准备好的陈述 - 是否必要

时间:2011-09-11 19:24:24

标签: php mysqli

准备好的语句添加了大量的代码......但我一直听到提到使用它们......从1行代码到6行代码增加了什么价值?这只是为了防止sql注入吗?

类似文章here

php.net关于准备好的陈述here

2 个答案:

答案 0 :(得分:6)

Prepared语句提供了针对SQL注入的出色保护。

除了SQL注入保护之外,当多次执行相同的查询时,预准备语句可以减少数据库服务器上的负载,例如在INSERT循环中。该语句仅由RDBMS编译一次,而不是每次都需要在mysql_query()调用中进行编译。

不同的API需要不同数量的代码才能执行预准备语句。我发现PDO可能比MySQLi稍微冗长,例如你的情况允许在execute()调用中使用隐式参数绑定。这只有在你的所有参数都可以被评估为字符串的情况下才有效。

// PDO implicit binding example:
// Not many lines of code if the situation allows for it
$stmt = $pdo->prepare("SELECT * FROM tbl WHERE col1=? AND col2=? AND col3=?");
$stmt->execute(array($val1, $val2, $val3));

答案 1 :(得分:3)

说准备好的语句导致1行代码爆炸到6是不公平的。实际上,使用一行代码只需要2行:一行准备语句,一行绑定参数。即使您没有使用预准备语句,也需要您编写的任何其他代码(执行查询,绑定结果,获取结果等)。

所以从本质上讲,我们正在讨论一个额外代码行购买的内容。它给你买了两件东西:

  1. 防止sql注入(其中还包括防止非恶意格式错误的查询,例如,如果注入的变量包含单个引号,则防止查询中断)
  2. 如果您最终为不同的注入值执行相同的预准备语句,则可能会带来性能优势。
  3. 第2点可能并不总是适用,但考虑到#1点还可以省去手动转义要在查询中注入的值的必要的问题。如果不使用预准备语句,这将是您需要自己编写的附加代码(即使您可以在同一行上进行内联)。

    在我看到的情况下,我们可以得出结论,通过准备好的陈述,您最终可以获得安全性并且可能免费