Запрос идет в бесконечном цикле - PullRequest
2 голосов
/ 29 марта 2011

Следующее входит в бесконечный цикл, то есть оно постоянно показывает одну и ту же запись снова и снова.

<?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 ]

7 голосов
/ 30 марта 2011

Вы помещаете запрос mysql в оператор while, поэтому каждый раз, когда он туда попадает, он выполняет один и тот же запрос и показывает одну и ту же первую запись, вы никогда не переходите к следующей записи в наборе результатов.

Лично я бы объединил все запросы в один, но чтобы показать, как вы можете решить свою проблему (то же самое относится ко всем циклам):

$results = mysql_query("SELECT * FROM table3 WHERE id = '".$rowr['cid']."'");
while ($rowc = mysql_fetch_assoc($results))
{
  // do stuff
}
2 голосов
/ 30 марта 2011

Просто потому, что запрос выполняется снова каждый раз, когда проверяется условие цикла.Это означает, что вы всегда будете получать один и тот же результат, если в то же время в базе данных что-то не изменится.

Вам нужно что-то вроде этого:

<?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 .

Кстати, вам не нужно ; после {}блок.

0 голосов
/ 30 марта 2011

Вы повторяете запросы на каждой итерации цикла, перезапуская результаты с нуля.

Вместо этого вы хотите что-то вроде этого:

$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).Почему бы не переформулировать это как объединение?

0 голосов
/ 30 марта 2011

Используйте объединения, и вы можете сделать это одним запросом.

Mysql Join

Tutorial Join

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...