Такой вариант - работает:
$proba = "114";
$up1 = $conn->prepare("UPDATE b1d SET mycolumn = TRUE WHERE id_b IN (:id_b);");
$up1->bindParam(':id_b', $proba);
Если $proba = "114,116,118";, то уже не работает.
Как правильно сделать?
PostgreSQL 9.2.4, compiled by Visual C++ build 1600, 32-bit
aleksandr barakin
68.8k243 золотых знака82 серебряных знака231 бронзовый знак
задан 10 янв. 2016 в 10:25
Alex
6442 золотых знака5 серебряных знаков21 бронзовый знак
1 ответ 1
Постгрес тут не при чем. Именованные плейсхолдеры вида :name - это фишка PDO.
Поскольку плейсхолдер в PDO может представлять только строковый или числовой литерал, то каждое значение должно быть представлено собственным плейсхолдером. То есть, запрос должен получиться вида
IN (?,?,?)
и при исполнении в него должны передаваться значения по отельности. Это можно сделать таким кодом:
$proba = array(114,116,118);
$in = str_repeat('?,', count($proba) - 1) . '?';
$sql = "UPDATE b1d SET mycolumn = TRUE WHERE id_b IN ($in)";
$stmt = $conn->prepare($sql)->execute($proba);
Не слшком красиво, но других вариантов, увы, нет.
ответ дан 10 янв. 2016 в 11:16
Ипатьев
21.5k4 золотых знака30 серебряных знаков54 бронзовых знака
-
Спасибо за помощь, сейчас попробую.Alex– Alex2016年01月10日 12:04:34 +00:00Commented 10 янв. 2016 в 12:04
-
Да, Ваш вариант работает и в моих условиях. Я правильно понял, что это такой же 'защищенный' вариант, как и с bindParam и ничем не хуже ?Alex– Alex2016年01月10日 12:23:51 +00:00Commented 10 янв. 2016 в 12:23
-
Так никаких условий особенных здесь и нету, все стандартно.Ипатьев– Ипатьев2016年01月10日 12:25:08 +00:00Commented 10 янв. 2016 в 12:25
-
Я имел ввиду, что можно на сервер отправить не массив, а готовую строку '114,116,118' и подставить в запросе UPDATE ... IN (".$proba.") , но это не рекомендуют, сори, нет опыта.Alex– Alex2016年01月10日 12:35:53 +00:00Commented 10 янв. 2016 в 12:35
-
А, это конечно. Не то что не рекомендуют, а в принципе запрещено.Ипатьев– Ипатьев2016年01月10日 12:36:46 +00:00Commented 10 янв. 2016 в 12:36
Начните задавать вопросы и получать на них ответы
Найдите ответ на свой вопрос, задав его.
Задать вопросdefault