当我尝试从PHP连接到MySQL服务器时,我看到以下错误:
不推荐使用:不推荐使用mysql扩展,将来会删除它:在第123行的/path/to/filename.php中使用mysqli或PDO
参考行的代码是:
mysql_connect($server, $username, $password);
我确信这些论据是正确的,而且这个确切的代码已经工作多年而没有问题。实际上,我是从PHP的一个很好的教程中获得的。
为什么会这样?
我该如何解决?
我了解可以通过在error_reporting
中设置php.ini
来排除E_DEPRECATED
来抑制弃用错误:
error_reporting = E_ALL ^ E_DEPRECATED
如果我这样做会怎样?
答案 0 :(得分:178)
为什么会这样?
整个ext/mysql
PHP扩展,提供所有以前缀mysql_
命名的函数,为officially deprecated in PHP v5.5.0和removed in PHP v7。
最初是在PHP v2.0(1997年11月)中针对MySQL v3.20引入的,自2006年以来没有添加任何新功能。再加上缺少新功能,难以在复杂的安全漏洞中维护这些旧代码
自2011年6月起,该手册中包含了针对其在新代码中使用的警告。
我该如何解决?
正如错误消息所示,您可以考虑另外两个MySQL扩展:MySQLi和PDO_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。
我了解可以通过在
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
个。
您正在开始一个新项目。
绝对没有理由使用ext/mysql
- 选择其他更现代化的扩展程序之一,并获得他们提供的好处的奖励。
您拥有(您自己的)旧版代码库,目前依赖于ext/mysql
。
执行回归测试是明智的:在确定所有潜在的影响区域之前,你真的不应该更改任何(尤其是升级PHP),然后在临时环境中彻底测试您的解决方案。
遵循良好的编码实践,您的应用程序是以松散集成/模块化的方式开发的,数据库访问方法都是自包含在一个地方,可以轻松换出其中一个新的扩展强>
花半个小时重写这个模块,使用另一个更现代的扩展;彻底测试。您可以稍后介绍进一步的改进,以获得他们提供的好处的回报。
数据库访问方法遍布整个地方,无法轻易换出其中一个新扩展程序。
考虑您是否真的需要在此时升级到PHP v5.5。
您应该开始计划将ext/mysql
替换为其他更现代化的扩展程序,以便您可以获得所提供的好处的回报;您也可以将它用作将数据库访问方法重构为更模块化结构的机会。
但是,如果您有紧急需要立即升级PHP,您可能会考虑暂时禁止弃用错误:但首先要确保识别任何其他也被抛出的弃用错误
您使用的是依赖ext/mysql
的第三方项目。
考虑您是否真的需要在此时升级到PHP v5.5。
检查开发者是否已发布与此特定问题相关的任何修复,变通方法或指导;或者,如果没有,则通过引起他们的注意来迫使他们这样做。如果您有紧急需要立即升级PHP,您可以考虑暂时禁止弃用错误:但首先要确保识别任何其他弃用错误。
进行回归测试绝对必要。