Создание динамического запроса 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;

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

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

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

2 ответов


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

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

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