什么时候在PHP中准备好的pdo语句中引用必要?

时间:2010-02-06 04:44:12

标签: php pdo prepared-statement

这是来自这个答案的评论,但我真的不明白他的意思:

How to change from mysql to pdo using prepared statements in PHP?

2 个答案:

答案 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将模拟该功能。事情开始让人感到困惑,但你可以放心地忘记它,只记得使用带参数的预准备语句。