ЧПУ - 1001й раз...

M7
На сайте с 31.03.2012
Offline
14
780

Здравствуйте.

Делаю сайт на php+mysql, самопис. Уперся в ЧПУ...

Либо я, уж сильно туп в программировании, либо программеры, пишущие мануалы и статьи на эту тему - напрочь не способны объяснять...

Хотелось бы получить от знающих людей - конкретные советы, алгоритмы, фрагменты кода, под мой случай... Спасибо!

Алиасы лежат в БД. Я их вытаскиваю и получаю в меню сайта ссылки/адреса типа:

/page/o_saite.html

/razd/razdel_takoi_to.html

/cat/categoria_takaia_to.html

Вместо них мне надо тащить из базы по таким параметрам:

index.php?tp=page&id=2

index.php?tp=razd&id=13

index.php?tp=cat&id=4

Соответственно, в таблице pages лежит строка с id=2, где url=o_saite. И мне, надо имея адрес "/page/o_saite.html" получить из таблицы pages строку с id=2.

Параметр tp определяет что за тип страницы, и из какой таблицы базы тащить строку по id (но как его увязать...??).

Вроде принцип работы понимаю, но реализовать не выходит. :madd:

Подскажите, что писать в .htaccess и как index.php заставить тащить строку из нужной таблицы базы, под нужным id

З.Ы. Прошу не посылать в гугл, не приводить абстрактные мануалы и примеры - так как уже обчитался... Также не советуйте, пожалуйста, забить и делать сайт на одной из стандартных CMS. Это уже дело принципа - ввязался, не отступлю. Помогите :)

C
На сайте с 04.02.2005
Offline
291
#1

Первое что бросилось в глаза

имея адрес "/page/o_saite.html" получить из таблицы pages строку с id=2.

т.е продолжив ряд

/razd/razdel_takoi_to.html - получить из таблицы razd

Фтопку такую систему.

Также не советуйте, пожалуйста, забить и делать сайт на одной из стандартных CMS

Не.. зачем же. Только посмотрите как это организовано в популярных

Табл. категорий

Табл. постов

/category/page

Это самый простой вариант, когда страница привязана к одной категории

Есть более сложные случаи:

/category1/page

/category2/page

Это когда страница может принадлежать нескольким категориям.

Но в любом случае привязка идет по url (алиасу) поста

SELECT * FROM post wher alias='page'

Запрос, конечно будет посложнее, потому как нужно еще проверить его привязку к категории.

IL
На сайте с 20.04.2007
Offline
435
#2
mayor777:
как index.php заставить тащить строку из нужной базы, под нужным id

В одну базу всё "не влазиит"?

mayor777:
как index.php заставить тащить строку из нужной базы, под нужным id

А зачем тащить "под нужным id" - тащите "под нужным url"

SELECT .. WHERE url = '{$url}'

Url разбить можно, например, так (проверок добавить по своему усмотрению):


$urls = explode ('.',$_SERVER['REQUEST_URI']);
$urls = explode ('/',$urls[0]);
print_r ($urls);
mayor777:
Это уже дело принципа - ввязался, не отступлю. Помогите

помогите "не отступить" 😂

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
M7
На сайте с 31.03.2012
Offline
14
#3

И чем отличается

/category/page

от моего

/page/o_saite.html

/razd/razdel_takoi_to.html

page - это категория, говорящая, что это отдельная информационная страница сайта

razd - раздел каталога

есть еще

cat - категория каталога

pub - статья каталога...

В чем разница, кроме букв... ?

Chukcha:

Но в любом случае привязка идет по url (алиасу) поста
SELECT * FROM post wher alias='page'

т.е. вы предлагаете тащить из базы не по id, а по алиасу?

C
На сайте с 04.02.2005
Offline
291
#4
И чем отличается
/category/page
от моего
/page/o_saite.html
/razd/razdel_takoi_to.html

Я показал чем - структурой базы, описанной вами же

И мне, надо имея адрес "/page/o_saite.html" получить из таблицы pages строку с id=2.

Откуда мне знать, что page != pages (на экстрасенса не учился)

т.е. вы предлагаете тащить из базы не по id, а по алиасу?

Да. Но alias должен быть уникальным.

M7
На сайте с 31.03.2012
Offline
14
#5
Chukcha:

Откуда мне знать, что page != pages (на экстрасенса не учился)

Ну причем тут экстрасенсорика? Вот же написано: "Соответственно, в таблице pages лежит строка с id=2, где url=o_saite. И мне, надо имея адрес "/page/o_saite.html" получить из таблицы pages строку с id=2.

Параметр tp определяет что за тип страницы, и из какой таблицы базы тащить строку по id (но как его увязать...??)."

То что алиасы должны быть уникальны я догадался.

И все же, по сути, как подменять ЧПУ в .htaccess исходя из этой структуры?...

siv1987
На сайте с 02.04.2009
Offline
427
#6
mayor777:
И все же, по сути, как подменять ЧПУ в .htaccess исходя из этой структуры?...

Либо вы там добавляете ид и тянете в скриптах по айдишнику, либо тянете сразу по алиасу (ну или на основе алиаса получаете ид) как показали выше. Вариантов здесь нет.

C
На сайте с 04.02.2005
Offline
291
#7
Вот же написано: "Соответственно, в таблице pages лежит строка с id=2, где url=o_saite.

Я же остальное начинаю интерполировать

/razd/razdel_takoi_to.html - получить из таблицы razds

htaccess должен все запросы перенаправлять на индексный файл

M7
На сайте с 31.03.2012
Offline
14
#8
Chukcha:

htaccess должен все запросы перенаправлять на индексный файл

Допустим...

Я делаю так:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule .* index.php [L]

В итоге, находясь на странице /page/page_takaia_to.html я жму на другой пункт меню и получаю дублирование вида - /page/page/page_takaia_to2.html

Как избавится от этих эффектов... И откуда они вообще берутся?

siv1987
На сайте с 02.04.2009
Offline
427
#9
mayor777:
Как избавится от этих эффектов... И откуда они вообще берутся?

скорее всего из не правильно прописанных путей. Почитайте про относительные и абсолютные адреса.

M7
На сайте с 31.03.2012
Offline
14
#10
siv1987:
скорее всего из не правильно прописанных путей. Почитайте про относительные и абсолютные адреса.

Вопрос про дублирование частей адреса снимается... Причину нашел. Спасибо!

Так теперь разбирать путь по принципу:

"Url разбить можно, например, так (проверок добавить по своему усмотрению):

Код:

$urls = explode ('.',$_SERVER['REQUEST_URI']);

$urls = explode ('/',$urls[0]);

print_r ($urls);"

???

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий