繁体   English   中英

我可以盲目地用 mysqli_ 替换所有 mysql_ 函数吗?

[英]Can I blindly replace all mysql_ functions with mysqli_?

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

所以,我想知道是否可以在我的项目中盲目地将所有mysql_函数替换为mysqli_ 例如,只需将mysql_query()替换为mysqli_query() 有什么不良影响吗?

简短的回答是否定的,功能不等价。

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

https://github.com/philip/MySQLConverterTool

它是 Oracle 原始版本的分叉版本,并且是 kosher 的。

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

1) 连接

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

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

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

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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

2)查询

注意:您应该使用 MySQLi 中提供的预处理语句来防止 SQL 注入。 看看如何在 PHP 中防止 SQL 注入? ,但我将在这里介绍基础知识。

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

程序:

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

面向对象:

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

3) 获取结果

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

while ($row = mysqli_fetch_assoc($result))

但由于$result现在是 mysqli 中的一个对象,您可以使用对象函数调用;

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

4) 紧密连接

所以和以前一样,你需要在 close 函数中包含连接; 作为程序上的论据;

mysqli_close($mysqli);

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

$mysqli->close();

如果我经历了所有这些,我会永远在这里,但你明白了。 查看文档以获取更多信息。 不要忘记转换您拥有的任何连接关闭、结果发布或错误和行计数功能。

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

如果您无法将所有调用转换为旧项目上的 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"; }

你不能。 mysql 和 mysqli 的一些函数需要不同的参数。 所以你应该知道哪些将使用相同的参数。

暂无
暂无

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

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