[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Определение id по url
maximka787
Парни здарова. У меня уже реализован механизм поиска id страницы по url, но всё же хочу найти наверно более простой способ, тк мой по-моему для нагрузки сложноват.

Есть таблица "страницы" id | pid | url | name | ...
Вложенность страниц любая.

К примеру, получаем полный URL site.ru/auto/audi/q5/

Как делаю это я.

1. Разбираю URL на части и нахожу последний элемент "q5" (explode(), end())

2. Делаю запрос в БД на наличие записи
SELECT * FROM `pages` WHERE `url` = 'q5'


3. Тк у нас может быть несколько запсей с 'q5' (вложенность-то разная) то создаю полный путь для ЭТИХ найденных строк. (Через рукурсию с использованием id, pid)
К примеру получили массив
1) auto/audi/q5/
2) news/q5/
3) auto/dillers/q5/

4. Сравниваю полный URL со значениями по пункту 3.


Может как-то легче можно всё сделать или всё верно? Я не могу найти в инете, как такое реализуют, тк не пойму как это НАЗВАТЬ. Хранить ПОЛНЫЙ URL в БД не уверен, что правильно. Учитывая, что уже на сайте 15.000 записей. Нужно бы что-то универсальное.

_____________
..Работает - не трогай!
Arh
SELECT * FROM `auto` WHERE `марка` = 'audi' AND `модель` = 'q5'

Или у тебя одна таблица для всех записей и ссылки ты придумываешь как хочешь? В таком случае храни полный адрес ссылки.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
maximka787
Arh
Не. Таблица одна. Это могут быть как и машины, так и страницы текстовые, так и всё, что угодно.

Возьми свою ОС. В ней папки тоже вложены друг в друга. Вопрос именно про то, как работает индекс. Как хранит данные по папке. Не думаю, что каждая папка хранит полный путь в таблице. Если переименовывать какую-то промежуточную папку то тут должна работать транзакция иначе при обрыве операции всё рухнет. Поэтому не уверен, что это логично хранение полных путей.

_____________
..Работает - не трогай!
Arh
Прикольное решение, всё в одной таблице =)
А почему не разбить на несколько таблиц?

Можно конечно сделать таблицу папок, где будет название папки и название родительской папки.
Например есть q5, у неё родитель news и есть q5 с родителем audi, а у audi родитель auto. только не знаю что это даст =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Razzwan
Цитата (maximka787 @ 13.10.2015 - 11:38)
Парни здарова. У меня уже реализован механизм поиска id страницы по url

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

_____________
Youtube канал WebDeveloper->Run()
Сайт для души
Gitter
Michael
со схемкой явно что то не то.
Особенно интересный пункт 3.

Сперва надо смотреть ты эти действия выполняешь для разбора текущего урла сайта? Почему думаешь что хранение полного пути будет тут проблемой? Или это станет для тебя "проблемой" если у тебя есть необходимость в создании ссылок по номеру страницы?

_____________
There never was a struggle in the soul of a good man that was not hard
maximka787
Я наверно не так выразился. Представьте на вас легла задача создать таблицу в БД для хранения имен директорий. Все просто. Есть папки, внутри подпапки. Зря я про машины начал smile.gif Пусть лучше будут папки (директории)

windows/
windows/system32/
program-files/
program-files/WinRAR/
program-files/WinRAR/help/

Следовательно хранить имена как лучше? (пока вопрос лишь в хранении)
Я думаю так лучше:

`id`, `pid`, `url`

Цитата
1 | 0 | windows
2 | 1 | system32
3 | 0 | program-files
4 | 3 | WinRAR
5 | 4 | help


Разве у меня тут проблемы могут быть с нормализацией? Уж тут то НЕУЖЕЛИ они могут быть?

_____________
..Работает - не трогай!
maximka787
Сразу зайду дальше, если предложенная схема вполне приемлема для хранения списка URL-ов.

Как наиболее быстро найти id директории если исходный полный путь = 'program-files/WinRAR/help/'

_____________
..Работает - не трогай!
Arh
Читал давно как то про left и right поля в таблице, для построения деревьев.

А если просто по pid определять, тут наверное придётся запросы городить.


$url = '/auto/audi/q5';
$url = array_diff(explode('/',$url),['']);

$sql[] = "SELECT f0.`id`,f0.`name` FROM `folders` as f0";
foreach ($url as $key => $folder) {

if($key == 1) {

$sql[] = "LEFT JOIN `folders` as f" . ($key) . " ON f" . ($key) . ".`name` = '" . $folder . "'";

} else {

$sql[] = "LEFT JOIN `folders` as f" . ($key) . " ON f" . ($key) . ".`name` = '" . $folder . "' AND f" . ($key) . ".`parent` = f" . ($key - 1) . ".`id`";
}

if ($key == count($url)-1) {

break;

}

}


$sql[] = "WHERE f0.`name` = '" . end($url) . "' AND f" . (key($url)-1) . ".`id` = f0.`parent`";

echo implode('<br>',$sql);


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.