2015-08-30 6 views
2

Каков наилучший способ построить инструкцию SQL с PDO, когда это зависит от того, установлена ​​ли какая-либо переменная PHP?построить условный SQL-оператор с PDO

Вот пример;

$query="SELECT * FROM table "; 

if($variable1 != "") { $query = $query . "WHERE variable1 = :variable1"; }     
if($variable2 != "") { $query = $query . " AND variable2 = :variable2"; }     

$query -> execute(array(':variable1' => $variable1, ':variable2' => $variable2)); 

У меня есть много этих if заявлений и при связывании переменных в запросе я не хочу, чтобы снова пройти через все эти if заявления.

Есть ли более простой способ построить инструкцию SQL с такими условиями if/else?

ответ

4

Я бы использовал массив, чтобы содержать каждую часть того, где ... по мере совпадения, добавьте результирующий оператор в массив. Ведь оцениваются, взрываются, отделяются от «И» и конкатенируются в $ query.

$arrWhere = array(); 
$assWhere = array(); 

if($variable1 != "") { 
    $arrWhere[] = "variable1 = :variable1"; 
    $assWhere[":variable1"] = $variable1; 
} 
if($variable2 != "") { 
    $arrWhere[] = "variable2 = :variable2"; 
    $assWhere[":variable2"] = $variable2; 
} 
if($variable3 != "") { 
    $arrWhere[] = "variable3 = :variable3"; 
    $assWhere[":variable3"] = $variable3; 
} 

$query="SELECT * FROM table WHERE " . implode (" AND " , $arrWhere); 

$query -> execute($assWhere); 
+0

Да, это, вероятно, было бы более изящным для построения запроса - но как узнать, что мне нужно связать в инструкции execute? – grueb

+0

Не 100% на это, но выглядит как выполнить принять ассоциативный массив ... см. Код в редакторе Ответ. – CLaFarge

+0

Это будет работать большую часть времени, но предложение WHERE должно быть добавлено условно, так как возможно, что ни одна из «переменныхN» не содержит значения. – zerobandwidth