切换到mysqli一个好主意?

我正在考虑切换到所有我的PHP项目的mysqli。 我的代码编写的方式(我运行非常简单的网站,并构建了我自己的基本框架,我使用它们)我不应该有太多修改函数和类的问题。

然而,我只听到了有关准备好的语句的积极的事情,请留心一些关于可用的PHP函数的问题,特别是在一段时间内没有简单替换使用mysql_fetch_array。

这听起来有点太好了,所以我想知道是否有人能够强调使用准备语句的一些问题,例如速度和资源使用情况。


如果您习惯将变量附加到查询字符串中,那么对已准备语句的编程需要一些习惯。 MySQL使用位置参数(您的查询将包含替换变量所属的问号)。 最好的办法是把它放到你现有的数据库抽象中。 如果该抽象是正确编写的,那么不应该在包装器外部调用mysql_fetch_array。

解决这个问题的方法就是预先收集所有的行,但是当然假设你不检索1000行并且只是要求第一行。 无论mysqli如何,这都是你应该做出的改变。

最后,一些语句不容易被参数取代,比如使用带有可变数量参数的in('x', 'y', 'z')语法的查询。 它可以完成,但你可能想要丰富你的数据库抽象,以允许它创建查询并执行它们。

然而,在性能和安全性方面,权衡是绝对值得的。 PHP端的附加处理通常超过了MySQL端查询的缓存执行计划,而且您不受许多最常见的SQL注入漏洞的影响。

希望这会有所帮助,乔


准备好的陈述非常好,一旦你习惯了它们,再次使用转义函数是很痛苦的 。 期。

但是,我曾经使用过的所有数据库库(包括oci8和sqlsrv ...)引入了一个或多个怪癖。 因此,我基本上使用一组简单的自定义类来封装我使用的任何库,这些自定义类以我喜欢的方式提供功能:

  • 基于名称的参数: WHERE foo = :foo
  • 参数通过关联数组中的值传递(而不是绑定到单个PHP变量): $params = array('foo' => 33)
  • 一行执行: $res = $Db->query($sql, $params);
  • 结果集是实现Iterator接口的对象,所以我可以使用foreach($res as $row)循环foreach($res as $row)
  • 采用这样的策略使得确切的语法或函数设置不那么重要。

    无论如何,虽然这可以通过几乎任何库来实现,但它提供了本地参数绑定(例如,您不必猜测数据类型)就会有所帮助。 而且,像交易这样的一些高级功能不能简单地用普通的mysql函数完成。

    PDO可能是一个不错的选择,但其大部分驱动程序基本上被放弃了,所以当你喜欢它的缺陷时,你实际上放松了拥有一个DB无关抽象层的好处。

    恕我直言,仅仅是你问的事实表明你应该给mysqli一个机会。

    链接地址: http://www.djcxy.com/p/45253.html

    上一篇: switch to mysqli a good idea?

    下一篇: How to maintain color settings when converting EPS to JPEG with ImageMagick