繁体   English   中英

切换到mysqli一个好主意?

[英]switch to mysqli a good idea?

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

但是,我只听到关于准备好的语句的积极的事情,关于可用的php函数的一些抱怨,最值得注意的是缺少一段时间使用mysql_fetch_array的简单替代。

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

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

这个问题的解决方案只是提前收集所有行,但当然假设您没有检索1000行而只是要求第一行。 无论mysqli如何,这都是您应该做出的改变。

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

然而,在性能和安全性方面,这种权衡无疑是值得的。 PHP端的额外处理通常被MySQL端查询的缓存执行计划所抵消,并且您不受许多最常见的SQL注入漏洞的影响。

希望有所帮助,乔

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

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

  • 基于名称的参数: WHERE foo = :foo
  • 在关联数组中通过值传递的参数(而不是绑定到单个PHP变量): $params = array('foo' => 33)
  • 一行执行: $res = $Db->query($sql, $params);
  • Resultsets是实现Iterator接口的对象,因此我可以使用foreach($res as $row)循环foreach($res as $row)

采用这样的策略使得确切的语法或功能集不那么重要。

无论如何,虽然这可以通过几乎任何库来实现,但如果它提供本机参数绑定(例如),则无需猜测数据类型。 此外,某些高级功能(如事务)不能简单地使用普通的mysql函数完成。

PDO可能是一个不错的选择,但它的大多数驱动程序基本上都被放弃了,所以当你享受陷阱时,你实际上已经失去了拥有DB不可知抽象层的好处。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM