Вопрос

А PdoStatement :: BindValue () Метод предлагает способ указать тип границы переменной:

PdoStatement :: BindValue ($ parameter, $ value [, $ 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, я не совсем знаю, как это будет работать на других RDBM), знает, как преобразовать строку в целое число перед ее использованием.

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

Это было полезно?

Решение

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

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

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

Ref: 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); 

СУБД без неявного кастинга

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

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

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

Ref: Причины для твердого типа параметров в 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..."

Другие советы

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

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

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

  • Если вы скажете это pdo :: param_str, он преобразует ваше значение в строку.
  • Если вы скажете это PDO :: PARAM_INT, и вы передаете логическое, он преобразует его в долгое время.
  • Если вы скажете это pdo :: param_bool, и вы передаете его долго, он преобразует его в логическое.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top