Материал посвящен сортировке на php и mysql. В предыдущих уроках ранее, мы уже рассматривали подобные сортировки, к примеру - сортировка и выборка с кнопкой применить или сортировка и выборка без кнопки применить, ну я решил немного поменять код, скажем так , сделать более правильным его и перевести на "сессии", вместо "куков". А также добавил некоторые дополнительные параметры, которых не было раньше и меня о них спрашивали люди. Допустим, кнопку "сброса сортировки", "сортировка ссылками выбора марки" и "сортировка по алфавиту, по цене". Скрипт я реализовал в демо версии и можно скачать его исходники.
Он написан на php и mysql, так что урок предоставлен уже для среднего класса, новичкам придется начать изучение хотя бы с азов этих языков, чтобы понимать принцип структуры скрипта.
Перед Вами его картинка. Хотел бы остановить свое внимание, что заполнял базу автомобилей в слепую, то есть не подбирал "точное" совпадение в реальном мире сортировки, поэтому суть заключается "только" в выполнении назначения сортировки! Прошу это учесть и не придираться к каким-либо параметрам.
Давайте теперь перейдем к рассмотрению самого кода скрипта, разберем все моменты, которые встретятся при его разработке.
Сначала создадим базу данных sort, в ней будут две таблицы catalog - таблица с автомобилями и catalog_brend - таблица с марками автомобилей. Если же в процессе, Вы захотите разработать более сложную структуру сортировки, возможно Вам потребуется создать другие таблицы, к примеру catalog_cat, в которой будите хранить категории автомобилей (или чего иного).
Дамп таблицы catalog.
-- -- Структура таблицы `catalog` -- CREATE TABLE IF NOT EXISTS `catalog` ( `id` bigint(240) unsigned NOT NULL AUTO_INCREMENT, `articul` varchar(255) NOT NULL, `catalog_brend` int(20) NOT NULL, `date` date NOT NULL, `title` varchar(255) NOT NULL, `img` varchar(255) NOT NULL, `city` varchar(255) NOT NULL, `tip_cuzova` varchar(255) NOT NULL, `tip_dvigately` varchar(255) NOT NULL, `privod` varchar(255) NOT NULL, `kpp` varchar(255) NOT NULL, `cvet` varchar(100) NOT NULL, `moshnosti` int(30) unsigned NOT NULL, `price` int(40) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=113 ; -- -- Дамп данных таблицы `catalog` -- INSERT INTO `catalog` (`id`, `articul`, `catalog_brend`, `date`, `title`, `img`, `city`, `tip_cuzova`, `tip_dvigately`, `privod`, `kpp`, `cvet`, `moshnosti`, `price`) VALUES (1, 'mazda xedos-9', 1, '2013-08-02', 'Mazda Xedos 9', 'img/mazda_xedos9.jpg', 'Москва', 'Седан', 'Бензин', 'Задний', 'Механическая', 'Черный', 100, 220000), (2, 'mazda rx-8', 1, '2013-07-02', 'Mazda RX 8', 'img/mazda_rx8.jpg', 'Королев', 'Хэдчбэк', 'Бензин', 'Полный', 'Автомат', 'Желтый', 210, 550000), (3, 'mazda rx-7', 1, '2013-04-02', 'Mazda RX 7', 'img/mazda_rx7.jpg', 'Москва', 'Седан', 'Бензин', 'Передний', 'Автомат', 'Красный', 150, 300000), (4, 'mazda luci', 1, '2011-07-02', 'Mazda Luci', 'img/mazda_luci.jpg', 'Воронеж', 'Седан', 'Бензин', 'Задний', 'Механическая', 'Белый', 90, 100000), (5, 'mazda cx5', 1, '2013-05-08', 'Mazda CX 5', 'img/mazda_cx5.jpg', 'Москва', 'Внедорожник', 'Бензин', 'Полный', 'Автомат', 'Синий', 250, 900000), (6, 'mazda 3', 1, '2013-08-13', 'Mazda 3', 'img/mazda_3.jpg', 'Королев', 'Купе', 'Бензин', 'Задний', 'Автомат', 'Красный', 180, 390000), (7, 'lamborgini lm', 2, '2009-01-31', 'Lamborgini LM', 'img/lamborgini_lm.jpg', 'Москва', 'Внедорожник', 'Дизель', 'Полный', 'Механическая', 'Красный', 300, 2100000), (8, 'lamborghini gallardo gt600', 2, '2012-10-07', 'Lamborghini Gallardo GT600', 'img/lamborghini_gallardo_gt600.jpg', 'Воронеж', 'Седан', 'Бензин', 'Полный', 'Автомат', 'Желтый', 400, 8000000), (9, 'ferrari f 430', 3, '2001-11-02', 'Ferrari F-430', 'img/ferrari_f_430.jpg', 'Королев', 'Седан', 'Бензин', 'Задний', 'Автомат', 'Красный', 350, 4500000), (10, 'ferrari 599 gtb fiorano', 3, '2013-08-04', 'Ferrari 599-GTB fiorano', 'img/ferrari_599_gtb_fiorano.jpg', 'Москва', 'Хэдчбэк', 'Бензин', 'Полный', 'Автомат', 'Синий', 410, 7200000), (11, 'ferrari 458 spider', 3, '2010-04-04', 'Ferrari 458 spider', 'img/ferrari_458_spider.jpg', 'Воронеж', 'Седан', 'Дизель', 'Полный', 'Механическая', 'Желтый', 480, 11000000);
Дамп таблицы catalog_brend.
-- -- Структура таблицы `catalog_brend` -- CREATE TABLE IF NOT EXISTS `catalog_brend` ( `id` int(100) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=16 ; -- -- Дамп данных таблицы `catalog_brend` -- INSERT INTO `catalog_brend` (`id`, `title`) VALUES (3, 'Ferrari'), (2, 'Lamborgini'), (1, 'Mazda');
Этот файл является основным в плане функционала. Сначала мы запускаем сессию, подключаем базу данных, проверяем на ошибки и устанавливаем кодировку cp1251.
session_start(); $db = mysql_connect ("localhost", "root", ""); //подключение к базе данных mysql_select_db ("sort", $db); mysql_set_charset ("cp1251",$db); //установка кодировки mysql_query('SET NAMES "cp1251"'); //запрос кодировки if (!$db) echo mysql_error(); //проверка на правильность подключения к базе данных
Далее перейдем к запросу о марках автомобилей. Обращаю сразу внимание на переменную $page_set, так как она нам будет постоянно встречаться, для удобства я в нее занес ссылку index.php, которая открывается при сортировке. Думаю так намного будет удобнее.
$page_set="index.php"; //занесение страницы $where = ""; $brendsQuery = mysql_query("select id, title from catalog_brend"); //запрос на выборку марок автомобилей $brendsResult = mysql_fetch_array($brendsQuery); do { $brendsList .= " $brendsResult[title] / "; } while($brendsResult = mysql_fetch_array($brendsQuery));
Теперь мы устанавливаем параметр "сброса сортировки". Уничтожая сессию при нажатии.
if (isset($_POST["filterClear"])) { session_unset(); //Сессия уничтожается при нажатии }
Записываем в сессию все параметры сортировки, которые указаны у нас в таблице catalog, чтобы правильно отсортировать товар. Отличие обосновывается только на первом методе сортировки, с помощью глобальной переменной $_GET, которая указана для выборки строкового параметра из таблицы catalog_brend. Остальные же параметры, сначала проверяются на существование, затем переводятся в строковой параметр и хранятся в сессии, пока не будут уничтожены.
if (isset($_GET["catalog_brend"])) //Проверка на существование { $catalog_brend = $_GET["catalog_brend"]; if (!empty($catalog_brend)) //Если переменная не пуста, то // можно выполнять занесение в сессию и вывод в строковой //параметр { $_SESSION["catalog_brend"] = $catalog_brend; } } if (isset($_POST["city"])) //Проверка на существование { $city = mysql_real_escape_string(strip_tags ($_POST["city"])); if ($city != "") //Перевод в строковой параметр и обрезка { $_SESSION["city"] = $city; //Сохранению в сессию } else { unset($_SESSION["city"]); //Уничтожение из сессии unset($city); } } if (isset($_POST["tip_cuzova"])) { $tip_cuzova = mysql_real_escape_string(strip_tags ($_POST["tip_cuzova"])); if ($tip_cuzova != "") { $_SESSION["tip_cuzova"] = $tip_cuzova; } else { unset($_SESSION["tip_cuzova"]); unset($tip_cuzova); } } if (isset($_POST["tip_dvigately"])) { $tip_dvigately = mysql_real_escape_string(strip_tags ($_POST["tip_dvigately"])); if ($tip_dvigately != "") { $_SESSION["tip_dvigately"] = $tip_dvigately; } else { unset($_SESSION["tip_dvigately"]); unset($tip_dvigately); } } if (isset($_POST["privod"])) { $privod = mysql_real_escape_string(strip_tags ($_POST["privod"])); if ($privod != "") { $_SESSION["privod"] = $privod; } else { unset($_SESSION["privod"]); unset($privod); } } if (isset($_POST["kpp"])) { $kpp = mysql_real_escape_string(strip_tags ($_POST["kpp"])); if ($kpp != "") { $_SESSION["kpp"] = $kpp; } else { unset($_SESSION["kpp"]); unset($kpp); } } if (isset($_POST["cvet"])) { $cvet = mysql_real_escape_string(strip_tags ($_POST["cvet"])); if ($cvet != "") { $_SESSION["cvet"] = $cvet; } else { unset($_SESSION["cvet"]); unset($cvet); } } if (isset($_POST["moshnostiOt"])) { $moshnostiOt = mysql_real_escape_string (strip_tags ($_POST["moshnostiOt"])); if ($moshnostiOt != "") { $_SESSION["moshnostiOt"] = $moshnostiOt; } else { unset($_SESSION["moshnostiOt"]); unset($moshnostiOt); } } if (isset($_POST["moshnostiDo"])) { $moshnostiDo = mysql_real_escape_string (strip_tags ($_POST["moshnostiDo"])); if ($moshnostiDo != "") { $_SESSION["moshnostiDo"] = $moshnostiDo; } else { unset($_SESSION["moshnostiDo"]); unset($moshnostiDo); } } if (isset($_POST["priceOt"])) { $priceOt = mysql_real_escape_string(strip_tags ($_POST["priceOt"])); if ($priceOt != "") { $_SESSION["priceOt"] = $priceOt; } else { unset($_SESSION["priceOt"]); unset($priceOt); } } if (isset($_POST["priceDo"])) { $priceDo = mysql_real_escape_string(strip_tags ($_POST["priceDo"])); if ($priceDo != "") { $_SESSION["priceDo"] = $priceDo; } else { unset($_SESSION["priceDo"]); unset($priceDo); } } if (isset($_POST["filterClear"])) { session_unset(); //Переменные которые заносятся при уничтожении сессии unset($city); unset($tip_cuzova); unset($tip_dvigately); unset($privod); unset($kpp); unset($cvet); unset($moshnostiOt); unset($moshnostiDo); unset($priceOt); unset($priceDo); } /*Делаем запрос на выборку из таблиц всех полей*/ if (isset($_SESSION["catalog_brend"])) { $catalog_brend = $_SESSION["catalog_brend"]; $where = "where"; $brendQuery = " $where catalog_brend='$catalog_brend'"; } if (isset($_SESSION["city"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $city = $_SESSION["city"]; $cityQuery = " $where city='$city'"; } if (isset($_SESSION["tip_cuzova"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $tip_cuzova = $_SESSION["tip_cuzova"]; $tip_cuzovaQuery = " $where tip_cuzova='$tip_cuzova'"; } if (isset($_SESSION["tip_dvigately"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $tip_dvigately = $_SESSION["tip_dvigately"]; $tip_dvigatelyQuery = " $where tip_dvigately='$tip_dvigately'"; } if (isset($_SESSION["privod"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $privod = $_SESSION["privod"]; $privodQuery = " $where privod='$privod'"; } if (isset($_SESSION["kpp"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $kpp = $_SESSION["kpp"]; $kppQuery = " $where kpp='$kpp'"; } if (isset($_SESSION["cvet"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $cvet = $_SESSION["cvet"]; $cvetQuery = " $where cvet='$cvet'"; } if (isset($_SESSION["moshnostiOt"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $moshnostiOt = $_SESSION["moshnostiOt"]; $moshnostiOtQuery = " $where moshnosti >='$moshnostiOt'"; } if (isset($_SESSION["moshnostiDo"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $moshnostiDo = $_SESSION["moshnostiDo"]; $moshnostiDoQuery = " $where moshnosti <='$moshnostiDo'"; } if (isset($_SESSION["priceOt"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $priceOt = $_SESSION["priceOt"]; $priceOtQuery = " $where price >='$priceOt'"; } if (isset($_SESSION["priceDo"])) { if (empty($where)) { $where = "where"; } else { $where = "and"; } $priceDo = $_SESSION["priceDo"]; $priceDoQuery = " $where price <='$priceDo'"; }
Реализация сортировки "по алфавиту", "по цене" - дешевые авто и дорогие.
/*Делаем сортировку по трем пунктам.*/ if (isset($_SESSION["sort"])) { $sortQuery = $_SESSION["sort"]; } /* 1) Сортировка по алфавиту*/ if (isset($_GET["sort"])) { if ($_GET["sort"] == "default") { $sortQuery = " order by title"; $_SESSION["sort"] = $sortQuery; } /* 2) Сортировка по деневым ценам*/ elseif ($_GET["sort"] == "asc") { $sortQuery = " order by price asc"; $_SESSION["sort"] = $sortQuery; } /* 3) Сортировка по дорогим ценам*/ elseif ($_GET["sort"] == "desc") { $sortQuery = " order by price desc"; $_SESSION["sort"] = $sortQuery; } else { $sortQuery = " order by title"; $_SESSION["sort"] = $sortQuery; } }
Реализуем постраничную навигацию.
$page = 5; //Сколько авто на странице. $x = 0; $v = 0; if (isset($_GET["page"])) //Реализация строкового параметра { $x = intval($_GET["page"]); if ($x > 0) { $navigation = " .($x-1)."">Предыдущая "; } $v = $x * $page; }
Выполняем запрос к таблице catalog и выводим все поля. В конце дописываем сортировку, указывая нужные значения при выводе. Значения сортировки записываем в переменную $navigation.
$contentQuery = mysql_query("select * from catalog $brendQuery $cityQuery $tip_cuzovaQuery $tip_dvigatelyQuery $privodQuery $kppQuery $cvetQuery $moshnostiOtQuery $moshnostiDoQuery $priceOtQuery $priceDoQuery $sortQuery limit $v,5") or die(mysql_error()); // 5 товаров на странице $countQuery = mysql_query("select count(id) from catalog $brendQuery $cityQuery $tip_cuzovaQuery $tip_dvigatelyQuery $privodQuery $kppQuery $cvetQuery $moshnostiOtQuery $moshnostiDoQuery $priceOtQuery $priceDoQuery $sortQuery limit 5") or die(mysql_error()); // 5 товаров на странице $countResult = mysql_result($countQuery, 0); $count = floor(($countResult) / $page); $a = 0; //С какой странице начинается сортировка while ($count >= $a) { $navigation .= " $a "; $a++; } if ($x < $count) { $navigation .= ".($x+1)."">Следующая "; } while ($contentResult = mysql_fetch_assoc($contentQuery)) { foreach ($contentResult as $key => $value) { $contentAdd .= $key." -- ".$value." "; }
Выводим все автомобили и параметры.
$content.= "<div> <table class='product_table'> <tr> <td valign='top' colspan='3'> <div class='product_div_name'> <span class='product_name'> $contentResult[title] </span> </div> </td> </tr> <tr> <td valign='top' width='400'> <img src='$contentResult[img]' width='200'/> </td> <td valign='top' width='200'> <label class='product_haracterisiki1'>Город: </label> <label class='product_haracterisiki2'>$contentResult[city]</label> <br> <label class='product_haracterisiki1'>Тип кузова: </label> <label class='product_haracterisiki2'>$contentResult[tip_cuzova]</label> <br> <label class='product_haracterisiki1'>Тип двигателя: </label> <label class='product_haracterisiki2'>$contentResult[tip_dvigately]</label> <br> <label class='product_haracterisiki1'>Привод: </label> <label class='product_haracterisiki2'>$contentResult[privod]</label><br> </td> <td valign='top' width='200'> <label class='product_haracterisiki1'>КПП: </label> <label class='product_haracterisiki2'>$contentResult[kpp]</label><br> <label class='product_haracterisiki1'>Цвет: </label> <label class='product_haracterisiki2'>$contentResult[cvet]</label><br> <label class='product_haracterisiki1'>Мощность, л.с.: </label> <label class='product_haracterisiki2'>$contentResult[moshnosti]</label> <br> <label class='product_haracterisiki1'>Стоимость: </label> <label class='product_haracterisiki2'>$contentResult[price]</label><br> </td> </tr> </table> </div><br>"; unset($contentAdd); }
Думаю тут ничего сложного нет, просто все параметры, которые нам нужны для сортировки, заложены именно тут. Обычный html и немного php.
<form action='<?=$page_set?>' method='post'> <table class='sort_table'><tr><td width='350' valign='top'> <label class='sort_label'>Город</label><br> <select class='sort_select' name='city'> <option class='sort_option' value=''>(любой)</option> <option class='sort_option' value='Москва' <?=($city == "Москва") ? "selected" : ""; ?>> Москва</option> <option class='sort_option' value='Королев' <?=($city == "Королев") ? "selected" : ""; ?>> Королев</option> <option class='sort_option' value='Воронеж' <?=($city == "Воронеж") ? "selected" : ""; ?>> Воронеж</option> </select><br><br> <label class='sort_label'>Тип кузова</label><br> <select class='sort_select' name='tip_cuzova'> <option class='sort_option' value=''>(любой)</option> <option class='sort_option' value='Внедорожник' <?=($tip_cuzova == "Внедорожник") ? "selected" : ""; ?>> Внедорожник</option> <option class='sort_option' value='Купе' <?=($tip_cuzova == "Купе") ? "selected" : ""; ?>> Купе</option> <option class='sort_option' value='Седан' <?=($tip_cuzova == "Седан") ? "selected" : ""; ?>> Седан</option> <option class='sort_option' value='Хэдчбэк' <?=($tip_cuzova == "Хэдчбэк") ? "selected" : ""; ?>> Хэдчбэк</option> </select><br><br> <label class='sort_label'>Тип двигателя</label><br> <select class='sort_select' name='tip_dvigately'> <option class='sort_option' value=''>(любой)</option> <option class='sort_option' value='Бензин' <?=($tip_dvigately == "Бензин") ? "selected" : ""; ?>> Бензин</option> <option class='sort_option' value='Дизель' <?=($tip_dvigately == "Дизель") ? "selected" : ""; ?>> Дизель</option> </select><br><br> <label class='sort_label'>Привод</label><br> <select class='sort_select' name='privod'> <option class='sort_option' value=''>(любой)</option> <option class='sort_option' value='Задний' <?=($privod == "Задний") ? "selected" : ""; ?>> Задний</option> <option class='sort_option' value='Передний' <?=($privod == "Передний") ? "selected" : ""; ?>> Передний</option> <option class='sort_option' value='Полный' <?=($privod == "Полный") ? "selected" : ""; ?>> Полный</option> </select> </td> <td width='300' valign='top'> <label class='sort_label'>КПП</label><br> <select class='sort_select' name='kpp'> <option class='sort_option' value=''>(любая)</option> <option class='sort_option' value='Механическая' <?=($kpp == "Механическая") ? "selected" : ""; ?>> Механическая</option> <option class='sort_option' value='Автомат' <?=($kpp == "Автомат") ? "selected" : ""; ?>> Автомат</option> </select><br><br> <label class='sort_label'>Цвет</label><br> <select class='sort_select' name='cvet'> <option class='sort_option' value=''>(любой)</option> <option class='sort_option' value='Белый' <?=($cvet == "Белый") ? "selected" : ""; ?>> Белый</option> <option class='sort_option' value='Черный' <?=($cvet== "Черный") ? "selected" : ""; ?>> Черный</option> <option class='sort_option' value='Желтый' <?=($cvet == "Желтый") ? "selected" : ""; ?>> Желтый</option> <option class='sort_option' value='Красный' <?=($cvet == "Красный") ? "selected" : ""; ?>> Красный</option> <option class='sort_option' value='Синий' <?=($cvet == "Синий") ? "selected" : ""; ?>> Синий</option> </select><br><br> <label class='sort_label'>Мощность, л.с.:</label><br> <input class='sort_input' type='text' size='5' name='moshnostiOt' value='<?=$moshnostiOt;?>' /> <label class='sort_label'> по</label> <input class='sort_input' type='text' size='5' name='moshnostiDo' value='<?=$moshnostiDo;?>'/> <br /><br /> <label class='sort_label'>Стоимость</label><br> <input class='sort_input' type='text' size='5' name='priceOt' value='<?=$priceOt;?>' /> <label class='sort_label'> по</label> <input class='sort_input' type='text' size='5' name='priceDo' value='<?=$priceDo;?>' /><br /> </td> </tr> <tr> <td colspan='2' align='center'> <br /><br /> <input class='sort_button' type='submit' name='filterSet' value='Выбрать'/> <input class='sort_button' type='submit' name='filterClear' value='Сбросить'/> </td></tr></table> </form>
Для начала подключим файл function.php.
include("function.php");
Далее выводим бренды, присвоенные переменной $brendsList, затем подключаем файл form.php, там как Вы уже знаете, находится сама сортировка по параметрам, далее реализуем выборку по алфавиту и ценам, затем выводим все автомобили из таблицы catalog, занесенные в переменную $content и в последнем случае остается переменная $navigation, сама навигация.
<div class="sort_div" id="div_a" class='center'> <div class="sort_brendlist"> <label class="sort_label_brend">Марка автомобиля: </label> <?=$brendsList;?> </div> <div class="sort_form"><? include("form.php"); ?></div> <div class="sort_brendlist"> <a href="<?=$page_set?>?sort=default">По алфавиту</a> / <a href="<?=$page_set?>?sort=asc">Сначале дешевые</a> / <a href="<?=$page_set?>?sort=desc">Сначала дорогие</a> </div> </div> <?=$content;?> <div class="sort_div" <div id="div_a"><?=$navigation;?></div> <br>
/*Сортировка*/ .sort_brendlist { padding: 10px; font-size: 14px; } .sort_div { background: #2da3bd; border: 1px solid #60b5dd; width: 800px; } .sort_form { background: white; } .sort_table { padding: 20px; } .sort_label { font-size: 14px; font-weight: bold; color: black; } .sort_label_brend { font-size: 14px; font-weight: bold; color: white; } .sort_label_param { font-size: 14px; color: white; } .sort_select { width: 200px; margin-top: 5px; margin-bottom: 10px; border: 1px solid #0268b2; color: black; } .sort_option { color: black; } .sort_input { width: 90px; margin-top: 5px; margin-bottom: 10px; border: 1px solid #0268b2; color: black; } .sort_button { background: none; color: white; border: 1px solid orange; background: orange; } /*Вывод автомобилей*/ .product_table { padding-top: 30px; } .product_div_name { background: #2da3bd; border: 1px solid #60b5dd; width: 800px; margin-bottom: 20px; } .product_name { color: white; font-size: 16px; font-weight: bold; padding-left: 10px; } .product_haracterisiki1 { font-size: 14px; font-weight: bold; } .product_haracterisiki2 { font-size: 14px; } /* Ссылки*/ a { color: white; } a:hover { color: orange; }
Мы пошагово рассмотрели все действия, связанные с сортировкой на php и mysql. Возможно, данная сортировка немного объемна, но зато очень практична. Спасибо всем за внимание, желаю Вам удачи в реализациях своих планов!