2010-05-14 52 views
0

我使用Postgresql + PHP。如何用單個查詢更新多行

說我有這個表:

Books (id, title, year) 

這陣標題在PHP中:

$titles = array ("bible","kafka","Book of Eli"); 

現在我想更新的所有行標題是$ titles數組上面。

所以,我需要這樣的查詢:

UPDATE books SET year = '2001-11-11' WHERE title is in $titles; 

是可能與一個單一的查詢?或者我需要使用FOR循環?

+0

你在更新日期爲相同的值所有標題在數組中的情況或不同的標題會有不同的日期? – TooManyCooks 2010-05-14 22:59:00

+0

是的,這只是一個例子:) – xRobot 2010-05-14 23:06:45

回答

4

這可能,你實際上很接近。

對於SQL,語法如下:

UPDATE books SET year = '2001-11-11' WHERE title IN ('bible','kafka','Book of Eli'); 

要生成使用PHP,你會想要做這樣的事情:

$query = "UPDATE books SET year = '2001-11-11' WHERE title IN ('" . implode("','", $titles) . "');'"; 

的PHP implode()功能加入陣列元素一起使用一個字符串,所以我把','放在它們之間,最初和最後的'被手動放入字符串中。

請注意,如果任何標題包含撇號,則此操作將失敗。如果這是一種可能性,你將需要逃避這些。

+0

看起來像你打敗了我的職位。 – 2010-05-14 23:03:37

+0

好的答案,但PHP手冊說:「查詢字符串不應以分號結尾。」 – 2010-05-15 06:03:42

+0

不要忘記在壓縮它們之前調用這些標題上的pg_escape_string()! – intgr 2010-05-15 17:29:30

1

可以使用implode()功能,可以讓你把數組轉換成一個逗號分隔的字符串:

$titles = array ("bible","kafka","Book of Eli"); 
$comma_separated = implode(",", $array) 
$sql = "UPDATE books SET year = '2001-11-11' WHERE title is in (" . $comma_separated .")" 
+0

你沒有引用字符串,目前不會工作。 – 2010-05-14 23:12:23

1

什麼

$sql = "UPDATE books SET year = '2001-11-11' WHERE title in ('".implode("','",$titles)."')"; 
+1

忘記了第一個/最後一個引號,你的字符串看起來像:'WHERE title IN(bible','kafka','Book of Eli)' – 2010-05-14 23:11:58

+0

我想你錯過了開幕式和結束時間'內爆的價值。 – TooManyCooks 2010-05-14 23:12:03

+0

這是真的。固定。謝謝 – 2010-05-15 05:47:40