[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Чтение и разбор URL вложенных папок
maximka787
Мужики, вопрос возник серьезный, посоветуйте, если знаете решение.

Есть таблица URL (id, parent_id, url)
1 | 0 | general
2 | 1 | about
3 | 1 | cars
4 | 1 | contacts
5 | 3 | mercedes
6 | 3 | ford
7 | 6 | foсus

В конечном виде это выглядит так:
/about/
/cars/
/cars/mercedes/
/cars/ford/
/cars/ford/foсus/
/contacts/

Как хранить данные, я разобрался.
Вопрос: Как их читать и проверять на существование? Хочу понять именно метод. В инете так ничего и не нашел, понять механизм одной выбранной CMS тоже оказалось сложно.

Цель:
ввести адрес /cars/mercedes/ получить 5
ввести адрес /car/mercedes/ получить 0, т.к. такой категории не существует. Это как в WIN XP, в проводнике, когда путь неверный, получаем ошибку.

Метод 1 (первое, пришло в голову)
URL разбиваем на массив, последний элемент массива ищем в таблице и поехали составлять полный путь в обратном направлении для всех найденных значений. В конце сравним полученные пути с $_SERVER['REQUEST_URI'] и получим id страницы, если таков есть.

Метод 2
Хранить полные адреса (от корня сайта) в базе, но тогда возникнет много вопросов с переименованием папок.

Больше ничего в голову не пришло, но думаю, это не самые лучшие решения.

_____________
..Работает - не трогай!
vagrand
maximka787

ИМХО легче второй метод. Переименование не такая уж и частая операция, а вот выборка частая.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
maximka787
vagrand
До вчерашнего момента так и было. Но сейчас клиент наполнил инет магазин товарами, там больше 200 товаров. А потом взял и переименовал категорию каталог "catalog". соответственно путь к товарам идет через не существующую категорию. Поисковик в шоке будет)) А процедуру массового переименования сделать тоже не так просто.

_____________
..Работает - не трогай!
Xpund
Цитата (maximka787 @ 6.02.2014 - 07:24)
vagrand
До вчерашнего момента так и было. Но сейчас клиент наполнил инет магазин товарами, там больше 200 товаров. А потом взял и переименовал категорию каталог "catalog". соответственно путь к товарам идет через не существующую категорию. Поисковик в шоке будет)) А процедуру массового переименования сделать тоже не так просто.

Лучше каждую категорию в отдельной строке хранить.
А потом юзать expend( "/", $url);
и foreach на проверку!
В таком случае без проблем изменять можно будет!

_____________
минус, конечно, иногда полезен, но плюс мне нравиться больше :)
Женский журнал - Жена сказала раскрутить сайт любой ценой (Sorry)
killer8080
Цитата (maximka787 @ 6.02.2014 - 09:24)
Поисковик в шоке будет))

Поисковик нужно информировать о смене адреса 301-м редиректом

Xpund
Цитата (killer8080 @ 6.02.2014 - 07:57)
Цитата (maximka787 @ 6.02.2014 - 09:24)
Поисковик в шоке будет))

Поисковик нужно информировать о смене адреса 301-м редиректом

Я думаю, что такие изменения будут часто происходить!

_____________
минус, конечно, иногда полезен, но плюс мне нравиться больше :)
Женский журнал - Жена сказала раскрутить сайт любой ценой (Sorry)
maximka787
killer8080
Редирект сделать возможно, но если путь с ошибкой, то это в любом случае ошибка.

Xpund
Если описать еще раз мой МЕТОД 1. То он уже действующий, использует 4 функции для "прокладки маршрута" от конца в начало. Единственно, не знаю как поведет себя скрипт на количестве страниц более 5000 к примеру, если вложенность будет около 4-х уровней.

У меня всего 1 таблица отвечает на ссылки и она же базовая - pages (`id`, `parent_id`, `url`, `type_page`, `id_obj`, `name`)

id - номер страницы
parent_id - родительская папка
url - адрес "страницы / категории / товара" (не полный путь), а только этой папки
type_page - тип страницы (enum: `page`, `category`, `product`)
id_obj это поле относится к таблице товаров и категорий, где подгружаются данные.
name - название "страницы / категории / товара"

Сейчас этот участок скрипта работает 0.008 сек на 20 записей

_____________
..Работает - не трогай!
Xpund
Цитата (maximka787 @ 6.02.2014 - 08:16)
killer8080
Редирект сделать возможно, но если путь с ошибкой, то это в любом случае ошибка.

Xpund
Если описать еще раз мой МЕТОД 1. То он уже действующий, использует 4 функции для "прокладки маршрута" от конца в начало. Единственно, не знаю как поведет себя скрипт на количестве страниц более 5000 к примеру, если вложенность будет около 4-х уровней.

У меня всего 1 таблица отвечает на ссылки и она же базовая - pages (`id`, `parent_id`, `url`, `type_page`, `id_obj`, `name`)

id - номер страницы
parent_id - родительская папка
url - адрес "страницы / категории / товара" (не полный путь), а только этой папки
type_page - тип страницы (enum: `page`, `category`, `product`)
id_obj это поле относится к таблице товаров и категорий, где подгружаются данные.
name - название "страницы / категории / товара"

Сейчас этот участок скрипта работает 0.008 сек на 20 записей

Как на счёт сделать несколько таблиц под каждый уровень?

Так же я пологаю, что походу под сео заточка делаетс?

Ну и что мешает загнать в базу 5000 строк?
type_page можно к tinyint преобразовать и сделаит 0,1,2 вметсо `page`, `category`, `product`


_____________
минус, конечно, иногда полезен, но плюс мне нравиться больше :)
Женский журнал - Жена сказала раскрутить сайт любой ценой (Sorry)
maximka787
Xpund
Ничего не мешает. Да под СЕО. Кстати это еще и просто логично)). По сути инет магазин может стоять на двух таблицах:

1. Базовая "страницы и категории" (ничем не отличаются => type_page = enum: `page`, `product`) `category` - удалим. ENUM в данном случае намного грамотней поля INTEGER.

2. Товары.

Цитата
Как на счёт сделать несколько таблиц под каждый уровень?

Думаю это будет излишне, тк я и так вынес таблицу товаров отдельно, чем обрек себя на проверку связи двух таблиц всегда.

Я просто боюсь за скорость скрипта при большом количестве страниц.

_____________
..Работает - не трогай!
Xpund
Цитата (maximka787 @ 6.02.2014 - 08:27)
Xpund
Ничего не мешает. Да под СЕО. Кстати это еще и просто логично)). По сути инет магазин может стоять на двух таблицах:

1. Базовая "страницы и категории" (ничем не отличаются => type_page = enum: `page`, `product`) `category` - удалим. ENUM в данном случае намного грамотней поля INTEGER.

2. Товары.

Цитата
Как на счёт сделать несколько таблиц под каждый уровень?

Думаю это будет излишне, тк я и так вынес таблицу товаров отдельно, чем обрек себя на проверку связи двух таблиц всегда.

Я просто боюсь за скорость скрипта при большом количестве страниц.

Смотри.
Я работаю с ИМ в котором порядка 3к товаров
Суть таблицы:
1 таблица: с title и мета для каждой категории и товара
2 таблица: таблица с описанием категорий
3 таблица: таблица с описанием товаров + путь до картинки

И прекрасно работает!

_____________
минус, конечно, иногда полезен, но плюс мне нравиться больше :)
Женский журнал - Жена сказала раскрутить сайт любой ценой (Sorry)
Быстрый ответ:

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