2015-10-13 250 views
0

使用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

您是否从第二次尝试的查询中删除了WHERE子句? –

+0

*“$ stmt-> execute(array('category'=>''));不返回任何内容。”* ---确切地说。你不要求任何东西,你会得到这个;没有。 *是不是正确的山姆?* @JayBlanchard –

+0

'SELECT字段,类别'也许? –

回答

3

我认为if...else解决方案所带来通过@Oldskool在这种情况下很好,但这里有另一个可能有用的想法。

这允许您有另一个参数来打开和关闭筛选器(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(); 
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();