Как определить тип переменной в 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 не создаст исключение или ошибку, если вы передадите данные с типом, который не соответствует переданному типу данных.