Видеоурок по реализации поиска на сайте
Почти на каждом сайте имеется поиск. И практически всегда там стоит какой-нибудь сторонний скрипт, что, на мой взгляд, не очень хорошо. Во-первых, я это знаю, потому что перебрал несколько десятков различных скриптов. Ни один из них мне не подошёл по самым разнообразным причинам, а, во-вторых, чужой код - это всегда потёмки, а я привык контролировать ситуацию полностью. Поэтому мне пришлось сделать свой скрипт поиска по сайту. Фактически, в этом видеоуроке мы реализуем поиск на сайте, который будет очень близок к моему. Я постараюсь всё тщательно и подробно объяснить и разъяснить. А так как в большинстве случаев контент сайта хранится в базе данных, то и в видеоуроке поиск будет вестись непосредственно в ней.
Очень надеюсь, что Вы поняли, что реализация поиска, если сильно не углубляться, совсем не сложное занятие, выполнив которое, Вы перестанете быть зависимыми от всяких "левых" скриптов.
Скачать видеоурок в отличном качестве можно по этой ссылке (45.1 МБ): скачать видеоурок. Запускать надо файл index.html
Скачать исходники к уроку: скачать исходники.
-
- Михаил Русаков
Комментарии (56):
Спасибо
Ответить
Подскажите пожалуйста, как сделать выборку по нескольким таблицам и постраничную навигацию для данного поиска?
Ответить
Про выборку из нескольких таблиц сразу: http://myrusakov.ru/sql-select-several.html Про навигацию по страницам: http://myrusakov.ru/php-page-navigation.html
Ответить
вот строчка у вас echo $results[$i]["title"]; выводит только название статьи. Мне нужно сделать чтобы выводило все поля которые есть в базе! пишу так echo $results[$i]["fio"] выводит фамилию, пишу echo $results[$i]["rbook"] номер зачетки не выводит... что не так? может быть это в запросе еще нужно искать по номеру зачетки или как? но в результате поиска вот такая строка Array ( [0] => Array ( [id] => 1 [scard] => 820601-01 [rbook] => A0255665 [fio] => Аврамчиков Андрей Викторович [stage1] => 54 [stage2] => 67 [stage3] => 89 [result] => 34 [tem] => ) )
Ответить
У Вас и так выводятся все поля в массив, а уже как выводить из массива Вы знаете. И в чём проблема?
Ответить
Здраствуйте Михаил.Все делал по Вашему уроку но возникают ошибки Cannot instantiate non-existent class:mysqli.а кагда меняю подключение к базе на вот такую команду mysql_connect то выскакивает ощибка Call to a member function on a non-object помогите разобраться.
Ответить
Проверьте что php_mysqli.dll подключен в конфиге.
Ответить
А почему вы перебираете массив полученный explode() конструкцией foreach, а массив ответа for? (Мне кажется все через for надо елать)
Ответить
Без разницы, какой цикл использовать. foreach покороче, поэтому его там и использовал. А для перебора result_set я всегда использовал только while, уже давно привык.
Ответить
Помоему for быстрее
Ответить
Да, на 2-3% быстрее, но зато запись короче на 30%, а вообще не в этом дело, это как руки напечатают, так и будет.
Ответить
Пожалуйста сделаете видеоурок о поииске не по базе, а по страницам.
Ответить
Михаил, а как можно сделать подсветку поискового слова? Пробую так return str_replace($words, "<span style = 'color: red; font-weight: bold;'>".$words."</span>", $results); но не выходит, и через preg_replace пробовал, тоже никак
Ответить
$results = str_replace(...);
Ответить
Михаил подскажите. Почему текст который выводится с БД у меня не сайте отображается в виде знаков вопроса (http://s52.radikal.ru/i135/1301/6c/2435a5313438.png). Кодировки в БД следующие: (http://s019.radikal.ru/i618/1301/f7/110bdad01335.png) и со вкладки операции (http://s017.radikal.ru/i400/1301/45/1391aa0e801f.png)
Ответить
http://myrusakov.ru/php-encoding-problems.html
Ответить
Прочитал статью и сделал все так как там написано. Перекодировал как написано во 2 причине (нечего не изменилось), добавил макрос mysql_query("set names utf8"); (ничего не изменилось). добавил файл .htaccess в корне сайта и тут кракозяблы просто изменились на другие (http://s017.radikal.ru/i413/1301/d4/68451998183f.png)
Ответить
Чудес не бывает. Сотни людей прошли через эту статью, я уже сотню сайтов точно создал, и никогда не выходил за пределы того, что там написано. Там всё, что нужно. Ищите ошибку, смотрите, какую кодировку выставляет браузер, сравнивайте с кодировкой документа, проверяйте 1000 раз, что написано в .htaccess, проверяйте все поля в таблицах (а не просто одну кодировку таблицы) и так далее.
Ответить
Видать чудеса бывают. Уже не знаю что делать... Статья не помогла, пробовал сменить Денвер на другие сборки эффект не изменился, а браузер выставляет как надо UTF-8. Но вот что ещё интересно. Отправил знакомому (который у себя на компьютере загрузил мою БД и Сайт) и на удивление у него всё нормально отображается. Что посоветуете?
Ответить
Обнаружил способ как решить проблему... Просто убрал галочку с пункта "SUPER" при выборе привилегий для пользователя.Так как в том случае, если помимо прочих привилегий для пользователя будет отмечена привилегия SUPER, то кодировка, установленная по умолчанию в настройках MySQL сервера, не будет на него действовать.
Ответить
А если сразу после подключения отправить запрос SET NAMES 'UTF-8' или SET NAMES 'CP1251'? Попробуйте, только обязательно верните SUPER. И не фантазируйте про SUPER, всегда он у меня стоит, но при этом никогда подобных проблем с кодировкой не было.
Ответить
А какие могут быть последствия при отмене SUPER?
Ответить
Никаких принципиальных привилегий она не даёт, просто её никто никогда не отключает. И ещё никому она не мешала сделать нормальную кодировку. Раз Вы решили эту проблему, поздравляю, но не фантазируйте на тему связи SUPER и проблем с кодировкой. Если всё делать, как я писал в статье, то ещё ни у кого проблем не было.
Ответить
Здравствуйте. Подскажите, почему при поиске данных которых нету в БД мне выводит как и надо "Ничего не найдено". Но при этом ещё выдает ошибку Notice: Undefined variable: results in C:\wamp\www\test.ru\index.php on line 31 Вот мой ссылка на мой php код и скриншот ошибки http://dfiles.ru/files/9ku6etu08 В строке №31 как и у вас находится return $results;
Ответить
http://myrusakov.ru/php-error-reporting.html
Ответить
Вы хотите сказать что мне стоит просто отключить вывод данной ошибки?
Ответить
Это не ошибка. А если так хочется, то можете написать в начале скрипта $results = false;
Ответить
Здравствуйте а где можно найти исходник вашего сайта по вашему курсу ОТ А до я?
Ответить
Их нет.
Ответить
Доброго времени суток. Как сделать так чтобы выводилась сперва название статьи а за ней сама статья, а то сначала выводит все названия а затем сплошной текст. Заранее спасибо.
Ответить
а как правильно проставить ссылки? Чтобы эти заголовки вели на полную статью? Спасибо!
Ответить
Например, поставить ссылки такие: article.php?id=5, при переходе на которую выводится весь текст статьи с id=5.
Ответить
вывел после for вот это: echo '<a href="'.$site_url.'articles.php?category_id='.$row_search['article_id'].'">'.$results[$i]['title'].'</a><br />'; не работает..id всех статей = 1.. вот запрос: $res_search = mysql_query("SELECT * FROM `articles`") or die(mysql_error); $row_search = mysql_fetch_assoc($res_search); Подскажите плиз в чем дело?
Ответить
.$row_search['article_id'].'" - здесь тоже [$i] нужен.
Ответить
а можете расписать подробней? [$i] вместо ['article_id']??
Ответить
$row_search[$i]['article_id'].'"
Ответить
Михаил, подскажи а как сделать что бы выводился не только title, но и сылка на это статью. Дополните ваш урок. ЗА ранее спасибо.
Ответить
Огромное спасибо. Очень полезная информация.
Ответить
Здравствуйте Михаил. Я хотел бы попросить вас в небольшое объяснение по данному видео. А именно с какой целью вы на 6 минуте и 55 секунде преобразовываете resault_set в двумерный массив. Я понимаю что вопрос для вас прозвучал глупо. Но я не могу понять с какой целью это делается... Даже не представляете как буду вам благодарен если вы немножко подробней мне объясните.
Ответить
Потому что result_set - это не те данные, которые можно просто взять и использовать. Перед этим их нужно преобразовать в понятный тип данных, а именно массив, с которым уже можно работать.
Ответить
А какой примерно вид имеет эта переменная до преобразования?
Ответить
Никакой, чтобы можно было с ним сразу работать.
Ответить
Спасибо вам большое
Ответить
Здраствуйте, а возможно ли в этом скрипте сделать так чтоб он искал по 2м полям, к примеру: <select name="marka"> <option value="0">Любая фирма</option> </select> <select name="model"> <option value="0">Любая модель</option> </select> Если возможно то как впихнуть туда 2е имя поля?
Ответить
Можно, но тогда придется менять код. У нас получатся две выборки из базы.
Ответить
<?php function search($words) { $words = htmlspecialchars($words); if ($words === "") return false; $query_search = ""; $arraywords = explode(" ", $words); foreach($arraywords as $key => $value) { if (isset($arraywords[$key - 1])) $query_search .= ' OR '; $query_search .= '`title` LIKE "%'.$value.'%" OR `text_article` LIKE "%'.$value.'%"'; } $query = "SELECT * FROM articles WHERE $query_search"; $mysqli = new mysqli("123", "123", "123", "123"); $result_set = $mysqli->query($query); $mysqli->close(); $i = 0; while($row = $result_set->fetch_assoc()) { $results[$i] = $row; $i++; } $result_set->close(); return $results; } if (isset($_POST['bsearch'])) { $words = $_POST['words']; $results = search($words); } ?> помогите найти ошибку, при пустом запросе все хорошо, при любом другим пишет Call to a member function fetch_assoc() on a non-object in
Ответить
http://myrusakov.ru/php-fetchassoc.html
Ответить
Здравствуйте. 1. Как ограничить поиск минимум по 3 буквам, а то ищет даже одну букву и естественно выводит все записи из базы? 2. Как реализовать чтобы поиск шел по целым словам, например: если искать ВОТ, то будет найден жиВОТные, а хотелось бы чтобы искались целые слова? Заранее благодарен.
Ответить
У меня на сайте есть session_start(); Он нужен для изменения языка на сайте.Я создал поиск по вашим урокам, но у меня выводится сообщение "Подтвердить повторную отправку формы" как этого избежать.Как можно убрать сессию отдельно для поиска?
Ответить
закрывайте сессию раньше)
Ответить
А как закрыть такую сессию session_start(); if(empty($_GET['view'])) $view = 'index'; else $view = $_GET['view']; if($_SESSION['lang'] == '') { $lang = 'kz'; $_SESSION['lang'] = $lang; } else $lang = $_SESSION['lang']; if(isset($_POST['change_lang'])) { change_lang($_POST['lang']); header("Location: index.php?view=".$view); }
Ответить
Используйте session_destroy ();
Ответить
Ребята выручайте, весь вечер убил, не могу найти ошибку, до 17 мин все делал по видео запустил проверку, выводит:Fatal error: Call to a member function fetch_assoc() on a non-object in D:\OpenServer\domains\uploadsearch\search_form.php on line 22 Строка запроса без ошибок : $query_search .= ' `img` LIKE "%'.$value.'%" OR `description` LIKE "%'.$value.'%"';
Ответить
Уважаемый Михаил Русаков я уже третий раз посмотрю ваш видео урок но все равно не могу найти ошибку когда идет до функ. fetch_assoc тут уже ошибка!
Ответить
Здравствуйте,я тоже уже сотый раз пересматриваю , но никак не понимаю в чем ошибка. даже исходник скачал , все равно. Fatal error: Call to a member function fetch_assoc() on a non-object in Z:\home\search\www\index.php on line 19
Ответить
Видеокурс по изучению HTML и CSS http://glopages.ru/affiliate/7021397
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.