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上工作)知道如何在使用它之前将字符串转换回整数.
有哪些用例会对绑定的类型参数与字符串产生影响?
我不是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
在这个问题的另一个答案中解释......
当参数未绑定到可转换数据时
即使具有强制转换能力的数据库也无法始终正确地转换变量.
$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)
归档时间: |
|
查看次数: |
4379 次 |
最近记录: |