准备好的查询中的可选参数

时间:2015-10-13 11:51:01

标签: php mysql sql pdo

使用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' => ''));不返回任何内容。

由于

2 个答案:

答案 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();