Mysql 扩展已被废弃,将来会被删除: 改用 mysqli 或 PDO

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

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

引用行上的代码是:

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

我确信这些参数是正确的,而且这个精确的代码已经工作了很多年,没有问题。事实上,我是从一个关于 PHP 的资源丰富的教程中获得它的。

  1. 为什么会这样?

  2. 我该怎么补救?

  3. 我理解通过在 php.ini中设置 error_reporting以排除 E_DEPRECATED来抑制弃用错误是可能的:

    error_reporting = E_ALL ^ E_DEPRECATED
    

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

393949 次浏览
  1. 为什么会这样?

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

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

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

  2. 我该怎么补救?

    正如错误消息所示,还有两个 MySQL 扩展可以考虑: MySQLiPDO _ MySQL,它们都可以代替 ext/mysql使用。这两个版本都是从5.0版本开始在 PHP 核心中使用的,所以如果您使用的版本抛出了这些弃用错误,那么您几乎可以肯定地立即开始使用它们,也就是说,不需要任何安装工作。

    它们略有不同,但是与旧扩展相比,它们提供了许多优势,包括对事务、存储过程和准备语句的 API 支持(因此提供了 最好的方式来击败 SQL 注入攻击)。PHP 开发人员 Ulf Wendel 编写了 对特征进行全面的比较

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

  3. 我理解通过在 php.ini中设置 error_reporting以排除 E_DEPRECATED来抑制弃用错误是可能的:

    error_reporting = E_ALL ^ E_DEPRECATED
    

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

    是的,可以暂时禁止此类错误消息并继续使用旧的 ext/mysql扩展。但是 你真的不该这么做 & mash; 这是来自开发人员的最后一个警告,即该扩展可能不会与未来版本的 PHP 绑定(实际上,正如前面提到的,它已经从 PHP v7中删除)。相反,您应该抓住这个机会迁移应用程序 现在,以免为时已晚。

    另请注意,这种技术将抑制 所有 E_DEPRECATED消息,而不仅仅是那些与 ext/mysql扩展有关的消息: 因此您可能不知道 PHP 即将发生的其他更改会影响您的应用程序代码。当然,可以通过使用 PHP 的 错误控制运算符错误控制运算符 & mash; 来抑制表达式中出现的错误,也就是使用 @ & mash; 来预先处理相关行,但是这样可以抑制由该表达式引起的 所有错误,而不仅仅是 E_DEPRECATED错误。


你该怎么办?

  • 你正在开始一个新的项目。

    绝对没有理由使用的 ext/mysql & mash; 选择其他之一,更现代,扩展而不是和收获的好处,他们提供的奖励。

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

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

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

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

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

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

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

      但是,如果您有一个 很紧急需要立即升级 PHP,您可能会考虑暂时抑制弃用错误: 但是首先一定要识别任何其他正在抛出的弃用错误。

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

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

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

    表演回归测试是绝对必要的。