为什么PHP的mysql_功能过时? [重复] 为什么PHP的mysql_功能过时? [重复]

2019-05-12 05:02发布

This question already has an answer here:

  • Why shouldn't I use mysql_* functions in PHP? 15 answers

Playing Devil's Advocate a little here as I stopped using these functions a while ago, but the question is genuine and probably matters to a lot of SO users.

We all know that using mysql_ functions in the wrong way can be very dangerous, it can leave your website vulnerable, etc. but used correctly these functions can be protected against SQL injection and are actually a fair bit faster than the newer PDO functions.

Bearing all this in mind, why have the mysql_ functions been deprecated?

Answer 1:

MySQL扩展是古代和已自PHP 2.0发布15年前(!); 这是一个决然不同的野兽比现代PHP它试图摆脱其过去的不良做法。 MySQL扩展是一种非常原始的,低层次的连接到MySQL缺乏许多的方便特性,由此很难以安全的方式正确适用; 它因此,对于菜鸟坏。 许多开发人员不懂SQL注入和MySQL API足够脆弱,使其很难阻止它,即使你意识到这一点。 这是充满了全局状态(隐式连接通过为实例),这使得它易于编写代码是很难维持的。 由于它是旧的,它可能是不合理很难在PHP核心层面维护。

mysqli扩展是很多更新,修复了所有上述问题。 PDO也比较新,并修复所有这些问题太多,加上更多。

由于这些原因,* mysql扩展会在将来某个时候删除。 它没有自己的工作在其鼎盛时期,而严重,但它做到了。 时代是在前进,最佳实践的演变,应用程序已经变得更加复杂,需要更先进的API。 MySQL是退役,与它生活。

考虑到这一切, 没有理由继续使用该卡除了惯性。


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

选择从该文件的后续行情:

文档团队正在讨论数据库的安全局势,并教育用户摆脱常用的EXT / mysql扩展走的是这部分。

 

从分机搬走/ MySQL的不仅是安全,而且关于有访问MySQL数据库的所有功能。

 

EXT / MySQL的难以维护的代码。 它是不是没有得到新的功能。 保持它最新的与的libmysql或mysqlnd版本的新版本的工作就是工作,我们可能会花那个时候更好。



Answer 2:

弃用

据我所知,这是负责支持甲骨文的乡亲,只是拒绝这样做了。 这似乎是主要原因。

所有其他的原因,但愚蠢的借口。 有一吨扩展同年龄的PHP,高兴地运行起来。 在一个现代版的一些新功能是不是一个理由弃用旧的一个。 当然,有一个与库本身,而是与图书馆用户没有安全问题。

这是否意味着我不再在我的网站使用它们?

这取决于。

  • 对于遗留代码,我怀疑它值得入手紧急重写。
  • 至于品牌新项目 - 答案相当简单:

你刚才不应该使用在应用程序代码,但在仅DBAL库的任何 API调用。

它不仅使整个驱动的问题可以忽略不计(因为你只需要以改变驱动器重写一个相对较小的库中的代码),而且它可以使你的代码大大缩短且干净。

性能

说到性能差异的,有提一件有趣的事情。 互联网的确是充满基准告诉你,X是由Z倍于Y快。 但是,如何一看就知道,从一个坏的一个很好的标杆? 很难在一般的判断。 一般来说,编写测试时,一个必须了解他们在做什么。 不幸的是,大多数测试的作家没有。

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

通过包含在环连接代码,笔者只标杆连接时间 ,但是不知道他的目的是要测量。 结果是相当明确。
因为

  • 连接被称为是一个相对耗费资源的操作
  • mysql_connect()实际上从未重新连接 (如果没有明确告知),而最后使用打开的连接来代替。

因此,我们有mysql分机大大加快结果。 也难怪,因为两者的mysqli和PDO不得不所有的几千倍连接,而MySQL的不得不一次连接。

与连接从迭代代码移除,结果显着地改变, 表示总的渺小。

有在这个测试中其他许多陷阱,但这个想法是一样的:

千万不要空转基准无章可循。 但总是做任何基准测试只有当你有一个理由,并在真实环境。 否则,你将测量什么,但任何有意义的数字



Answer 3:

他们为什么不推荐?

那么,根本的原因是API设计不良。 该mysqli库作为直接替代它,用更好的API设计创建。

是的,有与这意味着它需要更换库的内部代码的问题,但如果API已在第一时间被更好地设计,在mysqli库不需要被写入; 改进的代码可以简单地被交换到现有的库,我们的开发人员可以利用现有的功能,而无需知道事情已经在内部改变已经进行。

然而,事实并非如此。 原来的API也有一些关键的设计缺陷,这意味着,当PHP开发人员想要改善的事情,有这意味着他们不能做到这一点的问题。

因此,对他们的行动,最好的办法是提供一个新的API,并弃用旧的。



Answer 4:

因为它缺少的功能只是如今预计,it's不再值得保持。 由于PHP试图保持苗条的API(...),你可以期望它最终要去除。 It's与IE7一样:你不容指望用它,直到它“在前看不见”。 你必须自己停止使用。

从图片http://php.net/manual/en/mysqlinfo.api.choosing.php



文章来源: Why are PHP's mysql_ functions deprecated? [duplicate]