PDO execute() подставляет нули вместо переменных

230
30 сентября 2017, 23:22
> Что не так с кодом, почему при попытке использовать плейсхолдеры в базу в место каждого значения прилетает 0.
public static function set_data_test(){
  $sql = 'INSERT INTO messages (name, email, message) VALUES (name = :name, email = :email, message = :message)';
  $name ='vasia';
  $email = '@email';
  $message = 'some text';
  $link = self::$link;
  $res = $link->prepare($sql);
  $result = $res->execute(array('name' => $name, 'email' => $email, 'message' => $message));
  $count = $res->rowCount();
  return $result;
}
Answer 1

PDO всё верно подставляет куда требуется.

Смотрим внимательнее в запрос:

INSERT INTO messages (name, email, message) 
    VALUES (name = :name, email = :email, message = :message)

Что такое name = :name? Я действительно сильно удивился отсутствию ошибки разбора запроса. Оказалось да, так можно. Эффект полностью логичный, специфичный для крайне вольно работающего с типами mysql.

В values можно сослаться на значение колонки (вероятно на дефолтное значение или before trigger). С values можно делать подзапросы и любые вычисления.

То есть в колонку name вы говорите вставить значение выражения name = :name, дефолтное значение для name очевидно не равно передаваемому значению, т.е. false, который приводится к 0. Вот этот ноль и наблюдаем в результате.

sqlfiddle с демонстрацией

Answer 2

Если верить примерам в документации, то не хватает точек:

$result = $res->execute(array(':name' => $name, ':email' => $email, ':message' => $message));
                               ^--               ^--                 ^--

и сам запрос должен быть

INSERT INTO messages (name, email, message) VALUES (:name, :email, :message);

а не name = :name, email = :email, message = :message

READ ALSO
Поиск по многомерному массиву php

Поиск по многомерному массиву php

ЗдравствуйтеИмеется массив такого вида:

319
Работа return в рекурсивной функции php

Работа return в рекурсивной функции php

Доброго времени сутокЕсть код

208
Не получается добавить custom order item data woocommerce

Не получается добавить custom order item data woocommerce

На странице продукта(отеля) есть пять кнопок ADD TO CART, все они кастомные и на первой из них висит шорткод:

225
Модуль PHP7 не подключается к Apache

Модуль PHP7 не подключается к Apache

В файле httpdconf прописываю

197