Как определить тип переменной в PDOStatement :: bindValue ()? - PullRequest
9 голосов
/ 07 сентября 2011

Метод PDOStatement :: bindValue () предлагает способ указания типа связанной переменной:

PDOStatement :: bindValue ($ параметр, $ значение [, $ data_type = PDO :: PARAM_STR ])

Мне интересно, какова цель указания типа данных, тогда как при выходе из значения по умолчанию (PARAM_STR) в конечном итоге база данных в любом случае приведёт значение к нужному типу перед его использованием?

Например, если у вас есть эти запросы над полем INTEGER:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;

И вы связываете целое число в PHP, PDO по умолчанию связывает его как строку, что эквивалентно:

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;

Это будет работать безупречно, потому что база данных SQL (по крайней мере, MySQL, я не совсем понимаю, как это будет работать на других СУБД) знает, как преобразовать строку обратно в целое число перед ее использованием.

В каких случаях использовать разницу между типизированными параметрами и строками?

Ответы [ 3 ]

7 голосов
/ 10 сентября 2011

Я не эксперт по PDO, но могу вспомнить несколько сценариев, в которых параметр data_type полезен и даже необходим.

Выходные параметры

Когда вы определяете выходные или входные / выходные параметры, вы должны указать как тип, так и длину ожидаемого выходного параметра.

Ссылка: http://www.php.net/manual/en/pdo.prepared-statements.php

Пример # 4

$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

Пример # 5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

DBM без неявного приведения

Объясняется в другом ответе на этот вопрос ...

Когда параметр не привязан к преобразуемым данным

Даже базы данных со способностями приведения не всегда могут правильно преобразовать вашу переменную.

Ссылка: Причины для строгого ввода параметров в PDO?

$limit = 1;

$dbh->prepare("SELECT * FROM items LIMIT :limit");
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
// Will throw "You have an error in your SQL syntax..."
3 голосов
/ 10 сентября 2011

Это в основном для взаимодействия с базами данных, которые требуют правильной типизации.Например, если вы включите строгий режим в MySQL, вы получите ошибки (неудачные запросы) вместо предупреждений о несоответствиях типов.

По умолчанию MySQL делает все возможное для правильного преобразования данных.Но если вы когда-либо видели 0000-00-00 в поле даты, это, скорее всего, является результатом того, что mysql попытается преобразовать строку в дату и потерпит неудачу.В строгом режиме запрос не будет выполнен, вместо того, чтобы пытаться преобразовать и использовать любой результат.

1 голос
/ 10 сентября 2011

Параметр типа данных для PDOStatement :: bindValue () не очень полезен.По существу:

  • Если вы скажете ему PDO :: PARAM_STR, он преобразует ваше значение в строку.
  • Если вы сообщите ему PDO :: PARAM_INT и передадите логическое значение, он преобразуетв long.
  • Если вы передадите ему PDO :: PARAM_BOOL и передадите ему long, он преобразует его в логическое значение.

Похоже, больше ничего не конвертируется.Смотрите здесь для быстрого просмотра исходного кода и немного лучшего объяснения.Возможно, самое важное, что PDO не сгенерирует исключение или не выдаст ошибку, если вы передадите данные с типом, который не соответствует типу данных, который вы передали.

...