为什么我应该使用bindValue / Param与普通变量?

时间:2012-11-20 14:58:30

标签: php mysql pdo bindvalue

我可以看到很多关于为什么更好地使用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.

2 个答案:

答案 0 :(得分:2)

主要原因是使用预处理语句和绑定变量来保护自己免受用于sql注入攻击的最常见的向量。

第二个原因是,如果您有多个请求运行相同的查询语句,但具有不同的变量值,您只需让服务器计算一次执行计划,然后在调用时对变量运行它就可以节省时间同样的说法一遍又一遍。考虑多次循环同一语句。这是mysql允许且PDO支持的服务器端预处理语句的概念。

答案 1 :(得分:2)

像其他人所说,你想使用PDO来防止SQL注入。将具有不良意图类型的用户称为';drop table students;--类似于您网站上的输入框。如果没有PDO,最终查询将如下所示:

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

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

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