2011-01-27 70 views
1

這讓我很煩,所以請大家幫忙。使用Foreach更新MySQL表與數組使用Foreach

我想用數組更新Mysql表。

像這樣的事情

$a = array('1', '2', '3'); 

foreach($a as $id){ 

mysql_query("UPDATE table SET id = '$id' WHERE column = 'something'") or die(mysql_error()); 

} 

所以更新後的ID字段具有值1,2,3 相反,它與1,1,1

不正是我想要的更新。

有人可以顯示我做錯了什麼。

在此先感謝。

+2

如果你的where條件是** static **,你不會覆蓋相同的行/行嗎? – Nishant 2011-01-27 16:11:37

+1

在你的例子中,它會一遍又一遍地更新相同的行,所以最後的ID將是3,3,3。你能發佈你的實際代碼嗎? – 2011-01-27 16:12:44

+0

缺少某些東西。如果所有行在列列中都有內容,則所有行都以ID 3結尾。這是確切的代碼嗎?你能列出前後的表格行嗎? – 2011-01-27 16:45:22

回答

2

你是否在真實的代碼中更改了where-聲明?現在,您正在覆蓋column ='something'的每一行,這意味着每一行都會每次更新並以相同的內容結束。

編輯:回答評論

那麼,你就需要一個非靜態WHERE語句來此。你可以做一些類似我的帖子中的編輯...

$a = array('1' => 'something1', '2' => 'something2', '3' => 'something3'); 

foreach($a as $id => $where){ 
    mysql_query("UPDATE table SET id = '$id' WHERE column = '$where'") or die(mysql_error()); 
} 
+0

哇,什麼反應。在真正的代碼中,我只改變了與這個字段沒什麼區別的字段名稱。我剛剛刪除了where子句,正如你所說的那樣,它用相同的值更新了所有的行。那麼如何重新編寫整個東西,使其不會更新具有相同值的所有行? – jamjam 2011-01-27 16:22:41

0

我沒有看到循環中'where'條件改變。每次您執行「WHERE column ='something'」時,它將匹配並替換所有行,覆蓋每個先前更新的ID。

更新:

我們有些人在同一時間寫了類似的迴應。我應該打更多的時間之前,「添加」

對於它的價值,如果這是一個一次性的修復工作再上一個表順序ID「刷新」,你可以做到這一點與直MySQL的:

mysql> select * from foo; 
+------+------+ 
| id | name | 
+------+------+ 
| 0 | aaa | 
| 0 | bbb | 
| 0 | ccc | 
| 0 | ddd | 
+------+------+ 
4 rows in set (0.00 sec) 

mysql> set @ct=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> update foo set id=(@ct:[email protected]+1); 
Query OK, 4 rows affected (0.00 sec) 
Rows matched: 4 Changed: 4 Warnings: 0 

mysql> select * from foo; 
+------+------+ 
| id | name | 
+------+------+ 
| 1 | aaa | 
| 2 | bbb | 
| 3 | ccc | 
| 4 | ddd | 
+------+------+ 
4 rows in set (0.00 sec) 

「按訂單」使用的,如果你喜歡,例如:

mysql> update foo set id=(@ct:[email protected]+1) order by name 
2

每個在foreach你的更新語句的作用在同一行或每次設定的行。在你的例子中,你使用「where column ='something'」。如果這不會隨着foreach循環的每次迭代而改變,那麼您將繼續更新相同的行。