2016-01-11 42 views
-1

我有5個問題在我的數據庫中。我希望它們能夠隨機顯示而不會重複。我嘗試使用「由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

這樣做。獲取你的問題ID,將它們洗牌,然後將它們塞進'$ _SESSION',完成。 'ORDER BY RAND()'將成爲未來某個時刻的性能噩夢。 – Sammitch

+0

@JayBlanchard代碼直到我提交答案後才被編輯,分頁要求在我回答時並不明顯。 –

相關問題