Как определить тип переменной в 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, я действительно не знаю, как это будет работать с другими СУБД) знает, как преобразовать строку обратно в целое число перед ее использованием.
Каковы варианты использования, в которых это будет иметь значение для связанных типизированных параметров и строк?
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..."
Это в основном для взаимодействия с базами данных, которые требуют правильного ввода. Например, если вы включите строгий режим в MySQL, вы получите ошибки (неудачные запросы) вместо предупреждений при несоответствии типов.
По умолчанию MySQL делает все возможное для правильного преобразования данных. Но если вы когда-либо видели 0000-00-00 в поле даты, это, скорее всего, результат того, что mysql пытается преобразовать строку в дату и терпит неудачу. В строгом режиме запрос завершится неудачно, вместо того чтобы пытаться преобразуйте и используйте любой результат.
Параметр типа данных для PDOStatement::bindValue() не очень полезен. По существу:
- Если вы скажете ему PDO::PARAM_STR, он преобразует ваше значение в строку.
- Если вы скажете ему PDO::PARAM_INT и передадите логическое значение, оно преобразует его в long.
- Если вы скажете ему PDO::PARAM_BOOL и передадите ему длинный, он преобразует его в логическое значение.
Кажется, больше ничего не преобразовано. Смотрите здесь для быстрого ознакомления с исходным кодом и немного лучшего объяснения. Возможно, самое главное, PDO не создаст исключение или не выдаст ошибку, если вы передадите данные с типом, который не соответствует переданному вами типу данных.