【发布时间】:2010-02-06 04:44:12
【问题描述】:
来自这个答案下的评论,但我真的不明白他的意思:
How to change from mysql to pdo using prepared statements in PHP?
【问题讨论】:
-
如果你使用 $dbh->query() 你仍然需要引用,因为它不是一个准备好的语句(与 PDO 类有关)
标签: php pdo prepared-statement
来自这个答案下的评论,但我真的不明白他的意思:
How to change from mysql to pdo using prepared statements in PHP?
【问题讨论】:
标签: php pdo prepared-statement
使用准备好的语句时,您无需手动转义/引用 dbms(解析器)的字符串参数。
该评论涉及http://docs.php.net/pdo.prepared-statements:
准备好的语句非常有用,以至于它们是 PDO 将为不支持它们的驱动程序模拟的唯一功能。即如果驱动程序不支持准备好的语句,PDO 仍将公开 api 的准备语句部分并将它们“翻译”为包含参数的 sql 语句(例如
INSERT INTO foo (x,y,z) values(1,2,3))。但它会透明地这样做,即它会自动处理报价。
【讨论】:
准备好的语句是准备好的,因为您为 PDO 创建标记以插入值,并且这些值可以命名(例如,:accountId、:url),PDO 将在其中找到命名标记,或位置(特别是问号 ( ?)) PDO 将按照放置标记的顺序插入值。
例如:
$query = "SELECT user_id FROM users WHERE username = ?"; $statement = $pdo->prepare($query); $statement->execute(array("John Smith"));请注意明显缺少命名参数(特别是使用 ? 代替 :username),而是使用位置样式。虽然我发现在调试时使用命名参数更清晰,但使用其中一个纯粹是个人选择。
无论如何。这意味着如果您使用准备好的语句,您不必引用,并且您不必担心使用准备好的语句时的 SQL 注入。
现在,真正发生的是 PDO 要求数据库驱动程序(MySQL、PostgreSQL、MS SQL、Oracle 等)准备语句,但如果数据库驱动程序无法准备它,PDO 将模拟该功能。这就是事情开始变得混乱的地方,但您可以放心地忘记它,只记得使用带参数的准备好的语句。
【讨论】: