Вопрос по ReWrite'y

Spear

почемучка
Вопрос по ReWrite'y

здравствуйте,
народ, выручайте, пожалуйста:

пишу реврайт для сайта. Есть такой раздел сайта - энциклопедия. так вот - там может быть в GET'е ничего не стоять (кроме названия раздела - энциклопедия) а может стоять год (происходит фильтрация по году) и ещё 3 параметра.

код такой:

RewriteRule ^encyclopedia/filter/type([0-9]*)/yr([0-9]*)/st([0-9]*)/s([0-9]*) navigate.php?name=encyclopedia&type=$1&year=$2&status=$3&sort=$4 [NC]

Выше код - работает, но проблема в чем - можно както сказать реврайту, что в вышеописанной условии параметры -
type=$1&year=$2&status=$3&sort=$4 необязательны?
тоесть может быть просто человек делает фильтрацию только по типу, или по типу и году, или по году и статусу? или прийдется писать для каждого случая своё правило?

-~{}~ 08.06.05 09:12:

ещё загвоздка в том что порядок параметров фильтрации - непостоянный. тоесть будет работать и
&year=2005&status=2
u
&status=2&type=1&year=2005
 

digs

Новичок
Сделай несколько ReWrite-ов, на каждое количество параметров свой.
Что касается последовательности, то ты передавай не
&status=2&type=1&year=2005

а что нить типа
&par1=yr2005&par2=type1 и т.д.
А потом это в скрипте разбирай
 

Spear

почемучка
digs
по поводу последовательности:

передается так (в скрипте)

если есть в гете например $year, то делаются проверки (ну там, что состоит только из цифр, и не блинее 4 знаков). если все верно - то переменная
$yearToQuery = " and year='".$_GET['year']"';
если нет то $yearToQuery = "";

ну а сама переменная $yearToQuery стоит в запросе.
тоесть полуается если юзер задал год - идет филтрация. нет - не идет (по году)

и так несколько параметров.

и в гете они уже могут стоять как попало - все работает. просто незнаю как тперь на это все реврайт сделать :(
 

digs

Новичок
Spear
Ты наверное не понят.
Ты принимаешь скриптом par1="year2005", вытаскиваешь из него все первые не циферные символы, и получаешь слово "year", все остальное это год. Пробегаешь все par1..parN и таким образом заполняешь переменные $year и т.д. Потом анализируешь, какие переменные есть, те и включаешь в запрос
А на mor_rewrite такая вещь с последовательностью я не знаю как делается, видимо придется для каждого случая последовательности писать свое правило. А это много.
Мне кажется легче на уровне PHP разобраться
 

Spear

почемучка
digs
по-моему это не очень удобно.. хотя незнаю. Все-таки подожду, вдруг можно на реврайте это сделать ;)

-~{}~ 08.06.05 09:36:

хотя если с последовательностью не получится реврайтом - это пол-беды. напишу правила ещё. Проблема вот в чем:

допустим можно в правиле

RewriteRule ^encyclopedia/filter/type([0-9]*)/yr([0-9]*)/st([0-9]*)/s([0-9]*) navigate.php?name=encyclopedia&type=$1&year=$2&status=$3&sort=$4 [NC]

както сказатЬ, что тут может не быть какого-то параметра? Например - последнего это вообще сортировка на странице).
 

digs

Новичок
Spear
Ну а чем "s" отличается от например "st" с точки зрения Rewrite ? Тоже самое на мой взгляд.
А поводу полбеды не согласен. Появится у тебя еще какой нить параметр сортировки и количество правил станет ровно в два раза больше :)
 

Spear

почемучка
вот наглядный пример того. что я примерно и делаю (по способу сортировки:
http://www.ag.ru/geo/g1/st1/y2005/

http://www.ag.ru/geo/st1/y2005/g1/

http://www.ag.ru/geo/y2005/g1/
http://www.ag.ru/geo/y2005/g1

http://www.ag.ru/geo/y2005/g1/st1/

и так далее - результат один.не думаю что они писали десятк (сотни) правил реврайта для каждого возможного случая.
 

digs

Новичок
А я еще написал
http://www.ag.ru/geo/qqq3/qqq5/qqqq6/g1/st1/y2005/

Ну и как это по твоему сделали?
 

digs

Новичок
digs
Вот я и говорю, что проще собрать в переменные все, что между слешами, а потом в скрипте разобрать
 

IBSN

Новичок
А я вышел из такого положения приняв за ID страницы сам путь /test/test1/rus/faq/ (с учетом отсутствия последнего слэша), а затем уже достаю из базы страницы, ну и т.п...
 

Spear

почемучка
IBSN
непонял :(

digs
модно немного по-подробнее? Пожалуйста.
 

digs

Новичок
Spear тебе IBSN только что дал дельный совет.

RewriteRule ^encyclopedia/filter/([0-9a-z\/]*) navigate.php?id=$1

Т.е. все что после filter попадет в переменную id, а потом ее рабираешь в скрипте
 

Spear

почемучка
проблема вот в чем - как разбить ПРАВИЛЬНО переменную айди, чтобы без особого напряга на движок... блин.. запутался я :(
 

Spear

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

вот сейчас (уже) у меня так

$_GET['id'] = type70/yr2005/st0/
как бы это чудо раздить на другие переменные $type $yr и по максимуму стабильно, чотбы шаманства потенциального хакера со ссылкой не вызвали ошибку

-~{}~ 08.06.05 11:54:

наброски..
что-то не то делаю видимо:

PHP:
 $test1 =  $_GET['id'];
   $test2 = explode ("/", $test1);
   $test3 = count($test2);
   $t=0;
   while($t<$test3)
   {
   echo "$test2[$t]<br>";
   $t++;
   }
   print $_GET['id'];
как же мне все-таки сделать из y2005 сделать переменную $year=2005; а из st0 - $st=0;
 

digs

Новичок
Spear
Смотри функции работы со строками.
Программу за тебя писать не буду
 

Spear

почемучка
вот! вроде что-то по-тихонбкуполучается. смотрите:

if (preg_match("/^[y][0-9]{4}$/", $test2[$t])) echo "<br><hr> $test2[$t] - year<br><hr>";

это работает.
а вот ниже -нет:


if (preg_match("/^[st][0-9]{1}$/", $test2[$t])) echo "<br><hr> $test2[$t] - status<br><hr>";

-~{}~ 08.06.05 13:07:

ВОт, кажется сделал.. оцените пожалуйста. Буду рад замечаниям:

PHP:
$filterString =  $_GET['id'];
   $filterStringExpl = explode ("/", $filterString);
   $test3 = count($filterStringExpl);
   $t=0;
   while($t<$test3)
   {
   if (preg_match("/^[y][0-9]{4}$/", $filterStringExpl[$t]))
   {
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2);
        $test6 = strtolower(implode('', $matches2[1]));
        $year="$test6";
        
   }
   if (preg_match("/^ge[0-9]{1}$/", $filterStringExpl[$t]))
   {
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2);
        $test6 = strtolower(implode('', $matches2[1]));
        $ge="$test6";
   }
   if (preg_match("/^ge[0-9]{2}$/", $filterStringExpl[$t]))
   {
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2);
        $test6 = strtolower(implode('', $matches2[1]));
        $ge="$test6";
   }
   if (preg_match("/^st[0-9]{1}$/", $filterStringExpl[$t]))
   {
        preg_match_all('/(?:([0-9]+)|.)/i', $filterStringExpl[$t], $matches2);
        $test6 = strtolower(implode('', $matches2[1]));
        $st="$test6";
   }

   $t++;
   }
Понял, что сам отошол от темы своей же..
Вообщем все вопросы касательно реврайт отпадают. По последнему вопросу создао новую тему, чтобы не было бардака на форуме.
вот тема:
http://phpclub.ru/talk/showthread.php?s=&threadid=68102&rand=0
 
Сверху