0 / 0 / 0
Регистрация: 22.12.2018
Сообщений: 1
1
MySQL

Работает поисковик, но не так как нужно. В этом деле начинающий, очень тяжело разобраться. Буду благодарен всем

22.12.2018, 20:08. Показов 1178. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такая, проблема: вроде написал поисковик, присоединил базу, ищет по параметрам, но выводит не так как мне нужно. Пример что не так: при поиске 20 например он сделает вывод всех столбиков в принципе ( т.к вывод настроен на вывод всех столбиков ) где есть составляющая 20, например из 8 столбиков во втором столбике "год" есть 2018, вот он выведет все записи 2018, и даже 2017 и т.д, понятное дело. А мен нужно полное совпадение, причем как-то чтобы запрос принимал 2 слова в поиске как разные и мог искать их по разным столбикам и выводил когда оба столбика (их поля) включают в себя например 2018 (в столбике год) и Петров (в столбике автор) т.е вывел все записи из восьми столбиков базы где в годе задан 2018, а в авторе Петров, а не вывел например все работы где есть Петров и в добавок работы других людей 2018 года (сейчас понятное дело так и работает). Нужно 2018+Петров. P.s: возможно код не очень удобен к просмотру, писал много раз, и вот рабочий вариант, но не очень структурированный сейчас есть.
Код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
$connection = mysqli_connect("localhost","admin","951753");
if (!$connection) {
    die("Database connection failed: " . mysqli_connect_error());
} // присоединяемся к базе и проверяем подключение
// Далее выбираем какую базу использовать (самое первое)
$db_select = mysqli_select_db($connection, "literatura");
if (!$db_select) {
    die("Database selection failed: " . mysqli_error($connection));
}
    ?>
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
    <?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]))
        $query_search= '`god` LIKE "%'.$value.'%" OR `tip` LIKE IN "%'.$value.'%" OR `aftor` LIKE IN "%'.$value.'%" OR `soaftor` LIKE IN "%'.$value.'%" OR `podrazdelenie` LIKE IN "%'.$value.'%" OR `indexs` LIKE IN "%'.$value.'%" OR `nazvanie` LIKE IN "%'.$value.'%"';  
 
        }; // ЗАДАЁМ В КАКИХ СТОЛБЦАХ ищем совпадения через OR, думаю тут и надо как-то поменять и задать значения полного вхождения ввода
 
        $query = "SELECT * FROM sbornik WHERE $query_search"; // выбираем в какой базе искать, внутри датабазы david -> baza -> там уже наша таблица
        $mysqli = new mysqli("localhost", "admin", "951753", "literatura"); // данные подключения
        $result_set = $mysqli->query($query);
        $mysqli->close(); 
 
        $i = 0;
        while ($row = $result_set) {
            $results[$i] = $row;
            $i++;
        }
        return $results;
    }
if (isset($_POST['bsearch'])) {
    $words = $_POST['words'];
    $results = search ($words);
}
 
 
    ?>


HTML5
1
2
3
4
5
6
7
8
9
10
<h1>Детальный поиск по базе</h1>
    <form action="?p=poisk" method="POST" name="search">
        <input type="text" name="words" placeholder="Задайте год"  class="input-medium focused">
        <input type="text" name="words" placeholder="Укажите автора" class="input-medium focused">
        <input type="text" name="words" placeholder="Соавторы" class="input-medium focused">
            <hr>
        <input class="feedback btn btn-block btn-large btn-success" type="submit" name="bsearch" value="Искать">
 
 
    </form>
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
<?php
 
        if (isset($_POST['bsearch'])) { //код вывода с условиями
            echo "<h1>Результаты поиска:</h1>";
                if ($results === false) echo "Задан пустой запрос";
                if (count($results) === 0) echo "Ничего не найдено";
                else{
 
                    echo "<table>
                    <tbody>
 
                    <table border = 1>
                    <tr>
                    <td>Год издания</td>
                    <td>Тип работы</td>
                    <td>Автор работы</td>
                    <td>Соавторы работы</td>
                    <td>Подразделение</td>
                    <td>Название работы</td>
                    <td>Ссылка на работу</td>
                    </tr>";
 
        for ($i = 0; $i < count ($results); $i++)
                    echo "<tr>\n<td>".$results [$i]["god"]."</td>"."\n".
                    "<td>"."".$results [$i]["tip"]."</td>"."\n".
                    "<td>"."".$results [$i]["aftor"]."</td>"."\n".
                    "<td>"."".$results [$i]["soaftor"]."</td>"."\n".
                    "<td>"."".$results [$i]["podrazdelenie"]."</td>"."\n".
                    "<td>"."".$results [$i]["nazvanie"]."</td>"."\n".
                    "<td>"."<a target=_blank href=".$results[$i]["ssilka"].">"."<p>".$results[$i]["ssilka"]."</p>"."</a>"."</td>"."\n".
                    "</tr>"."\n";} // выбираем с каких столбцов выводим совпадения в соответствии с таблицей 
    }
 
 
        ?>
</table>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2018, 20:08
Ответы с готовыми решениями:

Ребзя, спасите, меня отчисляют, нужно капец(! Всем неравнодушным буду очень благодарен. не хочу в армейку(
З лабы, спасайте( 1. Лабораторная работа: Задача: Объявить класс и в нем реализовать следующие...

В целом понимаю как работает код, но в коде ориентироваться тяжело, если кто-то напишет комментарии буду благодарен)
Помогите пожалуйста разобраться с кодом, в целом понимаю как работает код, но в коде...

Код програмы поможите очень нужно, буду благодарен очень: y=cos(x)+1
Функиция: y=cos(x)+1 Промежуток Шаг 0,5

Нужно пройти тесты, буду очень благодарен!
Тесты по программированию с++ П.5.18.Правил Запрещено размещать задания и решения в виде...

6
767 / 323 / 157
Регистрация: 26.05.2016
Сообщений: 2,127
22.12.2018, 20:35 2
Можно еще раз и покороче
Как сейчас выводит
И как хочется просто на примере

Если не трудно
0
0 / 0 / 0
Регистрация: 22.12.2018
Сообщений: 1
22.12.2018, 21:22 3
Почему-то не могу зайти на созданный аккаунт Не приходит уведомление о подтверждении.
В общем по теме, сейчас выглядит так - https://pp.userapi.com/c849320... fL7PcM.jpg
Вот например я введу "2017 Юхн" мне выдает таблицу где присутствует "2018 Юхн" ; "2015 Юхн" и так далее. А мне нужно чтобы четко задал 2018 Юхн и вывело только тогда когда и то и другое в разных столбцах присутствует, а не по отдельности, вот примерно такая поисковая система нужна. Большое спасибо.
0
767 / 323 / 157
Регистрация: 26.05.2016
Сообщений: 2,127
22.12.2018, 22:10 4
Не могу зайти на созданный
В спаме посмотрите

Так, приблизительно понял

Ну, если хотим чтобы по два полю находило, то ставим and в условии, а не or: искать 'первое поле' And 'второе поле'

)чтобы находило как вы хотите, нужно настроить правильный шаблон в like
LIKE '^вася$'
Найдёт совпадение только васи васЯк или швася уже не найдётся

Добавлено через 2 минуты
Насчёт like in


Добавлено через 1 минуту
Я не пользуюсь, но люди советуют regexp или просто ставить or

Добавлено через 24 секунды
Like in возможно вы неправильно применяйте

Добавлено через 1 минуту
В mysql оно не используется насколько я понял
0
0 / 0 / 0
Регистрация: 22.12.2018
Сообщений: 1
22.12.2018, 22:18 5
like in я ошибочно написал, в коде просто like использую. На счёт использования and , с ним у меня тогда ищет чтобы в каждом столбика было 2018 например, если пишу фразу 2018 Юхн, то мне ничего не найдёт, т.к в поле именно этого нет, он сравнивает все поля соответственно и т.к у меня они все через and идут, то во всех должна быть эта фраза (слово). т.е он может вывести по запросу 2018 только тогда когда во всех столбиках в базе забито 2018. И вообще любые другие попытки изменить поиск приводят к этой ошибке - Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean in . Если функцию удалить ошибки нет, но поиск не работает, просто ничего не ищет. Я в php пару дней, до этого тоже слабо знал языки по большей части, поэтому не знаю что делать и как это пофиксить. При добавлении любого символа например $query_search = '+god* LIKE "%'.$value.'%" OR +tip* LIKE "%'.$value.'%" OR и т.д, выдаёт ошибку как я выше писал. Также я пробовал поменять мой рабочий поиск (но не то что мне нужно) на который нужен с помощью SELECT * FROM тататат WHERE - но выдаёт всё ту же выше указанную ошибку и я даже не могу знать может правильный вариант у меня хоть раз да получился, но из-за ошибки не могу проверить, На сто процентов код свой же понять не могу, т.к просто понял что для работы что-то нужно оставить, но не уверен конкретно что делает та или иная команда например, такие пробелы есть, поэтому и ищу помощи.

P.s: Если что может этот исправить на мне нужный или же написать под данные к моей базе и её данным (названия столбиков имею ввиду) отблагодарю.
0
767 / 323 / 157
Регистрация: 26.05.2016
Сообщений: 2,127
23.12.2018, 08:07 6
Смотрите, сами подумайте
LIKE можно строить, как вы сделали %___% или использовать регулярное выражение, как я вам показал с васей, в инете посмотрите примеры шаблонов в регулярках и составьте нужный себе, там не тяжело

2)у вас форма разве правильно составлена? В name='words', если нужен массив, то ставим 'words[]'
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 1
23.12.2018, 13:36 7
Цитата Сообщение от andyyy Посмотреть сообщение
2)у вас форма разве правильно составлена? В name='words', если нужен массив, то ставим 'words[]'
Возможно, неверно, но когда я пытаюсь изменить на массив, делаю как вы написали, то у меня выдаёт ошибку:

Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean in F:\web\OSPanel\domains\test\poisk.php:36 Stack trace: #0 F:\web\OSPanel\domains\test\poisk.php(44): search('2018') #1 F:\web\OSPanel\domains\test\index.php(48): include('F:\\web\\OSPanel\\...') #2 {main} thrown in F:\web\OSPanel\domains\test\poisk.php on line 36

Как я понимаю всё упирается в эту часть кода:
PHP
1
2
3
4
5
6
7
8
9
10
11
$i = 0;
    while ($row = $result_set->fetch_assoc()) {
            $results[$i] = $row;
            $i++;
        }
        return $results;
    }
if (isset($_POST['bsearch'])) {
    $words = $_POST['words'];
    $results = search ($words);
}
0
23.12.2018, 13:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2018, 13:36
Помогаю со студенческими работами здесь

Нужно ускорить код. Буду очень благодарен
Условие задачи: Вводиться число n, затем вводятся n чисел. Нужно с последней введенной цифры до...

Ребят, нужно реализовать задачи в maple! Буду очень благодарен!
Зад 1. Менеджмент компании принял решение о постоянном рекламировании нового продукта в течение...

Нужно переделать проекты через указатели.Буду очень благодарен)
Переделать всё через указатели. №1 Удалить элементы кратные 7. Добавить после каждого нечетного...

Опишите эту программу.Очень надо. Я её уже немного описал,мне нужно в мельчайших подробностях.Буду благодарен
namespace ConsoleApp4 { struct Student { public string firstName; public string gender; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru