准备好的语句添加了大量的代码......但我一直听到提到使用它们......从1行代码到6行代码增加了什么价值?这只是为了防止sql注入吗?
类似文章here。
php.net关于准备好的陈述here
答案 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行:一行准备语句,一行绑定参数。即使您没有使用预准备语句,也需要您编写的任何其他代码(执行查询,绑定结果,获取结果等)。
所以从本质上讲,我们正在讨论一个额外代码行购买的内容。它给你买了两件东西:
第2点可能并不总是适用,但考虑到#1点还可以省去手动转义要在查询中注入的值的必要的问题。如果不使用预准备语句,这将是您需要自己编写的附加代码(即使您可以在同一行上进行内联)。
在我看到的情况下,我们可以得出结论,通过准备好的陈述,您最终可以获得安全性并且可能免费 。