Повторно использовать подготовленное заявление с необязательным условием

Я использую один довольно сложный подготовленный оператор с различными условиями в предложении WHERE, и в какой-то момент мне действительно нужен тот же оператор с еще одним конкретным условием. Создание двух разных операторов — плохой подход, так как оба разделяют большую часть своей строки запроса, и когда я обновляю одно, мне нужно будет обновить и другое. До сих пор я пытался использовать это:

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

В этом сценарии я мог бы связать один произвольный аргумент и NULL, чтобы сделать конкретное условие бесполезным для запросов, которые в нем не нуждаются ($pdo->execute([/* ... */, -1, null])в то же время specificColumn при связывании правильного значения и чего-то, что не равно NULL ($pdo->execute([/* ... */, 'specific value', true])).

Это действительно грязный способ предотвращения дублирования кода, который заставляет меня связывать еще две переменные в большинстве случаев.

Есть ли более элегантный подход для предотвращения дублирования кода?

1

Решение

Это очень хороший вопрос от вдумчивого программиста.

Я бы сказал, что не существует такого же элегантного и простого решения. Но я могу предложить несколько подходов, и вы можете решить, какой из них лучше для вас.

  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)
    
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector