通过特定的行sql php迭代

时间:2015-07-02 00:58:10

标签: php mysql

我有一张看起来像这样的表

+-----------+--------+----------------+---------------------+-------------------+                
| 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

2 个答案:

答案 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)

你所看到的代码对我来说是正确的......就我们而言......我们没有看到whileif的右括号。如果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/