为什么我不能用引号编写PDO预处理语句?

时间:2011-11-20 10:56:13

标签: php pdo prepared-statement

我有PDO prepared statements的以下代码:

$stmt = $conn->prepare('SELECT `myColumn1` FROM my_table '.
                       'WHERE `myColumn2`=:val LIMIT 1');
$stmt->bindValue(":val", $value);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

这很好用。它发送以下查询:

113 Query   SELECT `myColumn1` FROM my_table WHERE `myColumn2`=":val" LIMIT 1

并返回正确的值。

但如果我将第一行改为

,它就不起作用
$stmt = $conn->prepare('SELECT `myColumn1` FROM my_table '.
                       'WHERE `myColumn2`=":val" LIMIT 1');

$stmt = $conn->prepare('SELECT `myColumn1` FROM my_table '.
                       'WHERE `myColumn2`=':val' LIMIT 1');

发送相同的查询,但PDO返回false。

有人可以解释原因吗?

2 个答案:

答案 0 :(得分:0)

来自the page you quote

  

不需要引用准备语句的参数;驱动程序会自动处理此问题。

引号的目的是从查询的其余部分分隔字符串数据,因为它不容易分开(与数字有明显的格式不同)。由于使用预准备语句意味着查询和数据是单独传递的,所以引号是不必要的。

答案 1 :(得分:0)

预处理语句的一个优点是可以为您处理类型(有点......)。换句话说,准备好的语句允许MySQL(或任何RDBMS)决定如何处理数据。在加上引号时,会强制它成为一个没有意义的字符串。如果它应该是一个字符串,那么服务器将处理它。