В руководстве по PHP указано, что:
PDO :: ATTR_EMULATE_PREPARES Включает или отключает эмуляцию подготовленных
заявления. Некоторые драйверы не поддерживают готовые заявления или
имеют ограниченную поддержку для них. Используйте эту настройку, чтобы заставить PDO либо
всегда подражать подготовленным высказываниям (если ИСТИНА), или пытаться использовать нативный
подготовленные заявления (если ЛОЖЬ). Это всегда будет отступать к эмуляции
подготовленное заявление, если водитель не может успешно подготовить
текущий запрос Требуется bool.
У меня есть запрос, который выглядит так:
$type = PDO::PARAM_INT;
if($_POST['code'] == "") $type = PDO::PARAM_NULL;
$stmt = $dbh->prepare("UPDATE Product SET code=? WHERE id=?");
$stmt->bindValue(1, $_POST['code'], $type);
$stmt->bindValue(2, $_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
Я понимаю, что без установки следующего утверждения я получу '0'
вместо значения NULL
(когда $_POST['code'] == ""
) в мою базу данных, используя код выше. Почему это так?
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
UPDATE:
Хотя отключение эмуляции работает для меня, я бы предпочел использовать его, потому что, как и ОП в этом вопросе , в основном все мои запросы выполняются только один раз за выполнение скрипта. Таким образом, подготовка отчетов не дает мне никакого преимущества и создает ненужные обращения к базе данных, как показано в общем журнале запросов ниже:
Emulation Disabled
22 Connect user@localhost on Database
22 Prepare UPDATE Product SET code=? WHERE id=?
22 Execute UPDATE Product SET code='abc' WHERE id='123'
22 Close stmt
22 Quit
Emulation Enabled
22 Connect user@localhost on Database
22 Query UPDATE Product SET code='abc' WHERE id='123'
22 Quit
Любая помощь в решении проблемы NULL
приветствуется.