2010-04-28 4 views
2

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

ответ

2

Это очень похоже на вопрос asked меня недавно форум для моей книги 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); 
1

Вместо если еще раз использовать PHP тройной оператор

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

}

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

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

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

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

Смежные вопросы