为什么不推荐使用PHP的mysql_函数?

时间:2013-05-31 14:17:09

标签: php mysql pdo mysqli

在我刚刚停止使用这些功能时,在这里玩魔鬼的倡导者,但这个问题是真实的,可能对很多SO用户很重要。

我们都知道以错误的方式使用mysql_函数可能非常危险,它可能会使您的网站容易受到攻击等,但正确使用这些函数可以防止SQL注入并且actually a fair bit faster而不是较新的PDO功能。

考虑到这一切,为什么不推荐使用mysql_函数?

4 个答案:

答案 0 :(得分:15)

mysql扩展很古老,自从15年前发布的PHP 2.0以来就已存在(!!);这是一个与现代PHP完全不同的野兽,试图摆脱过去的不良做法。 mysql扩展是MySQL的一个非常原始的低级连接器,缺少许多便利功能,因此难以以安全的方式正确应用 ;这对新手来说很糟糕。许多开发人员不理解SQL注入,并且mysql API非常脆弱,即使您已经意识到它也很难阻止它。它充满了全局状态(例如,隐式连接传递),这使得编写难以维护的代码变得容易。由于它已经陈旧,因此在PHP核心级别维护可能是不合理的。

mysqli扩展程序更新,修复了上述所有问题。 PDO也是新的,并且解决了所有这些问题,还有更多。

由于这些原因*将来某个时候将删除mysql扩展名。它在鼎盛时期完成了它的工作,相当糟糕,但它做到了。时间已经过去,最佳实践已经发展,应用程序变得更加复杂,需要更现代的API。 mysql正在退休,与它一起生活。

鉴于这一切,除了惯性之外,没有理由继续使用它。


*这些是我常识总结的原因;对于整个官方故事,请看这里:https://wiki.php.net/rfc/mysql_deprecation

该文件的选择引用如下:

  

文档小组正在讨论数据库安全状况,   并教育用户摆脱常用的ext / mysql   扩展是其中的一部分。

  

离开ext / mysql不仅是关于安全性,也是关于安全性的   可以访问MySQL数据库的所有功能。

  

ext / mysql很难维护代码。它不是没有新的   特征。保持最新版本的新版本   libmysql或mysqlnd版本是可行的,我们可能会花那么多   时间更好。

答案 1 :(得分:3)

弃用

据我所知,有人支持Oracle的人员,只是拒绝这样做了。这似乎是主要原因。

所有其他原因只是愚蠢的借口。在相同年龄的PHP中有大量的扩展,愉快地启动和运行。现代版本中的一些新功能不是弃用旧版本的理由。 当然,库本身没有安全问题,而是库用户

  

这是否意味着我应该停止在我的网站中使用它们?

这取决于。

  • 对于遗留代码,我怀疑是否值得开始进行紧急重写。
  • 至于全新的项目 - 答案很简单:

您不应该在应用程序代码中使用任何 API调用,而只应在DBAL库中使用

它不仅会使整个驱动程序问题忽略不计(因为您只需要重写一个相对较小的库代码来更改驱动程序),而且它可以使您的代码更加简洁和清晰。

性能

说到性能差异,有一件值得一提的事情。互联网确实是完整的基准测试,告诉你X比Z快了Z倍。但是如何从糟糕的基准中找出一个好的基准呢?一般来说很难说。一般来说,在编写测试时,必须了解他们在做什么。不幸的是,大多数测试编写者都没有。

让我们在你的问题中联系一个。

通过在循环中包含连接代码,作者仅仅标记了连接时间,而不是他想要衡量的内容。 结果非常可预测。
因为

  • 连接已知是一种相对耗费资源的操作
  • mysql_connect()从未实际重新连接(如果没有明确说明),而是使用上次打开的连接。

因此我们将mysql ext的速度提高得更快。难怪,因为mysqli和PDO都必须连接数千次,而mysql只需要连接一次。

从迭代代码中删除连接后,结果会发生显着变化,显示完全不重要。

此测试还有许多其他陷阱,但这个想法仍然相同:

永远不要无处运行闲置的基准测试。但是只有在真实环境中有理由的时候才能做任何基准测试。否则你会测量除了有意义的数字之外的任何东西

答案 2 :(得分:1)

他们为何弃用?

嗯,根本原因是API的设计很差。 mysqli库是作为其直接替代创建的,具有更好的API设计。

是的,库的内部代码存在问题,这意味着需要更换它,但如果首先设计了更好的API,则无需编写mysqli库;改进的代码可以简单地交换到现有的库中,我们开发人员可以继续使用现有的函数,而不需要知道内部发生的变化。

但事实并非如此。最初的API确实存在一些关键的设计缺陷,这意味着当PHP开发人员希望改进时,有些问题意味着他们无法做到这一点。

因此,对他们来说最好的做法是提供一个新API并弃用旧API。

答案 3 :(得分:-1)

Feature comparison

由于缺乏现在简单预期的功能,因此不再需要维护。由于PHP试图保持一个纤薄的API(...),你可以期望它最终被删除。就像IE7一样:你不能期望使用它,直到它“消失”。你必须自己停止使用。

来自http://php.net/manual/en/mysqlinfo.api.choosing.php的图片