为什么不应该使用mysql_*函数的技术原因是什么?(例如mysql_query()、mysql_connect()或mysql_real_ascape_string())?

为什么我要使用其他东西,即使它们在我的网站上工作?

如果它们在我的网站上不起作用,为什么我会出现这样的错误

警告:mysql_connect():没有这样的文件或目录


当前回答

mysql_函数:

已过时-不再维护不允许您轻松移动到另一个数据库后端不支持准备好的语句,因此鼓励程序员使用串联来构建查询,从而导致SQL注入漏洞

其他回答

如果您确定不想升级php版本,则无需更新,但同时您也不会获得安全更新,这将使您的网站更容易受到黑客攻击,这是主要原因。

mysql_函数:

已过时-不再维护不允许您轻松移动到另一个数据库后端不支持准备好的语句,因此鼓励程序员使用串联来构建查询,从而导致SQL注入漏洞

因为(除其他原因外)要确保输入数据得到净化要困难得多。如果您使用参数化查询,就像使用PDO或mysqli一样,您可以完全避免风险。

例如,有人可以使用“enhzflep);drop table users”作为用户名。旧的函数将允许每个查询执行多个语句,所以像这种讨厌的bug可以删除整个表。

如果要使用mysqli的PDO,用户名将以“enhzflep);drop table user”结尾。

参见bobby-tables.com。

我觉得上面的答案很冗长,所以总结一下:

mysqli扩展有许多优势,关键增强mysql扩展名为:面向对象的接口对已编制报表的支持支持多个语句交易支持增强的调试功能嵌入式服务器支持

来源:MySQLi概述


正如上面的答案所解释的,mysql的替代品是mysqli和PDO(PHP数据对象)。

API支持服务器端Prepared Statements:由MYSQLi和PDO支持API支持客户端Prepared Statements:仅PDO支持API支持存储过程:MySQLi和PDOAPI支持多语句和所有MySQL 4.1+功能-由MySQLi支持,大部分也由PDO支持

MySQLi和PDO都是在PHP 5.0中引入的,而MySQL是在PHP 3.0之前引入的。需要注意的一点是,MySQL包含在PHP5.x中,但在以后的版本中已被弃用。

原因有很多,但可能最重要的一点是,这些函数鼓励不安全的编程实践,因为它们不支持准备好的语句。准备好的语句有助于防止SQL注入攻击。

当使用mysql_*函数时,您必须记住通过mysql_real_aescape_string()运行用户提供的参数。如果你只在一个地方忘记了,或者你碰巧只漏掉了部分输入,你的数据库可能会受到攻击。

在PDO或mysqli中使用已准备好的语句将使其更难产生此类编程错误。