php + mysqli while (false! == ($ data = $ mysqli_res-> fetch_assoc)) создает бесконечный цикл - PullRequest
1 голос
/ 18 сентября 2011

Я написал обзор новых комментариев в админ-панели. Мой код

if($res = $db->query("select * from comments where unlocked=0"));
{
    $o = 0; //abortcondition temp
    echo '<div class="newcomments"><a>neuste kommentare: </a><br />';
    //here is the infinite loop
    while(false !== ($data = $res->fetch_assoc()) && ++$o < 10)
    {
        if($articles = $db->query("select title from coreless_articles where ID=".$data['article']))
        {
            if(false !== ($article = $articles->fetch_assoc()))
            {
                echo 
                '<div id="comment'.$data['ID'].'">'.$data['from'].' in'.
                ' <a href="article/'.($article['uri']).'#comments">'.$article['title'].'</a>'.
                ' <a href="javascript:;">anzeigen</a>'.
                ' <a href="javascript:;">freischalten</a>'.
                ' <a href="javascript:;">l&ouml;schen</a>'.
                ' <div class="preview" >'.$data['text'].'</div>'.
                '</div>';
            }
        }
    }
}

создает бесконечный цикл, если у меня нет условия отмены $ o. Но я хочу показать все новые комментарии, а не только ++ $ o

есть идеи?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

mysqli_result :: fetch_assoc возвращает значение NULL, когда оно пустое, а не FALSE.http://www.php.net/manual/en/mysqli-result.fetch-assoc.php

Возвращает ассоциативный массив, соответствующий выбранной строке или NULL, если строк больше нет.

Просто измените свой тест на NULL !== (etc).

(Это довольно странно, потому что эквивалентная функция mysql_fetch_assoc () возвращает , возвращает FALSE.)

0 голосов
/ 18 сентября 2011

Почему вы тестируете на негативное состояние? Почему бы вам просто не проверить положительный?

while($data = $res->fetch_assoc())
{
 ...
}

В любом случае, объяснение @evan, почему код создает бесконечный цикл, абсолютно верно.

...