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

Фанат

oncle terrible
Команда форума
Формирование request_uri

Че-та я и сам идиотским вопросом озаботился.
Задача классическая - формирование реквест ури из существующего, с заменой переменных.
То есть, если у нас запрос /script.php?a=b&c=d и надо в него вписать c=z

Подхода я вижу два
1.Отрезать от реквест ури путь, сформировать квери стринг вручную перебором $_GET и потом соединить их
2. Заменять прямо в реквест ури.
Раньше я увлекался первым, но сейчас что-то показалось - второй попроще будет. Но при попытке сделать реализацию получается кода не меньше, чем в первом. В силу того, что запрос, разумеется, может быть и /script.php, и /script.php? и /script.php?a=b

А кто как делает?
 

Духовность™

Продвинутый новичок
Да без разницы. Так и так делаю. В первом случае надо query_string отрезать, во втором найти\не найти знак вопроса и добавить новую переменную либо через амперсанд либо через "?".
 

dark-demon

d(^-^)b
/script.php/, и /script.php/ и /script.php/a=b

:-P

а вообще, самое труъ - это распарсить в ассоциативный массив, установить нужные значения и сериализовать. можно даже всё это в функцию вынести: modURI( '/script.php?a=b&c=d', array( 'c' => 'z', 'd' => null ) );
 

atv

Новичок
как вариант, распарсить урл функциями parse_url(), и parse_str() в массив данных, работать уже с полученным массивом, а потом по этому массиву построить урл.

О... Одновременно ответили :)
 

Фанат

oncle terrible
Команда форума
dark-demon
в функцию - это сомо собой.
только реквест ури я туды не передаю, а беру из сервера. и не массив, а просто пару переменных - имя, значение.
и парсить зачем - если пых уже сам все распарсил?

В общем, подумал, и решил остановиться на первом. Как-то алгоритм однозначнее. Линейнее, что ли.

-~{}~ 27.01.08 12:57:

atv
первую я использую, а во второй смысла не вижу, если её результат и так уже есть в $_GET
 

Фанат

oncle terrible
Команда форума
хм. логично, черт его возьми.

-~{}~ 27.01.08 13:12:

и хотя в случаях, когда требуется такая подстановка, обычно массивы не употребляются, но предусмотреть нужно.
или нуегонафиг, пожалуй. не будем перетяжелять
 

dark-demon

d(^-^)b
PHP:
function Qstr2arr( $str ){
	$query= array();
	$parts= array_filter( explode( '&', $str ) );
	foreach( $parts as $part ):
		list( $name, $value )= explode( '=', $part );
		$query[ $name ]= $value;
	endforeach;
	return $query;
}

function Qarr2str( $arr ){
	asort( $arr );
	$query= array();
	foreach( $arr as $name => $value ):
		if( is_null( $value ) ) continue;
		$query[]= "$name=$value";
	endforeach;
	if( !$query ) return '';
	return '?' . implode( '&', $query );
}

echo $_SERVER['SCRIPT_NAME'] . Qarr2str( array( 'c' => 'x' ) + Qstr2arr( $_SERVER['QUERY_STRING'] ) );
 

Фанат

oncle terrible
Команда форума
Во-первых, мне кажется, что и нейм, и валуе надо урленкодить.
Во-вторых, SCRIPT_NAME не годится - нужна именно часть реквест ури до вопроса.
в-третьих ,какой-то уж очень неочевидный алгоритм. ты складываешь массив со строкой?

-~{}~ 27.01.08 14:05:

Да, а квери стринг - на оборот - урл ДЕкодить.
 

riff

Новичок
Удалил, как не прошедшую цензуру.
(Хотел сократить функцию - в результате испортил).
 

Фанат

oncle terrible
Команда форума
Oh mein gott!
у меня большая часть законченных функциональных скриптов имеют меньший размер, чем эта функция.
А некоторые короче, чем комментарий к ней.
 

riff

Новичок
в строке define('amp', '&'); должно быть define('amp', '&_amp;'); (без подчёркивания)
 

Фанат

oncle terrible
Команда форума
у тебя не получилось.
во-первых, во всем этом кучерявом комментарии не нашлось места для двух строчек, поясняющих - а накой вообще эта функция нужна, и что делает.
во-вторых, меня интересует работа с REQUEST_URI, а не с url
в-третьих, у меня есть сильное подозрение, что все это можно написать короче.

и ещё ,у меня стойкое ощущение, что часть функционала этого проекта реализуется несколько более простыми средствами.
к примеру,
вместо echo url(null); можно написать echo $_SERVER['PHP_SELF']
а вместо echo url('key1');можно написать echo $_GET['key1']
 

riff

Новичок
Автор оригинала: *****
а накой вообще эта функция нужна, и что делает.
ну например попали вы на страницу news, там десять новостей
Новость1
------------
ля-ля-ля...
<a href="'.url(array('page', 'newsId'=>'1')).'"читать далее</a>

или находитесь на странице "abcd" и от туда даёте ссылку на новость1 <a href="'.url(array('page'=>'news', 'newsId'=>'1')).'"читать</a>
Автор оригинала: *****
а вместо echo url('key1');можно написать echo $_GET['key1']
но нет ведь гарантии что $_GET['key1'] существует - придётся каждый раз проверять, и не обязательно key1 будет написано в адресной строке маленькими буквами.

-~{}~ 27.01.08 16:55:

Кстати и вашим вопросом справится : "Задача классическая - формирование реквест ури из существующего, с заменой переменных.
То есть, если у нас запрос /script.php?a=b&c=d и надо в него вписать c=z"
 

Фанат

oncle terrible
Команда форума
ничего не понял.
если я нахожусь на какой угодно странице, и мне надо получить адрес /news.php?newsId=1, то я так и напишу! зачем мне эта функция?
рпроверка существования переменных к работе с урл вообще отношени не имеет
и если я пишу имя ключа большими буквами, то, черт возьми, я хочу и получать его тоже большими буквами!

с моим же запросом справится функция в 20 раз меньшего размера.
 

riff

Новичок
Зря я сейчас тронул функцию... хотел сократить только испортил :) Удалите тогда, пожалуйста её или мне восcтановить то что было там написано?
 

baev

‹°°¬•
Команда форума
если у нас запрос /script.php?a=b&c=d и надо в него вписать c=z
Достаточно в конец урла (не удаляя ничего из старого) добавить строку "?&c=z" — если переменная "c" есть в запросе, то её значение просто будет переопределено.
 
Сверху