mysql扩展已弃用,将来将被删除:使用mysqli或PDO代替

2022-08-30 06:36:09

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

已弃用:mysql 扩展已弃用,将来将被删除:在第 123 行的 /path/to/filename.php 中使用 mysqli 或 PDO 代替

引用行上的代码为:

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

我确信这些论点是正确的,并且这个确切的代码已经工作了多年而没有问题。事实上,我是从一个关于PHP的源代码良好的教程中获得的。

  1. 为什么会发生这种情况?

  2. 我该如何修复它?

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

    error_reporting = E_ALL ^ E_DEPRECATED
    

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


答案 1
  1. 为什么会发生这种情况?

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

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

    自 2011 年 6 月以来,该手册一直包含禁止在新代码中使用它的警告。

  2. 我该如何修复它?

    正如错误消息所暗示的那样,您还可以考虑另外两个MySQL扩展:MySQLiPDO_MySQL,其中任何一个都可以代替。两者都从v5.0开始就在PHP核心中,所以如果你使用的版本抛出了这些弃用错误,那么你几乎可以肯定可以立即开始使用它们 - 即没有任何安装工作。ext/mysql

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

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

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

    error_reporting = E_ALL ^ E_DEPRECATED
    

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

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

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


你该怎么办?

  • 您正在启动一个新项目。

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

  • 您有(您自己的)遗留代码库,该代码库当前依赖于ext / mysql

    执行回归测试是明智的:在你确定了所有潜在的影响领域,围绕每个领域进行规划,然后在过渡环境中彻底测试你的解决方案之前,你真的不应该改变任何东西(特别是升级PHP)。

    • 遵循良好的编码实践,您的应用程序以松散集成/模块化的方式开发,并且数据库访问方法都自包含于一个位置,可以轻松地将其换成一个新扩展之一。

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

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

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

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

      但是,如果您迫切需要立即升级 PHP,则可以考虑暂时禁止使用错误:但首先要确保识别也引发的任何其他弃用错误。

  • 您正在使用依赖于 ext/mysql 的第三方项目。

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

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

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


答案 2

推荐