Сегодня я покажу вам как сделать сложный поиск по таблице MySql, который бы искал любые вхождения на любых местах в поисковом запросе.
Особенности примера кода:
- Контекстный поиск отдельных слов, введенных через пробел в строке запроса.
- Подсветка найденных фрагментов.
- Сортировка по цене или по наименованию.
- Постраничный вывод, номера страниц выводятся сверху и снизу.
// подключение к базе MySql
require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
// если передан поисковый запрос
if($q){
$ar_q=explode(" ", $q);
$add_sql='';
for($i=0;$i<count($ar_q);$i++)
$add_sql.=' ((locate("'.strtolower(addslashes($ar_q[$i])).'",lower(price.name))>0) or'.
' ("'.strtolower(addslashes($ar_q[$i])).'"=lower(price.kod_prodact))) and';
$add_sql=' WHERE'.$add_sql.' ost<>"нет"';
$add_q=($q?'&q='.urlencode($q):'');
}else{
$add_sql=' WHERE ost<>"нет"';
$add_q='';
}
// Общее количество информации
//$count = mysql_numrows(sql('SELECT * from price '.$add_sql));
$row = mysql_fetch_assoc(sql('SELECT count(*) as counter from price '.$add_sql));
$perpage = 20; // Количество отображаемых данных из БД на одной странице
$count=intval($row['counter']); // общее кол-во товаров
if($count){
$pages_count = ceil($count / $perpage); // Количество страниц
// Если номер страницы оказался больше количества страниц
if ($page > $pages_count) $page = $pages_count;
$start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД
$bar=link_bar($page, $count, $pages_count, 8);
echo $bar;
// сортировка по наименованию или цене
$ord = @$_GET['ord']; if(($ord<>'name')&&($ord<>'price'))$ord='name';
if($ord=='price'){
print "<h3><a href=\"".$_SERVER['PHP_SELF'].'?page='.$page.$add_q."\">Наименование</a></h3>
↓Цена<a href='#price'><sup>*</sup></a> \n";
$add_q.='&ord=price';
}else
print "<h3>↓Наименование</h3>
<a href=\"".$_SERVER['PHP_SELF'].'?page='.$page.$add_q."&ord=price\">Цена</a> \n";
// Вывод информации из базы данных
$result = sql('SELECT * from price '.$add_sql.' ORDER BY '.$ord.' LIMIT '.$start_pos.', '.$perpage);
while ($row = mysql_fetch_assoc($result)) {
$name=($q?preg_replace("/(".str_replace('/','\/',$q).")/si",'<font color=red>\\1</font>',htmlspecialchars($row['name'])):htmlspecialchars($row['name']));// Подсветка
print "<h3 id='n".$row['id']."'>".$name."</h3>
".number_format($row['price'], 0, '.', ' ')." руб."; // цена
}
echo " <br clear=all />$bar<span class='it'>".($q?"Найдено по запросу":"Всего")." <b>".number_format($count, 0, '.', ' ')."</b> товаров.</span>";
}else print "<h3>По вашему запросу ничего не найдено!</h3>";
Функция вывода постраничной навигации:
function link_bar($page, $count, $pages_count, $show_link)
{global $add_q;
// $show_link - это количество отображаемых ссылок;
// нагляднее будет, когда это число будет парное
// Если страница всего одна, то вообще ничего не выводим
if ($pages_count == 1) return '';
$out='';
$begin = $page - intval($show_link / 2);
// Сам постраничный вывод
// Если количество отображ. ссылок больше кол. страниц
if ($pages_count <= $show_link + 1) $show_dots = 'no';
// Вывод ссылки на первую страницу
if (($begin > 2) && ($pages_count - $show_link > 2))
$out.='<a href="'.$_SERVER['PHP_SELF'].'?page=1'.$add_q.'" title="в начало"> << </a> ';
for ($j = 0; $j <= $show_link; $j++) // Основный цикл вывода ссылок
{ $i = $begin + $j; // Номер ссылки
// Если страница рядом с началом, то увеличить цикл для того,
// чтобы количество ссылок было постоянным
if ($i < 1) continue;
// Подобное находится в верхнем цикле
if (!isset($show_dots) && $begin > 1) {
$out.=' <a href="'.$_SERVER['PHP_SELF'].'?page='.($i-1).$add_q.'"><b>...</b></a> ';
$show_dots = "no";
}
// Номер ссылки перевалил за возможное количество страниц
if ($i > $pages_count) break;
if ($i == $page) $out.=' <a><b>'.$i.'</b></a> ';
else $out.=' <a href="'.$_SERVER['PHP_SELF'].'?page='.$i.$add_q.'">'.$i.'</a> ';
// Если номер ссылки не равен кол. страниц и это не последняя ссылка
if (($i != $pages_count) && ($j != $show_link)) $out.=' ';// Разделитель ссылок
// Вывод "..." в конце
if (($j == $show_link) && ($i < $pages_count))
$out.=' <a href="'.$_SERVER['PHP_SELF'].'?page='.($i+1).$add_q.'"><b>...</b></a> ';
}
// Вывод ссылки на последнюю страницу
if ($begin + $show_link + 1 < $pages_count)
$out.=' <a href="'.$_SERVER['PHP_SELF'].'?page='.$pages_count.$add_q.'" title="в конец"> >> </a>';
return "\n".$out."\n";
} // Конец функции
💡 Поздравляю, Ваш пост попал в рейтинг: Еженедельный рейтинг постов от djimirji. Неделя 10.12.2018-16.12.2018.
В случае апвоута поста с наградой, вознаграждение составило бы: 0.080 GOLOS
✅
💡 Поздравляю, Ваш пост попал в рейтинг: Рейтинг постов от djimirji. Период 12.12.2018-14.12.2018.
В случае апвоута поста с наградой, вознаграждение составило бы: 0.156 GOLOS
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
cats, spinner, neo, andrey1986, ovchinnikov, niiu, dikaniovs, tinochka, la-bella-vita, yurgent71, amikphoto, nefer, andreyprosto, gromozeka, gryph0n, ladykosha, kvg, roman-nikitin, sterh, olga-fink, optimist, amelina.elena, bombo, nerengot, upper, ili, mp42b, shafarevich, izbushka, propoker, ezavarov, sinilga, nightinga1e, anykeycheg, delectat, krevetkoshou, olgataul, boliwar, kinoshka, archual, alexxela, djimirji, alena4e, radmilochka, fatima
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
@djimirji up!
Призываю @delegation-fund
@vik 100%
💡 @maximus00 получил апвоут на 12% (VotingPower 9122.31).
Апайте посты блога: https://golos.id/@djimirji и будете получать апвоуты на 30%
Пост может попасть в двухдневный рейтинг и получить награду в случае АПА поста
Пост может попасть в еженедельный рейтинги получить награду в случае АПА поста
Условия вызова бота:
✅