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

Php 准备好的查询中的可选参数,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,使用MySQL和PDO,我准备了以下语句: $stmt = $bdd->prepare('SELECT field FROM table WHERE category=:category;'); 然后,如果我执行以下操作,效果很好,我在$results中拥有我想要的一切: 但是,我也希望能够执行相同的语句,而不使用WHERE子句。是否可以执行准备好的语句,并让它忽略WHERE子句(例如,不在其中传递任何参数) 或者我必须从表中创建一个新的SELECT字段;询问 注意:$stmt->exe

使用MySQL和PDO,我准备了以下语句:

$stmt = $bdd->prepare('SELECT field FROM table WHERE category=:category;');
然后,如果我执行以下操作,效果很好,我在$results中拥有我想要的一切:

但是,我也希望能够执行相同的语句,而不使用WHERE子句。是否可以执行准备好的语句,并让它忽略WHERE子句(例如,不在其中传递任何参数)

或者我必须从表中创建一个新的SELECT字段;询问

注意:$stmt->execute;返回“未为准备语句中的参数提供数据”和$stmt->executearray'category'=>;不返回任何内容


谢谢

如果您并不总是拥有一个类别,并且希望在这两种情况下都运行此查询,那么简单的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(); 

如果您并不总是拥有一个类别,并且希望在这两种情况下都运行此查询,那么简单的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(); 
我认为@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(); 
我认为@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(); 

您是否在第二次尝试时从查询中删除了WHERE子句?$stmt->EXECUTARRAY'category'=>;什么也不返回-没错。你什么都不要求,你得到的只是;没有什么是吗,山姆@JayBlanchard选择字段,可能是类别?@JayBlanchard我修改了这个问题,试图澄清我不是英国人,这个问题正是关于不必删除where:笨拙但。。。您可以根据需要添加or子句来测试始终为true或从不为true的占位符。i、 e.类别=:类别或:类别='ignoreCategoryTest'。SQL Optimizer可能会对测试做一些合理的操作。您是否在第二次尝试时从查询中删除了WHERE子句?$stmt->executearray'category'=>;什么也不返回-没错。你什么都不要求,你得到的只是;没有什么是吗,山姆@JayBlanchard选择字段,可能是类别?@JayBlanchard我修改了这个问题,试图澄清我不是英国人,这个问题正是关于不必删除where:笨拙但。。。您可以根据需要添加or子句来测试始终为true或从不为true的占位符。i、 e.类别=:类别或:类别='ignoreCategoryTest'。SQL乐观主义者可能会对测试做一些明智的事情。