2013-03-19 55 views
1

我有這段代碼工作(我認爲)。使用foreach()而不是while()與查詢結果

$sql = "SELECT 
      order.id, 
      order.date 
     FROM 
      order"; 
$result = mysql_query($sql) or die(mysql_error()); 
$rows = mysql_fetch_assoc($result); 

foreach($rows as $row){ 
    echo $row['id'].": ".$row['date']."<br>"; 
} 

結果是一樣的,如果我會用:

while($row = mysql_fetch_assoc($result)){ 
    echo $row['id'].": ".$row['date']."<br>"; 
} 

但奇怪的是,今天,它停止工作。或者它從來沒有,但是我有點瘋狂。

我想使用foreach(),因爲數組$行也可以手動填充而不是查詢。

我在做什麼錯誤..?

+5

你不能'這裏foreach'。它從來沒有工作。你只有一次獲取單行,並用'foreach'遍歷該行的*列*。 – meagar 2013-03-19 13:33:34

+2

第一個只獲取1條記錄,然後遍歷記錄列 – Waygood 2013-03-19 13:33:38

+0

爲什麼不在任何循環之前使用print_r($ rows)並檢查實際存在的內容?您將清楚發生了什麼;) – 2013-03-19 13:35:39

回答

3

這從來沒有工作過(正確)。 mysql_fetch_assoc()只返回一行,您的foreach只是迭代結果集中第一行的列。

如果不先使用while(或for)循環將結果行讀取到數組中,則不能使用foreach

如果你想使用foreach,就像你說的,這樣做:

$rows = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $rows[] = $row; 
} 

foreach ($rows as $row) { 
    // ... 
} 

此外,please, don't use mysql_* functions in new code。他們不再維護and are officially deprecated。請參閱red box?請改爲了解prepared statements,並使用PDOMySQLi - this article將幫助您決定哪個。如果您選擇PDO,here is a good tutorial

+0

謝謝戴夫,這就是答案!我不明白爲什麼我認爲這個代碼已經工作..可能我需要一個假期!我也知道'mysql_'在php 5.5中被棄用。目前我正在對舊的'mysql_'進行一些修改,稍後我會用'mysqli_'更新整個網站。 – Timo002 2013-03-19 13:44:01

+0

@ Timo002順便說一句,如果您使用的是PDO,則foreach代碼實際上會工作:) – NikiC 2013-03-19 15:44:03

0

mysql_fetch_assoc只讀取單行。這意味着foreach遍歷單行的列。

+0

即使您的數據庫中只有一行,這兩種方式也不盡相同。 – 2013-03-19 13:37:11

1

首先,值得了解mysql_xx()函數已被棄用;建議不要再使用它們,而是將代碼切換到mysqliPDO庫。

現在回答你的問題:

不能使用foreachmysql_xxx()函數返回記錄集。它根本無法完成。

然而,這兩種替代的API(mysqliPDO)的返回他們的Recordset對象爲迭代器,這意味着你可以使用foreach循環他們。

所以你的問題的答案是:如果你想使用foreach循環一個記錄集,你需要切換到其他數據庫API之一。

(作爲獎勵,如果你做開關,其他API還提供了相當多的附加功能在老mysql_xx()功能)

相關問題