Я конвертировал приложение, чтобы использовать подготовленные инструкции PDO, а не mysqli, и у меня возникает странная проблема. У меня есть некоторые записи в базе данных, где ожидается, что поле будет null. Не 'null' (строка), или '' (пустая строка), но NULL. Я строю свои запросы динамически, поэтому в прошлом, когда я сталкивался с нулевой переменной в объекте, я бы построил запрос следующим образом:
WHERE fieldName is null;
И получил ожидаемые результаты, когда поле было нулевым.
Теперь с PDO мои запросы не возвращают никаких результатов, и я не получаю никаких ошибок. Это просто не возвращает записи, которые я ожидал бы. Когда я повторяю построенные запросы и запускаю их непосредственно в MySQL, я получаю ожидаемые результаты, но в приложении результаты не возвращаются.
Некоторые из вещей, которые я пробовал, включают в себя построение запросов, которые выглядят так:
WHERE fieldName is null;
или
WHERE fieldName <=> null;
Я также попробовал стандартное подготовленное заявление:
WHERE fieldName = :fieldName
и затем привязка к этим типам заявлений:
$stmt->bindParam(":$field", $value); $stmt->bindParam(":$field", $value, PDO::PARAM_NULL); $stmt->bindParam(":$field", null, PDO::PARAM_NULL); $stmt->bindValue(":$field", null, PDO::PARAM_NULL); $stmt->bindValue(":$field", null, PDO::PARAM_INT);
Любая помощь с этим была бы весьма признательна. Моя PHP-версия – 5.3.10, а MySQL – 5.5.22. Как побочный вопрос, я до сих пор неясно, в чем разница между bindParam и bindValue, поэтому, если имеет смысл включить в ваш ответ, я бы очень признателен за некоторые разъяснения по этому вопросу …
Оказывается, это была комбинация некоторых ответов на этот вопрос: как вставлять значения NULL с помощью PDO? (как указал Джон)
Мне нужно было изменить свое предложение:
WHERE fieldName is :fieldName;
Затем передайте массив функции field => функции execute:
$binds = array(); foreach ($wheres as $where) { $field = $where['field']; $value = $where['value']; $binds[":$field"] = $value; } $stmt->execute($binds);
Запрос не будет работать вообще с bindValue, даже изменив предложение where. Кто-нибудь знает, почему привязка не работает, но этот другой метод сделал?
Различный вопрос, но здесь все азерсы: Как вставить значения NULL с помощью PDO?
Подвести итог:
$stmt->bindValue(':param', null, PDO::PARAM_INT);
Должен работать. Вы также можете использовать:
$stmt->execute( array(":param" => NULL));
Для bindparam вы должны указать значение в переменной (не константе), bindvalue, вы можете использовать константы и т. Д.
В MySql вы можете использовать запрос
select * from atable where isnull(column_name);
для проверки нулевых значений.