查询进入无限循环

时间:2011-03-29 19:57:51

标签: php mysql loops

以下进入无限循环,这意味着它不断地一遍又一遍地显示相同的记录。

<?php
while ($rowr = mysql_fetch_assoc(mysql_query("SELECT * FROM table1")) {
    while($rowu = mysql_fetch_assoc(mysql_query("SELECT * FROM table2 WHERE id = '".$rowr['uid']."'"))){
        while($rowc = mysql_fetch_assoc(mysql_query("SELECT * FROM table3 WHERE id = '".$rowr['cid']."'"))){
    ?>
    <tr><td><?php echo $rowc['post']; ?></td><td><a href="other.php?id=<?php echo $rowu['id']; ?>"><?php echo $rowu['username']; ?></a></td><td><a href="this.php?p=d&i=<?php echo $rowr['id']; ?>"><font color="#FF0000">X</font></a></td></tr>
    <?php
        };
    };
};
?>

为什么会发生这种情况,我该如何解决?

4 个答案:

答案 0 :(得分:7)

你将mysql查询放在while语句中,所以每次它到达那里它会执行相同的查询并显示相同的第一条记录,你永远不会前进到结果集中的下一条记录。

我个人会将所有查询合并为一个,但是要说明如何解决问题(同样适用于所有循环):

$results = mysql_query("SELECT * FROM table3 WHERE id = '".$rowr['cid']."'");
while ($rowc = mysql_fetch_assoc($results))
{
  // do stuff
}

答案 1 :(得分:2)

只是因为每次检查循环条件时都会再次执行查询。这意味着除非在此期间数据库发生变化,否则您将始终获得相同的结果。

你需要这样的东西:

<?php
$res1 = mysql_query("SELECT * FROM table1");
while ($rowr = mysql_fetch_assoc($res1)) {

    $res2 = mysql_query("SELECT * FROM table2 WHERE id = '".$rowr['uid']."'");
    while($rowu = mysql_fetch_assoc($res2)){

        $res3 = mysql_query("SELECT * FROM table3 WHERE id = '".$rowr['cid']."'");
        while($rowc = mysql_fetch_assoc($res3)){
?>
    <tr><td><?php echo $rowc['post']; ?></td><td><a href="other.php?id=<?php echo $rowu['id']; ?>"><?php echo $rowu['username']; ?></a></td><td><a href="this.php?p=d&i=<?php echo $rowr['id']; ?>"><font color="#FF0000">X</font></a></td></tr>
<?php
        }
    }
}
?>

这只是为了说明它为什么不起作用。正如其他人已经指出的那样,建议您使用JOIN将查询合并为一个。

顺便说一句,;阻止后你不需要{}

答案 2 :(得分:0)

使用联接,您可以在一个查询中执行此操作。

Mysql Join

Join Tutorial

答案 3 :(得分:0)

您在每次循环迭代时重新执行查询,从头开始重新启动结果。

你想要这样的东西:

$resultR = mysql_query("... table1");
while($rowR = mysql_fetch_assoc($resultR)) {
    $resultU = mysql_query("... table2");
    while($rowU = mysql_fetch_assoc($resultU)) {
        etc...
    }
}

当然,这是一种非常低效的结构。最终运行count($ rowR)* count($ rowU)* count($ rowC)查询。为什么不把它重新表述为一个加入?