Выбор запроса SQL с несколькими динамическими условиями

#php #sql

#php #sql

Вопрос:

Я хочу выполнить запрос SELECT с условиями, которые заполняются динамически.

 if($_POST['a']=='true'){
    $a = 'a,';
    $a_where = 'a >0';
}
if($_POST['b']=='true'){
    $b = 'b,';
    $b_where = 'b >0';
}
if($_POST['c']=='true'){
    $c = 'c,';
    $c_where = 'c >0';
}
  

Чем я пытался сделать, ГДЕ

 $where = 'WHERE '.$a_where.' OR '.$b_where.' OR '.$c_where;
  

И запрос

 $query = mysql_query('SELECT id,'.$a.$b.$c.'date FROM t_name '.$where.' ORDER BY date DESC');
  

Проблема в том, что если b или a не POST, у меня ошибка в запросе. На самом деле здесь проблема только в предложении WHERE.

Комментарии:

1. При динамическом построении операторов WHERE всегда включают WHERE 1 = 1, затем в поля, которые вы хотите добавить динамически, вы просто добавляете «И логику поля» «ИЛИ логику поля» для каждого поля, и ваше предложение where будет работать должным образом

2. Вы можете собрать их в массив и использовать implode(«,»,…) или implode(«ИЛИ»,…)

Ответ №1:

Вместо построения как отдельных переменных, проще собрать их в виде массивов, сделайте это как для имен столбцов, так и для частей предложения where, а затем используйте implode() для построения полного SQL…

 $columns = [ 'id', 'date' ];
$where = [];
if($_POST['a']=='true'){
    $columns[] = 'a';
    $where[] = 'a >0';
}
if($_POST['b']=='true'){
    $columns[] = 'b';
    $where[] = 'b >0';
}
if($_POST['c']=='true'){
    $columns[] = 'c';
    $where[] = 'c >0';
}

$sql = 'SELECT '.implode(",", $columns).'
          FROM t_name 
          WHERE '.implode(" or ", $where).' 
          ORDER BY date DESC';