2011-09-18 46 views
1

我在管理面板中編寫了新評論的概述。我的代碼

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 < n。我使用mysqli來訪問數據庫。

有什麼想法?

+0

如果將NULL替換爲NULL(或!==!!),會發生什麼情況? – luiscubal

+0

爲什麼不使用左連接? –

+2

此外,您的代碼看起來容易受到SQL和XSS注入的影響。這是你可能想要解決的問題。 – luiscubal

回答

2

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

你爲什麼爲負的條件測試?你爲什麼不簡單地測試正面的那個?

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

無論如何,@evan的解釋爲什麼代碼創建一個無限循環絕對正確。

+0

這是一個鼓勵的壞習慣。儘管在這種情況下它可能並不重要,但可以想象在數據集上循環,其中'$ res-> fetch_assoc()'可能是一個空數組;或者如果你正在用'0'或者空字符串循環數組。 – evan

+0

'NULL'或'false'會打破循環。對於空數據集或空數組,循環中的代碼將永遠不會執行。簡單地說,當第一次檢查條件時,它將評估爲「假」並且永不進入循環。我看不出有什麼危險。 –

+0

您誤解了我 - 如果您正在循環的數據集中的某個數組* *爲空,該怎麼辦? PHP將空數組解釋爲虛假數據。你的循環將停止在那一點。如果你正在循環一個**元素的**可以是'0'或'「」'或其他falsy值的列表,那麼也是如此。在這種情況下,沒有**技術**錯誤** - 我同意在這種情況下不會發生** - 但這是一個壞習慣。 – evan