【问题标题】:switch to mysqli a good idea?切换到mysqli 好主意吗?
【发布时间】:2010-03-25 01:29:49
【问题描述】:

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

但是,我只听说过有关准备好的语句的积极信息,除了一些关于可用 php 函数的抱怨,最值得注意的是一段时间内缺少使用 mysql_fetch_array 的简单替代品。

这听起来好得令人难以置信,所以我想知道是否有人可以强调使用准备好的语句的一些问题,例如速度和资源使用情况。

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

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

    解决这个问题的方法就是提前收集所有的行,但当然前提是你不检索 1000 行而只要求第一行。无论mysqli如何,您都应该进行此更改。

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

    不过,就性能和安全性而言,这种权衡绝对是值得的。 PHP 端的额外处理通常被 MySQL 端查询的缓存执行计划所抵消,并且您可以免受许多最常见的 SQL 注入漏洞的影响。

    希望对您有所帮助, 乔

    【讨论】:

    • 谢谢,我花了一些时间研究 mysqli 并构建了一个类(它不会直接放入我的代码中,我正在使用它进行实验,但我当然可以调整它)。 SQL 注入几乎是我想使用它的唯一原因。但我担心潜在的性能影响。我读过一些关于使用准备好的语句时缓存与原始方法相比缓存不一样的东西
    【解决方案2】:

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

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

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

    采用此类策略会使确切的语法或函数集变得不那么重要。

    不管怎样,虽然这可以通过几乎任何库来完成,但如果它提供了本机参数绑定,那么(例如)您不必猜测数据类型,这会有所帮助。此外,一些高级功能(如事务)不能简单地使用普通的 mysql 函数来完成。

    PDO 可能是一个不错的选择,但它的大多数驱动程序基本上都被抛弃了,因此您实际上失去了拥有与 DB 无关的抽象层的好处,同时您还享受它的陷阱。

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

    【讨论】:

      猜你喜欢
      • 2014-12-14
      • 2022-11-21
      • 2011-07-01
      • 2010-11-05
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多