Создайте динамический запрос mysql с использованием переменных php


У меня есть таблица html, которая загружает все в таблицу базы данных MySQL. У меня есть выпадающие списки, которые относятся к столбцам этой таблицы MySQL - когда пользователь выбирает один из выпадающих списков, он использует AJAX для запроса базы данных.

Мне нужно выяснить, как динамически строить запрос, потому что иногда выпадающие списки будут пустыми (т.Е. Они не хотят фильтровать по этому столбцу).

Как лучше всего это сделать?

В настоящее время у меня есть что-то вроде это:

    $stationFilter = $_GET['station'];
    $verticalFilter = $_GET['vertical'];
    $creativeFilter = $_GET['creative'];
    $weekFilter = $_GET['week'];    

    $result = mysql_query("SELECT * FROM $tableName WHERE STATION_NETWORK = '$stationFilter' AND VERTICAL = '$verticalFilter' AND CREATIVE = '$creativeFilter'  AND WK = '$weekFilter'");   
    $data = array();
    while ($row = mysql_fetch_row($result) )
        {
        $data[] = $row;
        }   
    $finalarray['rowdata'] = $data;

, который, как вы можете себе представить, не работает, потому что, если какое-либо из этих полей пусто, запрос завершается ошибкой (или, скорее, ничего не возвращает).

Очевидно, что создание такого "статического" запроса, как этот, действительно затрудняет, если некоторые переменные пусты.

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

Author: marc_s, 2013-04-03

2 answers

Просто проверьте, содержат ли переменные значение, и если да, постройте запрос следующим образом:

unset($sql);

if ($stationFilter) {
    $sql[] = " STATION_NETWORK = '$stationFilter' ";
}
if ($verticalFilter) {
    $sql[] = " VERTICAL = '$verticalFilter' ";
}

$query = "SELECT * FROM $tableName";

if (!empty($sql)) {
    $query .= ' WHERE ' . implode(' AND ', $sql);
}

echo $query;
// mysql_query($query);
 30
Author: SeanWM, 2013-04-03 17:55:51
$filter = array();

if ($_GET['station'] != '')
{ $filter[] = 'STATION_NETWORK = '.$_GET['station'];}
if ($_GET['vertical'] != '')
{ $filter[] = 'VERTICAL = '.$_GET['vertical'];}
if ($_GET['creative'] != '')
{ $filter[] = 'CREATIVE  = '.$_GET['creative'];}
if ($_GET['week'] != '')
{ $filter[] = 'WK = '.$_GET['week'];}

$query = 'SELECT * FROM $tableName WHERE '.implode(' AND ', $filter);
$result = mysql_query($query);
... 

Но лучше, если в GET вы нажмете название строк таблиц; $_GET['STATION_NETWORK']--- что-то вроде этого;

then you make
foreach ($_GET as $key => $value)
{
    if ($value != '')
    { $filter[] = $key.' = '.$value;}
}

Или попробуйте

$filter = array('STANTION_NETWORK' => $_GET['station'],
                'VERTICAL' => $_GET['vertical'],
                 'CREATIVE'  => $_GET['creative'],
                 'WK' => $_GET['week']);
$query_array = array();

 foreach ($filter as $key => $value)
{
    if ($value != '')
    { $query_array[] = $key.' = '.$value;}
}
$query = 'SELECT * FROM $tableName WHERE '.implode(' AND ', $query_array);
$result = mysql_query($query);
 0
Author: CHORTik, 2013-04-03 18:01:38