Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql扩展已弃用,将来将被删除:改用mysqli或PDO_Mysql_Deprecated_Php - Fatal编程技术网

mysql扩展已弃用,将来将被删除:改用mysqli或PDO

mysql扩展已弃用,将来将被删除:改用mysqli或PDO,mysql,deprecated,php,Mysql,Deprecated,Php,当我尝试从PHP连接到MySQL服务器时,我看到以下错误: 已弃用:mysql扩展已弃用,将来将被删除:请在第123行的/path/to/filename.php中使用mysqli或PDO 参考行上的代码为: mysql_connect($server, $username, $password); 我确信这些论点是正确的,而这个确切的代码多年来一直在毫无问题地工作。事实上,我是从一个关于PHP的源代码丰富的教程中获得的 为什么会这样 我怎样才能修好它 我理解,通过在php.ini中设置err

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

已弃用:mysql扩展已弃用,将来将被删除:请在第123行的/path/to/filename.php中使用mysqli或PDO

参考行上的代码为:

mysql_connect($server, $username, $password);
我确信这些论点是正确的,而这个确切的代码多年来一直在毫无问题地工作。事实上,我是从一个关于PHP的源代码丰富的教程中获得的

为什么会这样

我怎样才能修好它

我理解,通过在php.ini中设置error_reporting以排除E_DEPRECATED,可以抑制不推荐使用的错误:

如果我那样做会发生什么

为什么会这样

整个ext/mysql PHP扩展提供了以前缀mysql\ux命名的所有函数,它是和

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

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

我怎样才能修好它

正如错误消息所示,您可以考虑另外两个MySQL扩展:and,这两个扩展都可以用来代替ext/MySQL。这两个版本都是从v5.0开始在PHP核心中出现的,所以如果您使用的版本抛出了这些弃用错误,那么您几乎可以肯定的是,您可以立即开始使用它们,也就是说,无需任何安装工作

它们略有不同,但与旧的扩展相比,它们提供了许多优势,包括对事务、存储过程和预处理语句的API支持,从而提供了更好的性能。PHP开发人员Ulf Wendel写了一篇文章

Hashphp.org有一个

我理解,通过在php.ini中设置error_reporting以排除E_DEPRECATED,可以抑制不推荐使用的错误:

如果我那样做会发生什么

是的,可以抑制此类错误消息并暂时继续使用旧的ext/mysql扩展。但是你真的不应该这样做这是开发者的最后警告,这个扩展可能不会与PHP的未来版本捆绑在一起,正如前面提到的,它已经从PHPV7中删除了。相反,您应该抓住这个机会立即迁移应用程序,以免为时已晚

还要注意,这种技术将抑制所有E_不推荐的消息,而不仅仅是那些与ext/mysql扩展有关的消息:因此,您可能不知道PHP即将发生的其他更改会影响您的应用程序代码。当然,通过使用PHP,只可能抑制问题表达式上出现的错误-即在相关行前面加@-但是这将抑制该表达式引起的所有错误,而不仅仅是e_不推荐的错误

你该怎么办? 您正在启动一个新项目

绝对没有理由使用ext/mysql,而是从另一个更现代的扩展中选择一个,并从它们提供的好处中获得回报

您有自己的遗留代码库,当前依赖于ext/mysql

执行回归测试是明智的:在确定所有潜在影响区域、围绕每个区域进行规划并在登台环境中彻底测试解决方案之前,您确实不应该更改任何内容,尤其是升级PHP

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

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

数据库访问方法分散在各地,无法轻松地替换为新的扩展之一

考虑一下现在是否真的需要升级到PHPV5.5

你应该开始计划用另一个更现代的扩展取代ext/mysql,这样你就可以从它们提供的好处中获得回报;您还可以利用它将数据库访问方法重构为更模块化的结构

然而,如果您迫切需要升级PHP,您可能暂时考虑抑制弃用错误:但首先要确保识别出其他被丢弃的错误。

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

考虑一下现在是否真的需要升级到PHPV5.5

检查开发人员是否发布了与此相关的任何修复、解决方法或指导 针对这一具体问题,;或者,如果没有,通过提请他们注意这件事来迫使他们这样做。如果您迫切需要升级PHP,您可能暂时考虑抑制弃用错误:但首先要确保识别出其他被丢弃的错误。

执行回归测试是绝对必要的


还请推荐/建议使用prepared语句,,,很多时候我看到用户使用pdo或mysqli查询的方式与mysql相同,即使他们没有逃逸单引号,这更为重要dangerous@NullPointer当前位置它已经说他们…提供…准备好的陈述,从而提供失败的机会。我不想在这个答案中给出参数化查询的例子,因为它与手头的问题并不相关;你认为怎样才能更清楚呢?如果你想要一个快速而肮脏的修复,只需在mysql\u connect之前加上@就可以了。例如@mysql_connect。。。;通过这种方式,您不必更改任何其他配置。使用剩余的mysql_u函数是可以的。只有mysql_connect给出了这条消息。@BimalPoudel:我已经说过,在我的回答中,当然可以使用PHP来抑制出现在问题表达式上的错误,即在相关行前面加@,但是这将抑制该表达式引起的所有错误,不仅仅是E_不推荐的标题。@FranKee:如果不是在数据库中,这些用户生成的标题存储在哪里?你所指的“先我说”攻击是什么?在没有mysql数据库的情况下使用mysql\u real\u escape\u字符串绝对不是打败任何东西的正确方法,因为它根据mysql数据库连接的字符集来转义字符串,而您没有!。如果您试图阻止XSS攻击,则应该使用。对于任何其他攻击,请详细说明确切的威胁。这里有一个用于将mysql转换为mysqli的源代码扫描工具:使用。这是mysql最简单的升级路径,使用PDO;两种选择中哪一种更友好。MYSQLI实际上只是一个权宜之计;起初,由于名称相似性,对新手来说很有吸引力,但由于函数签名发生了变化,因此需要更多的重写,甚至使参数化查询更加努力。至于回答问题的标题,PDO更一般,通常是更好的解决方案@DennisDegryse=>虽然我更喜欢面向对象的PDO,但MySQLi也有一种面向对象的方法来使用它搜索MySQLi类。更多关于PDO | MySQLi on与Oracle Mysql Wiki weblink上未找到任何内容之间的比较的信息,请参见上面的评论。@hakre感谢该工具的链接。作为一般性评论,请注意,对于某些命令,您不能简单地将mysql_uu转换为mysqli_u,因为它们的功能不同。
error_reporting = E_ALL ^ E_DEPRECATED
error_reporting = E_ALL ^ E_DEPRECATED