为什么不执行第二个mysqli_fetch_assoc?

时间:2013-08-21 20:17:40

标签: php mysqli

我有两张桌子,评论和八卦 Gossips有3列:id,userid,八卦 评论有4列:id,userid,gossipid,comment 我写了这段代码,以便程序能够回应所有八卦和每个八卦特有的评论。

   $query = 'SELECT * FROM gossips ORDER BY id DESC LIMIT 0,10';
                            $result = mysqli_query($cxn, $query)
                                or die("Couldn't execute query");
                            while($row = mysqli_fetch_assoc($result))
                            {
                                    echo '<div class="gossip">'.$row['gossip'].'</div><form action="comment.php" method="post"><input type="hidden" name="gossipid" value="'.$row['id'].'" />';
                                    echo '<input type="text" name="comment" placeholder="Write your comment here"/><br /><input type="submit" value="Comment" /></form><br />';
                                        $querycomment = "SELECT * FROM comment WHERE gossipid ='{$row['id']}' ORDER BY id DESC";
                                        $resultcomment = mysqli_query($cxn, $query)
                                            or die("Couldn't fetch comments.");
                                        while($comments = mysqli_fetch_assoc($resultcomment))
                                        {
                                            echo $comments['comment'];
                                        }
                            }


此代码的输出仅回显八卦并且不执行第二个while循环。可能是什么问题?

1 个答案:

答案 0 :(得分:1)

第一次绕过该循环时,您将浏览整个$resultcomment结果集。当外部$result循环的第二次迭代启动时,没有更多数据要从第二个查询中获取,因此实际上内部循环仅从$result集合中运行该FIRST记录。

由于您似乎使用外部循环的数据过滤内部循环的结果,为什么不将该内部查询基于相同的数据,因此您不会吮吸整个comment表并抛弃所有内容除外对于匹配的记录?这是一种可怕的浪费。

更像是

SELECT * FROM gossips
while(fetch gossip) {
     SELECT * FROM comment WHERE id = gossip.id
}

这样效率更高一些,因为您只获取实际想要显示的注释。进一步的优化是将两个查询重写为单个JOIN查询,并使用一些循环逻辑来检测您何时在闲话之间进行更改。