MySQL PHP PDO准备语句 - 性能问题与安全性

nem*_*zny 7 php mysql pdo prepared-statement

我正在考虑使用InnoDB(现在的mysql_query和MyISAM)为我的PDO和事务重写一些开源应用程序.

我的问题是:哪些案例使用准备好的陈述是合理的?

因为我正在阅读的所有地方(即使在这里的许多帖子中)都说明了我应该每次都使用预备语句,因为1.安全性和性能.甚至PHP手册也建议使用预处理语句,而不是提及escape-thing.

你不能否认安全机制.但是想到它一遍又一遍地想到每次都必须准备语句然后再使用一次......这没有意义.虽然必须在单个语句中插入1000次一些变量,但这很有意义,但很明显.但这不是普通的电子商店或董事会的基础.

那么如何克服这个呢?我可以在整个应用程序范围内准备我的陈述并具体命名吗?我可以准备几个不同的陈述并按名称使用它们吗?因为这是我想到的唯一合理的解决方案(除了1000x之外).

我发现有一个名为$ pdo-> quote的mysql_real_escape以及单个查询的目的.为什么不用这个呢?为什么要打扰准备?

你觉得这篇优秀的文章怎么样? http://blog.ulf-wendel.de/2008/pdo_mysqlnd-prepared-statements-again/

您是否同意准备声明所产生的开销?

谢谢

Syl*_*rag 9

我认为这属于"过早优化"类别.

开销有多大?你测量过吗?它会影响您的服务器性能吗?

可能性不大.


从好的方面来说,你在安全方面有一个不可否认的收益(这应该是任何基于互联网的商店的主要关注点).

在缺点方面,您可能会遇到影响性能的风险.在您提供的链接中,它表明在某些情况下,执行不当的PDO准备会导致性能略低于未准备好的语句.5000次运行的性能差异为0.298秒.

微不足道.当你意识到"未准备好"的查询是在没有输入清理程序的情况下运行时更是如此,这些程序需要在现场环境中使它们安全.如果您不使用准备好的查询,则需要某种形式的输入清理以防止SQL攻击,并且根据其执行方式,您可能需要按摩结果集.

最重要的是,没有明显的性能问题,但有一个显着的安全性好处.因此官方建议使用准备好的陈述.

在你的问题中,你谈到"共同的电子商店".如果有的话,"普通电子商店"将永远不会有足够的流量来担心性能问题.另一方面的安全问题......

  • 然后为您的问题提出合理的案例.你有没有测量过表现?它会以任何方式影响您的网站运行方式吗?不,因为你还没有建造它.然而,你担心可能会浪费几分钟......这怎么不是过早优化?有关更多说明,请参阅编辑. (3认同)

Mik*_*e B 7

我的问题是:哪些案例使用准备好的陈述是合理的?

他们都是.社区公开反对使用mysql_*功能.

注意:建议的替代方案

不鼓励使用此扩展名.相反,应该使用MySQLi或PDO_MySQL扩展.另请参见MySQL:选择API以获取更多信息.

该功能的替代方案包括:

资源

但是想到它一遍又一遍地想到每次都必须准备语句然后再使用一次......这没有意义

你正在买一辆美洲虎的Geo,你抱怨你不喜欢美洲虎,因为你并不总是使用座椅加热器.您不必始终如一地使用库的每个功能来表示它是好的.

我发现有一个名为$ pdo-> quote的mysql_real_escape以及单个查询的目的.为什么不用这个呢?为什么要打扰准备?

如果您使用此函数来构建SQL语句,强烈建议您使用PDO :: prepare()来准备带有绑定参数的SQL语句,而不是使用PDO :: quote()将用户输入插入到SQL语句中.带有绑定参数的预处理语句不仅更易于移植,更方便,不受SQL注入的影响,但执行速度通常比内插查询快得多,因为服务器端和客户端都可以缓存查询的编译形式.资源