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

322

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

www.mysite.com/category/subcategory?myqueryhash

Вывод должен быть: myqueryhash

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

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

<?php
   echo $_GET['q'];  //Output: myquery
?>
enloz
источник

Ответы:

527

$_SERVER['QUERY_STRING'] содержит данные, которые вы ищете.


ДОКУМЕНТАЦИЯ

Филипп Розен - refp
источник
28
print_r ($ _ SERVER) для поиска связанных значений
22
примечание: $_SERVER['QUERY_STRING']покажет foo=bar2для строки запроса, какfoo=bar1&foo=bar2
Тимо Хуовинен
3
Для того, чтобы получить более читаемый вывод, вы можете обернуть print_r()заявление в <pre>тегах: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Амаль Мурали
1
@RJAnoop В этом случае qstring является частью URL, поэтому вы можете использовать его $_SERVER['REQUEST_URI'], хотя вы можете рассмотреть возможность использования mod_rewrite для передачи этой части URL в качестве переменной. См stackoverflow.com/questions/16388959/url-rewriting-with-php
допустимость пустых
5
Так почему же это лучше, чем использование $ _GET?
still_dreaming_1
92

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

Пример:

$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"

Полная документация здесь

медина
источник
15
На самом деле это лучший ответ, основанный на вопросе. Другие ответы получают только текущий URI, тогда как в вопросе указывается только «из URL».
Крис Харрисон
80

Функция 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.

sbrbot
источник
52
... и это злая, злая функция, которая не должна существовать.
Zenexer
6
Zenexer, не могли бы вы подробнее рассказать о своем утверждении? ПОЧЕМУ это ЗЛО?
sbrbot
26
Вы никогда не должны слепо превращать параметры строки запроса в переменные. Как вы думаете, что произойдет, если кто-то использует ключ, который соответствует реальной переменной? Это требует подвигов. Вот почему эта функция крайне не рекомендуется. Вы можете настроить PHP так, чтобы он делал это автоматически, без вызова parse_str, но, естественно, это считается нет-нет.
Zenexer
42
Вы можете использовать второй параметр parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- теперь $paramsмассив будет содержать все значения строки запроса.
Амаль Мурали
13
«Никогда не следует слепо превращать параметры строки запроса в переменные». Такие утверждения абсолютно абсурдны. «Никогда» -> откуда вы знаете, в каких ситуациях данный кодер будет сталкиваться в случайный час случайного рабочего дня ........ Абсолютная чепуха. Там нет такого слова, как «никогда». НИЧЕГО опасно, если вы используете его неправильно, НИЧЕГО полезно, если вы используете его правильно ....... 10 лет назад многие люди так говорили об IFRAME. зло, абсолютная глупость абсолютный риск безопасности. потом появился фейсбук, потом появился соцсеть, везде фреймы и никто так не говорит сейчас ...
unity100
42

Если вы хотите всю строку запроса:

$_SERVER["QUERY_STRING"]
Джейсон Т Ферингем
источник
25

Я рекомендую лучший ответ как

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

Предполагая, что пользователь ввел http://example.com/?name=Hannes

Приведенный выше пример выведет:

Привет Ханнес!

user3816325
источник
4
Это самый быстрый и простой способ получить переменные из заданной строки запроса.
Мирко Бруннер
2
ОП спросила, как получить параметр запроса из URL example.com/?Hannes...
Филипп,
5

Также, если вы ищете текущее имя файла вместе со строкой запроса, вам просто нужно следующее

basename($_SERVER['REQUEST_URI'])

Это даст вам информацию, как в следующем примере

file.php? arg1 = значение & арг2 = значение

И если вам также нужен полный путь к файлу, начиная с root, например /folder/folder2/file.php?arg1=val&arg2=val, просто удалите функцию basename () и просто используйте поиск

$_SERVER['REQUEST_URI']
К. Шахзад
источник
2
/является допустимым символом в строках запроса (см. RFC 3986 ), поэтому на него нельзя положиться basename.
Кэрнарвон
1
Это не будет работать, если строка запроса содержит косую черту и поэтому небезопасна. Вам лучше получить строку запроса, удалить ее из конца URI запроса, затем запустить basename () - и, конечно, добавить строку запроса в конец.
Zenexer
4

Вот моя функция для перестройки частей строки запроса REFERRER .

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

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

function refererQueryString(/* var args */) {

    //Return empty string if no referer or no $_GET vars in referer available:
    if (!isset($_SERVER['HTTP_REFERER']) ||
        empty( $_SERVER['HTTP_REFERER']) ||
        empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {

        return '';
    }

    //Get URL query of referer (something like "threadID=7&page=8")
    $refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);

    //Which values do you want to extract? (You passed their names as variables.)
    $args = func_get_args();

    //Get '[key=name]' strings out of referer's URL:
    $pairs = explode('&',$refererQueryString);

    //String you will return later:
    $return = '';

    //Analyze retrieved strings and look for the ones of interest:
    foreach ($pairs as $pair) {
        $keyVal = explode('=',$pair);
        $key = &$keyVal[0];
        $val = urlencode($keyVal[1]);
        //If you passed the name as arg, attach current pair to return string:
        if(in_array($key,$args)) {
            $return .= '&'. $key . '=' .$val;
        }
    }

    //Here are your returned 'key=value' pairs glued together with "&":
    return ltrim($return,'&');
}

//If your referer was 'page.php?foo=1&bar=2&baz=3'
//and you want to header() back to 'page.php?foo=1&baz=3'
//(no 'bar', only foo and baz), then apply:

header('Location: page.php?'.refererQueryString('foo','baz'));
Adriana
источник
4

Этот код и обозначение не мое. Эван К решает многозначный запрос имени с пользовательской функцией;) взят из:

http://php.net/manual/en/function.parse-str.php#76792 Кредиты предоставляются Эван К.

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

<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');

# the above produces:
$foo = array('foo' => '3');
?>

Instead, PHP uses a non-standards compliant practice of including brackets in fieldnames to achieve the same effect.

<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

This can be confusing for anyone who's used to the CGI standard, so keep it in mind.  As an alternative, I use a "proper" querystring parser function:

<?php
function proper_parse_str($str) {
  # result array
  $arr = array();

  # split on outer delimiter
  $pairs = explode('&', $str);

  # loop through each pair
  foreach ($pairs as $i) {
    # split into name and value
    list($name,$value) = explode('=', $i, 2);

    # if name already exists
    if( isset($arr[$name]) ) {
      # stick multiple values into an array
      if( is_array($arr[$name]) ) {
        $arr[$name][] = $value;
      }
      else {
        $arr[$name] = array($arr[$name], $value);
      }
    }
    # otherwise, simply stick it in a scalar
    else {
      $arr[$name] = $value;
    }
  }

  # return result array
  return $arr;
}

$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>
aimiliano
источник
3

Благодаря @K. Shahzad Это помогает, когда вы хотите переписать строку запроса без каких-либо дополнений перезаписи. Допустим, вы переписали / 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();
Сяак Виш
источник
2

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

// Inintialize URL to the variable 
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90'; 

// Use parse_url() function to parse the URL 
// and return an associative array which 
// contains its various components 
$url_components = parse_url($url); 

// Use parse_str() function to parse the 
// string passed via URL 
parse_str($url_components['query'], $params); 

// Display result 
echo 'v parameter value is '.$params['v'];

Это сработало для меня. Я надеюсь, это также поможет вам :)

Kamlesh
источник
Вывод: значение параметра v является qnMxsGeDz90
Kamlesh
1

Для получения каждого узла в 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, поэтому я добавил третий параметр в эту функцию.

Пол З.
источник