Intereting Posts
Шифровать javascript-файл jQuery Установка Composer в глобальном масштабе для использования laravel? Найти, где переменная определена в PHP (И / или SMARTY)? Как установить значение по умолчанию в поле выбора symfony2 с данными из базы данных Установите расширение интернационализации PHP (Intl) на XAMPP на Mac PHP сгенерированная форма не отправляет AJAX Как использовать индекс поисковых систем для базы данных? Викинг в PHP на Windows PHP Простой HTML DOM Parser, как получить TR только из первой таблицы Веб-хосты Bigcommerce не работают Отладчик PhpStorm не останавливается в BreakPoints; продолжает ждать xdebug _SESSION_ Сортировка большого многомерного массива Удалите автоматически добавленную <p> со страницы, которая не имеет литерального содержимого (использует короткие коды) Mockery – call_user_func_array () ожидает, что параметр 1 будет действительным обратным вызовом Заполнение третьего меню на основе предыдущих значений выпадающего списка

PHP: подготовленный оператор, требуется инструкция IF

У меня есть следующий код:

$sql = "SELECT name, address, city FROM tableA, tableB WHERE tableA.id = tableB.id"; if (isset($price) ) { $sql = $sql . ' AND price = :price '; } if (isset($sqft) ) { $sql = $sql . ' AND sqft >= :sqft '; } if (isset($bedrooms) ) { $sql = $sql . ' AND bedrooms >= :bedrooms '; } $stmt = $dbh->prepare($sql); if (isset($price) ) { $stmt->bindParam(':price', $price); } if (isset($sqft) ) { $stmt->bindParam(':price', $price); } if (isset($bedrooms) ) { $stmt->bindParam(':bedrooms', $bedrooms); } $stmt->execute(); $result_set = $stmt->fetchAll(PDO::FETCH_ASSOC); 

То, что я замечаю, является избыточным несколькими операторами IF, которые у меня есть.

Вопрос : есть ли способ очистить мой код, чтобы у меня не было этих нескольких операторов IF для подготовленных операторов?

Это очень похоже на вопрос, который пользователь недавно спросил у меня на форуме для моей книги SQL Antipatterns. Я дал ему ответ, подобный этому:

 $sql = "SELECT name, address, city FROM tableA JOIN tableB ON tableA.id = tableB.id"; $params = array(); $where = array(); if (isset($price) ) { $where[] = '(price = :price)'; $params[':price'] = $price; } if (isset($sqft) ) { $where[] = '(sqft >= :sqft)'; $params[':sqft'] = $sqft; } if (isset($bedrooms) ) { $where[] = '(bedrooms >= :bedrooms)'; $params[':bedrooms'] = $bedrooms; } if ($where) { $sql .= ' WHERE ' . implode(' AND ', $where); } $stmt = $dbh->prepare($sql); $stmt->execute($params); $result_set = $stmt->fetchAll(PDO::FETCH_ASSOC); 

Вместо того, чтобы иначе использовать PHP-тернарный оператор

  if (isset($_POST['statusID'])) { $statusID = $_POST['statusID']; } else { $statusID = 1; 

}

вместо этого вы можете сделать:

  $statusID = (isset($_POST['statusID'])) ? $_POST['statusID'] : 1; 

Формат тернарного оператора: $variable = condition ? if true : if false $variable = condition ? if true : if false

Красота заключается в том, что вы сократите свои операторы if / else до одной строки, и если компилятор когда-либо даст вам ошибки, вы всегда можете вернуться к этой строке вместо трех строк.