Web

Как получить параметры строки URL-запроса

Какой способ получения параметров из строки запроса URL, имеющей следующий формат, является «менее кодо-затратным»

www.mysite.com/category/subcategory?myqueryhash

 На выходе должно получиться: myqueryhash

Я знаю об этом подходе:

www.mysite.com/category/subcategory?q=myquery

<?php

   echo $_GET['q'];  //Выводит: myquery

?>

 

 Ответ 1

Этот код и обозначения не мои. Взято из:

http://php.net/manual/en/function.parse-str.php#76792 Credits go to Evan K.

 Стоит отметить, что встроенная функция parse_str НЕ обрабатывает строку запроса стандартным для CGI способом, когда дело доходит до дублирования полей. Если в строке запроса существует несколько одноименных полей, любой другой язык обработки веб-страниц считывает их в массив, но PHP молча перезаписывает их:

<?php

# не удается обработать несколько значений

parse_str('foo=1&foo=2&foo=3');

# вышесказанное производит:

$foo = array('foo' => '3');

?>

 Вместо этого PHP использует не соответствующую стандартам практику включения скобок в имена полей для достижения того же эффекта.

<?php

# странное поведение, специфичное для php

parse_str('foo[]=1&foo[]=2&foo[]=3');

# вышесказанное производит:

$foo = array('foo' => array('1', '2', '3') );

?>

 Это может сбить с толку тех, кто привык к стандарту CGI, поэтому имейте это в виду. В качестве альтернативы я использую «правильную» функцию парсера строк запроса:

<?php

function proper_parse_str($str) {

   # результирующий массив

  $arr = array();

  # разделение по внешнему разделителю

  $pairs = explode('&', $str);

  # пройдитесь по каждой паре

  foreach ($pairs as $i) {

    # разделить на имя и значение

    list($name,$value) = explode('=', $i, 2);

    # если имя уже существует

    if( isset($arr[$name]) ) {

      # поместить несколько значений в массив
      if( is_array($arr[$name]) ) {

        $arr[$name][] = $value;

      } else {

        $arr[$name] = array($arr[$name], $value);

      }

    } else {

      # в противном случае просто поместите его в скалярную величину

      $arr[$name] = $value;

    }

  }

   # возврат массива результатов  

   return $arr;

}

$query = proper_parse_str($_SERVER['QUERY_STRING']);

?>

 

 Ответ 2

Вот моя функция для перестройки частей строки запроса РЕФЕРЕРА. Если вызывающая страница уже имеет строку запроса в своем URL и вы должны вернуться на эту страницу, а также хотите отправить обратно некоторые, не все, параметры $_GET (например, номер страницы).

Пример: Строка запроса реферера была ?foo=1&bar=2&baz=3 вызов refererQueryString( 'foo' , 'baz' ) возвращает foo=1&baz=3":

function refererQueryString(/* var args */) {

    //Возвращает пустую строку, если нет реферера или отсутствуют параметры $_GET в реферере:

    if (!isset($_SERVER['HTTP_REFERER']) ||

        empty( $_SERVER['HTTP_REFERER']) ||

        empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {

        return '';

    }

 

    //Получить URL-запрос реферера (что-то вроде "threadID=7&page=8")

    $refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);

    //Какие значения вы хотите извлечь? (Вы передали их имена в качестве переменных).

    $args = func_get_args();

    //Получение строк '[key=name]' из URL реферера:

    $pairs = explode('&',$refererQueryString);

    //Строка, к которой вы вернетесь позже:

    $return = '';

    //Анализируйте полученные строки и ищите те, которые представляют интерес:

    foreach ($pairs as $pair) {

        $keyVal = explode('=',$pair);

        $key = &$keyVal[0];

        $val = urlencode($keyVal[1]);

        //Если вы передали имя в качестве аргумента, присоедините текущую пару к возвращаемой строке:

        if(in_array($key,$args)) {

            $return .= '&'. $key . '=' .$val;

        }

    }

    //Здесь находятся возвращенные вами пары 'ключ=значение', склеенные вместе с помощью "&":

    return ltrim($return,'&');

}

//Если ваш реферер был 'page.php?foo=1&bar=2&baz=3'

//и вы хотите вернуть header() обратно к 'page.php?foo=1&baz=3'

//(без 'bar', только foo и baz), то примените:

header('Location: page.php?'.refererQueryString('foo','baz'));

 

Ответ 3

Язык программирования: PHP

// Вводим URL в переменную 

$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90'; 

// Используйте функцию parse_url() для разбора URL-адреса 

// и возвращает ассоциативный массив, содержащий его различные компоненты 

$url_components = parse_url($url); 

 // Используйте функцию parse_str() для разбора строки. 

// строку, переданную через URL 

parse_str($url_components['query'], $params); 

    

// Выводим результат 

echo 'Значение параметра v равно ' . $params['v'];

Это сработало для меня.

 

Ответ 4

Для получения каждого узла в URI можно использовать функцию explode() для $_SERVER['REQUEST_URI']. Если вы хотите получить строки, не зная, переданы они или нет, вы можете использовать функцию, которую я определил сам, для получения параметров запроса из $_REQUEST (так как она работает как для POST, так и для GET параметров).

function getv($key, $default = '', $data_type = '') {

    $param = (isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default);

    if (!is_array($param) && $data_type == 'int') {

        $param = intval($param);

    }

    return $param;

}

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

 

Ответ 5

Это помогает, когда вам нужна переписанная строка запроса без каких-либо дополнений к ней. Допустим, вы переписали /test/?x=y в index.php?q=test&x=y и вам нужна только строка запроса.

function get_query_string(){

    $arr = explode("?", $_SERVER['REQUEST_URI']);

    if (count($arr) == 2){

        return "";

    } else{

        return "?" . end($arr) . "<br>";

    }

}

$query_string = get_query_string();

 

Ответ 6

Функция parse_str() автоматически считывает все параметры запроса в массив. Например, если URL имеет вид http://www.example.com/page.php?x=100&y=200, то код:

$queries = array();

parse_str($_SERVER['QUERY_STRING'], $queries);

будет хранить параметры в массиве $queries ($queries['x']=100, $queries['y']=200). Посмотрите документацию к функции parse_str.

Согласно документации PHP, функция parse_str() должна использоваться только со вторым параметром. Использование parse_str($_SERVER['QUERY_STRING']) для данного URL создаст переменные $x и $y, что делает код уязвимым для атак типа http://www.example.com/page.php?authenticated=1.

Схожие статьи

Web

Самый простой способ профилировать PHP-скрипт

Плюсы и минусы разработки веб-приложений на Node.js
Web

Плюсы и минусы разработки веб-приложений на Node.js

Web

Когда использовать self вместо $this?

Web

Предпочтительный метод хранения массивов PHP (json_encode vs serialize)

×