Формирование request_uri

Black Raven

Новичок
Фaнaт, неужели реализация http_build_query настолько ужасна, что функция на php будет лучше?
 

Фанат

oncle terrible
Команда форума
Ну, вот что у меня получилось
PHP:
function modURIparam($name,$value) {
  $uri = strtok($_SERVER['REQUEST_URI'],"?")."?";
  foreach ($_GET as $k => $v) if ($k != $name) $uri.=urlencode($k)."=".urlencode($v)."&";
  if ($value !==FALSE) $uri.=urlencode($name)."=".urlencode($value);
  return $uri;
}
соответственно, для посраничного вывода делаем
PHP:
$uri=modURIparam("page",FALSE);
for($i=1;$i<=$num_pages;$i++) $PAGES[$i]=$uri.'page='.$i;
Только, блин, для сортировки она все равно не годится...
Для сортировки другую функцию надо писать...

-~{}~ 27.01.08 22:26:

Black Raven, речь не о ней, а о функции riff

-~{}~ 27.01.08 22:35:

Сама по себе она неплоха.
Однако как её заточить под свои нужды?
как-то так?
PHP:
$get=$_GET;
unset($get['page']);
$uri = strtok($_SERVER['REQUEST_URI'],"?")."?".http_build_query($get);
-~{}~ 27.01.08 22:38:

Ну, или если наплевать на "производительность", то
PHP:
$path=strtok($_SERVER['REQUEST_URI'],"?")."?";
for($i=1;$i<=$num_pages;$i++) $PAGES[$i]=$path.http_build_query(array_merge($_GET,array("page"=>$i)));
так?
 

Black Raven

Новичок
Если забить на производительность и забыть о $_GET, а работать только со строкой

PHP:
<?php
parse_str('&test=1&test=2',$get_params);
echo http_build_query($get_params);
?>
смысл в том, что тебе не надо думать о вложенности массивов и энкоде - функции сами об этом заботятся.
смысл первой строчки в том, что сказал baev. у тебя в query_string есть переменная, а ты ее переопределяешь - функции ее сами сожрут.
и ты не будешь "засирать кеш" ((с) dark demon) кривым урлом.
 

Фанат

oncle terrible
Команда форума
А смысл?
какой смысл в первой строчке?

-~{}~ 27.01.08 23:03:

какой смысл в переменной $get_params, которая дублирует $_GET?
нафига мне два одинаковых массива?
 

Black Raven

Новичок
почему дублирует?

PHP:
<?php
$query_string = 'test=1&second=2';
//$query_string = $_SERVER['QUERY_STRING'];
parse_str($query_string.'&test=2',$get_params);
echo http_build_query($get_params);
?>
 

Фанат

oncle terrible
Команда форума
Хм. надо подумать.
Операция-то лишняя, но вот в гет могут быть лишние параметры.........
 

Black Raven

Новичок
про лишние параметры у меня тоже возник вопрос.

у меня обычно уже есть массив с именами параметров, которые нужно будет "форвардить".

поэтому непонятно откуда у тебя такое желание заменить что-то, а остальное оставить.

--

или "лишние" не в этом смысле?

PHP:
<?php
$query_string = 'test=1&second=2&arr[]=1';
//$query_string = $_SERVER['QUERY_STRING'];
parse_str($query_string.'&test=2&arr[]=2',$get_params);
echo http_build_query($get_params);
?>
 

Фанат

oncle terrible
Команда форума
parse_str($query_string.'&test=2&arr[]=%20',$get_params);

-~{}~ 27.01.08 23:45:

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

dark-demon

d(^-^)b
> не думать надо ли делать merge recursive?

на форте программист йода как тоже ты? :)
 

fixxxer

К.О.
Партнер клуба
эээ, а в чем вопрос то

PHP:
function mod_qstr(array $params) {
    parse_str($_SERVER['QUERY_STRING'], $qs);
    $qs = $params + $qs;
    $qs = empty($qs) ? '' : '?'.http_build_query($qs);
    return strtok($_SERVER['REQUEST_URI'], '?') . $qs;
}
или надо чтобы еще со всякими фишками типа ?foo[]=1&foo[]=2 нормально работало? не проще ли забить, довольно экзотический вобщем то случай
 

Фанат

oncle terrible
Команда форума
triumvirat, а зачем для значения делать urlencode?

fixxxer, ну вот постепенно мы к этому и пришли =)
 

rotoZOOM

ACM maniac
Еще одну мелочь не забыли ? Я про ЧПУ.
Например у меня сейчас ссылки вида:
/domain/1/2/?forget=me&a=b
конвертируются mod_rewrite'ом в
/domain/index.php?cat=1&subcat=2&forget=me&a=b
Таким образом если использовать QUERY_STRING + SCRIPT_NAME,
то на выходе в URL строке можем получим уже не ЧПУ.
Тоже сейчас столкнулся с этой проблемой и думаю менять/добавлять непосредственно в REQUEST_URI, может с помощью регулярок.
 

Фанат

oncle terrible
Команда форума
у меня в QUERY_STRING попадает то, что было в запросе.
 
Сверху