Что такое способ «меньше кода» для получения параметров из строки запроса URL-адреса, которая отформатирована следующим образом?
www.mysite.com/category/subcategory?myqueryhash
Выход должен быть: myqueryhash
Я знаю об этом:
www.mysite.com/category/subcategory?q=myquery <?php echo $_GET['q']; //Output: myquery ?>
$_SERVER['QUERY_STRING']
содержит данные, которые вы ищете.
ДОКУМЕНТАЦИЯ
Функция parse_str автоматически преобразует все параметры запроса в соответствующие переменные PHP. Например, по следующему URL-адресу:
http://www.domain.com/page.php?x=100&y=200
этот код:
parse_str($_SERVER['QUERY_STRING']);
автоматически создаст переменные $ x и $ y со значениями 100 и 200, которые вы затем сможете использовать в своем коде.
PHP-способ сделать это – использовать функцию parse_url , которая анализирует URL-адрес и возвращает его компоненты. Включая строку запроса.
Пример:
$url = 'www.mysite.com/category/subcategory?myqueryhash'; echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"
Полная документация здесь
Если вы хотите получить всю строку запроса:
$_SERVER["QUERY_STRING"]
Я рекомендую лучший ответ, как
<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>
Предполагая, что пользователь ввел http://example.com/?name=Hannes
Вышеприведенный пример выводит:
Привет, Ханнес!
Кроме того, если вы ищете текущее имя файла вместе с строкой запроса, вам просто нужно следующее
basename($_SERVER['REQUEST_URI'])
Это предоставит вам информацию, как в следующем примере
file.php? arg1 = значение & арг2 = значение
И если вам также нужен полный путь к файлу, начиная с root, например /folder/folder2/file.php?arg1=val&arg2=val, тогда просто удалите функцию basename () и просто используйте наложение
$_SERVER['REQUEST_URI']
Вот моя функция для восстановления частей строки запроса REFERRER .
Если на вызывающей странице уже была строка запроса в собственном URL-адресе , и вы должны вернуться на эту страницу и хотите отправить некоторые, не все, из этих $_GET
варов (например, номер страницы).
Пример: строка запроса 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'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'));
Для получения каждого узла в 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, поэтому я добавил третий параметр этой функции.
Этот код и обозначения не мои. Evan K разрешает многозначное одноименное задание с пользовательской функцией;) берется из:
http://php.net/manual/en/function.parse-str.php#76792 Кредиты идут к Эвану К.
Следует отметить, что 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'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']); ?>
Благодаря @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();