0

我有一个像这样的查询:

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

我在类别中有一些条目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']'

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

4

2 回答 2

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' : '' )
);
于 2013-10-04T19:17:42.193 回答
1

您在这一行中缺少一个冒号:

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

应该:

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

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

于 2013-10-04T19:17:24.513 回答