Постоянные переменные HTTP GET в PHP

Скажем, у меня есть такой код

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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
1 673
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Просто установите ссылку, которая изменяет 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='&';
}

Очень хорошо. Хотя вы могли бы использовать http_build_query для построения запроса. Браво.

Byron Whitlock 12.12.2008 02:26

Если вы обновляете строку запроса, убедитесь, что вы не делаете что-то вроде

$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>';

В остальном просто делайте то, что сказал Пол Диксон.

Другие вопросы по теме