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

时间:2014-10-20 22:45:00

标签: php mysql mysqli

我在整个项目中都使用了mysql_query();但我刚刚得知自PHP {5}已被弃用,已在PHP 7中被删除。

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

3 个答案:

答案 0 :(得分:41)

简短回答是,功能不相同。

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

https://github.com/philip/MySQLConverterTool

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

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

1)连接

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

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

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

请记住检查连接错误;

if ($mysqli->connect_errno) echo "Error - Failed to connect to MySQL: " . $mysqli->connect_error;

2)查询

注意:您应该使用MySQLi中提供的预准备语句来防止SQL注入。看一下How can I prevent SQL injection in PHP?,但我将在这里介绍基础知识。

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

程序:

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

OO:

$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();

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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