Доход с нуля
Все что относится к интернету.

Своя поисковая система на сайте

Сообщение Slash » более года назад 15 дек 2015, 20:19

Здравствуйте.
Хочу поделиться с теми, кто зарабатывает на своем сайте (PHP), возможно на интернет магазине, как сделать более удобным свой ресурс для ваших клиентов. Я расскажу, как сделать систему поиска на своем сайте. При помощи поиска ваш покупатель может гораздо быстрее найти нужный ему товар и покупатель останется доволен, или нет! Но его недовольство будет не из-за поисковика...

poisk_po_saitu


Практически во всех движках поиск уже встроен, если у вас он есть, то этот пост вам не нужен, но быть может вам потребуется ещё одна форма поиска или допилить существующий, тогда велком в тему, буду рад помочь!

Многие пользуются формой поиска от Яндекса или Гугла, что с одной стороны очень удобно, не надо быть программистом, что бы вставить пару строк в HTML документ. Но есть минус этих поисковиков - это время ушедшее на индексацию страницы. Например сегодня вы добавили товар, а в результатах поиска он появится только через день - два, а с Яндендексом и того дольше. Или наоборот, вы удалили товар, а он по прежнему появляется в поисковой выдачи. Покупатель переходит по ссылке, а там говорится: Товара нет в наличии. Всем известно, что скажет покупатель в данной ситуации? По этому, я считаю, что свой поиск - это лучше. Свой поиск работает на прямую со своей базой, и будет выдавать только то что в ней есть.

Ну, давайте начнем уже...
Конечно же любой поиск начинается с вода какой то фразы/слова, водится это слово в форму. Создаем такую форму:
Код: Выделить всё
        <!-- Search -->
        <div class="search">
            <form action="search.php" method="get">
                <input type="search" name="word" placeholder="Поиск" />
            </form>
        </div>
        <!-- END Search --> 

Что в этой форме:
Данная форма не имеет кнопки, только поле для вода слова, но по желанию кнопку можно добавить.
Для старта поиска следует нажать кнопку Enter.
Блок div с классом search, можете разукрасить при помощи css, как вам угодно. Если у вас своя задумка для вставки форму, можете удалить этот блок, я его написал для удобства.
action="search.php" - отдает команду куда перейти после старта.
method="get" - метод поиска. В данном случаи выбран метод GET. Это значит, что поисковое слово будет браться из URL.
type="search" - команда "поле поиска".
name="word" - название поля. В дальнейшем имя word будет обрабатываться, как переменная.
placeholder="Поиск" - выводится слово Поиск в поле, когда система не выполняет поиск.

Переходим к приему слова и его обработки. Содержимое файла search.php (команда передала из формы на этот файл: action="search.php"). Что бы было понятнее, прокомментирую по возможности код:
Код: Выделить всё
<?php
$connect 
= mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname); // Подключаемся к БД. Переменным должно быть назначены параметры доступа БД
if (!$connect) // Проверка на ошибку подключения
{
    exit('MySQL Error: ' . mysqli_error($connect)); // Если подключится не удалось, выводим ошибку
}

$word = (isset($_GET['word'])) ? $_GET['word'] : null; Забиваем переменную $word
$word 
= mysqli_real_escape_string($connect, trim($word)); // Экранируем символы и убираем пробелы

if(empty($word)) // Проверяем ведено ли слово
{
    echo 'Не ведено слова.'; // Если слово не введено, выводим сообщение ошибки
}
else if (iconv_strlen($word, 'utf-8') < 3) // Проверяем длину слова (мин 3 символа)
{
    echo 'Слово не может быть менее трех символов.'; // Если слово менее трех символов
}
else if (iconv_strlen($word, 'utf-8') > 20) // Проверяем длину слова (макс 20 символов)
{
    echo 'Слово не может быть более двадцати символов.'; // Если слово более двадцати символов
}
else // Если в ходе проверок ни каких ошибок не выявлено, двигаемся дальше
{
    $sql = 'SELECT * 
        FROM article
        WHERE article_text 
        LIKE "%'
 . $word . '%"'; // Составляем запрос
    $query = mysqli_query($connect, $sql); // Выполняем запрос
    if (!$query) // Проверяем запрос
    {
        echo 'Ошибка базы данных.'; // Если возникли проблемы при выполнения запроса
    }
    else // Все замечательно! Двигаемся дальше
    {
        while ($row = mysqli_fetch_assoc($query)) // Составляем массив
        {
            echo $row['article_title'] . '<br />'; // Выводим список заголовков статей, в которых было найдено веденное слово
        }
    }            
}

Вот пожалуй и все.
В примере я писал, как поиск по статьям, но его можно заменить, например на описание товара или название товара, да, как угодно!
Если есть вопросы - задавайте.

Прошу простить меня за допущенные ошибки в тексте, писать тексты не мой конек.

Надеюсь информация была полезной.
Спасибо за внимание.
Аватара пользователя
Slash
Эксперт
 
Сооб­щения: 488

Своя поисковая система на сайте



Сообщение Administrator » более года назад 15 дек 2015, 20:31

Спасибо за статью, очень полезная. Есть вопрос по опечаткам: можно ли сделать так, чтобы код учитывал опечатки при вводе поискового запроса и исправлял их? Насколько это сложно?
Аватара пользователя
Administrator
Администратор
 
Сооб­щения: 8672
Откуда: Россия

Сообщение Slash » более года назад 16 дек 2015, 07:52

Имеется введу, как у Гугла - Возможно Вы имели введу? Над этим надо подумать, как такое реализовать...
Возможно тут придется сравнивать введенное слово со словами в БД.
Пока что, могу предложить исправление раскладки клавиатуры, с английского на русский, и наоборот... Это для тех, кто забывает перевести клавиатуру на нужный язык. Но тут все ровно нужен механизм, который используют поисковые системы Рунета, так как во многих случаях может получится каша...
Аватара пользователя
Slash
Эксперт
 
Сооб­щения: 488

Сообщение Administrator » более года назад 16 дек 2015, 09:04

Да, как у Гугла и Яндекса. Яндекс автоматически исправляет опечатки и предлагает возможность искать по неисправленному запросу. Если получится решить проблему с опечатками, следующий шаг: учет синонимов и различных форм слова, например, слова с различными окончаниями.
Slash писал(а):Пока что, могу предложить исправление раскладки клавиатуры, с английского на русский, и наоборот... Это для тех, кто забывает перевести клавиатуру на нужный язык. Но тут все ровно нужен механизм, который используют поисковые системы Рунета, так как во многих случаях может получится каша...

Да, тоже сложный момент. Можно добавить проверку по своей базе данных. Например, если человек перепутал раскладку и вместо "sd карта" ввел "ыв карта", то можно сравнивать этот текст со своей базой данной и проверять есть ли в ней совпадения с учетом различных раскладок клавиатуры.

Самое сложное сделать поиск не просто по синонимам, а по смыслу введенной фразы. Если удастся решить эти самые сложные вопросы, то может получиться очень хороший скрипт - даже лучше любого стандартного.
Аватара пользователя
Administrator
Администратор
 
Сооб­щения: 8672
Откуда: Россия

Сообщение Slash » более года назад 16 дек 2015, 11:31

Вот нашел такое решение: ufi точка su/11 (Применение алгоритмов нечеткого поиска в PHP).
По словам автора:
Вдохновленный топиками о нечетком поиске и фонетических алгоритмах, захотел попытаться реализовать нечто подобное похожее на гугловское «Возможно, вы имели в виду: ...» средствами PHP.

Результат:
халадильнег -> холодильник
аффтамабэль -> автомобиль
матоцыгл -> мотоцикл
вэласэпэд -> велосипед
аформеть -> оформить
шына -> шина
превет -> привет
Но: пгевед -> перед

Код не проверял, но судя по комментариям он вполне рабочий.
Аватара пользователя
Slash
Эксперт
 
Сооб­щения: 488

Сообщение Administrator » более года назад 16 дек 2015, 11:35

Да, похоже это то что надо.
Аватара пользователя
Administrator
Администратор
 
Сооб­щения: 8672
Откуда: Россия

Сообщение dann ball » 14 июл 2018, 17:36

а мне выдает это(((

Предупреждение : mysqli_connect (): (HY000 / 1045): доступ запрещен для пользователя '' @ 'localhost' (с использованием пароля: НЕТ) в search.php on строка 2

Предупреждение : mysqli_error () ожидает, что параметр 1 будет mysqli, boolean задан в search.php в строке 5 Ошибка MySQL:

подскожите как мне быть?
dann ball
Новичок
 
Сооб­щения: 1

Сообщение Slash » 17 июл 2018, 06:52

dann ball писал(а):Предупреждение : mysqli_connect (): (HY000 / 1045): доступ запрещен для пользователя '' @ 'localhost' (с использованием пароля: НЕТ) в search.php on строка 2

Возможно ошибаюсь, но мне так кажется, что вы не назначили переменные для доступа к Базе Данных.
Аватара пользователя
Slash
Эксперт
 
Сооб­щения: 488

Сообщение Administrator » 17 июл 2018, 07:28

Предположу, как назначить переменные для доступа к Базе Данных.
Допустим:
хост базы данных такой же как у сайта;
имя пользователя базы данных задано как internetschopuserbd;
пароль к базе данных - internetschoppas;
имя базы данных - internetschopname.
Эти данные можно посмотреть в панели администратора сайта.

Тогда, чтобы назначить переменные, нужно перед строкой:
Код: Выделить всё
$connect = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname); // Подключаемся к БД. Переменным должно быть назначены параметры доступа БД

добавить такой код:
Код: Выделить всё
$dbhost = 'localhost';
$dbuser = 'internetschopuserbd';
$dbpasswd = 'internetschoppasbd';
$dbname = 'internetschopnamebd';
Аватара пользователя
Administrator
Администратор
 
Сооб­щения: 8672
Откуда: Россия

Сообщение Slash » 18 июл 2018, 04:52

Если вы делаете поиск для уже готового сайта, то движок уже должен иметь свой файл/класс подключения к БД и работы с ней. Вам достаточно подключить тот самый файл (и создать объект (если движок на классах) (не для автозагрузчика)). Например так (очень грубый пример):
Код: Выделить всё
<?php
include('db.php');
// По требаванию движка, может потребоваться подключить что то еще

$db = new db();

$word = (isset($_GET['word'])) ? $_GET['word'] : null// Или просто: $reqvest->get('word'); в зависимостити от движка
$word $db->real_escape_string($connecttrim($word)); // Экранируем символы и убираем пробелы

// Опять же, смотря что за движок
// Возможно, половина кода ниже будет лишней
if(empty($word)) // Проверяем ведено ли слово
{
    echo 
'Не ведено слова.'// Если слово не введено, выводим сообщение ошибки
}
else if (
iconv_strlen($word'utf-8') < 3// Проверяем длину слова (мин 3 символа)
{
    echo 
'Слово не может быть менее трех символов.'// Если слово менее трех символов
}
else if (
iconv_strlen($word'utf-8') > 20// Проверяем длину слова (макс 20 символов)
{
    echo 
'Слово не может быть более двадцати символов.'// Если слово более двадцати символов
}
else 
// Если в ходе проверок ни каких ошибок не выявлено, двигаемся дальше
{
    
$sql 'SELECT * 
        FROM article
        WHERE article_text 
        LIKE "%' 
$word '%"'// Составляем запрос
    
$query $db->query($connect$sql); // Выполняем запрос
    
if (!$query// Проверяем запрос
    
{
        echo 
'Ошибка базы данных.'// Если возникли проблемы при выполнения запроса
    
}
    else 
// Все замечательно! Двигаемся дальше
    
{
        while (
$row $db->fetch_assoc($query)) // Составляем массив
        
{
            echo 
$row['article_title'] . '<br />'// Выводим список заголовков статей, в которых было найдено веденное слово
        
}
    }            

В моем коде, коммент не закомментирован, вместо:
Код: Выделить всё
$word = (isset($_GET['word'])) ? $_GET['word'] : null; Забиваем переменную $word

Должно быть:
Код: Выделить всё
$word = (isset($_GET['word'])) ? $_GET['word'] : null; // Забиваем переменную $word  
Аватара пользователя
Slash
Эксперт
 
Сооб­щения: 488

на главнуюна главную



Вверх Вниз