2016-01-11 3 views
-1

У меня есть 5 вопросов в моей базе данных. Я хотел, чтобы их отображали случайным образом и без повторений. Я попытался использовать «order by rand()», но произошло повторение. Как я могу избежать повторения? Ниже приведен код, который я сделал до сих пор!отображать строки случайным образом из базы данных без повторения?

 <?php 
    $dbhost = 'localhost'; 
    $dbuser = 'root'; 
    $dbpass = 'mySql'; 
    $dbname = "papers"; 
    $rec_limit = 1; 
    $conn = new mysqli($dbhost, $dbuser, $dbpass , $dbname); 
    if(! $conn) 
    { 
     die('Could not connect: ' . mysql_error()); 
    } 

    mysqli_select_db($conn,"$dbname")or die("cannot select DB"); 

    /* Get total number of records */ 
    $sql = "SELECT * FROM quest "; 
    $retval = mysqli_query( $conn,$sql); 

    if(! $retval) 
    { 
     die('Could not get data: ' . mysql_error()); 
    } 

    $row = mysqli_fetch_array($retval, MYSQL_NUM); 
    $rec_count = $row[0]; 

    if(isset($_GET{'page'})) 
    { 
     $page = $_GET{'page'} + 1; 
     $offset = $rec_limit * $page ; 
    } 
    else 
    { 
     $page = 0; 
     $offset = 0; 
    } 

    $left_rec = $rec_count - ($page * $rec_limit); 
    $sql1 = "SELECT distinct * "." FROM quest "."order by rand()"."LIMIT $offset, $rec_limit"; 

    $retval = mysqli_query( $conn ,$sql1); 

    if(! $retval) 
    { 
     die('Could not get data: ' . mysql_error()); 

    } 

    while($row = mysqli_fetch_array($retval, MYSQL_ASSOC)) 
    { 
     echo '<div class="question-content">'.$row["id"].".".$row["question"]."<br><br>".'</div>'; 
     echo '<div class="question-options">'; 
     echo '<input type="radio" name="qn" value="option1" >'.$row["opt1"]."<br>".'</div>'; 
     echo '<input type="radio" name="qn" value="option2" >'.$row["opt2"]."<br>".'</div>'; 
     echo '<input type="radio" name="qn" value="option3" >'.$row["opt3"]."<br>".'</div>'; 
     echo '<input type="radio" name="qn" value="option4" >'.$row["opt4"]."<br><br>".'</div>'; 
     echo '</div>'; 
      "--------------------------------<br>"; 
    } 

    if($page > 0 && $page < 5) 
    { 
     $last = $page - 2; 

     echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$page.'">'.'next'.'</a>'; 
    } 

    else if($page == 0) 
    { 
     echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$page.'">'.'next'.'</a>'; 
} 

    else if($left_rec < $rec_limit) 
    { 
     $last = $page - 2; 
     echo "<a href=\"$_PHP_SELF?page=$last\">Last Record</a>"; 
    } 

    mysqli_close($conn); 
    ?> 
+0

Магазин, который был последним, если случайный вопрос равен последнему вопросу, то переберите. – Script47

+1

@ Script47 Лучше всего отслеживать все вопросы, а не только последние, но это звучит как проблема с алгоритмом больше всего на свете. –

+0

Вам нужно отслеживать вопросы, которые вы указали, и исключить их из запроса , В запросе вы можете использовать 'ORDER BY RAND', чтобы запрос возвращал случайное число, но он не удалит вопросы, которые вы уже указали. –

ответ

2

PHP предлагает функцию под названием shuffle, которая будет рандомизировать массив. Он также назначает новые ключи. Вот пример того, как это работает:

$array = array(1,2,3,4,5); 
shuffle($array); 

Когда эхо элементы $array вы будете иметь их в рандомизированном (перемешиваются) порядке. Это эксклюзивное решение PHP, способ заполнения $array зависит от вашего SQL и, следовательно, выходит за рамки этого вопроса.

+0

Проблема в том, что вы не можете устранить уже заданные вопросы. Лучше использовать случайный запрос и отслеживать вопросы, указанные во временной таблице. –

+2

Сделайте это. Получите ваши идентификаторы вопросов, перетасуйте их, вставьте их в '$ _SESSION', сделайте. 'ORDER BY RAND()' в какой-то момент в будущем будет кошмаром производительности. – Sammitch

+0

@JayBlanchard Code не редактировался до тех пор, пока я не отправил ответ, требование разбивки на страницы не было очевидным, когда я ответил. –

Смежные вопросы