转换到mysqli是个好主意吗?

7
我考虑将所有php项目转换为mysqli。我的代码编写方式很简单(我运行非常简单的网站,并构建了自己的基本框架,我在所有网站上都使用这个框架),修改函数和类不应该有太多问题。
但是,除了一些关于可用php函数的抱怨(特别是没有一个简单的替代mysql_fetch_array在while中使用)之外,我只听到过关于准备好的语句的积极评价。
这听起来有点太美好了,所以我想知道是否有人能够强调使用准备好的语句时遇到的问题,例如速度和资源使用。
2个回答

2

如果你习惯于将变量附加到查询字符串中,那么为准备好的语句编程需要一些时间适应。MySQL使用位置参数(你的查询将包含问号,代表替换变量的位置)。最好的方法是将其放入现有的数据库抽象层中。如果该抽象层编写正确,你不应该在包装器外部调用mysql_fetch_array。

这个问题的解决方案就是提前收集所有行,但是当然这假设你不会检索1000行并仅请求第一行。无论是否使用mysqli,你都应该进行此更改。

最后,有些语句不容易被参数替换,例如使用具有可变数量参数的in('x', 'y', 'z')语法的查询。虽然可以做到,但你可能希望丰富你的数据库抽象层以允许它创建查询以及执行它们。

然而,以性能和安全性为代价的平衡是绝对值得的。PHP端的额外处理通常被MySQL端查询的缓存执行计划所抵消,并且你免疫许多最常见的SQL注入漏洞。

希望这有所帮助, Joe


谢谢,我花了一些时间研究mysqli,并构建了一个类(它不能直接插入我的代码中,我只是用它来进行实验,但我肯定可以调整它)。SQL注入几乎是我想使用它的唯一原因。但我担心可能会影响性能。我读到一些关于使用预处理语句与原始方法相比,缓存不同的内容。 - Rob

2
准备好的语句非常好用,一旦你习惯了它们,再使用转义函数就会感到痛苦。然而,我使用过的所有数据库库(包括oci8和sqlsrv等)都引入了一个或多个怪癖。因此,我基本上用一组简单的自定义类封装了我使用的任何库,以我喜欢的方式提供功能:
- 基于名称的参数:`WHERE foo = :foo` - 通过关联数组传递参数(而不是绑定到单个PHP变量):`$params = array('foo' => 33)` - 单行执行:`$res = $Db->query($sql, $params);` - 结果集是实现迭代器接口的对象,所以我可以使用 `foreach($res as $row)` 循环
采用这样的策略使得确切的语法或功能集合不那么重要。
无论如何,虽然几乎任何库都可以完成这项工作,但如果它提供原生参数绑定,则会有所帮助(例如),这样你就不必猜测数据类型。此外,一些高级功能,如事务,不能仅使用普通的mysql函数来完成。
PDO可能是一个不错的选择,但它的大多数驱动程序基本上已经被放弃,因此您实际上失去了具有DB不可知性的抽象层的好处,同时享受它的缺陷。
在我看来,你提出这个问题本身就说明你应该给mysqli一个机会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接