Создание ЧПУ. Обратная сторона ЧПУ.

maxim

Новичок
Создание ЧПУ. Обратная сторона ЧПУ.

Как ЧПУ натравить на один-единственный index.php написано немало статей
и разжевано во всех подробностях это и
1)Errorcode 404
2)modRewrite
3)Реальное создание файлов, которые в той или иной мере инклудят /index.php
4)FilesMatch

Меня интересует другая сторона - как строить ссылки.

Дерево каталогов я храню в таблице -- |parent|child| (int,int)
Описание каталога в таблице -- |category_id|category_name|category_content|(int,varchar,text)
Ссылки строю из базы получается вот так - http://www.site.ru/?category_id=220
причем для каталога любого уровня вложенности.
Теперь мне придется строить ссылки типа http://www.site.ru/0/21/../220/
Или в идеальном случае вместо category_id завести еще
одно поле в таблице category_url_name(varchar) чтобы ссылки были
http://www.site.ru/product/submarine/nuclear/../atlantic/
или category_id сделать varchar?

Понятно что для построения таких ссылок необходимо
изменить код программы.

Или может быть завести еще одно поле в таблице и хранить там полный путь к каталогу?
Допустим проблема решена и ЧПУ чудесным образом создается.
Пришел ко мне ЧПУ я QUERY_STRING порезал получил последний category_url_name
по нему сделал выборку и отдал на браузер. Тогда в принципе можно набирать
http://www.site.ru/programmer_is_very_fool/atlantic/ (не сильно напрягает но все равно
хотелось бы как то проверять). Я попробовал такие комбинации на artlebedev.ru(там красивые урлы)
- не прокатило(выдавал 404).

Прошу прощения за немного сумбурное описание проблемы, теперь конкретные вопросы:

1) Как(какие) хранить данные в таблицах(category_id int или varchar)?
2) Как строить ссылки?

Ответ на второй вопрос, насколько я понимаю существенно определяется первым ответом.

(И еще для админов: А почему вы на родном и любимом сайте не сделали ЧПУ?)

-~{}~ 24.04.04 19:52:

Неужели никто никак не использует ЧПУ?
 

csa

Guest
можешь пройтись по элементам пути и проверить правильность вхождения, а можешь хранить полные пути прямо в базе
как хочешь
 

maxim

Новичок
Если хранить пути в базе то при большой глубине поле с полным путем будет очень большим, так что лучше имхо проверять правильность вхождения
 

slach

Новичок
надо заводить поле в базе
category_url
но хранить там не полный путь... а путь до начала конкретного раздела

т.е. если у тебя новости это /news/2004/02/22/

то category_url должно быть '/news';

далье все достаточно просто
mod_rewrite

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !\.(swf)|(jpg)|(png)|(gif)|(pcx)$

RewriteRule ^(.+) index.php?content=$1&%{QUERY_STRING} [L]

в index.php
SELECT * FROM category WHERE CONCAT(category_url,'%') LIKE '{$_GET['content']}' ORDER BY category_url DESC;

получишь раздел наиболее точно удовлетворяющий твоему УРЛу...

если нет такого, то выводим 404 страницу свою или какую нибудь страницу по дефолту...

дальше можно в category добавить category_lib ... библиотеку обработчик... и инклудить ее... обрабатывая логику полученную по $_GET['content']
 

crocodile2u

http://vbolshov.org.ru
В дополнение к последнему посту (просто личный опыт):

Лично я сохраняю category_folder в базе (т.е. не полный путь, а только указатель на "папку"). Скрипт разбирает путь находя соответствующую страницу в базе, когда доходит до того места, после которого соответствие уже не находится, "остаток" пути передает соответствующему классу, кот. собсно, рисует страницу.

Т. е. : если адрес /news/2004/02/..., скрипт отыщет в базе страницу с нулевым родителем и с category_folder=news, а остаток (2004/02/) будет обрабатываться классом news.

PS: с большим уровнем вложенности и большим кол-вом страниц, боюсь, будет тормозить. Но для небольших проектов прокатывает
 

maxim

Новичок
to SLACH
____________________
в index.php
SELECT * FROM category WHERE CONCAT(category_url,'%') LIKE '{$_GET['content']}' ORDER BY category_url DESC;
____________________
А зачем CONCAT(category_url,'%') может просто " ... LIKE '%".$_GET['content']. "..."
 

csa

Guest
здесь имеем список масок в category_url и последовательно примеряем к $_GET['content']
чувствуешь разницу?
 

maxim

Новичок
Если честно, то чувствую. А можно еще кэшировать результат в папку cache расположенную выше Document_Root и получив request, отрезав имя сервера, и проверив на наличие гадких символов проинклудить /cache/отрезанный_и_проверенный_request_url.

Таким образом решив проблему с нагрузкой на базу и хранением ЧПУ в базе.
 
Сверху