2010-05-14 5 views
0

Я использую Postgresql + PHP.Как обновить несколько строк одним запросом

Скажем, у меня есть эта таблица:

Books (id, title, year) 

и этот массив названий в PHP:

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

теперь я хочу обновить все строки, в которых заголовок находится в массиве $ названий выше.

Так мне нужен запрос, как это:

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

Является ли это возможно с помощью одного запроса? Или мне нужно использовать цикл FOR?

+0

Вы обновляя дату на ту же величину в все случаи, когда заголовок находится в массиве или разные названия имеют разные даты? – TooManyCooks

+0

да, это только пример :) – xRobot

ответ

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) . "');'"; 

implode() функция PHP присоединяется массив элементы вместе, используя строку, поэтому я положил ',' между всеми из них, причем исходный и окончательный ' были помещены в строку вручную.

Обратите внимание, что это произойдет, если какой-либо из названий содержит апостроф. Если это возможно, вам нужно будет избежать этого.

+0

Похоже, вы избили меня на почту. –

+0

Хороший ответ, но в руководстве php говорится: «Строка запроса не должна заканчиваться точкой с запятой». –

+0

НЕ ЗАБЫВАЙТЕ, чтобы вызывать pg_escape_string() для этих титров, прежде чем их использовать! – intgr

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

Вы не цитировали строки, в настоящее время не работали. –

1

Что о

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

Забыл первый/последний кавычки, ваша строка будет выглядеть так: 'WHERE title IN (библия ',' kafka ',' Book of Eli)' –

+0

Я думаю, вы пропустили открытие и закрытие 'у вас есть между вложенные значения. – TooManyCooks

+0

Thats true. Исправлена. благодаря –

Смежные вопросы