2

次のコードがあります。

$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 ステートメントがないように、コードをクリーンアップする方法はありますか?

4

2 に答える 2

2

これは、私の著書 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);
于 2010-04-28T20:05:48.797 に答える
1

if else の代わりに 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 ステートメントを 1 行に短縮できることです。コンパイラーがエラーを出した場合は、3 行ではなくいつでもその行に戻ることができます。

于 2010-04-28T21:07:38.177 に答える