PDO绑定参数不起作用

时间:2013-10-04 19:12:42

标签: php mysql pdo prepared-statement

我有一个类似的查询:

$stmt = $db->query('
    SELECT e.id
    FROM `entity` e
    WHERE e.deleted = 0 AND e.published = 1 AND e.date <= CURDATE() ' .
          ( !empty($_SESSION['filter']) ? ' AND e.category = :category' : '' )
);

if (!empty($_SESSION['filter'])) {
    $stmt->bindValue('category', $_SESSION['filter'], PDO::PARAM_INT);
}

$entities = $stmt->fetchAll(PDO::FETCH_ASSOC);

我在cat 1中设置了一些条目并设置了$_SESSION['filter']

string(1) "1"

但是它不会加载任何条目,也不会出现任何错误。

我也尝试过:

  • category重命名为其他内容,例如myvalue
  • 设置新变量:$x = 1; $stmt->bindValue('category', $x, PDO::PARAM_INT);
  • 直接编辑查询:' AND e.category = 1'' AND e.category = $_SESSION['filter']'

在所有可能性中,只有最后一个工作。这也是我实际上不想使用的那个。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

PDO::query() executes an SQL statement in a single function call, returning the result set (if any) returned by the statement as a PDOStatement object.

您的查询已经执行。绑定值不起作用。

您应该先准备好查询。

$stmt = $db->prepare('
    SELECT e.id
    FROM `entity` e
    WHERE e.deleted = 0 AND e.published = 1 AND e.date <= CURDATE() ' .
      ( !empty($_SESSION['filter']) ? ' AND e.category = :category' : '' )
);

答案 1 :(得分:1)

你错过了这一行的冒号:

$stmt->bindValue('category', $_SESSION['filter'], PDO::PARAM_INT);

应该是:

$stmt->bindValue(':category', $_SESSION['filter'], PDO::PARAM_INT);

编辑:我错过了最明显的问题。请参阅u_mulder的答案。