PHPRAND查询结果-检查以使新的随机查询与以前的查询不同

PHPRAND查询结果-检查以使新的随机查询与以前的查询不同,php,mysql,session,Php,Mysql,Session,我的PHP代码现在看起来像这样: $query = mysql_query("SELECT * FROM `questions` WHERE `id` = '$id' ORDER BY RAND()") or die(mysql_error()); $cmd = mysql_fetch_assoc($query); $question = $cmd['question']; 现在,这些问题只是随机化——这很好——但有时同样的问题会再次出现,我不想这样。我想你可以通过一个会话来解决这个问题。但

我的PHP代码现在看起来像这样:

$query = mysql_query("SELECT * FROM `questions` WHERE `id` = '$id' ORDER BY RAND()") or die(mysql_error());
$cmd = mysql_fetch_assoc($query);

$question = $cmd['question'];

现在,这些问题只是随机化——这很好——但有时同样的问题会再次出现,我不想这样。我想你可以通过一个会话来解决这个问题。但是怎么做呢?如果有人能修复代码,我将不胜感激。

也许是这样的:

$query = "SELECT * FROM `questions` WHERE `id` = `$id` AND `id` NOT IN (";
$query .= implode(', ', array_keys($_SESSION['questions']));
$query .= ') ORDER BY RAND()';
mysql_query($query) or die(mysql_error());

// Here add the returned questions to the $_SESSION['questions'] array so they would not appear again.

我不知道程序的其余部分是如何工作的,因此您需要的逻辑可能会有点不同,但我相信这种查询正是您需要的。

这应该满足您的需要:

$query = mysql_query("SELECT * FROM `questions` WHERE `id` = '$id' ORDER BY RAND()") or die(mysql_error());
$question = null;
while ($cmd = mysql_fetch_assoc($query)) {
    if (array_search($cmd['question'], $_SESSION['asked']))
        continue;
    $question = $cmd['question'];
    $_SESSION['asked'][] = $question;
    break;
}
if (!$question) {
    // No unique questions found.
} else {
    // $question will be unique here
}

您可以在会话中存储以前所有问题的ID:

if (!isset($_SESSION['QuestionAsked']))
{
    $_SESSION['QuestionAsked'] = array();
}
然后,您可以扩展查询以排除所有问题:

$query = 'SELECT * FROM `questions`';
if ($_SESSION['QuestionAsked'])
{
    $askedIds = implode(',', $_SESSION['QuestionAsked']);
    $query .= sprintf(' WHERE `id` NOT IN (%s)', $askedIds);
}
$query .= ' ORDER BY RAND()';
最后,在查询新问题后,将其添加到会话中:

$_SESSION['QuestionAsked'][] = $currentQuestionId;

旁注:如果您进行干预,这并不是完全随机的。使用数组翻转和内爆使foreach消失:)将不起作用,因为引号不匹配(
“string”
)。这个语法又有什么用?
$k.',;
$k
没有任何作用。也许你的意思是
$k.=',;
@Rikudo:Nice spot,hower$k甚至被用作迭代器变量。所以都很糟糕:)。谢谢你指出这些,编辑后创建了一个工作示例!而且,我没有看到引号不匹配的地方?也许我只是被忽略了瞎子,虽然?…我试图用你的例子,但同样的问题一再出现。