[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создать короткую url в динамике выборки из таблицы
Страницы: 1, 2, 3, 4, 5
skolozhabskiy
добрый день,

вопрос по созданию коротких url в динамике выборки из базы данных.

допустим есть таблица продуктов, из которой я выбираю по предопределенным параметрам список товаров из категории "кровати" (category=92).
каждый товар имеет ссылку на "Посмотреть товар детально...", например, такие:

http://www.mydomain.com/?cart=0&promo=yes&category=92&id=586
http://www.mydomain.com/?cart=0&promo=yes&...gory=92&id=2653
http://www.mydomain.com/?cart=0&promo=yes&...gory=92&id=2654

Вопрос, как наиболее лаконично при формировании кода в цикле чтения строк из таблицы продуктов изменить длинные ссылки на короткие, например, такие:

http://www.mydomain.com/bed/586
http://www.mydomain.com/bed/2653
http://www.mydomain.com/bed/2654

т.е., чтобы после загрузки кода html,например,

<a href="http://www.mydomain.com/bed/586">Кровать 1</a>
<a href="http://www.mydomain.com/bed/2653">Кровать 2</a>
<a href="http://www.mydomain.com/bed/2654">Кровать 3</a>

и нажатии на любой из этих ссылок был переход на соответствующий товар с нужными параметрами, переданными через url

P.S. Большая просьба на готовые сервисы создания коротких url не отсылать. данный путь не пригоден! нужен простой и оптимальный алгоритм, возможно с использованием регулярных выражений.

спасибо за любые идеи
killer8080
это не короткий урл, это ЧПУ. Гугли mod_rewrite
skolozhabskiy
я уже гуглил mod_rewrite, но все равно не могу понять как при обработке выборки в цикле создать короткие url, чтобы потом в html коде при переходе от них получить длинные url с заданными параметрами. вы можете на моем примере показать как это можно реально реализовать?

спасибо
killer8080
конкретно для данного примера
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule bed/(\d+) index.php?cart=0&promo=yes&category=92&id=$1 [L,QSA]


а вообще лучше делать классический вариант приложений с общей точкой входа
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]

и уже в index.php обрабатывать $_GET['request']
skolozhabskiy
1. я так понимаю, $_GET['request'] должен включать в себя следующую строку "cart=0&promo=yes&category=92&id=", но тогда в структуре построения html кода в цикле выборки непонятно что нужно указывать в href ссылок?

например,

while ( $row = mysql_fetch_assoc($result_query) )
{
$output[] = '<a href="???????????">$row['name']</a>';
}

я смотрел структуры подобных кодов, но там в href ссылок уже стоят короткие url. тогда как же здесь задействовать параметр request метода GET?

может так:

$output[] = '<a href="?request-'.$row['id'].'=cart=0&promo=yes&category='.$row['category_id'].'&id='.$row['id'].'">$row['name']</a>';

тогда как в самом index.php в структуре php далее обрабатывать эти запросы, вернее что с ними делать, ведь их может быть десятки и сотни ?

например в самом файле index.php мы получим список ссылок данной категории и все они будут выглядеть так:

<a href="'.$_GET['request-586'].'"></a>
<a href="'.$_GET['request-2653'].'"></a>
<a href="'.$_GET['request-2654'].'"></a>

В чем здесь фишка?

2.
и как в данном случае "RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]" интерпретатор поймет начинать нужно с bed (кровати) или curtain (шторы) и так далее?

спасибо
killer8080
Цитата (skolozhabskiy @ 19.03.2013 - 14:12)
1. я так понимаю, $_GET['request'] должен включать в себя следующую строку "cart=0&promo=yes&category=92&id="

нет, не так, там будет то же, что и в $_SERVER['REQUEST_URI'], только с урл декодированием. квери стринг туда не входит.
skolozhabskiy
четно говоря я совсем запутался уже.

так что же тогда в разборе выборки должно включать href ссылок?

while ( $row = mysql_fetch_assoc($result_query) )
{
$output[] = '<a href="???????????">$row['name']</a>';
}

и как далее "обрабатывать" GET['request']?

спасибо
killer8080
Цитата (skolozhabskiy @ 19.03.2013 - 14:20)
так что же тогда в разборе выборки должно включать href ссылок?

ну так то, что испрашивал
Цитата (skolozhabskiy @ 19.03.2013 - 13:25)
http://www.mydomain.com/bed/586
http://www.mydomain.com/bed/2653
http://www.mydomain.com/bed/2654

на то оно и чпу biggrin.gif
Цитата (skolozhabskiy @ 19.03.2013 - 14:20)
и как далее "обрабатывать" GET['request']?

а это уже зависит от того, какая структура ссылок будет использоваться на сайте. Разбиваешь explode-ом по слешу и анализируешь массив, подключая контроллер соответствующей страницы. Всё зависит от конкретной реализации маршрутов.
skolozhabskiy
вы имеете ввиду так:

while ( $row = mysql_fetch_assoc($result_query) )
{
$output[] = '<a href="?request-'.$row['id'].'=cart=0&promo=yes&category='.$row['category_id'].'&id='.$row['id'].'">$row['name']</a>';
}


тогда мне совсем непонятно - ведь в html коде в href ссылок будет снова что-то вроде, например:

<a href="?request-586=cart=0&promo=yes&category=92&id=586">Кровать 1</a>


или опять я чего не понимаю?

а если не так то как я могу в цикле выборки вставлять сразу короткий url?

while ( $row = mysql_fetch_assoc($result_query) )
{
$output[] = '<a href="http://www.mydomain.com/bed/586">$row['name']</a>';
}


откуда он возьмется?

может так:

while ( $row = mysql_fetch_assoc($result_query) )
{
$output[] = '<a href="/'.$row['category_name'].'/'.$row['id'].'">$row['name']</a>';
}


и тогда согласно правилу в файле .htaccess при клике по такой ссылке я буду получать длинный url с заданными параметрами?

тогда не понимаю что еще нужно обрабатывать и где с GET['request']?

спасибо
killer8080
Цитата (skolozhabskiy @ 19.03.2013 - 14:39)
может так:

while ( $row = mysql_fetch_assoc($result_query) ){
    $output[] = '<a href="?'.$row['category_name'].'/'.$row['id'].'">$row['name']</a>';}

и тогда согласно правилу в файле .htaccess при клике по такой ссылке я буду получать длинный url с заданными параметрами?

для первого варианта, да.

Цитата (skolozhabskiy @ 19.03.2013 - 14:39)
тогда не понимаю что еще нужно обрабатывать и где с GET['request']?

это для второго способа, с общей точкой входа. Сначала нужно определится с архитектурой движка.
skolozhabskiy
1. для первого варианта, что вы скопировали у меня допущена, вероятно, неточность. верно будет так:

while ( $row = mysql_fetch_assoc($result_query) ){
$output[] = '<a href="/'.$row['category_name'].'/'.$row['id'].'">$row['name']</a>';}


перед $row['category_name'] должна быть косая слеш или знак вопроса?

2. для второго варианта это должно быть так:


while ( $row = mysql_fetch_assoc($result_query) )
{
$request = 'category='.$row['category_name'].'&id='.$row['id'];
$output[] = '<a href="?request='.$request.'">$row['name']</a>';
}


а далее, например GET['request'] раскладывать и составлять из него уже короткий url

так или снова чего я не понимаю?

спасибо
skolozhabskiy
или так:


while ( $row = mysql_fetch_assoc($result_query) )
{
$request = 'category='.$row['category_name'].'&id='.$row['id'];
$output[] = '<a href="?request-'.$row['id'].'='.$request.'">$row['name']</a>';
}



спасибо
killer8080
Цитата (skolozhabskiy @ 19.03.2013 - 15:06)
1. для первого варианта, что вы скопировали у меня допущена, вероятно, неточность. верно будет так:

while ( $row = mysql_fetch_assoc($result_query) ){
    $output[] = '<a href="/'.$row['category_name'].'/'.$row['id'].'">$row['name']</a>';}
перед $row['category_name'] должна быть косая слеш или знак вопроса?

слеш естественно
Цитата (skolozhabskiy @ 19.03.2013 - 15:06)
2. для второго варианта это должно быть так:


while ( $row = mysql_fetch_assoc($result_query) ){
$request = 'category='.$row['category_name'].'&id='.$row['id'];  $output[] = '<a href="?request='.$request.'">$row['name']</a>';
}
а далее, например GET['request'] раскладывать и составлять из него уже короткий url

так или снова чего я не понимаю?

видимо "снова чего я не понимаю" smile.gif

для обоих случаев ссылки будут выглядеть одинаково, разница только в способе обработки маршрутов на стороне php.
skolozhabskiy
1. с первым вариантом более-менее понятно.

2. а вот со вторым вариантом не совсем. разбор выборки правильно будет так:


while ( $row = mysql_fetch_assoc($result_query) ){
$request[] = 'category='.$row['category_name'];
$request[] = 'id='.$row['id'];
$output[] = '<a href="?request-'.$row['id'].'='.$request.'">$row['name']</a>';
}


здесь остается вопрос об уникальности передаваемого массива request!

что тогда я в коде html получу в href ссылки:


<a href="?request-586=request[]">Кровать 1</a>


понятно, что если я кликну то получаю GET['request-586'] в виде массива, который, как вы писали, разбиваем explode-ом по слешу и анализируем массив.
допустим мы получили элементы массива array(0 => 'bed', 1 => 586) и сложили строку типа :

$request = '/bed/586';


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

задействовать

header("Location: http://mydomain.com'.$request.'");


?

и тогда можно использовать второй вариант с универсальной точкой входа?

получается так, что в index.php мы получили. например, GET['request-586'] при клике по ссылке


<a href="?request-586=request[]">Кровать 1</a>


потом этот GET['request-586'] передаем там же в index.php этот параметр в некую функцию редиректа, например:


function redirect();[php]

и результат обработки этой функции с [php]header("Location: http://mydomain.com'.$request.'");
перенаправляет нас на указанный продукт.

или как-то иначе?

спасибо
Быстрый ответ:

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