Php 执行while/loop以获得10个随机结果

Php 执行while/loop以获得10个随机结果,php,mysql,sql,Php,Mysql,Sql,你好,我正在尝试为我的网站做一个标签脚本,所以每次搜索引擎来到我的网站,我的网站上都会显示10个不同的标签 这些标签将从数据库中抓取。 所以现在我对它进行了编码,这样它就只抓到一个。(因为我不知道如何在时执行) 像这样 $sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10"; $result = mysql_query($sql); $row = mysql_fetch_object($result); echo "<a hre

你好,我正在尝试为我的网站做一个标签脚本,所以每次搜索引擎来到我的网站,我的网站上都会显示10个不同的标签

这些标签将从数据库中抓取。 所以现在我对它进行了编码,这样它就只抓到一个。(因为我不知道如何在时执行

像这样

$sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10";
$result = mysql_query($sql);
$row = mysql_fetch_object($result);
echo "<a href='index.php'>" .$row->tagname. " </a>";
$sql=“按兰德顺序从标记中选择标记名()限制10”;
$result=mysql\u查询($sql);
$row=mysql\u fetch\u对象($result);
回声“;

我是否可以在上面加上一段时间,让它重复10次?例如,使用相同的回波,但打印出10个结果,而不是1。。。。我已将限制从1更改为10,但这不起作用。。。仍然显示一个…

注意,在真正的答案之前阅读::对于那些一直对这个答案投反对票的人。阅读标题(以“做一段时间”开头)和最后一部分,即问题(“我是否可以添加一段时间,这样做10次?”)。这个答案是关于迭代结果集,而不是关于RAND函数的使用!这个问题甚至没有出现在我的回答中,最后我还建议采用一种不同的方法:


您只需要将对mysql\u fetch\u对象的调用封装在一个循环中

$result = mysql_query($sql);

while ($row = mysql_fetch_object($result))
{
echo "<a href='index.php'>" .$row->tagname. " </a>";
}
$result=mysql\u查询($sql);
while($row=mysql\u fetch\u object($result))
{
回声“;
}
以后编辑 其他考虑因素包括:

  • 如果表中包含大量数据(但似乎不会),order by rand()可能会对性能产生不良影响
  • 考虑使用pdo(或至少使用mysqli)
  • 即使查询看起来是错误的,您也应该进行一些错误处理 至少是完美的

    如果(!$result) { echo mysql_error(); 死亡 }


您只能获取其中一个

你需要在一段时间内一个接一个地把它们都拿来

$sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10";
$result = mysql_query($sql);
while($row = mysql_fetch_object($result)) {
    echo "<a href='index.php'>" .$row->tagname. " </a>";
}
$sql=“按兰德顺序从标记中选择标记名()限制10”;
$result=mysql\u查询($sql);
while($row=mysql\u fetch\u object($result)){
回声“;
}

请停止使用
按兰德订购()。停下来。此操作的复杂性为
n*log2(n)
,这意味着用于查询的时间将增加“

如果要生成随机结果,请创建一个存储过程来生成这些结果

至于在PHP端执行这一切,你应该停止使用古老的
mysql\u*
API。它已经有10多年的历史了,不再被维护。社区甚至反对使用它们。2012年不应该再使用
mysql\u*
编写新代码。相反,你应该使用or。至于如何编写(使用PDO):

更新 如果要求不仅获得10个随机结果,而且实际上10个唯一随机结果,则需要对
过程进行两次更改

  • 临时表应强制执行条目的唯一性:

    CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) UNIQUE);
    
    只收集ID而不是值也是有意义的。特别是如果你要找的是10篇独特的文章,而不仅仅是标签

  • 当发现插入重复值时,
    cnt
    计数器不应减少。这可以通过添加
    处理程序
    (在定义
    循环之前)来确保,该处理程序将“捕获”引发的警告,并调整计数器:

    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET cnt = cnt + 1;
    

  • 查看或迭代mysql_fetch_object感谢这个工作不好的标记,当它允许我使用它时,它有正确的答案。再次感谢-1:使用
    ORDER BY RAND()
    是一个错误的做法,有大量的结果。@tereško答案是关于如何迭代结果(mysql_fetch_object函数的使用);OP已经使用了该查询,如果你真的在投票前阅读了我的答案,你会发现我建议1)
    选择另一种算法来获得随机结果
    2)pdo 3)错误处理..使用你的方法,需要你的at。Thanks@IvanWang,更新的详细信息应包括您的附加条件-1:使用
    orderbyrand()
    是一种糟糕的做法,会产生大量的结果,另外,请不要建议人们使用古老的
    mysql.*
    函数。
    CALL get_rands(10);
    SELECT * FROM rands;
    
    // creates DB connection
    $connection = new PDO('mysql:host=localhost;dbname=mydb;charset=UTF-8', 
                          'username', 'password');
    $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    // executes the procedure and creates select statement
    $connection->exec('CALL get_rands(10)');
    $statement = $connection->query('SELECT * FROM rands');
    
    // performs query and collects all the info
    if ($statement->execute())
    {
        $tags = $statement->fetchAll(PDO::FETCH::ASSOC);
    }
    
    CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) UNIQUE);
    
    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET cnt = cnt + 1;