phpMyAdmin
Что ж, прежде всего, мы отчетливо понимаем — нам нужны пруфы ссылки. Иначе толку от такого поиска, который не формирует ссылки на то, что мы ищем? Поскольку есть сайт, который я прямо в настоящее время разрабатываю — показывать буду на нём, т.с. в режиме "реального времени".
Итак, открываем любую статью и смотрим на ссылку в адресной строке.
Я бы разделил её так: хост + "news" + "цыферки".
Я уже знаю, что данная cms не хранит ссылки целиком, так что открываем phpMyAdmin в панели управления нашего хостинга и идём искать (естественно, на вкладке "поиск"):
Просмотрев результаты, понимаем, что их не так уж и много, к тому же, после осмотра становится понятно, что пациент скорее мертв нас интересует табличка "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>");
}
?>
Форму и как делать страницу я полностью не буду расписывать — это можно подсмотреть в соответствующей статье.
Настало время проверить как оно работает:
И понимаем, что обосрались что-то тут не так:
Чешем яйца репу и думаем, что же тут не так... Что ж... У нас 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>");
}
?>
Проверяем тем же запросом на поиск:
Жамкаем на ссылку:
Что ж, ссылка через 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>"." ".$row0[1].$row[2]."<br />"."</srch>"); //выводим строки через print
}
}
}
else
{
print("<srch>".'Задан пустой поисковый запрос'."</srch>");
}
?>
А вот результат:












