【问题标题】:PHP fetch unique random value from databasePHP从数据库中获取唯一的随机值
【发布时间】:2011-07-04 23:42:46
【问题描述】:

我一直在使用 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 提出,我可以进行比较。

问题是如果新获取的数据已经在数组中,程序停止,因为我仍然没有其他值,

[idea-01] 我正在考虑在 else 上添加一个新的 select 语句,但我知道这是错误的,因为它在循环中,并且无法保证该值是唯一的。

[idea-02] 使用我在会话中的行 ID 的数组记录,我想在上面的选择上放置一个 where 条件

WHERE qid != $_SESSION['xy']

问题是我必须循环此会话以将每个值与语句进行比较。而且题目是20道题,以后可以扩充。

【问题讨论】:

    标签: php mysql random unique


    【解决方案1】:

    我想你要找的是mysql的in comparison function

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

    确保 $_SESSION["anwsered_question"] 中仅存储数值,否则此查询将容易受到 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/

    【讨论】:

    • 他可以使用array_map('mysql_real_escape_string', $_SESSION["anwsered_questions"]) 进行注射,但这会对性能造成严重影响。我只是检查以确保会话中没有任何内容,除了数值(在将其插入会话之前检查)。
    猜你喜欢
    • 2011-09-22
    • 2017-07-06
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多