2017-08-08 23 views
0

これの良い解決策は何ですか?SQL Concat Where句

私は、3つのオプションのパラメータ(businessunit_id、department_id、jobtitle)を持つ関数を持っています。私は動的に構築する必要がありますWHERE受信パラメータに従ってSQL節。上記のコードで

CODE

public function getEmpSearchResult($businessunit_id,$department_id,$jobtitle) 
{ 
    $i=0; 
    $WHERE = ""; 
    if (!empty($businessunit_id)) 
     { 
      if($i==1) { 
       $WHERE = $WHERE." AND"; 
      } 
      $WHERE = "businessunit_id"."=".$businessunit_id; 
      $i=1; 
     } 

    if (!empty($department_id)) 
     { if($i==1) { 
       $WHERE = $WHERE." AND"; 
      } 
      $WHERE = $WHERE." department_id"."=".$department_id; 
      $i=1; 
     } 

    if (!empty($jobtitle)) 
     { 
      if($i==1) { 
       $WHERE = $WHERE." AND"; 
      } 
      $WHERE = $WHERE." jobtitle_id"."=".$jobtitle; 
      $i=1; 
     } 

    $query = "SELECT * FROM `main_employees_summary` WHERE $WHERE "; 
    $data = $db->query($query)->fetchAll(); 
    return $data; 

。私は変数$をconcatingし、必要な場合状態を追跡するために$ I変数を使用しています建てWHERE状態に。

これを実現する最適な方法はありますか?

+2

配列に収集し、 'implode' –

+1

^に追加するには、プリペアドステートメントを使用します。 –

答えて

1

これを実現する最適な方法はありますか?

私は「読みやすく、維持しやすい」というより「パフォーマンスが最適化された」という解釈だ - あなたのより広い問題のコンテキストに基づいて。

この種のコードは、私が仲間のプログラマーにデータベース抽象化ライブラリを使用することを推奨する理由の80%です。パフォーマンスのコストは、コードのクリーンさのメリットを凌駕することはめったにありません。

既にPHPフレームワークを使用しているようには見えないので、まだcomposerを使用していない可能性があります。私はあなたのプロジェクトにそれを紹介し、それを使ってdoctrineeloquentのようなデータ抽象化を導入することをお勧めしたいと思います。

これらのライブラリとツールを使用しているため、SOには多くの支援があります。

doctrineは、doctrinePDOの間にあるライブラリdbalを表示します。

dbal(または上位レベルのライブラリ)が利用されている場合は、SQL(注入保護など)について考えるのをやめ、データベースから読めるPHPコードで説明することを考え始める。例えば

:(過去メモリから書き込まれたコードではないかもしれない文字通り正しい警告):そのオブジェクト指向インタフェースを使用して、広範where節を構築するには、保守風なる

$queryBuilder 
    ->select('id', 'name') 
    ->from('main_employees_summary'); 

if ($x) { 
    $queryBuilder 
     ->andWhere('businessunit_id = ?') 
     ->setParameter(0, $businessunit_id); 
} 

if ($y) { 
    $queryBuilder 
     ->andWhere('department_id = ?') 
     ->setParameter(0, $department_id); 
} 

// ... etc 
0

我々

$WHERE = ""; 
if (!empty($businessunit_id)) 
{ 
    $WHERE .= "businessunit_id='{$businessunit_id}' AND "; 
} 

if (!empty($department_id)) 
{ 
    $WHERE .= "department_id='{$department_id}' AND "; 
} 

if (!empty($jobtitle)) 
{ 
    $WHERE .= "jobtitle_id='{$jobtitle}' AND "; 
} 
if ($WHERE) { 
    $WHERE = preg_replace('/AND\s$/', '', $WHERE);//removing the last 'AND ' 
    $query = "SELECT * FROM `main_employees_summary` WHERE $WHERE "; 
    $data = $db->query($query)->fetchAll(); 
} 
return $data; 

または配列

01を使用して次のように私は$の使用を避けることができます
$whereArr = array(); 
if (!empty($businessunit_id)) 
{ 
    $whereArr[] = "businessunit_id='{$businessunit_id}'"; 
} 
//....... 
if (!empty($whereArr)) { 
    $WHERE = implode(' AND ', $whereArr);//joining with ' AND ' 
    $query = "SELECT * FROM `main_employees_summary` WHERE $WHERE "; 
    //..... 
}