Каков наилучший способ управления QUERY_STRING в php? - PullRequest
2 голосов
/ 04 марта 2009

На одном из моих сайтов есть несколько очень сложных функций сортировки, помимо нумерации страниц, и различные переменные в совокупности образуют довольно сложный URL-адрес, которым очень трудно управлять. Есть ли способ эффективно управлять QUERY_STRING?

Под этим я подразумеваю ... если URL - это index.php? Catid = 3 & sort = date & year = 2009 & page = 2 и я хочу, чтобы пользователь перешел на страницу 3 или изменил метод сортировки ..... я бы сохранил оставшиеся переменные без проверки для каждой отдельной переменной с условием if / else и вывел бы их в ссылку, которая ссылалась бы на страницу 3 или альтернативный метод сортировки.

Ответы [ 7 ]

3 голосов
/ 04 марта 2009

PHP предоставляет вам глобальный $ _GET, в котором вся строка вашего запроса аккуратно разбита на элементы

$_GET['catid'] will be '3'
$_GET['sort'] will be 'date'
$_GET['year'] will be '2009'

и т.д.

Вы можете сбросить те из них, которые вы не хотите передавать, а затем перейти к новому URL-адресу через что-то вроде:

$get = array_intersect_key($_GET, array_keys($_GET));
unset($get['sort']);
$url = 'target.php?' . http_build_query($get);
2 голосов
/ 04 марта 2009

Для обработки фактического запроса строки (формат строки) вы можете использовать parse_str(). Если вы хотите построить строку запроса, используйте http_build_query().

На этих страницах документации немало примеров.

Если по какой-то причине вы не можете использовать http_build_query, проверьте мой вопрос о самом быстром способе взрыва ассоциативного массива .

<?php
$QueryString = 'catid=3&sort=date&year=2009&page=2'; // sample querystring
parse_str($QueryString, $HttpQuery);

print_r($HttpQuery); // will be an associative array

$HttpQuery['page'] = 3; // change any values

$NewQueryString = http_build_query($HttpQuery); // rebuild the querystring
1 голос
/ 04 марта 2009

Хотя большинство решений, представленных здесь, будут работать, я думаю, что самый простой способ сделать это будет

// parse query string into an array
$queryData = array();
parse_str($_SERVER['QUERY_STRING'], $queryData);
/*
 * ... manipulate array $queryData
 */
// rebuild query string
$queryString = http_build_query($queryData, null, '&amp;'); // or use & if you don't need XHTML compliance

Вот и все. Пожалуйста, смотрите документацию по http_build_query() и parse_str() (это одна из тех функций, чье имя было полностью испорчено - никто не ожидал, что функция сделает то, что она делает, просто посмотрев на имя).

1 голос
/ 04 марта 2009

Если вы хотите сказать, что ссылка на страницу 3 будет только

index.php?page=3

или ссылка на изменение метода сортировки будет только

index.php?sort=date

Вам придется хранить другие переменные в переменных сеанса (или куки, если вы хотите, чтобы они сохранялись дольше).

Примерно так:

<?php

  session_start();

  foreach($_GET as $var => $val) {
    // filter any malicious stuff and invalid variables out of $var and $val here
    // like
    if (in_array($var, $array_of_valid_variable_names)) {
      if ($var == 'page') $val = intval($val);

      $_SESSION[$var] = $val;
    }
  }

  // do stuff based on the values stored in $_SESSION

  echo '<a href="index.php?page='.($_SESSION['page'] + 1).'">Next page</a>';
?>
0 голосов
/ 04 марта 2009

Добавьте имя и значение переменной в конце строки запроса (смена страницы на 3):

index.php?catid=3&sort=date&year=2009&page=2&x=page&y=3

Затем, после извлечения $ _GET, используйте простую функцию, чтобы проверить, установлены ли x и y.

Если это так, задайте для переменной, имя которой содержится в x, значение y.

Вы можете использовать одну и ту же ссылку везде с простым добавлением в конце, и объем программирования минимален.

0 голосов
/ 04 марта 2009

У меня была точно такая же проблема с общим классом "создай мне сортируемую таблицу". Вот почему кто-то изобрел подпроцедуры под названием «функции» в php.

Вы должны создать функцию, которая будет обрабатывать именно процесс построения ссылок. вот так:

/**
* $set: associative array of changing vars
* $unset : normal array of vars to delete
**/
function get_link($set,$unset=array())
{
 $set+=$_GET;
 if ($unset && is_array($unset))
   foreach($unset as $idx) 
      unset($set[$idx]);

 if ($set)
   foreach($set as $name=>$value)
      $pairs[]=$name.'='.urlencode($value);

 return $_SERVER['SCRIPT_NAME']."?".join('&',$pairs);
}

НЕПРОВЕРЕННЫЙ КОД! Используй свой мозг

или вы можете использовать $ _SESSION-vars для разбивки на страницы и сортировки (и т. П.) И иметь ссылки, изменяющие только те (что я в основном и делаю в настоящее время)

0 голосов
/ 04 марта 2009

Не управляйте строкой напрямую, а управляйте ее представлением в виде массива (ключ => значение) и переводите ее обратно в строку только при необходимости.

Один из возможных способов сделать это:

function explodeQueryString( $queryString )
{
    $parts = array();
    if ( strlen( $queryString ) > 1 && substr( $queryString, 0, 1 ) == '?' )
    {
        $q = explode( '&', substr( $queryString, 1 ) );
        foreach( $q as $part )
        {
            list( $key, $value ) = explode( '=', $part );
            $parts[ urldecode( $key ) ] = urldecode( $value );
        }
    }
    return $parts;
}

function implodeQueryString( array $arguments )
{
    $parts = array();
    foreach( $arguments as $key => $value )
    {
        $parts[ ] = sprintf( '%s=%s', urlencode( $key ), urlencode( $value ) );
    }
    return sprintf( '?%s', implode( '&', $parts ) );
}

// $query = $_GET;

$query = '?something=1&somethingelse=2&page=1&yetsomethingelse=3';

$q = explodeQueryString( $query );

print_r( $q );

$q[ 'page' ] += 1;

$query = implodeQueryString( $q );

echo $query;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...