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

Mid*_*eer 25 php mysql mysqli

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

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

wor*_*fjr 42

简短的回答是否定的,功能不相同.

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

https://github.com/philip/MySQLConverterTool

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

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

1)连接

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

$mysqli = new mysqli($host,$username,$password,$database);
Run Code Online (Sandbox Code Playgroud)

注意我已经保存了连接$mysqli.您可以保存$db或任何您喜欢的,但您应该在整个代码中使用它来引用连接.

请记住检查连接错误;

if ($mysqli->connect_errno) echo "Error - Failed to connect to MySQL: " . $mysqli->connect_error;
Run Code Online (Sandbox Code Playgroud)

2)查询

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

您现在必须在查询中包含连接作为参数,以及其他mysqli_函数.在程序代码中它是第一个参数,在OO中你把它写成类方法;

程序:

$result = mysqli_query($mysqli,$sql);
Run Code Online (Sandbox Code Playgroud)

OO:

$result = $mysqli->query($sql);
Run Code Online (Sandbox Code Playgroud)

3)获取结果

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

while($row = mysqli_fetch_assoc($result))
Run Code Online (Sandbox Code Playgroud)

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

while($row = $result->fetch_assoc())
Run Code Online (Sandbox Code Playgroud)

4)关闭连接

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

mysqli_close($mysqli);
Run Code Online (Sandbox Code Playgroud)

以及在OO中运行函数的对象;

$mysqli->close();
Run Code Online (Sandbox Code Playgroud)

如果我经历过这些,我会永远在这里,但你明白了.查看文档以获取更多信息.不要忘记转换任何连接关闭,结果释放,或错误和行计数功能.

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

  • 这种转换没有犹太版本.任何转换都应包含准备好的声明 否则根本就没有任何意义. (3认同)

小智 8

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