169

当我尝试从 PHP 连接到 MySQL 服务器时,我看到以下错误:

不推荐使用:不推荐使用 mysql 扩展并将在将来删除:在第 123 行的 /path/to/filename.php 中使用 mysqli 或 PDO 代替

引用行上的代码是:

mysql_connect($server, $username, $password);

我确信这些论点是正确的,并且这个确切的代码已经运行了多年而没有问题。事实上,我是从一个资源丰富的 PHP 教程中获得它的。

  1. 为什么会这样?

  2. 我该如何解决?

  3. 我知道可以通过设置excludeerror_reporting来抑制弃用错误:php.iniE_DEPRECATED

    error_reporting = E_ALL ^ E_DEPRECATED
    

    如果我这样做会发生什么?

4

1 回答 1

185
  1. 为什么会这样?

    ext/mysql提供所有以前缀命名的函数的整个PHP 扩展在 PHP v5.5.0 中mysql_正式弃用,在 PHP v7 中被删除

    它最初是在 MySQL v3.20 的 PHP v2.0(1997 年 11 月)中引入的,自 2006 年以来没有添加任何新功能。再加上缺乏新功能,在复杂的安全漏洞中难以维护这些旧代码。

    自 2011 年 6 月以来,该手册已包含针对其在新代码中使用的警告。

  2. 我该如何解决?

    正如错误消息所暗示的那样,您可以考虑另外两个 MySQL 扩展:MySQLiPDO_MySQL,其中任何一个都可以用来代替ext/mysql. 自 v5.0 以来,两者都在 PHP 核心中,因此如果您使用的版本会引发这些弃用错误,那么您几乎可以肯定地立即开始使用它们 — 即无需任何安装工作。

    它们略有不同,但与旧扩展相比具有许多优势,包括对事务、存储过程和预准备语句的 API 支持(从而提供了击败SQL 注入攻击的最佳方法)。PHP 开发人员 Ulf Wendel对这些特性进行了彻底的比较

    Hashphp.org 有一个关于从PDO迁移的优秀教程ext/mysql

  3. 我知道可以通过设置excludeerror_reporting来抑制弃用错误:php.iniE_DEPRECATED

    error_reporting = E_ALL ^ E_DEPRECATED
    

    如果我这样做会发生什么?

    是的,可以抑制此类错误消息并ext/mysql暂时继续使用旧扩展。但是你真的不应该这样做——这是来自开发人员的最后警告,该扩展可能不会与 PHP 的未来版本捆绑在一起(事实上,如前所述,它已从 PHP v7 中删除)。相反,您应该借此机会立即迁移您的应用程序以免为时已晚。

    另请注意,此技术将抑制所有 E_DEPRECATED消息,而不仅仅是与ext/mysql扩展有关的消息:因此,您可能不知道即将对 PHP 进行的其他更改会影响您的应用程序代码。当然,可以通过使用 PHP 的错误控制运算符(即在相关行前面加上-)来抑制相关表达式中出现的错误,@但是这将抑制该表达式引发的所有错误,而不仅仅是错误E_DEPRECATED


你该怎么办?

  • 您正在开始一个新项目。

    绝对没有理由使用ext/mysql- 选择其他更现代的扩展程序之一,并从它们提供的好处中获得回报。

  • 你有(你自己的)遗留代码库,目前依赖于ext/mysql.

    执行回归测试是明智的:在您确定所有潜在的影响领域,围绕每个领域进行计划并在暂存环境中彻底测试您的解决方案之前,您真的不应该更改任何内容(尤其是升级 PHP)。

    • 遵循良好的编码实践,您的应用程序是以松散集成/模块化的方式开发的,并且数据库访问方法都是自包含的,可以很容易地替换为新扩展之一。

      花半个小时重写这个模块以使用另一个更现代的扩展;彻底测试。您可以稍后引入进一步的改进,以获得它们提供的好处的回报。

    • 数据库访问方法分散在各处,不能轻易地换成新的扩展之一。

      考虑此时是否真的需要升级到 PHP v5.5。

      您应该开始计划ext/mysql用其他更现代的扩展来替换,以便您可以从它们提供的好处中获得回报;您也可以将其作为一个机会,将您的数据库访问方法重构为更加模块化的结构。

      但是,如果您迫切需要立即升级 PHP,您可能会考虑暂时抑制弃用错误:但首先要确保识别出任何其他也被抛出的弃用错误。

  • 您正在使用依赖于ext/mysql.

    考虑此时是否真的需要升级到 PHP v5.5。

    检查开发人员是否发布了与此特定问题相关的任何修复、解决方法或指南;或者,如果没有,通过提请他们注意这件事来迫使他们这样做。如果您迫切需要立即升级 PHP,您可能会考虑暂时抑制弃用错误:但首先要确保识别出任何其他也被抛出的弃用错误。

    执行回归测试是绝对必要的。

于 2012-12-19T03:11:43.407 回答