如何从数据库中随机检索问题


how to randomize retrieval of question from database?

.我有以下代码:

<?
session_start();
$host = 'localhost';
$user = 'root';
$pw = '';
$db = 'pmdb';
mysql_connect($host,$user,$pw); 
mysql_select_db($db);
$result = mysql_query("SELECT * FROM questions WHERE QuizID=1");
$num_rows = mysql_num_rows($result);
$_SESSION['totalquestions']=$num_rows;
while($row = mysql_fetch_assoc($result))
{
    $array[] = $row;
}
//Start the form
echo '<form method="post" action="result.php">';
for($i=0; $i<=($num_rows-1); $i++)
{
  //Render a question + the answer choices
  echo $array[$i]['Title']."<br />'n";
  for ($j=1;$j<=4;$j++) 
  {
    echo "<input type='"radio'" name='"answers$i'" value='"$j'">".
      $array[$i]['Answer'.$j]."<br />'n";
  }
}
//End the form
echo "<input type='"submit'" value='"submit'" id='"submit'">'n</form>";
?>

上面的代码显示了从数据库中检索到的所有问题及其相应的答案选择。我的问题是,你如何随机化问题的显示,一次只显示5个,点击下一个按钮后,将显示接下来的5个。提前感谢!

您可以使用LIMIT m,n来限制获得的结果数量,并将结果偏移给定的数量。

现在你可以做一些类似的事情:

 SELECT * FROM questions WHERE QuizID=1 LIMIT $page,5;

其中,基于$_GET变量计算$page。但这并不能解决你的随机性。

您可以始终通过在会话中保存的给定密钥为RAND($key(播种,这样您就可以ORDER BY RAND($key)并使用上述限制技术。

可能最简单的实现方法是获取整个结果集,对其进行混洗并缓存。然后使用php只显示缓存的特定块。

因为这与分页有关。让我告诉你,极限m,n可能没有听起来那么快。了解如何改进它,并阅读更多关于使用MySQL 高效分页的信息

SELECT * FROM questions WHERE QuizID=1 ORDER BY RAND() LIMIT 5

将为您提供5个随机行。对于一张很大的桌子来说,这不是很有效,但我猜你的情况并非如此。

一种潜在的方法是:

  1. 当您通过SQL中的ORDER BY RAND() LIMIT 5在第一个问题上检测到新用户时,从数据库中获取问题ID。

  2. 将这些存储在$_SESSION中。

  3. 遍历$_SESSION中的问题ID,通过ID从DB加载完整的问题数据。

试试这个:

以下是获取结果的代码:

    $total = @mysql_num_rows(mysql_query("SELECT * FROM questions WHERE QuizID=1"));
    $per_page = 5;
    $page = $_GET['page'];
    $query = "SELECT * FROM questions WHERE QuizID=1 , id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT " . mysql_real_escape_string($per_page) ." OFFSET " . mysql_real_escape_string($page * $per_page) . "";

这里是"下一页"的代码:

    if($total >= ($page * $per_page))
    {
      echo '<a href="?page='.$page+1.'" >Next Page</a>';
     }

也许你必须更改我代码中的某些内容,因为我还没有尝试过它是否有效。

这些答案中的许多似乎忽略了这样一个事实,即每次向服务器发送请求时,都会生成一个随机的问题列表,然后根据当前页面选择其中的5个问题
这意味着你可能会遇到重复的问题,也意味着你不能在列表中来回走动,也就是说,这不是分页,每次只有5个随机问题。

处理此问题的一种方法是生成与question表的关键字字段相对应的随机数字数组。然后,它以持久的方式存储在服务器上,并与传递回客户端的密钥(可能是会话ID(相关联。

然后,当用户访问页面时,会话ID进入;这用于识别随机化阵列;$page_num被用作数组的索引:

   $question_ids = array_slice($randomized_array, ($page_num - 1)*5, 5);

接下来,您可以使用获取问题

   $ids_for_query = array_map('mysql_real_escape_string', array_values($question_ids));
   mysql_query("SELECT * FROM questions WHERE id IN (".implode(',', $ids_for_query ).")");