PDO准备在where子句中具有多个条件的语句

时间:2013-12-13 01:18:24

标签: php mysql pdo prepared-statement sql-injection

如果我正在使用PDO预处理语句,并且我有这样的查询:

SELECT cat_name, cat_id_PK, cat_amount
FROM categories
WHERE month=? AND is_recurring = '0'
ORDER BY cat_name ASC;

$results->bindValue(1, $cur_month);

我是否还要绑定is_recurring子句的值? '0'是硬编码的,我不认为它会让我容易受到SQL注入的影响,但我想要确定。我注意到在一个教程中我看到他们确实绑定了值,即使它不是传递的变量,这让我想知道我是否做得对。

2 个答案:

答案 0 :(得分:1)

不,在这种情况下,绑定不是必需的。 As stated by PHP.net,准备好的陈述有两个目的:

  1. 查询只需要解析一次,因此运行得更快
  2. 他们阻止SQL注入
  3. 由于您在查询中对该值进行了硬编码,因此两者都不适用。查询保持不变,因此只需编译一次。并且没有用户输入粘贴到查询中,因此SQL注入是不可能的。 (只要你绑定其他值,当然)

    结论:您不必绑定0,因为它不是变量。

答案 1 :(得分:1)

在这种情况下,绑定不是必需的,它不是变量。