我有一张看起来像这样的表
+-----------+--------+----------------+---------------------+-------------------+ | commentid | blogid | comment_author | comment_date | blog_comment | +-----------+--------+----------------+---------------------+-------------------+ | 2 | 5 | random guy | 2015-07-01 16:48:35 | | 3 | 5 | James | 2015-07-01 18:54:03 | +-----------+--------+----------------+---------------------+-------------------+
里面有两行blogid=5
当我运行此代码时
$checkcomments = "SELECT * from blog_comments where blogid=5";
if ($result=$db->query($checkcomments)) {
while ($data=$result->fetch_object()) {
echo $data->comment_author;
}
}
它只显示一个名称random guy
。
如何遍历属于author_names
的所有blogid=5
?
答案 0 :(得分:1)
fetch_object()
只会返回1个结果,因此是您的问题。
您想要使用的内容是{while循环中的fetch()
:
while ($data=$result->fetch(PDO::FETCH_OBJ)) {
echo $data->comment_author;
}
假设您正在使用PDO
?
如果您使用mysqli
,只需执行以下操作:
while ($data=$result->fetch()) {
echo $data->comment_author;
}
答案 1 :(得分:1)
你所看到的代码对我来说是正确的......就我们而言......我们没有看到while
或if
的右括号。如果while
循环只获取一行,则有几种可能性。好像你已经排除了查询只返回一行的可能性。
另一种可能性是循环过早退出,可能是因为遇到了一些错误或者抛出了异常。标准建议适用于此处,请确保启用错误报告。
为了调试这个,缩短那个循环,只计算你完成它的次数,只做一些非常简单的事情......
$i = 0;
while ($data = $result->fetch_object() ) {
echo "#DEBUG: fetch count: " . ++$i ;
}
echo "#DEBUG: loop exit, count: " . $i ;
请注意,每次抓取都会覆盖$data
之前的内容。退出该循环时,您将拥有最后一行。考虑在查询中添加ORDER BY,以使结果更具确定性。 (您确定当前代码输出的行确实是第一行吗?我们看到的一些错误是循环遍历整个结果集,然后引用$data
...然后您只看到最后一行。 )
我怀疑在某个地方的循环中,你覆盖了一个尚未完成的变量,如$result
。如果你在循环中重新使用它作为另一个查询,当你再次回到循环的顶部时,“下一个”行将不可用于获取,因为$result
不再指向到原始结果集。
Bottomline,问题不在你所展示的代码行中。
http://ericlippert.com/2014/03/05/how-to-debug-small-programs/