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

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

PDOStatement::bindValue ( $parameter, $value [,$data_type = PDO:: PARAM_STR ] )

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

например, если у вас есть эти запросы через

3 ответов


Я не PDO-эксперт, но я могу придумать несколько сценариев, где параметр 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); 

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

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

когда параметр не привязан к castable data

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

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 и передадите логическое значение, он преобразует его в long.
  • Если вы скажете ему PDO:: PARAM_BOOL и передадите его долго, он преобразует его в логическое значение.

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