Как получить значение (somestring) из & ldquo; example.com/? Somestring & rdquo; в php? [Дубликат]

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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

267
задан Peter Mortensen 10 April 2014 в 20:52
поделиться

10 ответов

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


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

461
ответ дан Filip Roséen - refp 17 August 2018 в 20:45
поделиться
  • 1
    print_r ($ _ SERVER), чтобы найти соответствующие значения – user 12 December 2011 в 05:58
  • 2
    note: $_SERVER['QUERY_STRING'] отобразит foo=bar2 для строки запроса, например foo=bar1&foo=bar2 – Timo Huovinen 9 May 2013 в 14:39
  • 3
    Чтобы получить более читаемый вывод, вы можете обернуть оператор print_r() в тегах <pre>: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';. – Amal Murali 21 March 2014 в 14:08
  • 4
    @RJAnoop В этом случае qstring является частью URL-адреса, поэтому вы можете использовать $_SERVER['REQUEST_URI'], хотя вы можете захотеть использовать mod_rewrite для передачи этой части URL-адреса в качестве переменной. См. stackoverflow.com/questions/16388959/url-rewriting-with-php – nullability 10 June 2014 в 19:12
  • 5
    Так почему же это лучше, чем использование $ _GET? – still_dreaming_1 1 August 2017 в 23:30

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

$_SERVER["QUERY_STRING"]
39
ответ дан Jason T Featheringham 17 August 2018 в 20:45
поделиться

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

basename($_SERVER['REQUEST_URI'])

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

file.php? arg1 = val & amp; arg2 = val

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

$_SERVER['REQUEST_URI']
4
ответ дан K. Shahzad 17 August 2018 в 20:45
поделиться
  • 1
    / является допустимым символом в строках запроса (см. RFC 3986 ), поэтому вы не можете полагаться на basename. – Cairnarvon 16 January 2015 в 02:16
  • 2
    Это не будет работать, если в строке запроса есть косая черта, и поэтому она небезопасна. Вам лучше получить запрос, удалив его с конца URI запроса, then запустив basename () - тогда, конечно же, добавьте querystring в конец. – Zenexer 30 June 2015 в 20:47

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

Пример:

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

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

63
ответ дан medina 17 August 2018 в 20:45
поделиться
  • 1
    На самом деле это лучший ответ, основанный на вопросе. Другой ответ только получает текущий URI, тогда как вопрос только указывает «из URLS». – Chris Harrison 29 August 2013 в 06:38

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

1
ответ дан Paul Z. 17 August 2018 в 20:45
поделиться

Вот моя функция для восстановления частей строки запроса 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'));
3
ответ дан Peter Mortensen 17 August 2018 в 20:45
поделиться

Функция 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.

52
ответ дан sbrbot 17 August 2018 в 20:45
поделиться
  • 1
    .. и есть злая, злая функция, которая не должна существовать. – Zenexer 17 July 2013 в 03:31
  • 2
    Zenexer вы можете уточнить свое заявление немного больше? Почему это зло? – sbrbot 3 August 2013 в 23:40
  • 3
    Вы никогда не должны слепо превращать параметры запроса в переменные. Как вы думаете, что произойдет, если кто-то использует ключ, соответствующий реальной переменной? Он просит эксплойтов. Вот почему эта функция сильно обескуражена. Вы можете установить PHP для этого автоматически, не вызывая parse_str, но, естественно, это считается no-no. – Zenexer 4 August 2013 в 06:16
  • 4
    Вы можете использовать второй параметр parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params); - теперь массив $params будет содержать все значения строки запроса. – Amal Murali 20 October 2013 в 06:24
  • 5
    «Вы никогда не должны слепо превращать параметры запроса в переменные». Такие заявления абсолютно абсурдны. & Quot; никогда & Quot; - & GT; как вы знаете, какие ситуации любой кодер будет испытывать в случайный час случайного рабочего дня ........ Абсолютная глупость. Нет такого слова, как «никогда». НИЧЕГО опасно, когда вы используете его неправильно, НИЧЕГО полезно, когда вы используете его правильно ....... 10 лет назад многие люди говорили так, как о IFRAME. зло, абсолютная глупость. абсолютный риск безопасности. затем пришел facebook, затем появился социальный, iframes повсюду, и никто сейчас так не говорит ... – unity100 27 September 2015 в 21:34

Благодаря @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();
1
ответ дан Sjaak Wish 17 August 2018 в 20:45
поделиться

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

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

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

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

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

19
ответ дан user3816325 17 August 2018 в 20:45
поделиться
  • 1
    Это самый быстрый и простой способ получить вары из данной строки запроса. – Mirko Brunner 24 January 2015 в 12:59
  • 2
    OP спросил, как получить параметр запроса из URL 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']);
?>
1
ответ дан Wayne Werner 17 August 2018 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: