Управляйте строкой URL, добавляя параметры GET - PullRequest
69 голосов
/ 27 апреля 2011

Я хочу добавить параметры GET к URL-адресам, которые могут содержать и не содержать параметры GET без повторения ? или &.

Пример:

Если я хочу добавить category=action

$url="http://www.acme.com";
 // will add ?category=action at the end

$url="http://www.acme.com/movies?sort=popular";
 // will add &category=action at the end

Если вы заметили, я пытаюсь не повторять вопросительный знак, если он найден.

URL - это просто строка.

Какой надежный способ добавить определенный параметр GET?

Ответы [ 15 ]

1 голос
/ 24 сентября 2015

После поиска множества ресурсов / ответов по этой теме я решил написать свой собственный.Основываясь на ответе @ TaylorOtwell здесь, я обрабатываю входящий запрос $ _GET и изменяю / манипулирую каждым элементом.

Предполагая, что URL: http://domain.com/category/page.php?a=b&x=y И мне нужен только один параметр для сортировки: либо? desc = column_name или? asc = column_name.Таким образом, одного параметра url достаточно, чтобы отсортировать и упорядочить одновременно.Таким образом, URL будет http://domain.com/category/page.php?a=b&x=y&desc=column_name при первом щелчке соответствующей строки заголовка таблицы.

Затем у меня есть заголовки строк таблицы, по которым я хочу отсортировать DESC при первом щелчке, и ASC при втором щелчке.того же заголовка.(Каждый первый щелчок должен сначала «ORDER BY column DESC»). И если сортировка не выполняется, по умолчанию она будет сортироваться по «дате, затем идентификатору».

Вы можете улучшить ее, например, добавив очистку /функции фильтрации для каждого компонента $ _GET, но нижеследующая структура закладывает основу.

foreach ($_GET AS $KEY => $VALUE){
    if ($KEY == 'desc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE DESC";
        $URL_ORDER = $URL_ORDER . "&asc=$VALUE";
    } elseif ($KEY == 'asc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE ASC";
        $URL_ORDER = $URL_ORDER . "&desc=$VALUE";
    } else {
        $URL_ORDER .= "&$KEY=$VALUE";
        $URL .= "&$KEY=$VALUE";
    }
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}

(Вы можете использовать $ _SERVER [SCRIPT_URI] для полного URL, начинающегося с http://domain.com)

Затем я используюВ результате $ ORDER я получаю выше, в запросе MySQL:

"SELECT * FROM table WHERE limiter = 'any' $ORDER";

Теперь функция, чтобы посмотреть на URL, если есть предыдущая сортировка и добавить параметр сортировки (и упорядочения) к URL с «?» или«&» в соответствии с последовательностью:

        function sort_order ($_SORT){
            global $SORT, $URL_ORDER, $URL;
            if ($SORT == $_SORT){
                return $URL_ORDER;
            } else {
                if (strpos($URL, '?') !== false){
                    return "$URL&desc=$_SORT";
                } else {                        
                    return "$URL?desc=$_SORT";
                }
            }
        }

Наконец, заголовок строки таблицы для использования функции:

        echo "<th><a href='".sort_order('id')."'>ID</a></th>";

Сводка: это будет считывать URL, изменять каждый из $_GET компоненты и сделать окончательный URL с параметрами по вашему выбору с правильной формой использования "?" И "&"

0 голосов
/ 11 апреля 2019

Попробуйте эту функцию, чтобы добавить параметры URL .

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

<?php
  function addQueryString($a)
                {
             if (empty($_SERVER['QUERY_STRING']))
               return '?' . $a;
             else if (!empty($_SERVER['QUERY_STRING']))
              return '?' . $_SERVER['QUERY_STRING'] . '&' . $a;
                }
?>

 <a href="<?php echo addQueryString('lang=en'); ?>">test</a>
 <a href="<?php echo addQueryString('category=5'); ?>">sat</a>
0 голосов
/ 28 ноября 2017

еще одна улучшенная версия функции.Сочетание существующих ответов с небольшими улучшениями (поддержка портов) и исправлениями ошибок (правильная проверка ключей).

/**
 * @param string $url original url to modify - can be relative, partial etc
 * @param array $paramsOverride associative array, can be empty
 * @return string modified url
 */
protected function overrideUrlQueryParams($url, $paramsOverride){
    if (!is_array($paramsOverride)){
        return $url;
    }

    $url_parts = parse_url($url);

    if (isset($url_parts['query'])) {
        parse_str($url_parts['query'], $params);
    } else {
        $params = [];
    }

    $params = array_merge($params, $paramsOverride);

    $res = '';

    if(isset($url_parts['scheme'])) {
        $res .= $url_parts['scheme'] . ':';
    }

    if(isset($url_parts['host'])) {
        $res .= '//' . $url_parts['host'];
    }

    if(isset($url_parts['port'])) {
        $res .= ':' . $url_parts['port'];
    }

    if (isset($url_parts['path'])) {
        $res .= $url_parts['path'];
    }

    if (count($params) > 0) {
        $res .= '?' . http_build_query($params);
    }

    return $res;
}
0 голосов
/ 15 июня 2017
 public function addGetParamToUrl($url, $params)
{
    foreach ($params as $param) {
         if (strpos($url, "?"))
        {
            $url .= "&" .http_build_query($param); 
        }
        else
        {
            $url .= "?" .http_build_query($param); 
        }
    }
    return $url;
}
0 голосов
/ 27 апреля 2011

Я думаю, это то, что вы ищете:

Параметры URL регулярного выражения

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