Отримати параметри рядка запиту URL-адреси


322

Який спосіб "менш потрібний код" для отримання параметрів із рядка запиту URL, який відформатований наступним чином?

www.mysite.com/category/subcategory?myqueryhash

Вихід повинен бути: myqueryhash

Мені відомо про такий підхід:

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

<?php
   echo $_GET['q'];  //Output: myquery
?>

Відповіді:


527

$_SERVER['QUERY_STRING'] містить дані, які ви шукаєте.


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


28
print_r ($ _ SERVER), щоб знайти пов’язані значення

22
Примітка: $_SERVER['QUERY_STRING']буде показано foo=bar2для рядка запиту типуfoo=bar1&foo=bar2
— Timo Huovinen

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

91

Спосіб 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


EDIT

Відповідно до документації PHP, його parse_str()слід використовувати лише з другим параметром. Використання parse_str($_SERVER['QUERY_STRING'])цієї URL-адреси створить змінні $xта $y, що зробить код уразливим для таких атак http://www.example.com/page.php?authenticated=1.


52
..і - це зла, зла функція, яка не повинна існувати.
— Zenexer

6
Zenexer, чи можете ви детальніше розробити своє твердження? Чому це зло?
— sbrbot

26
Ніколи не слід сліпо перетворювати параметри запиту в змінні. Як ви думаєте, що трапляється, якщо хтось використовує ключ, що відповідає реальній змінній? Це прохання про подвиги. Ось чому ця особливість сильно не рекомендується. Ви можете налаштувати PHP робити це автоматично, без виклику parse_str, але, природно, це вважається "ні-ні".
— Zenexer

42
Ви можете використовувати другий параметр parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- тепер $paramsмасив буде містити всі значення рядка запиту.
— Амаль Муралі

13
"Ніколи не слід сліпо перетворювати параметри запиту в змінні" Такі твердження абсолютно абсурдні. "Ніколи" -> як ти знаєш, у яких ситуаціях переживає будь-який кодер у випадкову годину випадкового робочого дня ........ Абсолютна нісенітниця. Не існує такого слова, як "ніколи". БУДЬ-ЯКОГО небезпечно, коли ви неправильно вживаєте його, будь-що корисно, коли ви правильно його використовуєте ....... 10 років тому багато людей говорили так про ІФРЕМ. зло, абсолютна дурість. абсолютний ризик безпеки. потім прийшов у фейсбук, потім прийшов соціальний, якщо скрізь і ніхто вже не розмовляє так ...
— Єдність100


25

Я рекомендую найкращу відповідь як

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

Якщо припустити, що користувач ввів http://example.com/?name=Hannes

Наведений вище приклад виведе:

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


4
Це найшвидший і найпростіший спосіб отримати значення vars із заданого рядка запиту.
— Мірко Бруннер

2
ОП запитала, як отримати параметр запиту з URL example.com/?Hannes...
— Філіпп

5

Також якщо ви шукаєте поточне ім'я файлу разом із рядком запиту, вам знадобиться лише наступне

basename($_SERVER['REQUEST_URI'])

Це дасть вам інформацію, як наступний приклад

file.php? arg1 = val & arg2 = val

І якщо ви також хочете, щоб повний шлях до файлу також починався від кореня, наприклад, /folder/folder2/file.php?arg1=val&arg2=val, тоді просто видаліть функцію basename () і просто використовуйте fillowing

$_SERVER['REQUEST_URI']

2
/є дійсним символом у рядках запиту (див. RFC 3986 ), тому на нього не можна покладатися basename.
— Cairnarvon

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'));

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']);
?>

3

Завдяки @K. Шахзад Це допомагає, коли потрібно переписати рядок запитів без будь-яких доповнень для перезапису. Скажімо, ви перезаписали / 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'];

Це працювало для мене. Сподіваюся, це теж допоможе вам :)


Висновок: значення параметра 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, тому я додав третій параметр до цієї функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.