9

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

PDOStatement::bindValue ( $parameter , $value [, $data_type = 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,我真的不知道这将如何在其他 RDBMS 上工作)知道如何在使用之前将字符串转换回整数。

在哪些用例中,绑定类型参数与字符串会有所不同?

4

3 回答 3

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); 

示例#5

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

没有隐式转换的 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..."
于 2011-09-10T17:20:34.127 回答
3

这主要用于与需要正确键入的数据库进行交互。例如,如果您在 MySQL 中启用严格模式,当类型不匹配时,您将收到错误(查询失败)而不是警告。

默认情况下,MySQL 会尽力正确转换数据。但是,如果您曾经在日期字段中看到 0000-00-00,那很可能是 mysql 尝试将字符串转换为日期并失败的结果。在严格模式下,查询将失败,而不是尝试转换并使用任何结果。

于 2011-09-10T17:01:49.110 回答
1

PDOStatement::bindValue() 的数据类型参数并不是非常有用。本质上:

  • 如果您告诉它 PDO::PARAM_STR,它会将您的值转换为字符串。
  • 如果你告诉它 PDO::PARAM_INT 并且你传递一个布尔值,它会将它转换为一个长整数。
  • 如果你告诉它 PDO::PARAM_BOOL 并且你将它传递很长,它会将它转换为布尔值。

似乎没有其他任何东西被转换。请参阅此处以快速查看源代码和更好的解释。也许最重要的是,如果您传递的数据类型与您传递的数据类型不匹配,PDO 将不会引发异常或产生错误。

于 2011-09-10T16:27:48.697 回答