Как определить тип переменной в PDOStatement::bindValue()?


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

PDOStatement::Значение привязки ($параметр, $значение[, $тип_данных=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, я действительно не знаю, как это будет работать с другими СУБД) знает, как преобразовать строку обратно в целое число перед ее использованием.

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

Author: Adrian Cid Almaguer, 2011-09-07

3 answers

Я не специалист по 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); 

СУБД без неявного литье

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

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

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

Ссылка: Причины строгого ввода параметров в 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..."
 7
Author: Ivar Bonsaksen, 2017-05-23 12:34:02

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

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

 3
Author: Brent Baisley, 2011-09-10 17:01:49

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

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

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

 1
Author: FtDRbwLXw6, 2017-05-23 11:43:22