phpMyAdmin
phpMyAdmin

phpMyAdmin

11 октября 2022       89 просмотров

Что ж, прежде всего, мы отчетливо понимаем — нам нужны пруфы ссылки. Иначе толку от такого поиска, который не формирует ссылки на то, что мы ищем? Поскольку есть сайт, который я прямо в настоящее время разрабатываю — показывать буду на нём, т.с. в режиме "реального времени".

Итак, открываем любую статью и смотрим на ссылку в адресной строке.

картинко

Я бы разделил её так: хост + "news" + "цыферки".
Я уже знаю, что данная cms не хранит ссылки целиком, так что открываем phpMyAdmin в панели управления нашего хостинга и идём искать (естественно, на вкладке "поиск"):

ищем news

Просмотрев результаты, понимаем, что их не так уж и много, к тому же, после осмотра становится понятно, что пациент скорее мертв нас интересует табличка "structures":

structures

Искомое успешно находится в поле "path".

Теперь чуть сложнее, ищем Валдо цыферки, эти поиски занимают чуть больше времени, но очевидно, что искомое — это "id" из таблички "informationsystem_items", о чём явно свидетельствуют жертвы ограбления поля записи в которых имеется и текст заголовка новости, и лид, и полный текст, что собственно нас так же интересует:

нашли!

Просмотрев поля табличек "structures" и "informationsystem_ittems" понимаем, что как-то нет у них особо промеж собой связей. Что ж, well shit идем во вкладку "дизайнер" и проверяем связи указанных выше таблиц с таблицей "informationsystems", ведь поле "informationsystem_id" нам явно попадалось в "informationsystem_items". И, да, "informationsystems" уже таки связаны с "structures":

как-то так

Осталось проверить, зайти в новости, скопировать целиком какой-нибудь заголовок и написать сложный (вложенный) запрос, чтобы проверить связи. И, да, оно работает:

проверка

Следом проверим "id" из таблички "informationsystem_items":

оно живое!

Что ж, вроде всё что нужно для формирования ссылки в поисковой выдаче у нас есть, осталось только прихуярить монитор набросать код:

<?php    //начальный вариант
$query = $_POST['query'];
$link = mysqli_connect("localhost", "username", "password", "dbname"); //серьёзно, вы думали тут будет пароль?
$sql = "SELECT name, description FROM informationsystem_items WHERE name LIKE '%$query%' OR description LIKE '%$query%' OR text LIKE '%$query%'"; //запрос на поиск
$query = trim($query); //этими строками
$query = mysqli_real_escape_string($link,$query); //убираем символы
$query = htmlspecialchars($query); //которые могут навредить
if ($link == false){
    print("<srch>"."Ошибка: Невозможно подключиться к MySQL " . mysqli_connect_error()."</srch>"); //всё пропало, шеф (если серьезно mysqli_connect_error() скажет где конкретно мы накосячили)
}
else {
    $result = mysqli_query($link, $sql); //про параметры не забываем
    }
    if ($result == false) {
        print("<srch>"."Произошла ошибка при выполнении запроса"."</srch>"); //ну, мало ли...
    }
    else
    if (!empty($query))
    {
        if (strlen($query) < 3) //меньше трех символов — уже не ищем
        {
            print("<srch>".'Слишком короткий поисковый запрос'."</srch>");
        }
        else if (strlen($query) > 60) //больше 60 — то же самое
        {
            print("<srch>".'Слишком длинный поисковый запрос'."</srch>");
        }
        else if (mysqli_affected_rows($link) == 0) //если ничего не нашли
        {
            print("<srch>".'По вашему запросу ничего не найдено'."</srch>");
        }
        else
        {
            while ($row = mysqli_fetch_row($result)){ //пока читаем
            $sqlink0 = "SELECT path FROM structures WHERE id = (SELECT structure_id FROM informationsystems WHERE id = (SELECT informationsystem_id FROM informationsystem_items WHERE name LIKE '$row[0]'))"; //пробуем через сложный запрос вытащить первую часть ссылки после хоста
            $qlink0 = mysqli_query($link, $sqlink0); //не забываем про параметры
            $row0 = mysqli_fetch_row($qlink0); //и читаем
            $sqlink1 = "SELECT id FROM informationsystem_items WHERE name LIKE '$row[0]'"; //оставшаяся часть — цыферки
            $qlink1 = mysqli_query($link, $sqlink1); //делаем
            $row1 = mysqli_fetch_row($qlink1); //то же самое
            print("<srch>"."<a href=../$row0[0]/$row1[0]>"."<u>".$row[0]."</u>"."</a>".$row[1]."<br />"."</srch>"); //выводим строки через print
        }
        }
    }
    else
    {
        print("<srch>".'Задан пустой поисковый запрос'."</srch>");
    }
?>

Форму и как делать страницу я полностью не буду расписывать — это можно подсмотреть в соответствующей статье.

Настало время проверить как оно работает:

пробуем искать

И понимаем, что обосрались что-то тут не так:

fail

Чешем яйца репу и думаем, что же тут не так... Что ж... У нас 2 идентичных новости в разных разделах (информационных системах), а насколько я помню — вложенный запрос не возвращает 2 результата. Проверяем:

мои факап

Что ж, так оно и есть, сам мускуль говорит, что вложенный запрос возвращает более одного результата.
Тут стоит сделать шаг в сторону и сказать, что мол, я бы мог сразу нормально написать статью, не указывая на ошибку. Мог бы. Но подумал, что такое вот отступление будет полезным, наткнулись на ошибку — проверьте не убежало ли молоко как там вообще MySQL отрабатывает.

Что ж, раз результатов по запросу $sqlink0 может быть более одного, не будем долго страдать и лить слёзы — заебеним ещё один цикл:

<?php    //слегка порукожопили
$query = $_POST['query']; //забираем значение поля
$link = mysqli_connect("localhost", "username", "password", "dbname"); //серьёзно, вы думали тут будет пароль?
$sql = "SELECT name, description FROM informationsystem_items WHERE name LIKE '%$query%' OR description LIKE '%$query%' OR text LIKE '%$query%'"; //ищем заголовок, лид или текст
$query = trim($query); //убираем хитрые
$query = mysqli_real_escape_string($link,$query); //могущие навредить
$query = htmlspecialchars($query); //специальные символы
if ($link == false){
    print("<srch>"."Ошибка: Невозможно подключиться к MySQL " . mysqli_connect_error()."</srch>"); //всё пропало, шеф (если серьезно mysqli_connect_error() скажет где конкретно мы накосячили)
}
else {
    $result = mysqli_query($link, $sql); //про параметры не забываем
    }
    if ($result == false) {
        print("<srch>"."Произошла ошибка при выполнении запроса"."</srch>"); //ну, мало ли...
    }
    else
    if (!empty($query))
    {
        if (strlen($query) < 3) //слово из трёх букв мы всё же при желании найти хотим
        {
            print("<srch>".'Слишком короткий поисковый запрос'."</srch>");
        }
        else if (strlen($query) > 60) //а длинные конструкции нам ни к чему
        {
            print("<srch>".'Слишком длинный поисковый запрос'."</srch>");
        }
        else if (mysqli_affected_rows($link) == 0) //ну, вдруг ничего не найдём
        {
            print("<srch>".'По вашему запросу ничего не найдено'."</srch>");
        }
        else
        {
            while ($row = mysqli_fetch_row($result)){ //пока читаем
            $snlink = "SELECT informationsystem_id FROM informationsystem_items WHERE name LIKE '$row[0]'"; //берем id информационной системы
            $nlink = mysqli_query($link, $snlink); //параметры!
            while ($nrow = mysqli_fetch_row($nlink)){ //второй цикл пошёл!
            $sqlink0 = "SELECT path FROM structures WHERE id = (SELECT structure_id FROM informationsystems WHERE id LIKE '$nrow[0]')"; //вот сейчас норм
            $qlink0 = mysqli_query($link, $sqlink0); //по очереди
            $row0 = mysqli_fetch_row($qlink0); //же берем
            $sqlink1 = "SELECT id FROM informationsystem_items WHERE name LIKE '$row[0]'"; //забираем
            $qlink1 = mysqli_query($link, $sqlink1); //цыферки
            $row1 = mysqli_fetch_row($qlink1); //для ссылки
            print("<srch>"."<a href=../$row0[0]/$row1[0] target='_blank'>"."<u>".$row[0]."</u>"."</a>".$row[1]."<br />"."</srch>"); //выводим строки через print
			}
        }
        }
    }
    else
    {
        print("<srch>".'Задан пустой поисковый запрос'."</srch>");
    }
?>

Проверяем тем же запросом на поиск:

проверка 2

Жамкаем на ссылку:

результат

Что ж, ссылка через print формируется, открывается. Вы конечно же, в очередной раз, заметите, что я ленивая жопа вывожу повторяющиеся ссылки. Да, так и есть, я не дописал формирование string и проверку на повторение, но это не является целью этой статьи. Я вообще в рамках неё просто хотел показать как ориентироваться в безвоздушном пространстве в phpMyAdmin, табличках и полях, а статья и так затянулась.

UPD В течение рабочего для вспомнил, что id для всех элементов различных информационных систем — уникальные и упростил код, одновременно поправив его и немного улучшив:

<?php    //работающий вариант
$query = $_POST['query']; //забираем значение из формы поиска
$link = mysqli_connect("localhost", "username", "password", "dbname"); //серьёзно, вы думали тут будет пароль?
$sql = "SELECT id, name, description FROM informationsystem_items WHERE name LIKE '%$query%' OR description LIKE '%$query%' OR text LIKE '%$query%'"; //добавили id, и этим одновременно всё упростили
$query = trim($query); //защита
$query = mysqli_real_escape_string($link,$query); //от
$query = htmlspecialchars($query); //хитрожопых
if ($link == false){
    print("<srch>"."Ошибка: Невозможно подключиться к MySQL " . mysqli_connect_error()."</srch>"); //всё пропало, шеф (если серьезно mysqli_connect_error() скажет где конкретно мы накосячили)
}
else {
    $result = mysqli_query($link, $sql); //про параметры не забываем
    }
    if ($result == false) {
        print("<srch>"."Произошла ошибка при выполнении запроса"."</srch>"); //ну, мало ли...
    }
    else
    if (!empty($query))
    {
        if (strlen($query) < 3) //обрезаем короткие запросы
        {
            print("<srch>".'Слишком короткий поисковый запрос'."</srch>");
        }
        else if (strlen($query) > 60) //и слишком длинные
        {
            print("<srch>".'Слишком длинный поисковый запрос'."</srch>");
        }
        else if (mysqli_affected_rows($link) == 0) //и пустые
        {
            print("<srch>".'По вашему запросу ничего не найдено'."</srch>");
        }
        else
        {
            while ($row = mysqli_fetch_row($result)){
            $sqlink0 = "SELECT path, name FROM structures WHERE id = (SELECT structure_id FROM informationsystems WHERE id = (SELECT informationsystem_id FROM informationsystem_items WHERE id LIKE '$row[0]'))"; //возвращаем сложный запрос, но он тут всего 1
            $qlink0 = mysqli_query($link, $sqlink0); //забираем path и имя ИС
            $row0 = mysqli_fetch_row($qlink0); //для ссылки
            print("<srch>"."<a href=../$row0[0]/$row[0] target='_blank'>"."<u>".$row[1]."</u>"."</a>"."&nbsp;&nbsp;&nbsp;&nbsp;".$row0[1].$row[2]."<br />"."</srch>"); //выводим строки через print
			}
        }
    }
    else
    {
        print("<srch>".'Задан пустой поисковый запрос'."</srch>");
    }
?>

А вот результат:

пожалуй на этом пока остановлюсь