我正在考虑为我所有的php项目切换到mysqli。我的代码编写方式(我运行非常简单的网站并构建我自己的基本框架,我在其中使用所有这些)我不应该在修改函数和类时遇到太多问题。
然而,我只听到关于准备好的陈述的积极的事情,关于可用的PHP函数的一些抱怨,最值得注意的是缺乏一段时间使用mysql_fetch_array的简单替代。
这听起来有点太好了,所以我想知道是否有人可以强调使用预准备语句的一些问题,例如速度和资源使用。
答案 0 :(得分:2)
如果您习惯于将变量附加到查询字符串,那么对预准备语句进行编程需要花一些时间。 MySQL使用位置参数(您的查询将包含替换变量所属的问号)。最好的办法是将它放入现有的数据库抽象中。如果正确编写了抽象,那么你不应该在包装器之外调用mysql_fetch_array。
此问题的解决方案只是提前收集所有行,但当然假设您没有检索1000行而只是要求第一行。无论mysqli如何,这都是您应该做出的改变。
最后,一些语句不容易被参数替换,例如使用带有可变数量参数的in('x', 'y', 'z')
语法的查询。它可以完成,但您可能希望丰富数据库抽象,以允许它创建查询并执行它们。
希望有所帮助, 乔
答案 1 :(得分:2)
准备好的陈述是如此之好,以至于一旦习惯了它们,痛苦再次使用转义函数。周期。
然而,我曾经使用过的所有数据库(包括oci8和sqlsrv ......)都引入了一个奇怪或另一个。所以我基本上使用一组简单的自定义类来封装我使用的库,这些自定义类以 I 的方式提供功能:
WHERE foo = :foo
$params = array('foo' => 33)
$res = $Db->query($sql, $params);
foreach($res as $row)
采用此类政策会使确切的语法或功能集不太重要。
无论如何,虽然这几乎可以用任何库完成,但如果它提供本机参数绑定(例如)你不必猜测数据类型就会有所帮助。此外,一些高级功能(如事务)不能简单地使用普通的mysql函数完成。
PDO可能是一个不错的选择,但它的大多数驱动程序基本上都被放弃了,所以当你喜欢陷阱时,你实际上已经失去了拥有数据库不可知抽象层的好处。
恕我直言,你提出的一个事实就是建议你给mysqli一个机会。