【问题标题】:The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead [duplicate]不推荐使用 mysql 扩展并将在将来删除:请改用 mysqli 或 PDO [重复]
【发布时间】:2012-12-06 08:48:03
【问题描述】:

当我尝试从 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
    

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

【问题讨论】:

  • 这里有一个mysql转mysqli的源码扫描工具:Converting to MySQLi (Dec 2011; by Keith Larson; Oracle Mysql Wiki)
  • 使用pdo_query()。 mysql_最简单的升级路径,使用PDO;这是两种选择中更友好的。 MYSQLI 实际上只是一个权宜之计的 API;由于名称相似性,一开始对新手很有吸引力,但由于函数签名的变化需要更多的重写,然后甚至使参数化查询更加努力。
  • 至于回答问题标题 - PDO 更笼统,generally 是更好的解决方案。 @DennisDegryse => 虽然我更喜欢面向对象的 PDO,但 MySQLi 也有一种面向对象的使用方式(搜索“mysqli 类”)。更多关于 PDO|MySQLi 在code.tutsplus.com/tutorials/…php.net/manual/en/mysqli.overview.php 上的比较
  • 在 Oracle Mysql Wiki 上找不到任何东西(上面的网络链接评论)。
  • @hakre 感谢您提供该工具的链接。作为一般性评论,请注意您不能简单地将 mysql_ 转换为 mysqli_ 对于某些命令,因为它们的功能不同。

标签: mysql deprecated php


【解决方案1】:
  1. 为什么会这样?

    整个ext/mysql PHP 扩展,它提供了以mysql_ 为前缀的所有函数,是officially deprecated in PHP v5.5.0removed in PHP v7

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

    该手册已包含自 2011 年 6 月以来在新代码中使用它的警告。

  2. 我该如何解决?

    正如错误消息所示,您可以考虑另外两个 MySQL 扩展:MySQLiPDO_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

  3. 我知道可以通过在php.ini 中设置error_reporting 以排除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)然后在暂存环境中彻底测试您的解决方案。

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

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

    • 数据库访问方法分散在各处,不能轻易地换成新的扩展之一。

      考虑此时是否真的需要升级到 PHP v5.5。

      您应该开始计划将ext/mysql 替换为其他更现代的扩展程序之一,以便您能够从它们提供的好处中获得回报;您也可以利用它作为一个机会,将您的数据库访问方法重构为更加模块化的结构。

      但是,如果您有紧急需要立即升级 PHP,您可能会考虑暂时抑制弃用错误:但首先要确保识别出任何其他也被抛出的弃用错误.

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

    考虑此时是否真的需要升级到 PHP v5.5。

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

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

【讨论】:

  • 请也推荐/建议使用prepared statement ,,, 很多时候我看到用户使用pdo或mysqli查询的方式与mysql相同,即使他们没有转义单引号,这更危险
  • @NullPointer:它已经说“他们...提供...准备好的陈述(从而提供the best way来击败SQL injection attacks”。我真的不想在这个答案中给出参数化查询的例子,因为它与手头的问题并不真正相关;您认为如何更清楚?
  • 如果你想要一个快速而肮脏的修复,只需在 mysql_connect 之前加上 @ 即可抑制它。例如。 @mysql_connect(...);通过这种方式,您不必更改任何其他配置。使用其余的 mysql_ 函数是可以的。只有 mysql_connect() 给出这个消息。
  • @BimalPoudel:我已经在我的回答中说过——“当然,可以通过使用 PHP 的 error control operator 来抑制在相关表达式中出现的错误——即在相关行之前添加使用@——但是这将抑制该表达式引发的所有错误,而不仅仅是E_DEPRECATED 的错误。”
  • @FranKee:如果不在数据库中,您会将这些用户生成的标题存储在哪里?您所指的“跟我说话”攻击是什么?在没有 MySQL 数据库的情况下使用 mysql_real_escape_string() 绝对不是 打败任何东西的正确方法(因为它根据 MySQL 数据库连接的字符集转义字符串,你没有!)。如果你想阻止 XSS 攻击,你应该使用htmlentities()。对于任何其他攻击,请详细说明确切的威胁。
猜你喜欢
  • 2014-12-29
  • 2014-01-05
  • 2016-09-28
  • 2017-08-20
  • 2014-04-04
  • 2014-09-18
  • 2014-11-11
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多