Скажем, у меня есть такой код
if (isset($_GET['foo']))
//do something
if (isset($_GET['bar']))
//do something else
Если пользователь находится на example.com/?foo=abc и нажимает ссылку, чтобы установить bar = xyz, я хочу легко перенаправить его на example.com/?foo=abc&bar=xyz, а не на example.com/?bar. = xyz.
Я могу придумать несколько очень грязных способов сделать это, но я уверен, что есть что-то более чистое, о чем я не знаю и не могу отследить через Google.






Просто установите ссылку, которая изменяет bar на xyz, чтобы также было foo = abc, если foo уже установлено.
$link = ($_GET['foo'] == 'abc') ? 'foo=abc&bar=xyz' : 'bar=xyz';
?>
<a href = "whatever.php?<?= $link ?>">Click Me</a>
Для этого вам нужно будет отобразить ссылки с правильной строкой запроса URL. Это проектное решение, которое вам нужно будет принять со своей стороны в зависимости от того, как настроена ваша система.
У меня есть несколько сайтов, на которых есть эта проблема, и я настраиваю глобальную переменную querystring, которая устанавливает данные текущей страницы в начало запроса страницы.
Затем, когда я визуализирую страницу, если мне нужно использовать текущую строку запроса, я делаю что-то вроде:
echo '<a href = "myurl.php' . querystring . '&bar=foo';
Он не самый чистый, но все зависит от того, как работает ваша система.
Вот один способ ....
//get passed params
//(you might do some sanitizing at this point)
$params=$_GET;
//morph the params with new values
$params['bar']='xyz';
//build new query string
$query='';
$sep='?';
foreach($params as $name=>$value)
{
$query.=$sep.$name.'='.urlencode($value);
$sep='&';
}
Если вы обновляете строку запроса, убедитесь, что вы не делаете что-то вроде
$qs = "a=1&b=2";
$href = "$qs&b=4";
$href contains "a=1&b=2&b=4"
Что вы действительно хотите сделать, так это перезаписать текущий ключ, если вам нужно. Вы можете использовать такую функцию. (отказ от ответственности: с головы до ног, может быть, с ошибкой)
function getUpdateQS($key,$value)
{
foreach ($_GET as $k => $v)
{
if ($k != $key)
{
$qs .= "$k = ".urlencode($v)."&"
}
else
{
$qs .= "$key = ".urlencode($value)."&";
}
}
return $qs
}
<a href = "reports.php?<?getupdateqs('name','byron');?">View report</a>
Сохраните код и используйте встроенный http_build_query. Я использую эту обертку в одном из своих проектов:
function to_query_string($array) {
if (is_scalar($array)) $query = trim($array, '? \t\n\r\0\x0B'); // I could split on "&" and " = " do some urlencode-ing here
else $query = http_build_query($array);
return '?'.$query;
}
Кроме того, хотя это не часто используется, вы можете иметь $ _GET в левой части присваивания:
$_GET['overriden_or_new'] = 'new_value';
echo '<a href = "'.to_query_string($_GET).'">Yeah!</a>';
В остальном просто делайте то, что сказал Пол Диксон.
Очень хорошо. Хотя вы могли бы использовать http_build_query для построения запроса. Браво.