PHP随机选择有限制的结果

PHP随机选择有限制的结果,php,Php,我有一个文件集合(每个文件包含一个语法练习),数据库中有一个表,其中每个文件都根据主题、时态和类型进行描述 我有一个表格,可以选择我需要的主题、时态和类型。 使用下面的PHP脚本,我可以检索我搜索的文件。检索到的最大练习数对应于$limit的值 一切都很好,但我不能做的是将所有检索到的练习混洗并随机返回。实际上,脚本从上到下浏览DB,检索练习,但当达到$limit时,脚本停止。因此,存储在数据库表底部的练习永远不会被检索 您是否知道如何洗牌所有候选文件,然后输出其中的n个,其中n=$limit

我有一个文件集合(每个文件包含一个语法练习),数据库中有一个表,其中每个文件都根据主题、时态和类型进行描述

我有一个表格,可以选择我需要的主题、时态和类型。 使用下面的PHP脚本,我可以检索我搜索的文件。检索到的最大练习数对应于$limit的值

一切都很好,但我不能做的是将所有检索到的练习混洗并随机返回。实际上,脚本从上到下浏览DB,检索练习,但当达到$limit时,脚本停止。因此,存储在数据库表底部的练习永远不会被检索

您是否知道如何洗牌所有候选文件,然后输出其中的n个,其中n=$limit

if(isset($_POST['limit'], $_POST['topic'], $_POST['tense'], $_POST['type']))
{
    $counter = 0;
    $limit = intval($_POST['limit']);
    $result = '';
    foreach ($_POST['topic'] as $key_topic => $value_topic)
    {
            foreach ($_POST['tense'] as $key_tense => $value_tense)
        {
            foreach ($_POST['type'] as $key_type => $value_type)
            {
               $q_to_te_ty = "SELECT * FROM items WHERE topic = '".$value_topic."' AND tense = '".$value_tense."' AND type = '".$value_type."' ORDER BY RAND()";              
               $qu_to_te_ty = mysql_query($q_to_te_ty);
               while ($rows = mysql_fetch_array($qu_to_te_ty) and ($counter < $limit))
                             {
                                     $result = $rows['file'];
                                     readfile("files/$result");
                     echo "----------------------------------------"."\n"."\n";
                     $counter++;
                             }
            }
        }
    }
    if(!$result)
      {
          echo "SORRY. There are no exercises in the database which match your search."."\n"."Please try selecting different values.";
      }
}
else
{
    echo "ERROR: You forgot to check something."."\n"."Please select at least one type, topic and tense value. And don't forget to set a number of exercises.";
}
?>
if(isset($\u POST['limit']、$\u POST['topic']、$\u POST['tense']、$\u POST['type']))
{
$counter=0;
$limit=intval($_POST['limit']);
$result='';
foreach($\u POST['topic']作为$key\u topic=>$value\u topic)
{
foreach($\u POST['tense']作为$key\u tense=>$value\u tense)
{
foreach($\u POST['type']作为$key\u type=>$value\u type)
{
$q_to_te_ty=“SELECT*FROM items,其中topic='”“$value_topic.”和tense='“$value_tense.”和type='“$value_type.”“ORDER BY RAND()”;
$qu_to_te_ty=mysql_查询($q_to_te_ty);
而($rows=mysql_fetch_数组($qu to_te_ty)和($counter<$limit))
{
$result=$rows['file'];
readfile(“files/$result”);
回显“---------------------------------------”\n.“\n”;
$counter++;
}
}
}
}
如果(!$result)
{
echo“对不起,数据库中没有与您的搜索匹配的练习。”“\n”。“请尝试选择不同的值。”;
}
}
其他的
{
echo“错误:您忘记检查某些内容。”“\n”。“请至少选择一种类型、主题和时态值。不要忘记设置一些练习。”;
}
?>

我会使用MySQL的
RAND()
函数:

SELECT column FROM table
ORDER BY RAND()
LIMIT $limit 

或者诸如此类。

对每个$\u POST变量执行foreach有点违反直觉,您没有清理输入,并且使用了不推荐的PHP函数,但除此之外,您缺少了实际的LIMIT子句。如果您相应地添加LIMIT子句,看看这是否有帮助。我的所有输入(LIMIT、topic、tense、type)都通过一个具有固定值的表单(多选)进行输入。用户不输入任何内容。他们只是选择他们需要的。关于限制,它被设置了,当达到$limit值时,脚本实际上停止检索。我只需要一个策略,在输出之前真正地洗牌所有候选对象。Ale,上面的代码没有反映出您有一个适当的限制。在查询中。你把它放在一个我没想到的地方。我想在查询本身中添加一个“LIMIT”子句。请看这里:哦,关于输入卫生,即使你的用户没有以纯文本输入任何内容,黑客也可以使用你的网站截取帖子值,并将其修改为他/她的出价。在处理用户输入时,无论是通过选择框还是纯文本字段,都需要卫生设施。Kobus,感谢您的反馈。我实际上完全忽略了网站被黑客入侵的可能性。我将清理输入。谢谢,但在检索所有候选对象后,我需要限制输出。如果我在查询中放入一个LIMIT语句(如您所建议的),那么输出就会变得混乱(上面有三个FOREACH循环…),我想我需要将所有候选对象放入一个数组中,并在获取输出(使用LIMIT语句)之前对其进行洗牌。坦白地说,我不知道怎么做。