我正在做一个测验,我将问题存储在表格中,每次提出一个问题时,我都希望显示另一个问题。我试过使用rand()
:
select * from quiz order by rand() LIMIT 1
但是这些行正在重复。
还有什么我可以使用的地方我可以获得随机行但不会再次遇到相同的问题吗?
您可以使用会话和测验 ID。
例如
select * from quiz order by rand() LIMIT 1
在会话测验中添加测验ID:
if(!$_SESSION['quiz']) { $_SESSION['quiz'] = array(); }
$_SESSION['quiz'][] = $row['id'];
并调用 NOT IN:
$session = implode(", ", $_SESSION['quiz']);
$query = "select * from quiz WHRE `id` NOT IN (".$session.") order by rand() LIMIT 1";
只需获取id
先前返回的行并将其从将来的查询中排除。
select * from quiz WHERE id NOT :previous_id order by rand() LIMIT 1
如果您要求用户以随机顺序完成所有问题一次,则必须跟踪每个用户的单独“播放列表”。最好使用会话:
session_start();
if (!$_SESSION['ids']) {
$_SESSION['ids'] = $db->getAllQuestionIdsFromTheDatabase();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Leaving this up to you.
shuffle($_SESSION['ids']);
// $_SESSION['ids'] should now look like array(42, 12, 75, ...);
}
$question = $db->getQuestionById(array_shift($_SESSION['ids']));
...
您可以在数据库中使用ORDER BY RAND()
或在 PHP 中使用进行随机化shuffle
,两者都可以。
是的,您可以选择所有行(或其中一些行)并使用shuffle()
主要是因为ORDER BY RAND()
它确实对资源不友好,它实际上会重新查询表的每一行,分配一个随机数 ID,然后提供结果。