【发布时间】:2012-07-01 22:09:10
【问题描述】:
从现在开始,我一直在使用旧的 mysql 而不是 PDO,并且我已经看到了很多建议为什么要切换到 PDO,但也有许多不同的事实(也在这里),例如:
- 声明
PDO稍快/稍慢 - 说
PDO有助于防止 SQL 注入,但前提是您使用准备好的查询 - 还说使用准备好的查询很糟糕,因为它太慢了
那么,什么是真实的?尤其是使用PDO 时的最佳实践是什么?速度和安全性都很重要——如何在保持快速查询的同时最好地保护自己免受 SQL 注入?
【问题讨论】:
-
为什么“老”在引号里?它是旧的,也被弃用了。
-
方便。一切都是为了方便。使用准备好的语句可以为您节省繁琐的手动转义部分。这是一个副作用,但几乎消除了 SQL 注入。您仍然会在某些时候连接动态查询,因此忽略转义和上下文不是一种选择。但准备好的陈述涵盖了大多数情况。 -- 是否更快取决于您当前的设置和使用情况,只有分析器才能判断,而不是 meme。
-
我知道使用
PDO::quote(),这取决于你在做什么。我认为让您理解这一点的最佳方法是了解准备好的语句实际上 做什么 - 他们将查询发送到数据库服务器进行解析和准备,然后当您调用execute()他们发送数据这将用于占位符并检索结果。因此,对于只运行一次的语句,这是更多的数据库流量,它会(非常非常轻微地)减慢速度...... -
...但是(一个常见的例子)对于许多使用略有不同数据的
UPDATEs,它可以大大加快速度,因为查询被解析并且执行计划只设计一次,唯一的变体是执行期间使用的数据。 -
PDO::quote() 不仅会转义字符串,还会引用它。另一方面, mysql_real_escape_string() 只会转义字符串。始终建议使用准备好的语句而不是 PDO::quote() 和 mysql_real_escape_string()。
标签: php mysql database pdo database-connection