2017-02-04 9 views
1

При подготовке запроса SQL с помощью PDO, должен/я должен сделатьДолжен/Должен ли я использовать PDO :: PARAM_NULL при привязке значения, которое равно null?

$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR); 

Или я могу просто использовать PDO::PARAM_INT или PDO::PARAM_STR непосредственно, потому что PDO цифры, что одного из них сама по себе? (Как это на самом деле, на самом деле следует, на мой взгляд)


И как любопытство прослеживания вопрос, если я не должны использовать PDO::PARAM_NULL, что это на самом деле для?

+0

Это должно быть легко проверить. Настройте таблицу с нулевым столбцом, затем выполните «INSERTs» в обоих направлениях. –

+0

В соответствии с [исходным кодом] (https://github.com/php/php-src/blob/master/ext/pdo/pdo_stmt.c) в функции 'really_register_bound_param' он либо преобразуется в' long', ' boolean' и 'string', если значение не является ничем. Таким образом, в какой-то мере бывает устаревшим использование константы 'PARAM :: TYPE', однако .. если PDO будет поддерживать другой тип db, который не позволяет' '' 'обрабатываться как' null' в 'null', это простое изменение для поддержки этой базы данных, если вы используете параметр. – Xorifelse

+0

@ RickJames Ну, вот почему я спрашиваю, потому что это кажется * работать без него. Так что интересно, есть ли какие-либо проблемы с краем или возможные проблемы, с которыми я мог столкнуться, если я * не * использую его. – Svish

ответ

0

Идея PDO заключается в том, что вы можете использовать 1 API для связи с различными базами данных, а это значит, что можно обрабатывать значение, отличное от другого. Например MySQL может обрабатывать значение столбца целого типа в качестве как целое числа и строки:

INSERT INTO table (col_type_int) VALUES (1) 
INSERT INTO table (col_type_int) VALUES ('1') 

Этот запрос будет выполнять оба способа правильно MySQL, но другая база данных могут быть более конкретными.

Так PDO::PARAM_TYPE просто добавляет еще один уровень строгости к запросу, чтобы обеспечить корректный перевод запроса для разных типов баз данных. В настоящее время единственными значениями, которые используются в source code, являются PDO_PARAM_STR, PDO_PARAM_INT и PDO_PARAM_BOOL. Остальные просто преобразуются в строку.

К добавлению PDO::PARAM_NULL к запросу только гарантирует, что если вы собираетесь использовать другой драйвер (который, возможно, еще не существует), который обрабатывает их по-разному, вам не нужно менять код, возможно, только запрос.

0

В теории PDO следует признать

$value = NULL; 
$query->bindValue('column', $value, PDO::PARAM_STR); 

и хранить NULL (не строку 'NULL', ни '') в заявлении. В частности, он должен иметь возможность генерировать

UPDATE ... SET `column` = NULL; 

из вышеперечисленного свяжите.

В этом случае ваш код «overkill».

+0

В этом случае мой код на самом деле нет, так как я этого не делаю; только в моем примере здесь – Svish