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

时间:2011-04-16 13:17:04

标签: php mysql

.i包含以下代码:

<?
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=\"ans$i\" value=\"$j\">".
      $array[$i]['Answer'.$j]."<br />\n";
  }
}

//End the form
echo "<input type=\"submit\" value=\"submit\" id=\"submit\">\n</form>";
?>

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

5 个答案:

答案 0 :(得分:1)

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

现在你可以这样做:

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

根据$page变量计算$_GET的位置。但这不会解决你的随机性。

你总是可以通过你在会话中保存的给定密钥来种子兰德($ key),这样你就可以ORDER BY RAND($key)并使用上述限制技术。

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

因为这与分页有关。让我告诉你,LIMIT m,n可能没有它听起来那么快。 Learn how to improve it并详细了解Efficient Pagination Using MySQL

答案 1 :(得分:0)

试试这个:

这里是获取结果的代码:

    $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>';
     }

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

答案 2 :(得分:0)

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

将获得5个随机行。对于一个非常大的桌子来说这不是非常有效,但我猜这不是你的情况。

答案 3 :(得分:0)

可能的方法是:

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

  2. 将这些内容存储在$_SESSION

  3. 迭代$_SESSION中的问题ID,通过ID从数据库加载完整的问题数据。

答案 4 :(得分:0)

这些答案中的许多似乎忽略了这样一个事实,即每次向服务器发送请求时,您都会生成一个品牌随机的问题列表,然后根据您当前的页面选择其中的一个。 /> 这意味着您可能会反复提出问题,这意味着您无法在列表中前后移动,即它不是分页,每次只是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 ).")");