Php 执行while/loop以获得10个随机结果
你好,我正在尝试为我的网站做一个标签脚本,所以每次搜索引擎来到我的网站,我的网站上都会显示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
)
像这样
$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;