2013-05-26 57 views
5

我有这个问题来清除事情。我阅读了一些文档和评论,但仍有些不够清楚。PDO与MYSQLI,PrepaStatemens和绑定参数

  • 据我所知,PDO提供了更多的驱动程序,如果您改变数据库类型,肯定会带来更多的驱动程序。
  • 作为另一个帖子说,PDO犯规提供真正准备好的声明,但mysqli的不那么这将是安全使用mysqli的
  • 基准长相相似,(没有测试它自己,但检查各地在网络上几个基准)
  • 由于mysqli正在迎头赶上,所以面向对象并不是我的问题。但是,将过程mysqli与PDO进行基准比较会更好,因为程序应该稍微快一点。

但是,这里是我的问题,与准备好的声明,我们必须使用参数绑定与我们在声明中使用的数据?好的做法还是必须的?如果您多次运行相同的查询,但是它足以确保查询本身,我知道准备好的语句具有良好的性能 - 明智吗?或绑定参数是必须的?绑定参数到底是如何工作的以及如何保护sql注入的数据?如果您对我上面的陈述有任何误解,我们也将不胜感激。

感谢

+0

[您是否应该使用准备好的语句进行转义?](http://stackoverflow.com/a/16365669/285587) –

+0

什么是PDO不支持本地预处理语句?它必须被删除或至少downvoted –

+0

http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection,Quote =>“要实现这里重要的事情默认情况下,PDO不会执行准备好的语句,而是模拟它们(对于MySQL)。“,可能会误解我的意思...... – Leon

回答

4

总之,

  • 绑定是必须,被保护的基石,不管它是由本地驱动程序或不支持。这是重要的替代想法。
  • 除了少数边缘情况之外,其差异在安全性和性能上可以忽略不计。
  • 性能是最后要考虑的事情。没有任何API比其他API慢得多。它不是一个类或函数,可能会导致任何性能问题,但数据操作或错误的算法。优化您的查询 - 有一种方法可以去 - 不仅仅是调用它们的函数。
  • 如果您打算使用原始裸API,那么PDO是唯一的选择。被封装在更高层次的类中,mysqli似乎更适合于mysql。
  • mysqli和PDO都缺少开发人员自己写的重要文字的绑定,例如safeMysql
+0

如果我们正确地使用预先准备的语句并按照预期绑定参数,那么我们仍然考虑使用这个safeMysql或创建我们自己的类?我明白这对于“方便是有好处的,因为它使得应用程序代码简洁而有意义,没有无用的重复,使其在其网站上提到的额外干燥”。 – Leon

+0

因为“mysqli和PDO都缺少重要文字的绑定” - 例如标识符。尝试在mysqli或PDO中绑定字段名称,然后参阅。 IN声明也可能成为一个问题。 safeMysql类的主要思想是为可能添加到查询中的* everything *提供一个占位符,不仅可以像mysqli那样使用1或2个数据类型。 –