1

我可以看到很多关于为什么使用 PDO bindValue 与 bindValue 更好的讨论。但是我找不到关于为什么要在查询中使用它而不是简单变量的精确信息。谁能告诉我?谢谢

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); 
$s->execute();

VS

$sex = 'male';
$s = $dbh->query('SELECT name FROM students WHERE sex = $sex'); // OR PREPARE, The question is how to pass the variable.
4

2 回答 2

2

主要原因是通过使用准备好的语句和绑定变量,您可以保护自己免受用于 sql 注入攻击的最常见向量的侵害。

第二个原因是,如果您有多个请求来运行相同的查询语句,但使用不同的变量值,您可以通过只让服务器计算一次执行计划,然后在调用同一语句时在变量上运行它来节省时间一遍又一遍。考虑多次循环相同的语句。这是 mysql 允许和 PDO 支持的服务器端准备语句的概念。

于 2012-11-20T15:00:38.943 回答
2

正如其他人所说,您想使用 PDO 来防止 SQL 注入。假设有恶意的用户';drop table students;--在您网站的输入框中输入了类似的内容。如果没有 PDO,最终查询将如下所示:

SELECT name FROM students WHERE sex = '';drop table students;--'

看看会发生什么?该select语句将运行并且找不到任何结果(除非您的表中有没有指定性别的学生)。然后,该drop语句将运行,并且您的整个学生表将被删除。

这只是一个例子——有各种各样的 SQL 注入攻击,其中许多比这更危险。使用 PDO 可以防止几乎所有这些。在内部,绑定变量与查询本身分开。

于 2012-11-20T15:17:50.120 回答