2014-11-05 106 views
3

我使用一個循環來處理一些查詢和所有查詢都是一樣的,除了一個不使用參數的其他人:是否可以統計PDO準備語句中的參數數量?

$queries = array(
    'query1' = "SELECT * FROM table_1 WHERE id=:id", 
    'query2' = "SELECT * FROM table_2 WHERE id=:id", 
    'query3' = "SELECT * FROM table_3" 
); 

$params = array(':id',1); 

foreach($queries as $q) { 
    $st = $pdo->prepare($q); 
    if($st->execute($params)) { 
    // do stuff with results 
    } else { 
    echo json_encode($st->errorInfo()); 
    } 
} 

這裏的問題是,$ ST->執行($ params)在沒有定義參數的查詢上不起作用,這就是爲什麼我想知道在發送之前是否可以分析查詢的原因。

這是假代碼,只要有一個參數(:id)或none,它應該工作而不管查詢結構如何。

更新,解決了:

我如何申請通過@ Jonast92給出瞭解決方案:

foreach($queries as $q) { 
    $st = $pdo->prepare($q); 
    if($st->execute(substr_count($q,":") > 0 ? $params : null)) { 
    // do stuff with results 
    } else { 
    echo json_encode($st->errorInfo()); 
    } 
} 
+0

你正在寫這些查詢在數組中提前,對吧?爲什麼不製作另一個包含params數量的數組?因此,您只需根據您嘗試運行哪個查詢來查找數組。 – 2014-11-05 22:01:24

+0

這應該是有點動態的,但這個和下面的答案的組合應該工作。謝謝。 – vcanales 2014-11-05 22:03:19

+1

另一種方法是指定'where 1:= id or 1 = 1',基本上顛覆參數。 – 2014-11-05 22:07:36

回答

3

您可以使用substr_count來算的:數量發生,且是參數的個數執行到準備好的聲明。

$itemInArray = "SELECT * FROM table_1 WHERE id=:id"; 
$count = substr_count($itemInArray, ':'); // 1 
+0

我不知道爲什麼我沒有想到這一點。漫長的一天,我猜。我會在10分鐘過去後接受答案。謝謝。 – vcanales 2014-11-05 22:04:07

+0

@devJunk享受。 – Jonast92 2014-11-05 22:04:41