我一直在使用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] 我正在考虑在else上添加一个新的select语句,但我知道这是错误的,因为它在一个循环内,并且无法保证该值是唯一的。
[想法-02] 使用我在会话中的行ID的数组记录,我想在上面的选择中放置where条件
WHERE qid != $_SESSION['xy']
问题是我必须循环此会话以将每个值与语句进行比较。问题还有20个问题,将来可以延长。
答案 0 :(得分: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/。