php - PDO - 真实的事实和最佳实践?

标签 php mysql database pdo database-connection

从现在开始,我一直在使用旧的 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);

PDO vs MySQL

几个链接供进一步引用
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/

相关文章:

mysql - 如何在 Laravel 5 中的一对多关系中仅查询一个外部行

mysql - 创建其列属性是另一个表的行的表

PHP/Javascript 复选框在选中时更改表单操作

php - 如何在不使用按钮上的提交事件的情况下提交表单。

php - 查询以检索列名称中存储变量的数据

php - 成功插入数据库后,Mysqli_insert_id() 绝对不返回任何内容。为什么?

html - 如何将视频转换为 ogg 和 mp4 并存储在数据库中

database - 关于哈希盐的综合信息

php - 使用 php + gearman + node.js

php - Laravel 5 三个模型的关系