Какой способ получения параметров из строки запроса URL, имеющей следующий формат, является «менее кодо-затратным»?
www.mysite.com/category/subcategory?myqueryhash
На выходе должно получиться: myqueryhash
Я знаю об этом подходе:
www.mysite.com/category/subcategory?q=myquery
<?php
echo $_GET['q']; //Выводит: myquery
?>
Ответ 1
Этот код и обозначения не мои. Взято из:
http://php.net/manual/en/function.parse-str.php#76792 Credits go to Evan K.
Стоит отметить, что встроенная функция parse_str НЕ обрабатывает строку запроса стандартным для CGI способом, когда дело доходит до дублирования полей. Если в строке запроса существует несколько одноименных полей, любой другой язык обработки веб-страниц считывает их в массив, но PHP молча перезаписывает их:
<?php
# не удается обработать несколько значений
parse_str('foo=1&foo=2&foo=3');
# вышесказанное производит:
$foo = array('foo' => '3');
?>
Вместо этого PHP использует не соответствующую стандартам практику включения скобок в имена полей для достижения того же эффекта.
<?php
# странное поведение, специфичное для php
parse_str('foo[]=1&foo[]=2&foo[]=3');
# вышесказанное производит:
$foo = array('foo' => array('1', '2', '3') );
?>
Это может сбить с толку тех, кто привык к стандарту CGI, поэтому имейте это в виду. В качестве альтернативы я использую «правильную» функцию парсера строк запроса:
<?php
function proper_parse_str($str) {
# результирующий массив
$arr = array();
# разделение по внешнему разделителю
$pairs = explode('&', $str);
# пройдитесь по каждой паре
foreach ($pairs as $i) {
# разделить на имя и значение
list($name,$value) = explode('=', $i, 2);
# если имя уже существует
if( isset($arr[$name]) ) {
# поместить несколько значений в массив
if( is_array($arr[$name]) ) {$arr[$name][] = $value;
} else {
$arr[$name] = array($arr[$name], $value);
}
} else {
# в противном случае просто поместите его в скалярную величину
$arr[$name] = $value;
}
}
# возврат массива результатов
return $arr;
}
$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>
Ответ 2
Вот моя функция для перестройки частей строки запроса РЕФЕРЕРА. Если вызывающая страница уже имеет строку запроса в своем URL и вы должны вернуться на эту страницу, а также хотите отправить обратно некоторые, не все, параметры $_GET (например, номер страницы).
Пример: Строка запроса реферера была ?foo=1&bar=2&baz=3 вызов refererQueryString( 'foo' , 'baz' ) возвращает foo=1&baz=3":
function refererQueryString(/* var args */) {
//Возвращает пустую строку, если нет реферера или отсутствуют параметры $_GET в реферере:
if (!isset($_SERVER['HTTP_REFERER']) ||
empty( $_SERVER['HTTP_REFERER']) ||
empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {
return '';
}
//Получить URL-запрос реферера (что-то вроде "threadID=7&page=8")
$refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);
//Какие значения вы хотите извлечь? (Вы передали их имена в качестве переменных).
$args = func_get_args();
//Получение строк '[key=name]' из URL реферера:
$pairs = explode('&',$refererQueryString);
//Строка, к которой вы вернетесь позже:
$return = '';
//Анализируйте полученные строки и ищите те, которые представляют интерес:
foreach ($pairs as $pair) {
$keyVal = explode('=',$pair);
$key = &$keyVal[0];
$val = urlencode($keyVal[1]);
//Если вы передали имя в качестве аргумента, присоедините текущую пару к возвращаемой строке:
if(in_array($key,$args)) {
$return .= '&'. $key . '=' .$val;
}
}
//Здесь находятся возвращенные вами пары 'ключ=значение', склеенные вместе с помощью "&":
return ltrim($return,'&');
}
//Если ваш реферер был 'page.php?foo=1&bar=2&baz=3'
//и вы хотите вернуть header() обратно к 'page.php?foo=1&baz=3'
//(без 'bar', только foo и baz), то примените:
header('Location: page.php?'.refererQueryString('foo','baz'));
Ответ 3
Язык программирования: PHP
// Вводим URL в переменную
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90';
// Используйте функцию parse_url() для разбора URL-адреса
// и возвращает ассоциативный массив, содержащий его различные компоненты
$url_components = parse_url($url);
// Используйте функцию parse_str() для разбора строки.
// строку, переданную через URL
parse_str($url_components['query'], $params);
// Выводим результат
echo 'Значение параметра v равно ' . $params['v'];
Это сработало для меня.
Ответ 4
Для получения каждого узла в 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, поэтому я добавил третий параметр в эту функцию.
Ответ 5
Это помогает, когда вам нужна переписанная строка запроса без каких-либо дополнений к ней. Допустим, вы переписали /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();
Ответ 6
Функция 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.
Согласно документации PHP, функция parse_str() должна использоваться только со вторым параметром. Использование parse_str($_SERVER['QUERY_STRING']) для данного URL создаст переменные $x и $y, что делает код уязвимым для атак типа http://www.example.com/page.php?authenticated=1.
Web