Why shouldn't I use mysql_* functions in PHP?
(15个答案)
5年前关闭。
当我尝试从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
如果我这样做会怎样?
为什么会这样呢?
提供了所有以前缀ext/mysql
命名的所有功能的整个mysql_
PHP扩展分别为officially deprecated in PHP v5.5.0和removed in PHP v7。
它最初是在MySQL v3.20的PHP v2.0(1997年11月)中引入的,自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,则可以暂时考虑抑制弃用错误:但是首先请确保确定还会抛出的其他弃用错误。
进行回归测试绝对必要。
我是一名优秀的程序员,十分优秀!