如何在PDOStatement :: bindValue()中定义变量类型?

Ben*_*min 9 php sql pdo pdostatement bindvalue

PDOStatement对象:: bindValue()方法提供了一种方式来指定绑定的变量的类型:

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

我想知道,指定数据类型的目的是什么,而当作为default(PARAM_STR)离开时,数据库最终会在使用它之前将值转换为正确的类型?

例如,如果您对INTEGER字段进行了以下查询:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;
Run Code Online (Sandbox Code Playgroud)

并且您在PHP中绑定一个整数,PDO默认将它绑定为一个字符串,这相当于:

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;
Run Code Online (Sandbox Code Playgroud)

这将完美地工作,因为SQL数据库(至少MySQL,我真的不知道它将如何在其他RDBMS上工作)知道如何在使用它之前将字符串转换回整数.

有哪些用例会对绑定的类型参数与字符串产生影响?

Iva*_*sen 7

我不是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); 
Run Code Online (Sandbox Code Playgroud)

例#5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 
Run Code Online (Sandbox Code Playgroud)

没有隐式转换的DBM

在这个问题的另一个答案中解释......

当参数未绑定到可转换数据时

即使具有强制转换能力的数据库也无法始终正确地转换变量.

参考:在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..."
Run Code Online (Sandbox Code Playgroud)