不推荐使用mysql扩展,将来会删除它:使用mysqli或PDO代替

时间:2012-12-19 03:11:43

标签: mysql deprecated php

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

  

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

参考行的代码是:

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

我确信这些论据是正确的,而且这个确切的代码已经工作多年而没有问题。实际上,我是从PHP的一个很好的教程中获得的。

  1. 为什么会这样?

  2. 我该如何解决?

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

    error_reporting = E_ALL ^ E_DEPRECATED
    

    如果我这样做会怎样?

1 个答案:

答案 0 :(得分:178)

  1.   

    为什么会这样?

    整个ext/mysql PHP扩展,提供所有以前缀mysql_命名的函数,为officially deprecated in PHP v5.5.0removed in PHP v7

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

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

  2.   

    我该如何解决?

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

    它们略有不同,但与旧的扩展相比具有许多优势,包括对事务,存储过程和预准备语句的API支持(从而使the best way失败SQL injection attacks)。 PHP开发人员Ulf Wendel撰写了a thorough comparison of the features

    Hashphp.org有excellent tutorial on migrating from ext/mysql to PDO

  3.   

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

    error_reporting = E_ALL ^ E_DEPRECATED
    
         

    如果我这样做会怎么样?

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

    另请注意,此技术将禁止所有 E_DEPRECATED消息,而不仅仅是那些与ext/mysql扩展名相关的消息:因此您可能不知道其他即将发生的对PHP的更改这会影响您的应用程序代码。当然,可以通过使用PHP的error control operator来抑制在表达式上出现的错误 - 即。在@之前添加相关行 - 但是这会抑制该表达式引发的所有错误,而不仅仅是E_DEPRECATED个。


  4. 你应该怎么做?

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

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

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

      执行回归测试是明智的:在确定所有潜在的影响区域之前,你真的不应该更改任何(尤其是升级PHP),然后在临时环境中彻底测试您的解决方案。

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

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

      • 数据库访问方法遍布整个地方,无法轻易换出其中一个新扩展程序。

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

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

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

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

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

      检查开发者是否已发布与此特定问题相关的任何修复,变通方法或指导;或者,如果没有,则通过引起他们的注意来迫使他们这样做。如果您有紧急需要立即升级PHP,您可以考虑暂时禁止弃用错误:但首先要确保识别任何其他弃用错误。

      进行回归测试绝对必要。