【问题标题】:Deprecated MySQL extension in PHP 5.5.xPHP 5.5.x 中弃用的 MySQL 扩展
【发布时间】:2013-08-19 12:35:41
【问题描述】:

根据PHP manual,以及从 PHP 5.5.x 开始在 Internet 上的许多来源,整个原始 MySQL 扩展已被弃用。我有一个非常强大的 Web 应用程序,我的协会中的很多学生都在使用它,但是当我对 PHP 不太了解时,我开始研究它,而且我从来没有为使用 MySQLi_* 或 PDO_MySQL 更改 MySQL_* 扩展而烦恼.

网络应用程序已完成,所有系统都在运行,可能不会用新功能增强,所以我的问题是:我是否应该花一些时间来更改所有 mysql_* 调用并用 mysqli_* 调用切换它们。如果我将所有内容都保留为已弃用的 mysql_* 扩展程序,我的应用程序是否会在 Internet 上无法访问?

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    如果我将所有内容都保留为已弃用的 mysql_* 扩展程序,我的应用程序是否会在 Internet 上无法访问?

    只有当运行它的服务器升级到不支持旧 API 的 PHP 版本时,您的应用程序才会中断。如果您的服务器没有升级到 PHP 5.5,那么您的应用程序将无限期地继续运行。在这方面,外部互联网上的任何其他内容都不会影响它;只有升级到您自己的服务器是相关的。

    目前,php 5.4 仍然受到积极支持,因此您可以愉快地继续使用该版本,而无需担心您的代码会突然中断。

    但是,在未来的某个时候,出于某种原因,您将需要升级到 PHP 5.5 或更高版本。 PHP 5.4 将终止使用,建议迁移到 5.5。或者,如果您使用的是共享主机帐户,您甚至可能无法选择您的 PHP 版本。所以是的,您应该期望您当前的代码不适用于您当时使用的 PHP 版本。最终。

    因此,虽然没有立即进行转换的紧迫性,但您应该考虑尽快这样做。你想要的一件事是当事情破裂的那一天到来时,你会发现自己被抓了。

    5.5 刚刚发布,因此您可能需要几年时间才能成为可用的最低版本,但请接受我的建议;你不想等到最后一刻。

    我是否应该花一些时间来更改所有 mysql_* 调用并用 mysqli_* 调用切换它们。

    您说您的应用“非常强大”并且“可能不会得到增强”。所以它基本上处于一个只需要长期维护的阶段。

    鉴于这些标准,我会说是的,简单地切换到 mysqli 库是明智之举。所需的更改相当微不足道(听起来您已经掌握了要做什么),并且对软件的其余部分几乎没有任何影响。

    如果您的代码确实健壮且编写良好,那么您的代码结构就会有某种数据库层,这意味着您无论如何都没有太多事情要做。

    如果它的结构不是很好,它可能有很多 mysql_query() 调用分散在代码周围,在这种情况下可能需要更多的工作。在这种情况下,由于您无论如何都在处理代码,您可能会考虑花时间进行一些重组。创建数据库层。也许开始使用准备好的语句。我还建议切换到 PDO 而不是 mysqli。但是您的电话 - 鉴于您在问题中所说的内容,如果您想尽可能少地完成工作,那将是可以理解的。

    顺便说一句 - 如果您还没有这样做,您可能还想阅读以下内容:Why shouldn't I use mysql_* functions in PHP?

    【讨论】:

      【解决方案2】:

      是的,只要您的虚拟主机升级到删除扩展的 PHP 版本,应用程序就无法访问。请注意,这不会在 PHP 5.5 中发生,其中扩展“仅”标记为已弃用。删除扩展程序的确切时间是 afaik unknown atm。

      关于升级问题:这真的取决于,您是否希望您的应用程序寿命超过 mysql_*?您的网络主机是否经常更新 PHP?如果它们的更新速度很慢,您可能可以运行该应用程序数年。

      在性能/安全方面,最好更改为准备好的语句。

      【讨论】:

      • 请注意,在典型的 Web 应用程序中,您没有机会使用“性能方面”的准备好的语句。
      【解决方案3】:

      你应该问自己的问题是

      "How long before I am forced to move to a version of PHP that no longer supports mysql_*?"
      

      如果您从不升级 PHP,则根本不需要更改代码。 (请不要对我大喊大叫)

      但是在未来一段时间内,您将不得不迁移到更新版本的 PHP

      您的 ISP 或您的网络管理员会坚持认为您所使用的 PHP 版本太旧且在网络上不安全。

      所以诚实的答案是,您不必在星期五之前这样做,但是当管理员坚持要删除您的 PHP 版本时,您将不得不在某个时候这样做。所以当你有时间去做吧。

      【讨论】:

        【解决方案4】:

        我是否应该花一些时间来更改所有 mysql_* 调用并用 mysqli_* 调用切换它们。

        不,不,不。

        • 如果您想让您的应用程序更好,请熟悉某种 ORMquery builder 或至少像 PDOsafeMysql 这样的 DAL。
        • 如果您想让您的应用程序继续运行,请保持原样。您的服务器上还没有 5.5,是吗?获得它后,您将能够关闭已弃用级别的通知。不是最好的方法,但便宜且可用。

        虽然机械地将 mysql 更改为 mysqli 调用没有好处。

        如果我将所有内容都保留为已弃用的 mysql_* 扩展程序,我的应用程序是否会在 Internet 上无法访问?

        实际上无法在这里得到您的要求,但我会说您至少还有 5 年的时间。

        【讨论】:

        • 我确实认为使用mysqli_ 程序命令非常好,毕竟它只不过是一个别名不是吗?
        • @MackieeE 完全正确。和 mysql_ 一样好 - 所以,改变没有意义。
        【解决方案5】:

        是的,您应该费心更新您的代码以使用 mysqli 或 PDO。

        原因不仅在于 mysql_* 在未来的 PHP 版本中无法访问。但也有利于您的安全。

        mysql_* 不支持涵盖 sql 保护的预处理语句/参数化语句。您可以使用 mysql_real_escape_string(),但即使这样在处理多字节字符时也不是完美无缺的。

        另见:https://security.stackexchange.com/questions/8028/does-mysql-escape-string-have-any-security-vulnerabilities-if-all-tables-using-lhttps://stackoverflow.com/a/12118602/1209443

        【讨论】:

        • 这是什么意思 - 准备好的语句参数化的语句?他们不是一样的吗? mysql_real_escape_string() 正确使用时完美无瑕。
        • @YourCommonSense : 如果使用得当确实如此。但是,如果从一台服务器上获取代码并将其放在另一台服务器上(使用不同的字符编码),您的安全性可能会存在漏洞。
        • 我在您添加的链接中看不到任何证据。更不用说它在 mysql_escape_string() 上。
        • @YourCommonSense 试试这个链接。 stackoverflow.com/a/12118602/1209443 。 mysql_real_escape_string 可以上当,但最终你可以控制它,只要你知道自己在做什么。
        • 对不起,伙计,但我不需要链接或谷歌,因为我自己做研究。每个工具都必须正确使用,mres() 也不例外。然而,此功能没有基本问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-09
        • 2014-07-18
        • 2013-10-20
        • 2012-05-17
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多