У меня есть следующий код:
$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 до одной строки, и если компилятор когда-либо даст вам ошибки, вы всегда можете вернуться к этой строке вместо трех строк.