2010-10-07 70 views
0

基本上會發生什麼是這樣的:PHP/Mysql array_pop缺少第一個值

一個人去特定的畫廊,說GalleryID = 42。我做了一個查詢以獲取該圖庫中的所有圖像(具有GalleryID = 42的值),並執行單獨的查詢以獲取與該圖庫相關聯的所有評論(例如,GalleryID = 42)。總共400張圖片中,在3張不同的圖片上可能只有4條評論總數。

當我用do/while循環遍歷圖像並顯示它們時,我搜索每個圖片放置的註釋數組,隨着它循環。如果它找到與特定圖片相匹配的圖片ID,則會顯示評論值(Comment,CommentAuthor和CommentDate)。

下面是圖片查詢:

SELECT * FROM GalleryData WHERE GalleryID = 42 

而對於評論查詢:

SELECT Comment, CommentAuthor, CommentDate, ID FROM Comments WHERE CategoryID=42 

然後我用這個代碼把評論的可重複使用的查詢:

while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments)); 

然後我使用它來循環訪問數組以查找與特定項相關的註釋ar picture

foreach($Comments as $comment) 
{ 
    if($comment['ID'] == $row_rsGalleries['ID']) 
    { 
    echo '<p>'.$comment['Comment'].' - '.$comment['CommentAuthor'].'</p>'; 
    } 
} 

問題是,該代碼似乎不包括查詢中的第一個註釋。

現在,這是我做了這樣的事情的第一個項目之一,我不是一個PHP/MySQL專家,新手用戶。

當我運行查詢時,它出現了4個結果,但數組只包含3,第一個結果丟失。

+0

它從一個Mysql查詢中獲取所有值,並將其放入一個可反覆使用的數組中,我可以一遍又一遍地使用它。值來自: – dragboatrandy 2010-10-07 17:52:50

+0

嗯,一方面,你將會把'bool'值附加到'$ Comments'上......'mysql_fetch_assoc(...)|| array_pop(...)'在賦值之前被賦值,結果總是一個布爾值。 – meagar 2010-10-07 17:52:53

+1

爲什麼你有'|| array_pop($評論)'? – MatTheCat 2010-10-07 17:53:57

回答

5

這個構造對我來說看起來非常瘋狂。我不明白爲什麼它會切斷第一個元素,但我真的不想花時間去發現:你需要修正這個說法。在這種情況下使用||永遠不會給你你想要的結果。

你能描述一下這個應該做什麼嗎?

+0

它取自記錄集中的值: mysql_select_db($ database_connUser,$ connUser); $ query_rsComments = sprintf(「SELECT Comment,CommentAuthor,CommentDate,ID FROM Comments WHERE CategoryID =%s」,GetSQLValueString($ colname_rsComments,「int」)); $ rsComments = mysql_query($ query_rsComments,$ connUser)或die(mysql_error()); $ row_rsComments = mysql_fetch_assoc($ rsComments); $ totalRows_rsComments = mysql_num_rows($ rsComments); – dragboatrandy 2010-10-07 17:54:14

+1

@Randy我不明白'|| array_pop($評論)'部分應該做的。我認爲你可以把它放開,它應該可以工作 – 2010-10-07 18:00:58

3

爲什麼你需要pop代碼?

while($rsComment = mysql_fetch_assoc($rsComments)) { 
    $Comments[] = $rsComment; 
} 

不這樣做,你需要的是更詳細的優點的一切嗎?

編輯你的代碼無法工作的原因是,當while計算爲false來停止循環時,它運行array_pop,並從數組中刪除1個元素。

+1

請注意,當第一個元素彈出時,一個布爾彈出到最後。 – meagar 2010-10-07 18:01:23

0

mysql_fetch_assoc返回一個關聯數組,如果存在行,則返回對應於獲取行的關聯數組,如果沒有更多行,則返回false

所以

while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments)); 

看起來像:

while(true || array_pop($Comments)); 

的第4行。現在||短路,流行不會發生。此後,當沒有更多行時,mysql_fetch_assoc返回false,該數組被推入陣列,然後array_pop被執行,刪除最後添加的元素(false)。

如此有效,|| array_pop($Comments)將刪除數組中推入的最終布爾值,確保該數組僅具有由mysql_fetch_assoc返回的行。

+0

不正確;它更像'while($ Comments [] =(true || array_pop(...)));'這是一個重要的區別,因爲推送到數組上的'array_push'值總是** bools **。 – meagar 2010-10-07 18:16:38

+0

基本上會發生什麼事情是這樣的:一個人去特定的畫廊,說GalleryID = 42。我做了一個查詢來獲取與ID = 42的值相關的所有評論。在畫廊中,有400個圖像。只有幾張照片才做出評論。當我遍歷圖像並顯示它們時,我搜索數組以查找在循環中爲每張圖片放置的註釋。如果它找到與特定圖片匹配的圖片ID,它會顯示評論值(Comment,CommentAuthor和CommentDate)。這是否有意義? – dragboatrandy 2010-10-07 18:16:44

0

我不知道這是如何工作的。

起初我以爲它會填滿bool的數值,但想到它後,循環不應該終止

它最終將等同於while(($array[] = array_pop($array)));,和一個非空數組,這將自旋永遠

下從未終止:

<?php 

// Simulate MySQL_fetch_assoc; return false when no more results 
function fetch($results) { 
    if (count($results)) 
     return array_pop($results); 
    return false; 
} 

$Comments = array(); 
$rsComments= array(array(3), array(4), array(5), array(6)); 

while (($Comments[] = fetch($rsComments) || array_pop($Comments))); 

// $Comments = array(true,true,true,true,true,...); 
0

你必須放在一個櫃檯;例如:$ counter = 3然後你的while語句包含這個計數器,像這樣:

while($ count < 3){(你的計數從0開始,所以儘管總共有4個項目,其中一個,你的程序只能計算3個數組)。有一個永無止境的循環。