从现在开始,我一直在使用旧的 mysql
而不是 PDO
,而且我看到了很多关于为什么要切换到 PDO
的建议,但是也有许多不同的事实(也在 SO 上),例如:
- 说明
PDO
稍快/稍慢 - 说
PDO
有助于防止 SQL 注入(inject),但前提是您使用准备好的查询 - 还说使用准备好的查询很糟糕,因为它太慢了
那么,什么是真实的?尤其是使用 PDO
时的最佳实践是什么,速度和安全性都很重要——如何在保持快速查询的同时最好地保护自己免受 SQL 注入(inject)?
最佳答案
数据库支持
PDO 相对于 MySQL 的核心优势在于其对数据库驱动程序的支持。 PDO 支持许多不同的驱动程序,例如 CUBRID、MS SQL Server、Firebird/Interbase、IBM、MySQL 等。
安全
这两个库都提供 SQL 注入(inject)安全性,只要开发人员按照预期的方式使用它们。建议将准备好的语句与绑定(bind)查询一起使用。
// PDO, prepared statement
$pdo->prepare('SELECT * FROM users WHERE username = :username');
$pdo->execute(array(':username' => $_GET['username']));
// mysqli, prepared statements
$query = $mysqli->prepare('SELECT * FROM users WHERE username = ?');
$query->bind_param('s', $_GET['username']);
$query->execute();
速度
虽然 PDO 和 MySQL 都相当快,但 MySQL 在基准测试中的执行速度微乎其微——非准备语句约为 2.5%,准备语句约为 6.5%。
命名参数
就像@DaveRandom 指出的那样,这是 PDO 的另一个特性,它比可怕的数字绑定(bind)要容易得多。
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
$pdo->prepare('
SELECT * FROM users
WHERE username = :username
AND email = :email
AND last_login > :last_login');
$pdo->execute($params);
几个链接供进一步引用
MySQL vs PDO (Stackoverflow)
Why you should be using PDO for database access (net.tutsplus.com)
关于php - PDO - 真实的事实和最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11277675/