Intereting Posts
Как безопасно поддерживать связь между PHP и WCF single Вставить запрос для вставки нескольких строк в один столбец Как отсортировать массив по определенному ключу? Удалите автоматически добавленную <p> со страницы, которая не имеет литерального содержимого (использует короткие коды) Синхронизировать в php или zend framework Достаточно ли проверять достоверность идентификатора $ _GET в базе данных? хранить временную строку AM PM в типе данных TIME в MySQL и получать с AM PM во время отображения? прокрутка пейджера прокрутки В Yii2 Лучшая практика для генерации случайного токена для забыли пароль CakePHP 2.1 Ошибки проверки Ajax Включите «требуемые вопросы» в случайном порядке mysql_query () ожидает, что параметр 2 будет ресурсом, boolean given Laravel 5 не работает на общем хостинге Как избежать добавления одного и того же шаблона навигатора на каждую страницу .html Ошибка анализа на взрыве ('-', 'foo-bar') (например)

Как связать значение, если я хочу, чтобы он принимал INT и NULL с PDO?

$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' ); $stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT ); 

У меня есть код выше. Если папка имеет parent_folder_id, значит, она находится внутри другой папки. Если этот столбец равен NULL, это означает, что это корневая папка.

Из моего понимания, если $ folder_id имеет значение NULL, тогда он будет рассматривать его как 0 (поэтому я не получаю никаких результатов с кодом, поскольку это потому, что значение в этом столбце равно NULL, а не 0). Если я изменю третий аргумент на PDO :: PARAM_NULL, я до сих пор не получаю никаких результатов. Я считаю, что это потому, что он оценивает запрос как «WHERE parent_folder_id = NULL», который не совпадает с «WHERE parent_folder_id NULL».

Есть ли способ, чтобы PDO относился к этому правильно или мне нужно создать инструкцию SQL с помощью встроенного, если изменить «=» на «is» и заменить третий параметр bindValue на правильный?

Solutions Collecting From Web of "Как связать значение, если я хочу, чтобы он принимал INT и NULL с PDO?"

Если вы используете MySQL, вы можете использовать нестандартный NULL-безопасный равный оператор <=> , который может сравнивать либо нулевые, либо ненулевые значения.

 $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id <=> :id' ); $stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT ); 

Этот оператор всегда возвращает true или false, а не NULL, что вы получаете, если пытаетесь сравнить что-либо с NULL с equals = .

ANSI SQL определяет предикат IS [NOT] DISTINCT FROM который работает аналогично, но он не поддерживается всеми поставщиками (пока).

Вы можете использовать NULL-безопасный равный оператор , <=> . Ваш запрос должен быть SELECT id, name FROM folders WHERE parent_folder_id <=> :id

Если вы когда-либо переходите на другую базу данных и вам нужно обновить запрос, у некоторых из них есть NOT DISTINCT FROM который делает примерно то же самое.

Может быть, это ?

 <?php $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' ); if (is_null($folder_id)) { $stmt->bindParam( ':id',null, PDO::PARAM_NULL ); } else { $stmt->bindParam( ':id', $folder_id, PDO::PARAM_INT ); } 

Не проверено

РЕДАКТИРОВАТЬ :

Что-то вроде этого:

  <?php if (is_null($folder_id)) { $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id IS NULL' ); } else { $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' ); $stmt->bindParam( ':id', $folder_id, PDO::PARAM_INT ); } 

Я знаю, что это не оптимально, но PDO по-прежнему глючит …