У меня есть таблица 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;
То, что вы можете себе представить, не работает, потому что, если какое-либо из этих полей пуст – запрос терпит неудачу (или ничего не возвращает).
Очевидно, что создание такого «статического» запроса, как это, действительно затрудняет, если определенные переменные пусты.
Каков наилучший способ динамического создания этого запроса, чтобы он включал только те, которые не были пустыми, добавляется в запрос, чтобы он мог успешно завершить и отобразить соответствующие данные?
Просто проверьте, содержат ли переменные значение, и если это так, создайте запрос следующим образом:
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);
с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);