目前我一直在使用老版本的mysql
而不是PDO
,我看到了很多建议要转换到PDO
的理由,但也有很多不同的事实(也包括在 Stack Overflow 上),例如:
- 声称
PDO
略微更快/稍微慢一点 - 说
PDO
有助于防止 SQL 注入,但只有在使用预处理语句时才能防止 - 还说使用预处理查询很糟糕,因为它非常慢
那么,什么才是真实情况呢?特别是,在使用PDO
并且速度和安全性都非常重要时,最佳实践是什么 - 如何在保持快速查询的同时最大限度地保护自己免受 SQL 注入攻击?
目前我一直在使用老版本的mysql
而不是PDO
,我看到了很多建议要转换到PDO
的理由,但也有很多不同的事实(也包括在 Stack Overflow 上),例如:
PDO
略微更快/稍微慢一点PDO
有助于防止 SQL 注入,但只有在使用预处理语句时才能防止那么,什么才是真实情况呢?特别是,在使用PDO
并且速度和安全性都非常重要时,最佳实践是什么 - 如何在保持快速查询的同时最大限度地保护自己免受 SQL 注入攻击?
PDO 相对于 MySQL 的核心优势在于其数据库驱动程序的支持。PDO 支持许多不同的驱动程序,如 CUBRID、MS SQL Server、Firebird/Interbase、IBM、MySQL 等。
只要开发人员按照预期使用它们,两个库都提供 SQL 注入安全性。建议使用预处理语句和绑定查询。
// 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具有的另一个特性,比可怕的数字绑定容易得多。
$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)
为什么你应该使用PDO来访问数据库(net.tutsplus.com)
bind_param()
/bind_result()
,而不能直接传递/检索数组,导致创建明确引用数组的可怕函数和难以阅读的call_user_func_array()
结构。 - DaveRandom
PDO::quote()
,但这要看你在做什么。我认为让你理解最好的方法是了解一下预处理语句实际上是做什么的 - 它们将查询发送到数据库服务器进行解析和准备,然后当你调用execute()
时,它们会发送用于占位符的数据并检索结果。因此,对于只运行一次的语句,这会导致更多的数据库流量,并且会稍微拖慢速度… - DaveRandomUPDATE
,它可以显著加快速度,因为查询只被解析一次并且执行计划只被设计一次,唯一的变量是在执行期间使用的数据。 - DaveRandom