Как сделать поиск по сайту
Если на сайте-каталоге или интернет-магазине представлено большое количество товаров
с многочисленными описаниями и на сайте отсутствует система внутреннего пользовательского
поиска, то мимо посетителя пройдёт значительная доля информации, которую именно ему адресует
владелец каталога или интернет магазина. Поэтому, если Вы веб-мастер и разрабатываете
функционал такого сайта индивидуально, не прибегая к использованию типовых CMS, то эта
статья о том, как слелать многокритериальный поиск по сайту, именно для Вас.
Разберём эту задачу на примере многокритериального поиска по сайту-каталогу, на котором
представлены лодки и катера различных производителей и с большим числом характеристик.
Условимся, что посетитель сайта получит возможность искать товары по следующим
характеристикам:
- цена,
- год выпуска,
- длина,
- мощность двигателя,
- бренд.
В реализации поиска широко задействована
алгебра логики. О логических операциях с логическими
же функциями можно узнать из материала "Булева алгебра (алгебра логики)".
Четыре первые характеристики предполагают выбор посетителем минимального и максимального
значений (то есть, ищутся варианты "от" и "до"), а бренд - одного конкретного значения. Значения критериев выбираются из
выпадающего селектора. Пользователь может выбрать значения только одного критерия (в этом
случае все остальные критерии представлены полным диапазоном), нескольких или всех
критериев.
Первое, что делаем - на всех или определённой странице сайта размещаем форму
многоритериального поиска. Её код (пояснения - после кода):
Код HTML/PHP
<h1 class="title">Детальный поиск</h1>
<h3>Выберите минимальное и максимальное значение одного или нескольких критериев</h3>
<form style="margin-bottom: 16px;" action="search.php" method="post">
<h5 style="font-size: 16px; margin: 0 0 0 0; padding: 0 0 0 0; color: #035165; font-weight: normal;">Цена</h5>
<select style="float: left; width: 93px;" name="price_from">
<option value="e">От €</option>
<option value="1">0</option>
<option value="10000">10000</option>
...//промежуточные значения цены
<option value="90000">90000</option>
<option value="100000">100000.'</option>
<option value="100001">> 100000</option>
</select>
<select style="float: left; width: 93px;" name="price_to">
<option value="e">До €</option>
<option value="10000">10000</option>
...//промежуточные значения цены
<option value="100000">100000</option>
<option value="10000000000">> 100000</option>
</select>
<br><h5 style="font-size: 16px; margin: 0 0 0 0; padding: 0 0 0 0; color: #035165; font-weight: normal;">Год выпуска</h5>
<select style="float: left; width: 93px;" name="year_from">
<option value="e">От</option>
<option value="2000">2000</option>
<option value="2001">2001</option>
...//промежуточные значения годов выпуска
<option value="2014">2014</option>
<option value="2015">2015</option>
</select>
<select style="float: left; width: 93px;" name="year_to">
<option value="e">До</option>
<option value="2000">2000</option>
<option value="2001">2001</option>
...//промежуточные значения годов выпуска
<option value="2014">2014</option>
<option value="2015">2015</option>
</select>
<br><h5 style="font-size: 16px; margin: 0 0 0 0; padding: 0 0 0 0; color: #035165; font-weight: normal;">Длина</h5>
<select style="float: left; width: 93px;" name="length_from">
<option value="e">От (м)</option>
<option value="4">4</option>
...//промежуточные значения длины
<option value="15">15</option>
<option value="16">> 15</option>
</select>
<select style="float: left; width: 93px;" name="length_to">
<option value="e">До (м)</option>
<option value="4">4</option>
...//промежуточные значения длины
<option value="15">15</option>
<option value="100000">> 15</option>
</select>
<br><h5 style="font-size: 16px; margin: 0 0 0 0; padding: 0 0 0 0; color: #035165; font-weight: normal;">Мощность двигателя</h5>
<select style="float: left; width: 93px;" name="motor_from">
<option value="e">От (л/сил)</option>
<option value="0">0</option>
<option value="50">50</option>
...//промежуточные значения мощности
<option value="300">300</option>
<option value="301">> 300</option>
</select>
<select style="float: left; width: 93px;" name="motor_to">
<option value="e">До (л/сил)</option>
<option value="0">0</option>
<option value="50">50</option>
...//промежуточные значения мощности
<option value="300">300</option>
<option value="100000">> 300</option>
</select>
<br><h5 style="font-size: 16px; margin: 0 0 0 0; padding: 0 0 0 0; color: #035165; font-weight: normal;">Бренд</h5>
<select style="width: 186px;" name="brand">
<option value="e">Выбрать</option>';
<?php
$mybrandnastr = mysql_query("SELECT * FROM `brands` ORDER BY `brand_name`", $db) or die (mysql_error());
$myrowbrand = mysql_fetch_array($mybrandnastr);
do
{
echo '<option value="'.$myrowbrand['brand_name'].'">'.$myrowbrand['brand_name'].'</option>';
}
while ($myrowbrand = mysql_fetch_array($mybrandnastr));
echo '</select>';
?>
<input type="hidden" name="sended" value="yes">
<input class="but" name="" type="submit" size="27" value="Искать">
</form>
Необходимые пояснения к приведённому коду. Предположим, что цена указывается в евро, поэтому
и знак €. Далее - важный момент: значение селектора, отображаемого по умолчанию как
выбранном, то есть, том, в котором записано "от" и "до", равно "е" (от слова empty - пустой).
Оно передаётся скрипту-обработчику, если пользователь не выбрал минимальное, либо
максимальное, или же оба значения какого-либо критерия. Скрипт обработки запроса из формы
трактует это значение "е" как весь диапазон значений. То есть, например, если не выбрана
цена, то поиск будет производится среди позиций в базе данных со всеми значениями цены, а
также тех, у которых цена не указана (бывает и такое, например, когда цена ещё формируется).
Точно такую же роль значение селектора "е" играет и у других критериев поиска. Например,
если пользователь ищет товар только по длине, то все остальные критерии имеют полные
диапазоны значений.
Далее - код скрипта-обработчика, который размещается в файле-обработчике формы (например,
search.php) и обеспечивает многокритериальный поиск по сайту в базе данных. Он приведён
вместе с кодом вывода найденных в результате поиска товаров. Пояснения, как мы уже
договорились - после кода.
Код PHP
<?php
if ($_POST['sended'] == "yes")
{
if (($_POST['price_from'] == 'e') OR ($_POST['price_to'] == 'e'))
{
$price_from = 0;
$price_to = 1000000000000;
}
else
{
$price_from = $_POST['price_from'];
$price_to = $_POST['price_to'];
}
if (($_POST['year_from'] == 'e') OR ($_POST['year_to'] == 'e'))
{
$year_from = 0;
$year_to = 2020;
}
else
{
$year_from = $_POST['year_from'];
$year_to = $_POST['year_to'];
}
if (($_POST['length_from'] == 'e') OR ($_POST['length_to'] == 'e'))
{
$length_from = 0;
$length_to = 1000000000000;
}
else
{
$length_from = $_POST['length_from'];
$length_to = $_POST['length_to'];
}
if (($_POST['motor_from'] == 'e') OR ($_POST['motor_to'] == 'e'))
{
$motor_from = 0;
$motor_to = 1000000000000;
}
else
{
$motor_from = $_POST['motor_from'];
$motor_to = $_POST['motor_to'];
}
if ($_POST['brand'] == 'e')
{
$brand = 'e';
}
else
{
$brand = $_POST['brand'];
}
if (($brand == 'e') AND (($price_from == 'e') OR ($price_to == 'e')) AND (($year_from == 'e') OR ($year_to == 'e')) AND (($length_from == 'e') OR ($length_to == 'e')) AND (($motor_from == 'e') OR ($motor_to == 'e')))
{
echo "";
}
else if ($brand == 'e')
{
$query = mysql_query("SELECT * FROM `skycat_tov` WHERE (`tov_cena`>='$price_from' AND `tov_cena`<='$price_to') AND (`tov_year`>='$year_from' AND `tov_year`<='$year_to')
AND (`tov_dlina`>='$length_from' AND `tov_dlina`<='$length_to') AND (`tov_motormin`>='$motor_from' AND `tov_motormin`<='$motor_to') AND (`tov_motormin`>='$motor_from' AND `tov_motormax`<='$motor_to')",$db);
}
else
{
$query = mysql_query("SELECT * FROM `skycat_tov` WHERE (`tov_cena`>='$price_from' AND `tov_cena`<='$price_to') AND (`tov_year`>='$year_from' AND `tov_year`<='$year_to')
AND (`tov_dlina`>='$length_from' AND `tov_dlina`<='$length_to') AND (`tov_motormin`>='$motor_from' AND `tov_motormin`<='$motor_to') AND (`tov_motormin`>='$motor_from' AND `tov_motormax`<='$motor_to') AND `tov_brand`='$brand'",$db);
}
$myrow1 = mysql_fetch_array($query);
$mnrows = mysql_num_rows($query);
// вывод товаров
if ($mnrows > 0)
{
echo '<h1 class="title" id="page-title">Результаты поиска</h1>
<div class="view-content">';
do
{
...//Вывод информации из базы данных к найденному товару
}
while($myrow1 = mysql_fetch_array($query));
echo '</div>';
}
else
{
echo "По Вашему запросу результатов не найдено";
}
}
?>
Обещанные пояснения. В первом условии для значения каждого критерия поиска - значение "е",
то есть, пользователь не выбрал одно из либо оба (минимальное и максимальное) значения
данного критерия поиска по сайту. В альтернативном условии (значения критерия поиска выбраны)
принимаются выбранные значения критерия поиска. Далее - варианты запроса к базе данных сайта
для случаев, когда не выбраны значения ни одного из критериев поиска, не выбран бренд и
выбраны значения всех критериев поиска по сайту. В базу данных сайта поступает запрос со
значениями критериев поиска, выбранных пользователем (если значение критерия поиска не
выбрано пользователем, в запросе поступает значение от "О" до какого-либо заведомо
экстремального, например, "1000000000", такого, что все значения данного критерия в базе
данных сайта явно меньше этого экстремального значения). В реализации поиска широко задействована
алгебра логики. Строить сложные логические условия для поиска Вам поможет материал "Булева алгебра (алгебра логики)".
А об операциях для манипулирования данными из баз данных - материал "Реляционная алгебра"
Вот, пожалуй, всё. Многокритериальный поиск по сайту готов!
Поделиться с друзьями