Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
4 / 3 / 2
Регистрация: 03.09.2013
Сообщений: 141

Поиск по сайту

05.08.2019, 19:50. Показов 783. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Хочу поделиться своим решением поиска по сайту.
Исходил только из своей логики, мышления. Взял одну фичу, ссылка есть.
Дано: база данных с таблицами модулей типа
module_contact;
module_content_category;
module_content_pages
ну и так далее, главное "module_", чтобы обозначить активные таблицы, содержащие информацию для пользователей
Далее, каждая таблица должна обязательно содержать поле "title" (заголовок), чтобы выводить заголовки в результате поиска
Это обязательное правило
Я исходил из того, что текст может содержаться в полях типа "varchar", "text", "mediumtext" - тоже некое правило при создании таблиц, остальные поля (типа "datetime") при обработке выдадут ошибки.
Я не знаю, как будут называться столбцы, и как говорил выше - главное тип данных.
Поехали с запросом через форму POST:
одно поле поиска и выполнить
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<div class="container">
    <div class="row">
        <div class="col-sm-12 text-center padding-top font-weight-bold">
            <label for="searchField">Поиск</label>
        </div>
    </div>
    <div class="row">
       <div class="col-sm-12 text-center padding-top">
           <?= $errors ?>
           <form action="" method="post">
               <div class="form-group">
                   <input type="text" name="SearchData" class="form-control" id="searchField" aria-describedby="searchHelp" placeholder="Введите текст запроса" required>
                   <small id="searchHelp" class="form-text text-muted">Минимальная длина запроса: три символа</small>
               </div>
               <div class="padding-top padding-bottom">
                   <button type="submit" class="btn btn-primary">Найти</button>
               </div>
           </form>
       </div>
    </div>
    <?php
    if (isset($result)) {
        if (empty($result)) {
            ?>
            <div class="row">
                <div class="col-sm-12 alert alert-danger text-center">
                    Результатов по запросу не найдено
                </div>
            </div>
            <?php
        } else {
            ?>
            <div class="row">
                <div class="col-sm-12 alert alert-success text-center">
                    Найдено результатов: <?= $count; ?>
                </div>
                <div class="col-sm-12">
                    <?php foreach ($result as $value) { ?>
                        <p><a href="<?= $value['controller'] ?><?= $value['method'] ?><?= $value['id'] ?>" class=""><?= $value['title'] ?></a></p>
                    <?php } ?>
                </div>
            </div>
            <?php
        }
    }
    ?>
</div>
Идем в контроллер:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
if ($_POST) { 
// фильтруем/валидируем входящие данные, у кого как
if (валидация прошла успешно) {
                $fieldsArr = [];
                $endArr = [];
                $modules = $this->model->viewAllModules(); // return $this->queryFetch("SHOW TABLES LIKE 'module__%' ");
                foreach ($modules as $module) {
                    foreach ($module as $m) {
                        $tables = $this->model->showTables($m);
                        // SQL model "showTables"
                        // $varchar = "%varchar%";
                        // return $this->queryFetch("SHOW COLUMNS FROM `{$table}` WHERE type = ? OR type = ? OR type LIKE ?",['text','mediumtext',$varchar]);
                        $fieldsArr[$m] = $tables; // получаем массив имен столбцов [Field] и [Type] => text / [Type] => varchar(255)
                        // там есть и другие данные, пофиг
                    }
                }
// далее поехали по массиву $fieldsArr
                foreach ($fieldsArr as $item=>$value) {
                    foreach ($value as $v) {
                        // SQL model "selectResult"
                        // $str = "%$str%";
                        // return $this->queryFetch("SELECT `id`,`title` FROM {$table} WHERE `{$field}` LIKE ?",[$str]);
                        $res = $this->model->selectResult($item,$v['Field'],$field['SearchData']); // 
                        if (($res)) {
                            foreach ($res as $r) {
                                $arrMod = self::linkArr($item); // см. метод ниже
                                $result = array_merge($arrMod,$r);
                                $endArr[] = $result;
                            }
                        }
 
                    }
                }
                // возвращает массив всех найденных без повтора 'id', т.к. слово может быть и в заголовке и в тексте, поэтому без отрезания повторяющихся 'id' результат будет с перебором
                // $newArr и $count я и передаю в файл вида
                // результат $newArr см. ниже
                $newArr = self::unique_multidim_array($endArr,'id');
                // соотв-нно количество найденных 
                $count = count($newArr);
            }
}
 
}
linkArr возвращает предустановленные контроллер и метод:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private function linkArr($module) {
        $arr['module_actual_pages'] = [
            'controller' => '/Actual',
            'method' => '/page/',
        ];
        $arr['module_contact'] = [
            'controller' => '/Contact',
            'method' => '/viewUnit/',
        ];
        $arr['module_content_category'] = [
            'controller' => '/Content',
            'method' => '/categories/',
        ];
        $arr['module_content_pages'] = [
            'controller' => '/Content',
            'method' => '/page/',
        ];
        return ($arr[$module]) ;
    }
unique_multidim_array:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // https://php.net/manual/ru/function.array-unique.php#116302
    private function unique_multidim_array($array, $key) {
        $temp_array = array();
        $i = 0;
        $key_array = array();
 
        foreach($array as $val) {
            if (!in_array($val[$key], $key_array)) {
                $key_array[$i] = $val[$key];
                $temp_array[$i] = $val;
            }
            $i++;
        }
        return $temp_array;
    }
результат $newArr:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Array
(
    [0] => Array
        (
            [controller] => /Actual
            [method] => /page/
            [id] => 43
            [title] => Альтернативный текст
        )
 
    [1] => Array
        (
            [controller] => /Actual
            [method] => /page/
            [id] => 44
            [title] => Заголовок + Текст + Альтернативный текст
        )
 
    [2] => Array
        (
            [controller] => /Actual
            [method] => /page/
            [id] => 29
            [title] => Заголовок актуальной информации 3
        )
 
    [6] => Array
        (
            [controller] => /Content
            [method] => /page/
            [id] => 13
            [title] => Заголовок
        )
 
)
Вот я и получил все значения которые было нужно
Поверьте, голову хорошо поломал. Других вариантов, удовлетворяющих поставленной собой перед собой задачей - не нашел.
Я так и не смог привинтить контроллер-метод иным способом, а приписывать в БД напрямую в каждой таблице - тоже решил, что хуже вариант чем здесь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2019, 19:50
Ответы с готовыми решениями:

Поиск по сайту
Объясните пожалуйста как организовать поиск по сайту? Верхней по блок так как вся информация находится там. Интересуют разные варианты:...

Поиск по сайту
Делаю поиск по новостям. Форма: &lt;form method=&quot;post&quot; action=&quot;../Models/Search.php&quot;&gt; &lt;input type=&quot;search&quot; name=&quot;query&quot;...

Поиск по сайту
наверняка этот вопрос уже рассматривался, но что-то я не нашла такой темы.... Задача следующая. Есть сайт - пока не размещен на...

4
68 / 60 / 10
Регистрация: 07.03.2019
Сообщений: 657
06.08.2019, 13:33
Использование запросов внутри циклов это очень плохая идея, + во вложенном цикле, да это же кошмар.
Поиск на PHP это же ад.
В основном поиск делается асинхронно и ваш код можно было бы снизить ну примерно на 30 строчек точно.
1
4 / 3 / 2
Регистрация: 03.09.2013
Сообщений: 141
06.08.2019, 23:26  [ТС]
server_net, я с Вами согласен. Задача решена, принцип показан.
Это я еще улучшил ... что было до этого ...
Я тоже думал так: выводить в отдельные массивы, прорабатывать их, потом склеивать - но уже ни времени ни желания, еду пока дальше. Может потом вернусь.
Я и выложил рабочий вариант своей логики как раз для того, чтобы можно было что "допилить"
Просто весь результат поиска из того что мне нужен был - не был найден, везде цепляются за имена таблиц в SQL-запросах, а я как раз хотел этого избежать
Как иной раз говорят: "работает и ладно"
0
14 / 50 / 3
Регистрация: 26.12.2009
Сообщений: 406
10.08.2019, 20:11
Цитата Сообщение от server_net Посмотреть сообщение
В основном поиск делается асинхронно.
Асинхронно?
Да ладно.
0
68 / 60 / 10
Регистрация: 07.03.2019
Сообщений: 657
12.08.2019, 11:53
Цитата Сообщение от Madrid Посмотреть сообщение
Асинхронно?
Конечно, а ты на чем хотел?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2019, 11:53
Помогаю со студенческими работами здесь

Поиск по сайту
Всем привет. В общем имеется живой поиск по сайту с моментальной выдачей результата. Проблема заключается в том, что если ввести слово (...

поиск по сайту
Здравствуйте! имеется страничка index.php, в нее входят блоки sidebar.php, header.php, content (динамически изменяемый через GET), и...

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

Поиск по сайту
&lt;?php require_once 'config.php'; session_start(); if( isset($_POST) ){ $search = mysql_real_escape_string($_POST); ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru