这是来自这个答案的评论,但我真的不明白他的意思:
How to change from mysql to pdo using prepared statements in PHP?
答案 0 :(得分:1)
使用预准备语句时,您永远不必手动转义/引用dbms(解析器)的字符串参数 该评论涉及http://docs.php.net/pdo.prepared-statements:
准备好的语句非常有用,它们是PDO为不支持它们的驱动程序模拟的唯一功能。I.e。如果驱动程序不支持预处理语句,PDO仍会公开api的prepare语句部分,并将它们“翻译”为包含参数的sql语句(例如
INSERT INTO foo (x,y,z) values(1,2,3)
)。但它会透明地这样做,即它会自动处理引用。
答案 1 :(得分:1)
准备好准备语句是因为您为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将模拟该功能。事情开始让人感到困惑,但你可以放心地忘记它,只记得使用带参数的预准备语句。