繁体   English   中英

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

[英]how to randomize retrieval of question from database?

.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个,点击下一个按钮后,将显示下五个。 提前致谢!

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

现在你可以这样做:

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

在哪里根据$_GET变量计算$page 但这不会解决你的随机性问题。

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

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

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

尝试这个 :

这是获得结果的代码:

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

也许你必须在我的代码中改变一些东西,因为我没有尝试过它,看看它是否有效。

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加载完整的问题数据。

其中许多答案似乎忽略了这样一个事实,即每次向服务器发送请求时,您都会生成一个品牌随机的问题列表,然后根据您当前的页面选择其中的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 ).")");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM