在我刚刚停止使用这些功能时,在这里玩魔鬼的倡导者,但这个问题是真实的,可能对很多SO用户很重要。
我们都知道以错误的方式使用mysql_
函数可能非常危险,它可能会使您的网站容易受到攻击等,但正确使用这些函数可以防止SQL注入并且actually a fair bit faster而不是较新的PDO功能。
考虑到这一切,为什么不推荐使用mysql_
函数?
答案 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)
由于缺乏现在简单预期的功能,因此不再需要维护。由于PHP试图保持一个纤薄的API(...),你可以期望它最终被删除。就像IE7一样:你不能期望使用它,直到它“消失”。你必须自己停止使用。