1

Такой вариант - работает:

$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

1 ответ 1

3

Постгрес тут не при чем. Именованные плейсхолдеры вида :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
8
  • Спасибо за помощь, сейчас попробую. Commented 10 янв. 2016 в 12:04
  • Да, Ваш вариант работает и в моих условиях. Я правильно понял, что это такой же 'защищенный' вариант, как и с bindParam и ничем не хуже ? Commented 10 янв. 2016 в 12:23
  • Так никаких условий особенных здесь и нету, все стандартно. Commented 10 янв. 2016 в 12:25
  • Я имел ввиду, что можно на сервер отправить не массив, а готовую строку '114,116,118' и подставить в запросе UPDATE ... IN (".$proba.") , но это не рекомендуют, сори, нет опыта. Commented 10 янв. 2016 в 12:35
  • А, это конечно. Не то что не рекомендуют, а в принципе запрещено. Commented 10 янв. 2016 в 12:36

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.