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

234

Что такое способ "меньше кода" для получения параметров из строки запроса URL-адреса, которая отформатирована следующим образом?

www.mysite.com/category/subcategory?myqueryhash

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

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

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

<?php
   echo $_GET['q'];  //Output: myquery
?>
Теги:
url
query-string

10 ответов

412
Лучший ответ

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


Documentation

  • 25
    print_r ($ _ SERVER) для поиска связанных значений
  • 18
    примечание: $_SERVER['QUERY_STRING'] покажет foo=bar2 для строки запроса, такой как foo=bar1&foo=bar2
Показать ещё 8 комментариев
44

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

Пример:

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

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

  • 13
    На самом деле это лучший ответ, основанный на вопросе. Остальные ответы получают только текущий URI, тогда как в вопросе указывается только «из URL».
44

Функция parse_str автоматически преобразует все параметры запроса в соответствующие переменные PHP. Например, по следующему URL-адресу:

http://www.domain.com/page.php?x=100&y=200

этот код:

parse_str($_SERVER['QUERY_STRING']);

автоматически создаст переменные $x и $y со значениями 100 и 200, которые вы затем можете использовать в своем коде.

  • 49
    ... и это злая, злая функция, которая не должна существовать.
  • 4
    Zenexer, не могли бы вы подробнее рассказать о своем утверждении? ПОЧЕМУ это ЗЛО?
Показать ещё 8 комментариев
36

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

$_SERVER["QUERY_STRING"]
18

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

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

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

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

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

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

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

basename($_SERVER['REQUEST_URI'])

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

file.php арг1 = Val &? Арг2 = значение

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

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

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

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

Пример: строка запроса Referrer была ?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 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'));
1

Благодаря @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();
1

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

http://php.net/manual/en/function.parse-str.php#76792 Кредиты идут к Evan K.

Следует отметить, что parse_str builtin НЕ обрабатывает строку запроса стандартным способом 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 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']);
?>
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню