2011-07-04 19 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> 

私は、レコードに新しい質問が既にin_array使用してお願いしている場合、私は比較することができ、すべての以前の質問と をできるように、私はセッション配列の各行のIDを置きます。

問題は、新しいフェッチデータは、アレイ内に既に存在する場合、私はまだ他の値を持っていないため、プログラムが停止され、

[アイデア-01] 私は他に新しいSELECT文を置くことを考えていますしかし、それはループ内にあるので、間違っていることがわかります。値が一意になるという保証はありません。

[アイデア-02]私がセッションを持っている行IDの配列記録と 、

WHERE qid != $_SESSION['xy'] 

上記の選択にWHERE条件を入れてのイム思考問題は、私はループにこのセッションを持っています各値をステートメントと比較します。また、質問は20項目であり、将来延長することができます。

答えて

1

あなたが探しているのは、mysqlのin comparison functionです。

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

そうでない場合は、このクエリはまた

MySQLの注射にvulnarableだろう$ _SESSION [ "anwsered_question"]に保存された数値のみが存在していることを確認してください:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/を参照して、RAND()、ORDER BYを使用しないでください詳細については。

+1

彼は注射のために 'array_map( 'mysql_real_escape_string'、$ _SESSION [" anwsered_questions "])'を使うことができましたが、これはパフォーマンスの高いヒットです。セッションに挿入する前に確認してください(セッションに挿入する前に確認してください)。 – Ben

関連する問題