2013-10-04 85 views
0

我有这样一个查询:PDO绑定参数不起作用

$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); 

我在catgeory 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']'

出于所有可能性只有最后一个工作。这也是我实际上不想使用的那个。我怎样才能解决这个问题?

+1

你必须执行'()'语句,您可以'使用fetchall()' –

回答

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' : '') 
); 
+0

啊,当然。我想我应该在整天编码后休息一下。我绝对没有'执行'它。谢谢。接得好。 – lampshade

1

你错过了在这一行冒号:

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

应该是:

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

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

+0

其实它的工作原理之前,左右逢源,但感谢这个提示了。 – lampshade

+0

哦,我没有意识到。然后我也学到了一些东西。 :) –