我有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。
有人可以解释原因吗?
答案 0 :(得分:0)
不需要引用准备语句的参数;驱动程序会自动处理此问题。
引号的目的是从查询的其余部分分隔字符串数据,因为它不容易分开(与数字有明显的格式不同)。由于使用预准备语句意味着查询和数据是单独传递的,所以引号是不必要的。
答案 1 :(得分:0)
预处理语句的一个优点是可以为您处理类型(有点......)。换句话说,准备好的语句允许MySQL(或任何RDBMS)决定如何处理数据。在加上引号时,会强制它成为一个没有意义的字符串。如果它应该是一个字符串,那么服务器将处理它。