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 

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

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

    整个ext/mysql PHP扩展提供了所有以前缀mysql_命名的mysql_ , 在PHP mysql_中正式弃用,并在PHP v7中被删除 。

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

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

  2. 我该如何解决?

    正如错误消息所示,还有两个MySQL扩展可以考虑: MySQLi和PDO_MySQL ,其中任何一个都可以用来代替ext/mysql 。 这两个版本都是从v5.0开始的PHP核心,所以如果你使用的是抛弃这些弃用错误的版本,那么你几乎肯定会立即开始使用它们,即不需要任何安装工作。

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

    Hashphp.org有一个很好的从ext/mysql到PDO的教程 。

  3. 我明白,可以通过在php.ini设置error_reporting来排除E_DEPRECATED从而抑制弃用错误:

     error_reporting = E_ALL ^ E_DEPRECATED 

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

    是的,可以抑制这样的错误消息,并暂时继续使用旧的ext/mysql扩展。 但是你真的不应该这么做 – 这是开发人员最后的警告,说这个扩展可能不会和未来版本的PHP捆绑在一起(事实上,正如已经提到的那样,它已经从PHP v7中移除了)。 相反,您应该利用这个机会现在就迁移您的应用程序,然后为时已晚。

    还要注意,这种技术将会抑制所有的 E_DEPRECATED消息,而不仅仅是那些使用ext/mysql扩展的消息:因此,你可能并不知道即将发生的其他PHP更改会影响你的应用程序代码。 当然,只有通过使用PHP的错误控制操作符(即将相关行与@相加)才能抑制在expression式上出现的错误 ,但是这样会抑制expression式引发的所有错误,而不仅仅是E_DEPRECATED


你该怎么办?

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

    绝对没有理由使用ext/mysql – select其他更现代的扩展之一来获得他们提供的好处。

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

    执行回归testing是明智的做法:在确定了所有可能的影响领域之后,确实不应该改变任何事情 (特别是升级PHP),并计划在每个环节中进行计划,然后在分级环境中彻底testing您的解决scheme。

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

      花上半个小时重写这个模块,使用其他更现代的扩展之一。 彻底testing。 您稍后可以引入进一步的改进来获得他们提供的好处的回报。

    • 数据库访问方法遍布各处,不能轻易换出新扩展之一。

      考虑一下你现在是否真的需要升级到PHP v5.5。

      你应该开始计划用另外一种更现代的扩展来replaceext/mysql ,以便你可以获得他们所提供的好处。 您也可以使用它作为一个机会,将您的数据库访问方法重构为更加模块化的结构。

      但是,如果您迫切需要立即升级PHP,则可以考虑暂时抑制弃用错误:但首先请确定还有其他正在抛出的弃用错误。

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

    考虑一下你现在是否真的需要升级到PHP v5.5。

    检查开发者是否发布了有关这个特定问题的任何修复,解决方法或指导; 或者,如果不是这样的话,就把这件事情提请他们注意。 如果您迫切需要立即升级PHP,您可以考虑暂时抑制弃用错误:但首先请确定还有其他正在抛出的弃用错误。

    执行回归testing是绝对必要的。

Interesting Posts