NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
$_SERVER['QUERY_STRING']
содержит данные, которые вы ищете.
ДОКУМЕНТАЦИЯ
Если вы хотите получить всю строку запроса:
$_SERVER["QUERY_STRING"]
Также, если вы ищете имя текущего файла вместе с строкой запроса, вам просто нужно следующее
basename($_SERVER['REQUEST_URI'])
. Оно предоставит вам информацию, например, следующий пример:
file.php? arg1 = val & amp; arg2 = val
blockquote>И если вам также нужен полный путь к файлу, начиная с root, например /folder/folder2/file.php?arg1=val&arg2=val, тогда просто удалите функцию basename () и просто используйте fillowing
$_SERVER['REQUEST_URI']
/
является допустимым символом в строках запроса (см. RFC 3986 ), поэтому вы не можете полагаться на basename
.
– Cairnarvon
16 January 2015 в 02:16
PHP-способ сделать это - использовать функцию parse_url, которая анализирует URL-адрес и возвращает его компоненты. Включая строку запроса.
Пример:
$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"
Для получения каждого узла в 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, поэтому я добавил третий параметр к этой функции.
Вот моя функция для восстановления частей строки запроса 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'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'));
Функция parse_str()
автоматически считывает все параметры запроса в массив.
Например, если URL-адрес http://www.example.com/page.php?x=100&y=200
, код
$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);
будет хранить «x» = 100 и «y» = 200 в $queries
.
Посмотрите документацию parse_str
EDIT
Согласно документации PHP, parse_str()
следует использовать только с второй параметр. Использование parse_str($_SERVER['QUERY_STRING'])
на этом URL-адресе создаст переменные $x
и $y
, что сделает код уязвимым для таких атак, как http://www.example.com/page.php?authenticated=1
.
parse_str
, но, естественно, это считается no-no.
– Zenexer
4 August 2013 в 06:16
parse_str($_SERVER['QUERY_STRING'], $params);
- теперь массив $params
будет содержать все значения строки запроса.
– Amal Murali
20 October 2013 в 06:24
Благодаря @K. Shahzad Это помогает, когда вы хотите переписать строку запроса без каких-либо переписывающих дополнений. Скажем, вы переписываете / test /? X = y в index.php? Q = test & amp; 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();
Я рекомендую лучший ответ как
<?php
echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';
?>
Предполагая, что пользователь введен http://example.com/?name=Hannes
Вышеприведенный пример выводит:
Привет, Ханнес!
example.com/?Hannes
...
– Philipp
30 April 2017 в 19:29
Этот код и обозначения не мои. 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'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']);
?>
$_SERVER['QUERY_STRING']
отобразитfoo=bar2
для строки запроса, напримерfoo=bar1&foo=bar2
– Timo Huovinen 9 May 2013 в 14:39print_r()
в тегах<pre>
:echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
. – Amal Murali 21 March 2014 в 14:08$_SERVER['REQUEST_URI']
, хотя вы можете захотеть использовать mod_rewrite для передачи этой части URL-адреса в качестве переменной. См. stackoverflow.com/questions/16388959/url-rewriting-with-php – nullability 10 June 2014 в 19:12