2015-10-13 276 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();