Постоянные переменные 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. = хуг.

Я могу придумать несколько очень грязных способов сделать это, но я уверен, что есть кое-что более чистое, о чем я не знаю и не смог найти его через Google.

11.12.2008 23:00:41
5 ОТВЕТОВ
РЕШЕНИЕ

Вот один из способов ....

//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='&';
}
2
11.12.2008 23:18:44
Очень хорошо. Хотя вы могли бы использовать http_build_query для построения запроса. Браво.
Byron Whitlock 11.12.2008 23:26:12

Просто установите ссылку, которая меняет панель на xyz, чтобы она также имела foo = abc, если foo уже установлена.

$link = ($_GET['foo'] == 'abc') ? 'foo=abc&bar=xyz' : 'bar=xyz';
?>
<a href="whatever.php?<?= $link ?>">Click Me</a>
0
11.12.2008 23:06:34

Чтобы это произошло, вам нужно будет отобразить ссылки с правильной строкой URL-адреса. Это дизайнерское решение, которое вам нужно будет принять с вашей стороны в зависимости от того, как настроена ваша система.

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

Затем при рендеринге страницы, если мне нужно использовать текущую строку запроса, я делаю что-то вроде:

echo '<a href="myurl.php' . querystring . '&bar=foo';

Это не самый чистый, но все зависит от того, как работает ваша система.

0
11.12.2008 23:07:12

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

$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>
1
11.12.2008 23:19:19

Сохраните некоторый код и используйте встроенный 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>';

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

0
12.12.2008 00:27:51