6

因此,我确信任何经常使用 SO 的人都已经注意到,这些mysql_功能将被弃用,建议使用mysqli_PDO代替。因此,我决定通过在我的代码中进行简单的查找/替换来转换到 mysqli,将每个替换mysql_mysqli_. 这在 Dreamweaver 中似乎可以正常工作,而且我没有遇到任何语法错误或任何问题。所有新mysqli_功能都涂成蓝色,这意味着它们被识别为有效功能。

但是,当我保存所有内容并运行代码时,我注意到任何与 mysql 相关的代码都无法正常工作。撤消替换解决了问题。

我的服务器可能不支持 mysqli 功能吗?我知道它正在运行 php 5 和 mysql 5。您可能还需要在代码中添加其他内容吗?我错过了什么?

4

5 回答 5

4

现在是切换的好时机,因为 PHP 7.0ext/mysql从核心中删除了这些功能。

考虑以下遗留代码

$res = mysql_query($sql);

这些mysql_函数是惰性的,因为它会使用任何打开的连接。但mysqli_不仅不是懒惰,它是一个对象,而不是连接资源(这是mysql_connect()会返回的)。在此处查看这些行以连接到数据库

$mysqli = new mysqli('host', 'username', 'password', 'db');
$mysqli = mysqli_connect('host', 'username', 'password', 'db');

他们都给你同样的东西......

返回一个表示与 MySQL 服务器的连接的对象。

是的,这是正确的。甚至程序连接函数也返回一个对象。直接使用它的最简单方法是对象形式

$mysqli->query($sql);

过程函数只是对此的包装。但他们并不懒惰。查看差异

mysqli_query($mysqli, $sql);

其中最大的问题(为什么简单的查找和替换mysql_失败mysqli_)是大多数mysqli_函数都要求您将连接对象作为第一个参数传递。同样重要的是要注意结果也是对象(mysqli_result类),尽管它们的过程对应物只需要结果集,因此您可以简单地查找/替换它们。

为了完整起见,还有另一个不太常见的问题(这确实是旧代码):mysql_result。此功能在mysqli_. 您应该切换到完整的行返回函数,例如mysqli_fetch_assoc($result)

于 2015-12-02T18:57:43.757 回答
1

您必须知道在替换代码时可能会遇到很多问题。

  1. 在此处检查 mysqli 的安装。
  2. 在此处检查 mysqli 的配置。
  3. 以两种方式检查数据库连接:

    ** 像natimysql这样的简单连接:

    $con = mysqli_connect("localhost","my_user","my_password","my_db");

    但是现在你必须这样使用它

    mysqli_query($con,"SELECT * FROM Table"); // $con is the connection which is must for executing the sql query

    **我最好的方法是把它当作新的 mysqli 对象来处理:

    $con = new mysqli('localhost', 'user', 'pass', 'demo');

    现在你会这样做:

    $sql = "SELECT * FROM Table";
    $con->query($sql);
    

    如果您检查了之前完成的每个查询,您必须找到其中一个错误,特别是第三点中的错误,您可以在此处此处此处查看其教程

于 2015-12-08T12:46:31.710 回答
1

您可能想查看http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers,它应该告诉您有关迁移 mysql_ 代码的所有信息,但迁移到 PDO,而不是 MySQLi。

于 2015-12-02T19:21:30.543 回答
0

很惊讶没有人提到 mysql_ 和 mysqli_ 函数不是完全平行的,因此搜索和替换肯定会失败。此外 mysqli_ 通常会坚持使用数据库连接参数(在程序模式下使用时,这是您的目标),其中 mysql_ 只会获取代码中之前打开的任何连接。

如果您启用了调试,您应该能够解决错误。

最常见的“问题”是没有与 mysql_result() 等效的 mysqli,人们在获得单个结果时经常使用它。我愿意打赌你的代码分散在“mysqli_result()”调用中,这些调用都会失败。

这是基本的修复。“好的”修复可能是为所有 SQL 调用使用一个专用类,这样在整个代码库中只有少数几个 mysqli 函数的使用,并且全部在一个文件中。这样,当您重构时,您不需要搜索大量文件,所有这些文件都具有各种 mysqli 函数的各种不同用途。

如果您“需要一些权威的 MySQL 资源 -> MySQLi 迁移”,我可以推荐一个名为 Google 的网站;-) 输入“MySQL -> MySQLi 迁移”。

例如,这个“for Dummies”页面向您展示了您需要解决的各种功能之间的差异,以使您的代码正常工作。

http://www.dummies.com/how-to/content/how-to-convert-mysqli-functions-to-mysql-functions.html

于 2015-12-07T16:30:10.867 回答
-1

mysql_ 函数现已弃用

不,他们还没有

我决定通过在我的代码中进行简单的查找/替换来过渡到 mysqli

问题很可能在于 mysqli 函数具有反向参数顺序并明确需要连接资源。

尽管如此,即使您成功地进行了这样的批量替换,它也不会对您的代码有丝毫好处,因此,您最好保持原样,尽管本网站上有一些错误...过度热情的活动。

  1. 没有理由着急。在您开始注意到一些不便之前,您至少有 5 年的时间。
  2. 所有这些关于 mysql 函数的噪音的目的不是为了将某些 API 更改为另一个 API,而是为了使通常的 PHP 代码更加合理和安全。仅仅通过搜索和替换你不会达到这两个目标 - 所以,根本没有理由这样做。

您真正需要的是一种处理查询的智能方法,封装在某个库类中,这不仅可以改善您运行 SQL 查询的体验,而且可以将所有 API 函数移动到一个可以轻松替换为任何 API 的位置有些人会决定强迫你使用。

于 2013-01-19T19:39:37.597 回答