2016-12-15 37 views
1

我在WHERE子句中使用了一個相當複雜的預備語句,並且在一個點上我實際上需要具有一個更具體條件的相同語句。創建兩個不同的語句是一個糟糕的方法,因爲它們共享大部分查詢字符串,當我更新一個時,我將不得不更新另一個。到目前爲止,我嘗試使用這樣的:重複使用帶有可選條件的準備語句

SELECT columns 
FROM tables 
WHERE manyConditions AND (specificColumn = ? OR ? = NULL) 

在這種情況下,我可以綁定一個任意參數,NULL來呈現特定條件沒用它不需要它($pdo->execute([/* ... */, -1, null]))查詢,同時仍然能夠通過specificColumn過濾當綁定一個適當的值和非NULL的東西時($pdo->execute([/* ... */, 'specific value', true]))。

這是一種非常骯髒的方式來防止代碼重複,這迫使我在大多數情況下綁定兩個變量。

有沒有更好的方法來防止代碼重複?

+0

請留下你爲什麼downvoting這個問題的一些建設性的意見 - 也許有一些改善它? –

+0

不要傷心downvoting我有相同的經歷,我從來沒有得到任何答案... – JosMac

+0

Downvoters你可以做的至少是評論 –

回答

0

這是一個深思熟慮的程序員的一個非常好的問題。

我會說沒有同樣優雅和簡單的解決方案。但是我可以提供一些方法,您可以決定哪一種方法最適合您。

  1. 您可以使用命名佔位符並保持模擬模式打開。在這種情況下,你將不得不綁定每個變量一次。但是,整體寫作將保持與指定佔位符相同,因此您必須重複每個名稱三次。
  2. 正如在現在刪除的回答表明,你可以使用條件查詢的建築,像

    $sql = "SELECT columns FROM tables WHERE manyConditions"; 
    $params = [$a,$b,$c]; 
    if (!empty($d)) { 
        $sql .= " AND specificColumn = ?"; 
        $params[] = $d; 
    } 
    $stmt = $pdo->prepare($sql); 
    $stmt->execute($params)