Отримати параметри рядка запиту 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.