#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';