2010-04-28 154 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行。