Почему эмуляция подготовленного оператора завершается ошибкой с нулем? - PullRequest
4 голосов
/ 20 ноября 2011

В руководстве по 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 приветствуется.

1 Ответ

5 голосов
/ 01 декабря 2011

Попробуйте связать null для PDO::PARAM_NULL.

$type = PDO::PARAM_INT;
if($_POST['code'] == "") {
    $_POST['code'] = null;
    $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();

На самом деле, кажется, вам не нужно использовать PDO::PARAM_NULL, код ниже также вставит null.

$stmt->bindValue(1, $_POST['code'] ? $_POST['code'] : null, PDO::PARAM_INT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...