PHP: mysql v mysqli v pdo [closed]

2022-08-30 22:02:07

我一直在阅读一些关于使用mysqli与pdo在php中使用mysql的问题。

我见过诸如mysqli或PDO之类的问题 - 优缺点是什么?或者从mysql转移到mysqli或pdo?,它们都专门处理mysqli v pdo。我对这两种方法中哪一种更好并不感兴趣。

我想知道为什么应该避免mysql_功能。当然,根据PHP的文档 http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated,它们正在被弃用,线程PHPDO和MySQLi建议PDO和MySQLi更受欢迎,线程MySQL,MySQLi和PDO之间有什么区别?意味着这些较新的方法更安全。

总的来说,我想知道mysql_方法中最大的弱点是什么,以及避免使用它的原因是什么(我想不仅仅是因为它被弃用了)。我计划更新受影响的脚本,并好奇为什么这个旧方法被弃用。

谢谢!


答案 1

该函数的设计使得您必须小心地转义注入其中的每一位数据,如果您错过了哪怕一个,您的整个应用程序都可能被自动SQL漏洞利用工具破坏。mysql_query

和 PDO 都支持占位符,这是确保查询免受 SQL 注入 bug 影响所必需的。调用所有内容不仅乏味,而且容易出错,这就是问题出现的地方。mysqlimysql_real_escape_string

这些函数是PHP早期产品的产物,并且比两者作为选项或PDO设计提供的新面向对象功能受到更多限制。mysqlmysqli

使用这两个新接口之一有很多很好的理由,但最重要的是,在生产代码中使用该函数太危险了。有了它,你将永远是一个错误,远离一些非常严重的问题。mysql_query

充满密码和信用卡号的数据库不断出现是有原因的。拥有一个明显的SQL注入点使得完全接管站点变得非常容易。


答案 2

从选择 MySSQL API @ PHP.net

// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);

创建一个对象,就像mysqli和PDO一样,是编写任何现代软件的推荐方法。mysql liblary是为PHP版本2.0发布的,从那时起就没有进行过重大的重写。PHP 2.0 发布于 1997 年,这应该足以解释为什么不使用它。


推荐