当我尝试从 PHP 连接到 MySQL 服务器时,我看到以下错误:
已弃用:mysql 扩展已弃用,将来将被删除:在第 123 行的 /path/to/filename.php 中使用 mysqli 或 PDO 代替
引用行上的代码是:
mysql_connect($server, $username, $password);
我确信这些论点是正确的,并且这个确切的代码已经工作了很多年,没有任何问题。事实上,我是从一个来源良好的 PHP 教程中获得的。
为什么会发生这种情况?
我该如何修复它?
-
我知道可以通过设置来抑制弃用错误error_reporting
in php.ini
排除E_DEPRECATED
:
error_reporting = E_ALL ^ E_DEPRECATED
如果我这样做会发生什么?
-
为什么会发生这种情况?
整个ext/mysql
PHP 扩展,提供所有以前缀命名的函数mysql_
, was PHP v5.5.0 中正式弃用 http://php.net/manual/en/changelog.mysql.php and 在 PHP v7 中删除 https://secure.php.net/manual/en/migration70.removed-exts-sapis.php.
它最初是在 MySQL v3.20 的 PHP v2.0(1997 年 11 月)中引入的,自 2006 年以来没有添加新功能。再加上缺乏新功能,在复杂的安全漏洞中维护这种旧代码很困难。
自 2011 年 6 月起,该手册就包含了反对在新代码中使用它的警告。
-
我该如何修复它?
正如错误消息所示,您可以考虑另外两个 MySQL 扩展:MySQLi http://php.net/manual/en/book.mysqli.php and PDO_MySQL http://php.net/manual/en/ref.pdo-mysql.php,其中任何一个都可以用来代替ext/mysql
。两者自 v5.0 起就已存在于 PHP 核心中,因此,如果您使用的版本引发了这些弃用错误,那么您几乎可以肯定可以立即开始使用它们,即无需任何安装工作。
它们略有不同,但比旧扩展提供了许多优势,包括对事务、存储过程和预准备语句的 API 支持(从而提供最好的办法 https://stackoverflow.com/a/60496打败SQL注入攻击 https://stackoverflow.com/q/332365)。 PHP 开发者 Ulf Wendel 写道全面的功能比较 http://blog.ulf-wendel.de/2012/php-mysql-why-to-upgrade-extmysql/.
Hashphp.org 有一个关于迁移的优秀教程ext/mysql to PDO http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers.
-
我知道可以通过设置来抑制弃用错误error_reporting
in php.ini
排除E_DEPRECATED
:
error_reporting = E_ALL ^ E_DEPRECATED
如果我这样做会发生什么?
是的,可以抑制此类错误消息并继续使用旧的ext/mysql
暂时延长。但你真的不应该这样做——这是开发人员的最后警告,该扩展可能不会与未来版本的 PHP 捆绑在一起(事实上,正如已经提到的,它已从 PHP v7 中删除)。相反,您应该借此机会迁移您的应用程序now,在为时已晚之前。
另请注意,该技术将抑制all E_DEPRECATED
消息,而不仅仅是那些与ext/mysql
扩展:因此您可能不知道即将对 PHP 进行的其他更改会影响您的应用程序代码。当然,可以仅通过使用 PHP 来抑制有问题的表达式中出现的错误错误控制算子 http://php.net/manual/en/language.operators.errorcontrol.php-IE。在相关行前面加上@
——然而这会抑制all该表达式引发的错误,不仅仅是E_DEPRECATED
ones.
你该怎么办?
-
您正在开始一个新项目。
有绝对没有理由 to use ext/mysql
— 选择其他更现代的扩展之一,并获得它们提供的好处的回报。
-
您拥有(您自己的)遗留代码库,当前依赖于ext/mysql
.
执行回归测试是明智的:你真的不应该改变anything(尤其是升级 PHP),直到您确定了所有潜在的影响领域,围绕每个领域进行了规划,然后在临时环境中彻底测试了您的解决方案。
-
遵循良好的编码实践,您的应用程序以松散集成/模块化的方式开发,并且数据库访问方法全部独立于一个位置,可以轻松地替换为新扩展之一。
花半小时重写此模块以使用其他更现代的扩展之一;彻底测试。您可以稍后进行进一步的改进,以获得它们所提供的好处的回报。
-
数据库访问方法分散在各处,无法轻松更换为新扩展之一。
考虑一下此时是否真的需要升级到PHP v5.5。
您应该开始计划更换ext/mysql
使用其他更现代的扩展之一,以便您可以获得它们提供的好处的回报;您还可以将其用作将数据库访问方法重构为更加模块化的结构的机会。
但是,如果您有urgent需要立即升级 PHP,您可能会考虑暂时抑制弃用错误:但首先请确保识别也抛出的任何其他弃用错误。
-
您正在使用依赖于的第三方项目ext/mysql
.
考虑一下此时是否真的需要升级到PHP v5.5。
检查开发人员是否发布了与此特定问题相关的任何修复、解决方法或指南;或者,如果没有,请通过提请他们注意此事来迫使他们这样做。如果你有一个urgent需要立即升级 PHP,您可能会考虑暂时抑制弃用错误:但首先请确保识别也抛出的任何其他弃用错误。
执行回归测试是绝对必要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)