2016-12-15 3 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) 
    
Смежные вопросы