2011-07-04 85 views
2

我一直在使用PHP測驗程序,並且在從數據庫中獲取唯一的隨機值時我有點失落。目前這裏是我的腳本。PHP從數據庫中獲取唯一的隨機值

<?php $num = 1; 
    $sql = "SELECT * FROM questions ORDER BY RAND() LIMIT ".$num; 
    $sql_exec = mysql_query($sql, $connection); 
    if(isset($_POST['start']) || isset($_SESSION['xy'])){ 
     while($row = mysql_fetch_array($sql_exec)){ 
      if(!in_array($row['qid'], $_SESSION['xy'])){ 
       echo $row['qid']." -".$row['question']."<br />"; 
       if(isset($_POST['num'])){ 
        $_SESSION['xy'][] .= $row['qid']; 
       } 
      }else{ 
       // WHAT WILL I PUT HERE 
      } 
     } 
    } ?> 

<form action="<?php $_SERVER[PHP_SELF]; ?>" method="post"> 
    <input type="hidden" name="num" value="1" /> 
    <input type="submit" name="start" value="Start" <?php if(isset($_POST['start']) || isset($_SESSION['xy'])) echo "disabled"; ?> /> 
    <input type="submit" name="submit" value="Continue" /> 
    <input type="submit" name="destroy" value="Destroy" /> 
</form> 

我把每行的ID在一個會話陣列,這樣我可以記錄以前所有的問題和 如果新的問題已經問使用in_array,我可以比較。

的問題是,如果新獲取的數據已經在數組中,程序停止,因爲我還沒有別的價值,

[想法-01] 我想將一個新的select語句上的其他人的,但我知道這是錯誤的,因爲它在循環內部,並且不能保證該值是唯一的。

[想法-02] 隨着行ID陣列記錄我在會議上,把一個WHERE條件在選擇上述

WHERE qid != $_SESSION['xy'] 

問題的即時通訊思想是我必須循環本次會議比較每個值與聲明。此外,這些問題是20個項目,將來可以擴展。

回答

1

我認爲你要找的是mysql的in comparison function

$mysql_query="SELECT * FROM questions WHERE question NOT IN (".implode(",",$_SESSION["anwsered_questions"]).") ORDER BY RAND();"; 

確保沒有存儲在$ _SESSION只有數值[ 「anwsered_question」 否則此查詢將vulnarable到MySQL注射

另外:不要使用ORDER BY RAND(),見http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/獲取更多信息。

+1

他可以使用'array_map('mysql_real_escape_string',$ _SESSION [「anwsered_questions」])'注射,但這是一個很難的表現。我只是檢查一下,確保沒有任何東西可以進入會話,除了數值(在將它插入會話之前檢查)。 – Ben