2012-03-16 240 views
1

所以我正在研究一個「產品列表」,它的想法是產品的名稱,然後是從數據庫派生的顏色下拉列表。問題是我只能得到「顏色」循環迭代一次,我得到的第一個產品名稱和下拉菜單中的顏色一次,但不是隨後,我希望的幫助是,我該如何改變這段代碼讓它做我所需要的,我一直在嘗試一個星期,我真的可以使用一些幫助。PHP雙while循環,第二個循環不會迭代多次

$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 


while ($get_product_rows = mysql_fetch_assoc($product_query)){ 
echo $get_product_rows['name']; 
    echo "<br \>"; 

    if ($get_product_rows['has_colour'] == '1'){ 
     while ($get_colour_row = mysql_fetch_assoc($colour_query)){ 
      // Drop down box population goes here. 


     } 
    } 
} 

如果有人能幫助,我將不勝感激。 來自Grant M.

+1

我不能肯定這一點,並沒有時間來測試,但我想嘗試同時運行兩個MySQL查詢,這樣是不可預測的。相反,你可以通過while循環將查詢轉換爲數組,然後做一個嵌套的foreach循環。 – kingcoyote 2012-03-16 00:23:59

+0

你能做'var_dump(mysql_fetch_assoc($ color_query))'並用輸出更新你的問題嗎? – F21 2012-03-16 00:24:20

+0

@kingcoyote爲什麼它會變得不可預測?他在兩個不同的表上有兩個不同的查詢,他也在while循環之前執行查詢。 – steveoh 2012-03-16 00:31:35

回答

2

mysql_fetch_assoc()的工作方式是它有一個內部指針,並且每次運行該方法時,都會得到下一個項目,並且該指針被移動一次。如果沒有指針,while循環將如何終止?它會一直保持拉出顏色,一遍又一遍。

解決此問題的方法是重置每次迭代中的點。這可以使用mysql_data_seek()完成。

$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 

while ($get_product_rows = mysql_fetch_assoc($product_query)) { 
    echo $get_product_rows['name']; 
    echo "<br />"; 

    if ($get_product_rows['has_colour'] == '1') { 
     while ($get_colour_row = mysql_fetch_assoc($colour_query)) { 
      // Drop down box population goes here. 
     } 
    } 
    mysql_data_seek($colour_query, 0); 
} 
+0

我嘗試了你的加入,最後我得到了第二個while循環迭代了好幾次,似乎是基於查詢返回的行數進行迭代的,但是,在循環中插入一個「break」對其進行排序。非常感謝您的幫助人員。 – 2012-03-16 01:03:06

+0

@GrantMackenzie不客氣。如果這解決了您的問題,請記住通過單擊左側的V將其標記爲答案。 – kba 2012-03-16 02:43:52

0

的問題是,圍繞所述第二時間,指針已經在用於$colour_query記錄的結束;它將繼續返回null,因爲它不知道嵌套循環是完整的。

可通過重新使用mysql_data_seek指針解決這個問題:

$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 

while ($get_product_rows = mysql_fetch_assoc($product_query)) { 
    echo $get_product_rows['name']; 
    echo "<br />"; 

    if ($get_product_rows['has_colour'] == '1') { 
     while ($get_colour_row = mysql_fetch_assoc($colour_query)) { 
      // Drop down box population goes here. 
     } 

     // Reset the pointer: 
     mysql_data_seek($colour_query, 0); 
    } 
} 

此外,您<br \>是錯誤的;它應該是<br />

2

@Kristian Antonsen是非常正確的 - 一旦你在'結束'之後讀取了行,除非你回退到結果集的開頭。

除了發佈的其他答案之外,因爲顏色不依賴於產品 - 獲取它們一次,然後在內存中重用它們。

// get the colours once 
$colour_query = mysql_query('SELECT * FROM product_colours WHERE id > 0'); 
$colours = array(); 
while ($get_colour_row = mysql_fetch_assoc($colour_query)) { 
    array_push($colours, $get_colour_row['colour']); 
} 

// loop through each product 
$product_query = mysql_query('SELECT * FROM products WHERE id > 0'); 
while ($get_product_rows = mysql_fetch_assoc($product_query)) { 
    echo $get_product_rows['name']; 
    echo "<br />\n"; 

    if ($get_product_rows['has_colour'] == '1'){ 
     foreach ($colours as $colour) { 
      echo $colour . "<br />\n"; 
     } 
    } 
}