2017-08-08 166 views
0

這有什麼更好的解決方案。SQL Concat Where子句

我有一個函數包含三個可選參數(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; 

在上面的代碼中。內置WHERE條件我concating $ WHERE變量和使用$ I變量來跟蹤並在必要時條件。

是否有任何優化的方法來實現這一目標?

+2

收集到數組,然後'implode' –

+1

要添加到^,請使用預準備語句。 –

回答

1

是否有任何優化的方式來實現這一目標?

我的理解是,「更易於維護,更易於閱讀」而不是「性能優化」 - 基於更廣泛的問題的上下文。

這種類型的代碼有80%是我鼓勵其他程序員使用數據庫抽象庫的原因。性能方面的成本很少會影響代碼清潔的好處。

它看起來不像你已經在使用PHP框架,所以我猜你可能不會已經在使用composer。我建議您將它引入到您的項目中,然後使用它來引入數據抽象,如doctrineeloquent

對於使用這些庫和工具,您會在SO上找到大量的幫助。

doctrine帶給你dbal,位於doctrine本身和PDO之間的庫。

如果使用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

我們可避免使用$ I如下:

$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; 

或者使用數組

$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 "; 
    //..... 
}