Опростяване/Съкращаване на код

GTI

Well-Known Member
Joined
Jan 1, 2011
Messages
1,365
Reaction score
423
Имам база данни в която има записани ид,име,картинка.
Искам да изкарам 3 случайни реда от таблицата.
За целта използвам този код:
PHP:
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }

    $sql = "select * from chroma WHERE ID > 1 AND ID <= 10 order by rand() limit 1";
    $result = mysqli_query($conn, $sql);
    if (mysqli_num_rows($result) > 0) {
        // output data of each row
        echo "You won" . '<br><br>';
        while ($row = mysqli_fetch_assoc($result)) {
            echo "" . $row["skin"] . '<br>' . '<img src="' . $row['img'] . '">' . "<br>";
            $skin1 = $row["skin"];
        }
    } else {
        echo "error";
    }
    $sql2 = "select * from chroma WHERE ID > 1 AND ID <= 10 order by rand() limit 1";
    $result2 = mysqli_query($conn, $sql2);

    if (mysqli_num_rows($result2) > 0) {
        // output data of each row
        while ($row2 = mysqli_fetch_assoc($result2)) {
            echo "" . $row2["skin"] . '<br>' . '<img src="' . $row2['img'] . '">' . "<br>";
            $skin2 = $row2["skin"];
        }
    } else {
        echo "error";
    }
    $sql3 = "select * from chroma WHERE ID > 1 AND ID <= 10 order by rand() limit 1";
    $result3 = mysqli_query($conn, $sql3);

    if (mysqli_num_rows($result3) > 0) {
        // output data of each row
        while ($row3 = mysqli_fetch_assoc($result3)) {
            echo $row3['skin'] . "<br> <img src='" . $row3['img'] . "'> <br>";
            $skin3 = $row3["skin"];
        }
    } else {
        echo "error";
    }


Това е кода,който го copy-paste-вам 3,5,8,10 пъти за да излезе това,което искам.
PHP:
  if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }

    $sql = "select * from chroma WHERE ID > 1 AND ID <= 10 order by rand() limit 1";
    $result = mysqli_query($conn, $sql);
    if (mysqli_num_rows($result) > 0) {
        // output data of each row
        echo "You won" . '<br><br>';
        while ($row = mysqli_fetch_assoc($result)) {
            echo "" . $row["skin"] . '<br>' . '<img src="' . $row['img'] . '">' . "<br>";
            $skin1 = $row["skin"];
        }
    } else {
        echo "error";
    }

Изглежда ми прекалено сложен и дълъг,а съм сигурен че има начин той да изглежда по-добре само че не съм достатъчно опитен за да го направя сам и за това се обръщам за помощ към вас. Държа да отбележа,че се опитах сам като гледах уроци,но не успях.
 
Last edited:
Нали ти дадох пример долу горе как да стане в другият пост. На pafata варианта не бачка ли ?

Ето го варианта за SQL, който току що тествах и си бачка нормално. Дори може while да не е вътре в форийч цикъл за да не върти постоянно, но и така става. Или да е for с определена кондиция, която си задал. Логиката според мен е една и съща заявката при mysqli може да е различна

PS
И това
PHP:
if (!$conn) { 
        die("Connection failed: " . mysqli_connect_error()); 
    }

това задължително ли го искаш във всеки модул, според мен трябва да се зарежда веднъж само и толкова, или поне да е в някаква фунцкия в комбинация с допълнитени проверки, която да хвърля false/true и само нея да проверяваш.

PHP:
$numbers = range(1, 3);
shuffle($numbers);
foreach ($numbers as $number) {

$check = mssql_query("select * from DPWeb_Auctions where id = '".$number."' "); 
while($row = mssql_fetch_row($check)){
	var_dump($row[1]);
  }
	
}

Резултат string(3) "333" string(1) "1" string(2) "22" , при всеки рефреш различна подредба и така...
 
Last edited:
Нали ти дадох пример долу горе как да стане в другият пост. На pafata варианта не бачка ли ?

Ето го варианта за SQL, който току що тествах и си бачка нормално. Дори може while да не е вътре в форийч цикъл за да не върти постоянно, но и така става. Или да е for с определена кондиция, която си задал. Логиката според мен е една и съща заявката при mysqli може да е различна

PS
И това
PHP:
if (!$conn) { 
        die("Connection failed: " . mysqli_connect_error()); 
    }

това задължително ли го искаш във всеки модул, според мен трябва да се зарежда веднъж само и толкова, или поне да е в някаква фунцкия, която да хвърля false/true и само нея да проверяваш.

PHP:
$numbers = range(1, 3);
shuffle($numbers);
foreach ($numbers as $number) {

$check = mssql_query("select * from DPWeb_Auctions where id = '".$number."' "); 
while($row = mssql_fetch_row($check)){
	var_dump($row[1]);
  }
	
}

Резултат string(3) "333" string(1) "1" string(2) "22" , при всеки рефреш различна подредба и така...

Не съм го пробвал,но след малко ще го пробвам. Трябват ми само 4 модула както съм написал да единия да изкарва 3, другият 5 и тн.

Забравих да отбележа,че съм написал следното
PHP:
    $write = "insert into table (1,2,3,4) values ('$1','$2','$3','text')";
    mysqli_query($conn, $write);

с което записвам данните от резултата в случая от 3те повторения на кода в базата.

PS: кода ти работи,но засега ще ползвам другия код.
PS2: На пафата работи много добре,но го направих така и мисля,че е по-добре.4
PHP:
$sql = "select * from chroma where ID = " . rand(1, 10);
 
Last edited:
Е щом моя работи с 3 реда закакво ти е онзи с 15, нали такъв беше таска (rofl). Както ти е удобно, но специално на мен 3 уайла + инсърт за всеки, отнасящи се за едно и също ми е меко казано странно.
 
Last edited:
Визирах от предната тема кода,а може и да греша. Колкото до този код,не мога да го накарам за работи. Може би нещо липсва или аз греша.

PS: Сайта е нещо като лотария,натискаш копче и печелиш 3 неща,всяко трябва да е записано на 1 ред в таблицата.
 
Аз не виждам причина да не работи, даже тук го направих с твоя синтаксис за връзка с mysqli. Пробвай така и му пусни един дебъг тук там да видиш какво гърми. Инсърта ще ти вкарва инфото, което искаш за всеки победител според селектнатото от формата 3 или 5

Dobre sega tuka malko prosta6ko maj go napravih ama otivam da spq ve4e :D

PHP:
$go =0;
if(isset($_POST['5'])){
$numbers = range(1, 5);
$go =1;
}
elseif(isset($_POST['3'])){
$numbers = range(1, 3);	
$go =1;
}
else{
echo "
  <form method='post' name='ivane'>
     5 Winners <input name='5' type='submit'>
     3 Winners <input name='3' type='submit'>
  </form>
";
}
if($go == 1){
shuffle($numbers);
foreach ($numbers as $number) {
    $sql = "Select * from chroma WHERE ID = '".$numbers."'"; 
    $result = mysqli_query($conn, $sql);  
    while ($row = mysqli_fetch_assoc($result)) { 
            echo $row['skin'] . "<br> <img src='" . $row['img'] . "'> <br>"; 
            $skin3 = $row["skin"]; 
			// Insert na infotata 
	$write = "insert into table (?) values (?)"; 
    mysqli_query($conn, $write);  
        
    } 
  }
}
 
Last edited:
  • Like
Reactions: GTI
Възможно най-съкратената и правилна версия на твоя код + това да имаш възможност да вземеш N на брой записа.

Иначе мисля, че това нещо може да се направи и с една единствена SQL заявка, което би било най-правилното нещо.

PHP:
getPrizes(10);

function getPrizes($count) {
    $prizes = array();
    
    for ($i = 0; $i < $count; $i++) {
        $prizes[$i] = getRandomPrize();
        echo $prizes[$i]['output'];
    }

    // Тук трябва да решиш дали да върнеш резулататите, ако искаш да ги използваш или да покаже Prizes[i][output] е достатъчно.
}

function getRandomPrize() {
    global $conn;

    $query = "select * from chroma WHERE ID > 1 AND ID <= 10 order by rand() limit 1";
    $result = mysqli_query($conn, $query);

    if (mysqli_num_rows($result) > 0) {
        $data = mysqli_fetch_assoc($result);
        $output = $data['skin'] . "<br> <img src='" . $data['img'] . "'> <br>";
        $skin = $data["skin"];

        mysqli_query($conn, "Insert into table () values () bla bla bla bla");
    }

    return array(
        "skin" => isset($skin) ? $skin : null,
        "output" => isset($output) ? $output : null
    );
}

И малко по-друга версия :)

PHP:
$prizesData = getPrizes(2);

function getPrizes($count = 1) {
    global $conn;

    $mainQuery = "(select * from chroma WHERE ID > 1 AND ID <= 10 order by rand() limit 1)\n";
    $query = $mainQuery . ($count > 1 ? str_repeat('UNION ALL ' . $mainQuery, ($count - 1)) : '');
    $result = mysqli_query($conn, $query);
    $outputs = array();
    $skins = array();

    if (mysqli_num_rows($result) > 0) {
        while ($data = mysqli_fetch_assoc($result)) {
            $outputs[] = $data['skin'] . "<br> <img src='" . $data['img'] . "'> <br>";
            $skins[] = $data["skin"];

            mysqli_query($conn, "Insert into table () values () bla bla bla bla");
        }
    } else {
        $outputs[] = "No results found";
    }

    return array(
        "skins" => $skins,
        "outputs" => $outputs
    );
}
 
Last edited:
  • Like
Reactions: dDosgwapo and GTI
И 3те кода работят за което ви благодаря. Отново забравих да отбележа,че искам резултатите да могат да се дублират. За да ме разберете по-ясно,като се изпълни кода да изкарва примерно следните редове от таблицата: 1,3,5,5,4,3 примерно.
PS: Другия проблем, който не успях да разреша сам е,как да запиша резултатите на 1 ред в друга таблица,а не всеки на нов ред.
Написах следният код за да ги записвам,по-скоро промених малко кода на рафа.


PHP:
            $skin = $data["skin"];
            $write = "Insert into 3skins (skin1) values ('$skin')";

            mysqli_query($conn, $write);
 
Last edited:
Това би трябвало да ти свърши работа :)

PHP:
    if (mysqli_num_rows($result) > 0) {
        while ($data = mysqli_fetch_assoc($result)) {
            $outputs[] = $data['skin'] . "<br> <img src='" . $data['img'] . "'> <br>";
            $skins[] = $data["skin"];
        }

        mysqli_query($conn, "Insert into `3skins` (`skin1`) values ('" . join(", ", $skins) . "')");
    } else {
        $outputs[] = "No results found";
    }
 
Така не изкарва абсолютно нищо,но като дъмпна $skins изкарва отново 3 еднакви резултата.
Опитвам се да се справя и сам,но неуспешно.
 
Last edited:
Така не изкарва абсолютно нищо,но като дъмпна $skins изкарва отново 3 еднакви резултата.
Опитвам се да се справя и сам,но неуспешно.

Ако ми пратиш таблица с данни на лично ще видя какъв е проблема. Не съм тествал нищо от кода, който съм написал :D
 
имаш лс в скайп