我有一个类似的查询:
$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']'
在所有可能性中,只有最后一个工作。这也是我实际上不想使用的那个。我该如何解决这个问题?
答案 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的答案。