我可以盲目地用mysqli_替换所有mysql_功能吗?

2022-08-30 13:55:58

我在整个项目中都使用过;但我刚刚了解到,从 PHP 5.5 开始被弃用,在 PHP 7 中已被删除。mysql_query()mysql_

那么,我想知道我是否可以盲目地替换项目中的所有功能?例如,只需替换为 .是否有任何不良影响?mysql_mysqli_mysql_query()mysqli_query()


答案 1

简短的回答是否定的,函数不等价。

好消息是,如果您有很多电话/项目要更改,则有一个转换器工具可以帮助您。这将允许您的脚本立即工作。

https://github.com/philip/MySQLConverterTool

它是Oracle原始版本的分叉版本,它是犹太洁食。

也就是说,更新代码并不太困难,无论如何,您可能希望迁移到面向对象的方法...

1) 连接

例如,对于所有意图和目的,您需要一个新的连接函数,将连接保存为PHP变量;

$mysqli = new mysqli($host, $username, $password, $database);

请注意,我已将连接保存到 。您可以保存到或您喜欢的任何内容,但您应该在整个代码中使用它来引用连接。$mysqli$db

请记住在打开连接之前为mysqli启用错误报告;

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

2) 查询

注意:您应该使用预准备语句防止 SQL 注入,这些语句在 MySQLi 中可用。看看如何防止PHP中的SQL注入?,但我只是在这里介绍基础知识。

现在,您必须将连接作为参数包含在查询和其他函数中。在过程代码中,它是第一个参数,在OO中,你把它写得像一个类方法。mysqli_

程序:

$result = mysqli_query($mysqli, $sql);

$result = $mysqli->query($sql);

3) 获取结果

结果的获取类似于过程中的旧函数;mysql_

while ($row = mysqli_fetch_assoc($result))

但是就像现在mysqli中的一个对象一样,你可以使用对象函数调用;$result

while ($row = $result->fetch_assoc())

4) 关闭连接

因此,与以前一样,您需要在关闭函数中包含连接;作为程序性论据;

mysqli_close($mysqli);

并作为您在OO中运行函数的对象;

$mysqli->close();

如果我经历过所有这些,我将永远在这里,但你明白了。有关详细信息,请查看文档。不要忘记转换您拥有的任何连接关闭,结果释放或错误和行计数函数。

基本的经验法则是,对于使用数据库连接的函数,您现在需要将其包含在函数中(作为过程中的第一个参数,或用于在 OO 中调用函数的对象),或者对于结果集,您只需将函数更改为或将结果集用作对象。mysqli_


答案 2

如果无法在旧项目上转换对 mysqli 函数的所有调用,则可以安装并包含函数库 php7-mysql-shim

它将尝试使用mysqli在PHP 7上创建mysql的透明替代品。显然,性能较慢,但这是在几分钟内解决问题的解决方案。您可以安全地将库包含在使用 PHP 5.6 的项目中(它将被忽略)。

if (defined('PHP_VERSION_ID') && (PHP_VERSION_ID >= 50600)) { require_once "mysql-shim.php"; }

推荐