Разные фильтры для выборок из БД

Опубликовано Опубликовано в рубрике jquery-ui, PHP, SQL

Сегодня речь пойдет о том, как получить данные, связанные определенными свойствами. Иначе говоря, как из запроса SQL при помощи PHP выделить нужные группы данных.Начнем с простого — сделаем фильтр с помощью выпадающего списка select. Его пункты будут формироваться из имеющихся значений — это будет простенькая «защита от дурака», чтобы не грузить базу «левыми» запросами.

Для начала сделаем запрос к БД, который будет выбирать все уникальные значения столбца, по которому будет идти фильтрация. К примеру, если у нас есть таблица заказов, в которой есть столбец с типами заказов, то в БД это будет выглядеть примерно так:

id Type Price
1 Delivery 500
2 Office 300
3 Delivery 800

Уникальные значения выбираются для того, чтобы не выводить в выпадающем списке одинаковые пункты.

$sql = "SELECT DISTINCT `Type` FROM `orders`";

Такой запрос выдаст нам массив (пусть массив будет иметь имя $row) с двумя значениями : «Delivery» и «Office». Их мы применим в выпадающем списке. Сформируем его и форму, в которой он будет вызываться.

Выберите систему бронирования

Что же мы сделали? Мы создали форму, которая по сабмиту вызывает файл extract.php (файл вывода полученных по запросу данных) и методом POST передает в него необходимые переменные.
Мы создаем статический пункт «Все», который будет отвечать за отсутствие фильтра. Остальные будут генерироваться при наличии значений в таблице.

Теперь посмотрим, что же нужно вызвать в файле вывода extract.php

if (isset($_POST['Type'])){$type = ($_POST['Type']);} else {$type='*';}

В начале файла мы проверяем, задан ли фильтр. Если нет, что присваиваем переменной значение *.

Формируем статическую часть SQL-запроса. Она не будет меняться в зависимости от фильтров.

$query = "SELECT * FROM `orders`";

Теперь пишем условия для фильтров:

if ($type != '*')
{
	$query .= " WHERE `Type` = '$type'";
}

Если задан фильтр, то в конец запроса мы дописываем условие выборки WHERE. После этого запрос сформирован окончательно и готов к работе!

Сделаем более интересный и красивый фильтр, который будет выбирать строки с датами, принадлежащими определенному диапазону (для тех случаев, когда в sql-таблице есть поля дат). Пусть поля дат в БД хранятся в формате YYYY-MM-DD.

Снова идем на страничку фильтров. Для удобной выборки нам понадобится популярный нынче скрипт datepicker. Демо можно посмотреть здесь.

Разметим страницу выбора диапазона дат. Это очень просто!

Выбрать даты с

По

Подключаем скрипт:





Все эти файлы можно получить на странице автоформирования архива для скачивания здесь. На странице выбираем ссылку «Deselect all», после чего отмечаем пункты «Datepicker» и «UI-Core». В правом сайдбаре выбираем тему оформления.
Последняя строчка вышеприведенного кода — это русская локализация календаря. Вспомним, что формат даты у нас YYYY-MM-DD. Поэтому зайдем в файл jquery.ui.datepicker-ru.js и исправим там строчку

dateFormat: 'dd.mm.yy',

На строчку

dateFormat: 'yy-mm-dd',

Теперь активируем JavaScript на странице фильтров.




Готово! О более подробной настройке Datepicker расскажет Google (ну, или я, но несколько позже =) ). Даты передаются в extract.php точно также, как и select-фильтры.

Обработаем их в extract.php.

if (isset($_POST['dfr'])){$dfr = ($_POST['dfr']);}
if (isset($_POST['dto'])){$dto = ($_POST['dto']);}

Приняли переменные. Добавляем «защиту от дурака» — если дата «С» позже, чем дата «ПО»:

	if ($dfr > $dto)
		{
			$dch = $dto;//дата для обмена
			$dto = $dfr;//меняем местами
			$dfr = $dch;
		}

А что если одна из дат (или обе) не заданы? Пусть тогда их место займут соответственно самая ранняя и самая поздняя даты из имеющихся в БД.

if (empty($dto))
 {
	$maxdate = "SELECT MAX(`Date`) FROM `orders`";
	$resmaxdate = mysql_query($maxdate);
	$dto = mysql_result($resmaxdate, 0);
 }
if (empty($dfr))
 {
	$mindate = "SELECT MIN(`Date`) FROM `orders`";
	$resmindate = mysql_query($mindate);
	$dfr = mysql_result($resmindate, 0);
 }

Теперь добавляем к статической части запроса даты

if (($dfr=='*') && ($dto!='*'))
{
	$query .= " WHERE `Date` BETWEEN '$mndt' AND '$dto'";
}
if (($dfr!='*') && ($dto=='*'))
{
	$query .= " WHERE `Date` BETWEEN '$dfr' AND '$mxdt'";
}
if (($dfr=='*') && ($dto=='*'))
{
	$query .= " WHERE `Date` BETWEEN '$mndt' AND '$mxdt'";
}

Все! Выполняем запрос и радуемся жизни!

Безошибочного Вам кода!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *