2012-11-09 138 views
1

我在兩個頁面上使用相同的while循環,其中唯一的區別是每個頁面上的不同SQL調用。第一個作品,因爲它應該從查詢中抓取的內容,並在圖像滑塊顯示它:PHP無限循環問題

<?php 

      $qry = mysql_query(sprintf("SELECT * FROM manageme WHERE element IN ('%s')", $element)); 
      $i = 0; 
      while (($t = mysql_fetch_array($qry)) != null && $i < 52) { $i++;?> 
       <li> 


        <a href="">               
         <img src="<?php print $t['fileLocation']; ?>"; 
         title="<?php print $t['element_name']; ?>"; 
         name="<?php print $t['clickLocation']; ?>"; 
         alt="wat" 
         class="btnshow" /> 
        </a> 
       </li> 
<?php } ?> 

這工作,因爲它應該通過循環步進而只要從查詢抓取的內容,因爲有少超過52個條目返回,每個記錄顯示一次時結束。

在使用不同的SQL調用實現相同的while循環時,會發生問題。

 <?php 

$qry = mysql_query(sprintf("SELECT u.username, us.user_id, us.service_id, 
             s.imageID, s.title, s.clickLocation, s.fileLocation, s.element_name 
             FROM user u, user_service us, manageme s 
             WHERE us.user_id = %s 
             AND s.imageID = us.service_id", $_COOKIE['user_id'])); 
      $i = 0; 
      while (($t = mysql_fetch_array($qry)) != null && $i < 52) { $i++;?> 
       <li> 


        <a href="">               
         <img src="<?php print $t['fileLocation']; ?>"; 
         title="<?php print $t['element_name']; ?>"; 
         name="<?php print $t['clickLocation']; ?>"; 
         alt="wat" 
         class="btnshow" /> 
        </a> 
       </li> 
<?php } ?> 

而是從陣列抓取和當內容已經顯示一次結束while循環的,它繼續循環在圖像滑塊的內容,直到52級的條目已經被顯示。因此,例如,如果SQL調用僅查找4條記錄以顯示在圖像滑塊中,則在結束循環之前,該組4顯示13次(52/4)。

任何人都可以幫助我弄清楚如何結束這個循環後,它已經顯示我的數據庫中的每個記錄一次,只有一次?提前致謝!

+1

爲什麼不限制MySQL查詢的結果?這將解決無限循環問題,並且不需要$ i限制循環變量 – Blacksonic

+0

@Blacksonic。 OP在這裏做什麼是不必要的。 –

回答

0

主要問題:

1)易受SQL injection attacks。享受你的服務器 銷燬。

2)術語:你不是「從數組中獲取」。您正在從結果集中提取一行數據,並將該行作爲數組返回。

3)您的循環應該在52條記錄之後終止,或者即使您在while()條件中使用了一些醜陋的語法,也不會有更多記錄可用。檢查您的查詢是否實際以您期望的順序/格式獲取正確的記錄。你的代碼中沒有任何東西會導致PHP輸出「重複」行。

+0

謝謝Marc的領導。我對PHP還是比較陌生的,所以知道的人的洞察力是非常重要的。在擺脫while循環並像其他人所建議的那樣在查詢結尾添加LIMIT 52後,我得到了一個只在52之後結束的循環的不幸結果。問題是我的查詢,我通過包含SELECT u.username和其他所有內容來從用戶表中抓取每個用戶。擺脫它只抓取我需要的記錄。我非常感謝幫助傢伙! – user1809737

0

使用mysql_num_rows($qry)終止除循環到< 52

喜歡的東西:

(($t = mysql_fetch_array($qry)) != null && ($i < mysql_num_rows($qry) || $i < 52)) 
0

From the manual看來你對mysql_fetch_array($qry)調用將永遠不會返回null。在結果集結束時,您將獲得false回報。如果你改變你的條件來檢查這個,你應該可以終止循環

+1

但他並沒有進行嚴格的比較。 'null!= false'是錯誤的 –

0

擺脫$i < 52檢查。請將LIMIT 52添加到SQL查詢的末尾。然後換while循環:

while ($t = mysql_fetch_array($qry)) { 
.... 
} 
1

嘗試增加LIMIT 52到您的查詢,並執行while循環,

while ($t = mysql_fetch_array($qry)) { 
    //do something 
    }