使用MySQL和PDO,我有以下准备好的声明:
$stmt = $bdd->prepare('SELECT field FROM table WHERE category=:category;');
然后,如果我执行以下操作,它可以正常工作,我想要$results
中的所有内容:
$stmt->execute(array('category' => $someCategory));
$results = $stmt->fetchAll();
但是,我也希望能够在没有WHERE
子句的情况下执行相同的语句。是否可以执行预准备语句并忽略WHERE
子句(例如,在其中不传递参数)?
或者我是否必须进行新的SELECT field FROM table;
查询?
注意:$stmt->execute();
返回“No data supplied for parameters in prepared statement”
,$stmt->execute(array('category' => ''));
不返回任何内容。
由于
答案 0 :(得分:3)
我认为@Oldskool提出的if...else
解决方案对于这种情况很好,但这是另一个可能有用的想法。
这允许您使用另一个参数来打开和关闭过滤器(WHERE子句)。
$stmt = $bdd->prepare('SELECT field FROM table WHERE (1=:filter AND category=:category) OR (0=:filter);');
$stmt->execute(array(
'filter' => 1, //1 = on; 0 = off
'category' => $someCategory));
$results = $stmt->fetchAll();
答案 1 :(得分:0)
如果你不总是有一个类别,并且想要为这两种情况运行这个查询,那么简单的if / else结构就足够了:
if (!empty($someCategory)) {
$stmt = $bdd->prepare('SELECT field FROM table WHERE category=:category;');
$stmt->execute(array('category' => $someCategory));
} else {
$stmt = $bdd->prepare('SELECT field FROM table;');
$stmt->execute();
}
$results = $stmt->fetchAll();