Передача параметров в php из адресной строки браузера

Обновлено: 07.07.2024

Эта функция разбирает URL и возвращает ассоциативный массив, содержащий все компоненты URL, которые в нём присутствуют. Элементы массива не будут декодированы как URL.

Эта функция не предназначена для проверки на корректность данного URL, она только разбивает его на нижеперечисленные части. Частичные и недопустимые URL также принимаются, parse_url() пытается сделать всё возможное, чтобы разобрать их корректно.

Список параметров

URL для разбора.

Укажите одну из констант PHP_URL_SCHEME , PHP_URL_HOST , PHP_URL_PORT , PHP_URL_USER , PHP_URL_PASS , PHP_URL_PATH , PHP_URL_QUERY или PHP_URL_FRAGMENT , чтобы получить только конкретный компонент URL в виде строки ( string ). Исключением является указание PHP_URL_PORT , в этом случае возвращаемое значение будет типа int .

Возвращаемые значения

При разборе значительно некорректных URL-адресов parse_url() может вернуть false .

Если параметр component определён, функция parse_url() вернёт строку ( string ) (или число ( int ), в случае PHP_URL_PORT ) вместо массива ( array ). Если запрошенный компонент не существует в данном URL, будет возвращён null . Начиная с PHP 8.0.0, parse_url() различает отсутствующие и пустые запросы и фрагменты:

Ранее во всех случаях запрос и фрагмент были null .

Обратите внимание, что управляющие символы (смотрите ctype_cntrl() ) в компонентах заменяются подчёркиванием ( _ ).

Список изменений

Версия Описание
8.0.0 parse_url() теперь различает отсутствующие и пустые запросы и фрагменты.

Примеры

var_dump ( parse_url ( $url ));
var_dump ( parse_url ( $url , PHP_URL_SCHEME ));
var_dump ( parse_url ( $url , PHP_URL_USER ));
var_dump ( parse_url ( $url , PHP_URL_PASS ));
var_dump ( parse_url ( $url , PHP_URL_HOST ));
var_dump ( parse_url ( $url , PHP_URL_PORT ));
var_dump ( parse_url ( $url , PHP_URL_PATH ));
var_dump ( parse_url ( $url , PHP_URL_QUERY ));
var_dump ( parse_url ( $url , PHP_URL_FRAGMENT ));
?>

Результат выполнения данного примера:

// До 5.4.7 в path выводилось "//www.example.com/path"
var_dump ( parse_url ( $url ));
?>

Результат выполнения данного примера:

Примечания

Замечание:

Эта функция предназначена специально для разбора URL-адресов, а не URI. Однако, чтобы соответствовать требованиям обратной совместимости PHP, она делает исключение для протокола file://, в которой допускаются тройные слеши (file:///. ). Для любого другого протокола это недопустимо.

Смотрите также

User Contributed Notes 34 notes

[If you haven't yet] been able to find a simple conversion back to string from a parsed url, here's an example:

Here is utf-8 compatible parse_url() replacement function based on "laszlo dot janszky at gmail dot com" work. Original incorrectly handled URLs with user:pass. Also made PHP 5.5 compatible (got rid of now deprecated regex /e modifier).

$parts = parse_url ( $enc_url );

if( $parts === false )
throw new \ InvalidArgumentException ( 'Malformed URL: ' . $url );
>

foreach( $parts as $name => $value )
$parts [ $name ] = urldecode ( $value );
>

Here's a good way to using parse_url () gets the youtube link.
This function I used in many works:

<?php
function youtube ( $url , $width = 560 , $height = 315 , $fullscreen = true )
parse_str ( parse_url ( $url , PHP_URL_QUERY ), $my_array_of_vars );
$youtube = '<iframe allowtransparency="true" scrolling="no" width keyword">. $width . '" height keyword">. $height . '" src keyword">. $my_array_of_vars [ 'v' ]. '" frameborder="0"' .( $fullscreen ? ' allowfullscreen' : NULL ). '></iframe>' ;
return $youtube ;
>

I was writing unit tests and needed to cause this function to kick out an error and return FALSE in order to test a specific execution path. If anyone else needs to force a failure, the following inputs will work:

There's a quirk where this function will return the host as the "path" if there is a leading space.

Based on the idea of "jbr at ya-right dot com" have I been working on a new function to parse the url:

preg_match ( $r , $url , $out );

So both named and numbered array keys are possible.

It's quite advanced, but I think it works in any case. Let me know if it doesn't.

I have coded a function which converts relative URL to absolute URL for a project of mine. Considering I could not find it elsewhere, I figured I would post it here.

The following function takes in 2 parameters, the first parameter is the URL you want to convert from relative to absolute, and the second parameter is a sample of the absolute URL.

Currently it does not resolve '../' in the URL, only because I do not need it. Most webservers will resolve this for you. If you want it to resolve the '../' in the path, it just takes minor modifications.

function relativeToAbsolute ( $inurl , $absolute ) // Get all parts so not getting them multiple times :)
$absolute_parts = parse_url ( $absolute );
// Test if URL is already absolute (contains host, or begins with '/')
if ( ( strpos ( $inurl , $absolute_parts [ 'host' ]) == false ) ) // Define $tmpurlprefix to prevent errors below
$tmpurlprefix = "" ;
// Formulate URL prefix (SCHEME)
if (!(empty( $absolute_parts [ 'scheme' ]))) <
// Add scheme to tmpurlprefix
$tmpurlprefix .= $absolute_parts [ 'scheme' ] . "://" ;
>
// Formulate URL prefix (USER, PASS)
if ((!(empty( $absolute_parts [ 'user' ]))) and (!(empty( $absolute_parts [ 'pass' ])))) <
// Add user:port to tmpurlprefix
$tmpurlprefix .= $absolute_parts [ 'user' ] . ":" . $absolute_parts [ 'pass' ] . "@" ;
>
// Formulate URL prefix (HOST, PORT)
if (!(empty( $absolute_parts [ 'host' ]))) <
// Add host to tmpurlprefix
$tmpurlprefix .= $absolute_parts [ 'host' ];
// Check for a port, add if exists
if (!(empty( $absolute_parts [ 'port' ]))) // Add port to tmpurlprefix
$tmpurlprefix .= ":" . $absolute_parts [ 'port' ];
>
>
// Formulate URL prefix (PATH) and only add it if the path to image does not include ./
if ( (!(empty( $absolute_parts [ 'path' ]))) and ( substr ( $inurl , 0 , 1 ) != '/' ) ) <
// Get path parts
$path_parts = pathinfo ( $absolute_parts [ 'path' ]);
// Add path to tmpurlprefix
$tmpurlprefix .= $path_parts [ 'dirname' ];
$tmpurlprefix .= "/" ;
>
else <
$tmpurlprefix .= "/" ;
>
// Lets remove the '/'
if ( substr ( $inurl , 0 , 1 ) == '/' ) < $inurl = substr ( $inurl , 1 ); >
// Lets remove the './'
if ( substr ( $inurl , 0 , 2 ) == './' ) < $inurl = substr ( $inurl , 2 ); >
return $tmpurlprefix . $inurl ;
>
else // Path is already absolute. Return it :)
return $inurl ;
>
>

/* EXAMPLE 1 */
echo relativeToAbsolute ( $absolute , $absolute ) . "\n" ;
/* EXAMPLE 2 */
echo relativeToAbsolute ( "img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 3 */
echo relativeToAbsolute ( "/img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 4 */
echo relativeToAbsolute ( "./img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 5 */
echo relativeToAbsolute ( "../img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 6 */
echo relativeToAbsolute ( "images/img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 7 */
echo relativeToAbsolute ( "/images/img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 8 */
echo relativeToAbsolute ( "./images/img.jpg" , $absolute ) . "\n" ;
/* EXAMPLE 9 */
echo relativeToAbsolute ( "../images/img.jpg" , $absolute ) . "\n" ;

Sorry if the above code is not your style, or if you see it as "messy" or you think there is a better way to do it. I removed as much of the white space as possible.

Данные методом GET передаются путем их добавления к URL-адресу вызываемого сценария, предназначенного для обработки полученной информации. Для пояснения данного метода наберите в адресной строке браузера URL-адрес ресурса и добавьте сначала знак вопроса ( ? ), а затем строчку num=10 . Например


Если у вас локальный сервер, то обычно домен будет localhost , и тогда предыдущая запись будет выглядеть

В этом случае мы передаем параметр num равный 10. Для добавления следующих параметров сценарию нужно использовать разделитель - амперсант ( & ), например

В данном случае мы передали скрипту три параметра: num со значением 10, type со значением " new " и v со значением " text ".
Для получения этих параметров в скрипте нужно использовать встроенный массив $_GET. Ключами этого массива будут названия параметров. В нашем случае нужно использовать $_GET["num"], $_GET["type"],$_GET["v"] . Эти элементы массива и будут содержать значения переданных параметров. Для демонстрации этого примера создайте файл script.php следующего содержания

Немного прокомментирую созданную форму. Формы создаются тегом form . Поля формы создаются тегами input , select , textarea (подробнее можно почитать формы в HTML). В теге form в атрибуте action указывается URL-адрес скрипта, который получит данные формы. В нашем случае мы указали уже существующий у нас файл script.php . Атрибут method задает метод отправки данных. Мы указали метод GET. Теперь мы знаем, какому файлу будут переданы данные формы, и каким способом, осталось разобраться, где их там искать?!
Данные этой формы будут переданы веб-ресурсу браузером путем добавления их к URL-адресу: сначала будет знак вопроса ( ? ), затем будут представлены параметры разделенные амперсантом ( & ). Название параметра будет браться из атрибута name , которое должно быть прописано у любого поля формы. Значение параметра будет зависеть от типа поля. Если поле является текстовым, то значением будет введенный пользователем текст. Если же поле будет представлять собой список, группу переключателей или флажков, то значением параметра будет значение атрибута value выбранного элемента. Поясню на примере нашей формы. Если пользователь введет в поле input число 10, то названием параметра будет num (значение атрибута name тега input ), а значением будет 10 (введенное пользователем число). Соответственно браузер сформирует пару " num=10 ". Если пользователь из списка выберет вариант "Да", то названием параметра будет type (значение атрибута name тега select ), а значением будет yes (значение атрибута value тега option ). Соответственно браузер сформирует пару " type=yes ".
Теперь эту форму разместим на странице forma.php .

Теперь давайте рассмотрим, как работает метод POST.
Для отправки данных методом POST нужно использовать HTML -формы. Как мы помним, что за способ отправки данных формы отвечает атрибут method тега form . Поэтому нужно в атрибуте method тега form указать значение POST . В остальном форма может быть та же, как и для метода GET . Изменим нашу форму, которую мы уже использовали для передачи данных способом GET , для передачи методом POST .


Как видите, форма осталась та же за исключением атрибутов method и action . Теперь данные будут передаваться сценарию script_post.php . Поместим нашу форму на странице forma_post.php .

Теперь надо написать сценарий, который будет обрабатывать данные нашей формы.
Для получения в скрипте данных переданным методом POST нужно использовать встроенный массив $_POST. Ключами этого массива будут названия параметров. В нашем случае нужно использовать $_POST["num"], $_POST["type"],$_POST["v"] . Эти элементы массива и будут содержать значения переданных данных. Как видите отличие от использования способа GET , выражается лишь в использовании массива $_POST . Поэтому нам не составит труда написать файл script_post.php :

Сравнение методов GET и POST

При использовании метода GET данные передаются путем добавления к URL-адресу. Таким образом, они будут видны пользователю, что с точки зрения безопасности не всегда хорошо. Также максимальный объем передаваемых данных будет зависеть от браузера - от максимально-допустимого количества символов адресной строке браузера.
При использовании метода POST данные не будут видны пользователю (не отображаются в адресной строке браузера). И поэтому они более защищены, а, следовательно, и программа обрабатывающая эти данные более защищена в плане безопасности. Также объем передаваемых данных практически ни чем не ограничен.
Выбирая способ передачи данных нужно учитывать приведенные особенности и останавливаться на наиболее приемлемом методе.

Итак, мы снова продолжаем изучение основ PHP и в этой статье познакомимся со способами передачи переменных в PHP, а именно с методами GET и POST. Каждый из них имеет свои плюсы и минусы, и применяется в соответствующих ситуациях, речь о которых пойдет в данной статье. Мы также рассмотрим примеры кода, которые демонстрируют работу методов POST и GET.

Передача переменных при помощи метода GET

Данный метод передачи переменных применяется в PHP для передачи переменных в файл при помощи адресной строки. То есть переменные передаются сразу через адресную строку браузера. Примером может быть, например, ссылка на статью в WordPress без использования ЧПУ (SEF), которая имеет примерно следующий вид:

То есть в данном случае передается переменная $p со значением 315. Теперь давайте более подробно на примере рассмотрим работу метод GET. Пускай нам нужно передать в файл три переменных $a, $b и $c методом GET и вывести их сумму на экран. Для этого можно использовать следующий код.

Поскольку все переменные перед передачей будут помещаться в глобальный массив GET (Массивы в PHP), то мы первым делом присваиваем нашим переменным значения соответствующих элементов массива GET. Делаем это в самом начале во избежание разнообразных ошибок при передаче переменных. Далее для демонстрации работы прописываем произвольную формулу и выводим результат на экран.

Как видно с примера, сначала мы добавляем знак вопроса сразу после названия файла. Далее прописываем переменную и через равно указываем ее значение. После этого через амперсанд аналогичным образом перечисляем другие переменные. Теперь при переходе по этой ссылке нам выведется сумма переменных $a, $b и $c.

Данный способ очень простой и не требует создания дополнительных файлов. Все необходимые данные поступают прямо через адресную строку браузера.

Ну а теперь давайте перейдем ко второму способу передачи переменных в PHP – методу POST.

Передача переменных в PHP при помощи метода POST

Данный способ позволяет скрыто передавать переменные с одного файла в другой. Как вы уже поняли, обычно для этих целей используются два файла. В первом находится форма для ввода исходных данных, а во втором исполнительный файл, который принимает переменные. Для демонстрации давайте рассмотрим следующий код.

Код первого файла с формой для отправки данных. Дадим ему название post-1.php

  • action – указываем файл, в который будут передаваться переменные.
  • method – метод передачи переменных. В нашем случае это метод POST.
  • name – название формы. Одновременно в файл будет передана переменная с таким именем.
  • name – имена переменных. В нашем случае это имя и фамилия (переменные name и lastname).
  • type – тип поля. В нашем случае это текстовое поле.
  • name – имя кнопки и переменной, которая будет передана вместе с другими переменными.
  • type – тип кнопки. В нашем случае это кнопка для отправки данных.
  • value – текст на кнопке.

Код второго файла, который будет служить приемником переменных. Назовем его post-2.php

Как и с методом GET, мы первым делом присваиваем переменным значения соответствующих элементов глобального массива POST. Далее для наглядности выводим эти переменные на экран при помощи оператора вывода echo.

Когда происходит отправка данных формы PHP-скрипту, информация из этой формы автоматически становится доступной ему. Существует несколько способов получения этой информации, например:

Есть только два способа получить доступ к данным из форм HTML. Доступные сейчас способы приведены ниже:

Замечание:

Точки и пробелы в именах переменных преобразуется в знаки подчёркивания. Например, <input name="a.b" /> станет $_REQUEST["a_b"] .

PHP также понимает массивы в контексте переменных формы (смотрите соответствующие ЧАВО). К примеру, вы можете сгруппировать связанные переменные вместе или использовать эту возможность для получения значений списка множественного выбора select. Например, давайте отправим форму самой себе, а после отправки отобразим данные:

<?php
if ( $_POST ) echo '<pre>' ;
echo htmlspecialchars ( print_r ( $_POST , true ));
echo '</pre>' ;
>
?>
<form action="" method="post">
Имя: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Пиво: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="Отправь меня!" />
</form>

Имена переменных кнопки-изображения

При отправке формы вместо стандартной кнопки можно использовать изображение с помощью тега такого вида:

Когда пользователь щёлкнет где-нибудь на изображении, соответствующая форма будет передана на сервер с двумя дополнительными переменными - sub_x и sub_y . Они содержат координаты нажатия пользователя на изображение. Опытные программисты могут заметить, что на самом деле имена переменных, отправленных браузером, содержат точку, а не подчёркивание, но PHP автоматически преобразует точку в подчёркивание.

Замечание: Начиная с PHP 7.2.34, 7.3.23 и 7.4.11, соответственно, имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

Если вы хотите присвоить множество значений одной переменной cookie, вы можете присвоить их как массив. Например:

<?php
setcookie ( "MyCookie[foo]" , 'Testing 1' , time ()+ 3600 );
setcookie ( "MyCookie[bar]" , 'Testing 2' , time ()+ 3600 );
?>

Это создаст две разные cookie, хотя в вашем скрипте MyCookie будет теперь одним массивом. Если вы хотите установить именно одну cookie со множеством значений, сначала рассмотрите возможность использования к значениям такие функции, как serialize() или explode() .

Обратите внимание, что cookie заменит предыдущую cookie с тем же именем в вашем браузере, если только путь или домен не отличаются. Так, для приложения корзины покупок вы, возможно, захотите сохранить счётчик. То есть:

<?php
if (isset( $_COOKIE [ 'count' ])) $count = $_COOKIE [ 'count' ] + 1 ;
> else $count = 1 ;
>
setcookie ( 'count' , $count , time ()+ 3600 );
setcookie ( "Cart[ $count ]" , $item , time ()+ 3600 );
?>

Точки в именах приходящих переменных

Как правило, PHP не меняет передаваемых скрипту имён переменных. Однако следует отметить, что точка не является корректным символом в имени переменной PHP. Поэтому рассмотрим такую запись:

По этой причине важно отметить, что PHP будет автоматически заменять любые точки в именах, приходящих переменных на символы подчёркивания.

Определение типов переменных

Поскольку PHP определяет типы переменных и преобразует их (как правило) по мере необходимости, не всегда очевидно, какой тип имеет данная переменная в любой момент времени. PHP содержит несколько функций, позволяющих определить тип переменной, таких как: gettype() , is_array() , is_float() , is_int() , is_object() и is_string() . Смотрите также раздел Типы.

HTTP является текстовым протоколом, и большинство, если не всё, содержимое, которое приходит в суперглобальные массивы, например, $_POST и $_GET , останется в виде строк. PHP не будет преобразовывать значения в определённый тип. В приведённом ниже примере $_GET["var1"] будет содержать строку "null", а $_GET["var2"] - строку "123".

Список изменений

Версия Описание
7.2.34, 7.3.23, 7.4.11 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

User Contributed Notes 30 notes

The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot):
chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)

PHP irreversibly modifies field names containing these characters in an attempt to maintain compatibility with the deprecated register_globals feature.

Important: Pay attention to the following security concerns when handling user submitted data :

This post is with regards to handling forms that have more than one submit button.

Suppose we have an HTML form with a submit button specified like this:

<input type="submit" value="Delete" name="action_button">

Normally the 'value' attribute of the HTML 'input' tag (in this case "Delete") that creates the submit button can be accessed in PHP after post like this:

<?php
$_POST [ 'action_button' ];
?>

We of course use the 'name' of the button as an index into the $_POST array.

This works fine, except when we want to pass more information with the click of this particular button.

Imagine a scenario where you're dealing with user management in some administrative interface. You are presented with a list of user names queried from a database and wish to add a "Delete" and "Modify" button next to each of the names in the list. Naturally the 'value' of our buttons in the HTML form that we want to display will be "Delete" and "Modify" since that's what we want to appear on the buttons' faceplates.

Both buttons (Modify and Delete) will be named "action_button" since that's what we want to index the $_POST array with. In other words, the 'name' of the buttons along cannot carry any uniquely identifying information if we want to process them systematically after submit. Since these buttons will exist for every user in the list, we need some further way to distinguish them, so that we know for which user one of the buttons has been pressed.

Using arrays is the way to go. Assuming that we know the unique numerical identifier of each user, such as their primary key from the database, and we DON'T wish to protect that number from the public, we can make the 'action_button' into an array and use the user's unique numerical identifier as a key in this array.

Our HTML code to display the buttons will become:

<input type="submit" value="Delete" name="action_button[0000000002]">
<input type="submit" value="Modify" name="action_button[0000000002]">

The 0000000002 is of course the unique numerical identifier for this particular user.

Then when we handle this form in PHP we need to do the following to extract both the 'value' of the button ("Delete" or "Modify") and the unique numerical identifier of the user we wish to affect (0000000002 in this case). The following will print either "Modify" or "Delete", as well as the unique number of the user:

<?php
$submitted_array = array_keys ( $_POST [ 'action_button' ]);
echo ( $_POST [ 'action_button' ][ $submitted_array [ 0 ]] . " " . $submitted_array [ 0 ]);
?>

$submitted_array[0] carries the 0000000002.
When we index that into the $_POST['action_button'], like we did above, we will extract the string that was used as 'value' in the HTML code 'input' tag that created this button.

If we wish to protect the unique numerical identifier, we must use some other uniquely identifying attribute of each user. Possibly that attribute should be encrypted when output into the form for greater security.

Читайте также: