Выбор строк, где поле имеет нулевое значение, используя подготовленные инструкции PHP PDO и MySQL

Я конвертировал приложение, чтобы использовать подготовленные инструкции 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, поэтому, если имеет смысл включить в ваш ответ, я бы очень признателен за некоторые разъяснения по этому вопросу …

Solutions Collecting From Web of "Выбор строк, где поле имеет нулевое значение, используя подготовленные инструкции PHP PDO и MySQL"

Оказывается, это была комбинация некоторых ответов на этот вопрос: как вставлять значения 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); 

для проверки нулевых значений.