2010-04-28 204 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反模式論壇提出的問題非常相似。我給他類似這樣的答案:

$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語句縮短爲一行,並且如果編譯器給出錯誤,您可以始終返回該行而不是3行。