Начнём с метода GET. Если воспользоваться английским языком, то GET переводится как получать. То есть задача данного метода что-то получить от сервера, а никак не изменять данные на нём. Поэтому когда запрос должен получить какие-то данные и вывести их пользователю, то надо использовать метод GET. Самый яркий пример - это форма поиска, она почти всегда отправляет через GET, поскольку поиск извлекает данные и позволяет сохранить ссылку на эту страницу с результатами.
Теперь перейдём к методу POST. Задачей метода POST является модификация каких-либо данных на сервере, например, базы данных или файловой системы сервера, на основе запроса от пользователя. В этом случае надо использовать метод POST.
Так же метод POST надо использовать для скрытия отправляемых данных (например, для форм авторизации). Ещё надо помнить, что POST позволяет отправлять огромные объёмы данных по сравнению с GET. Поэтому если нужно отправить 10-20 тысяч символов, то без POST не обойтись.
Но очень важная рекомендация при использовании POST - делайте редирект хотя бы на ту же страницу, откуда и были отправлены данные. Без этого, если пользователь нажмёт F5 (то есть обновит страницу), то данные отправятся заново, а в большинстве случаев это совсем не нужно.
Используйте GET для получения данных (форма поиска, вывод какого-либо контента без каких-либо изменений на сервере). А POST используйте для отправки запроса, изменяющего данные на сервере, также для сокрытия отправляемых данных и для отправки больших объёмов. Только при использовании POST всегда делайте редирект после его обработки.
С точки зрения разработчика форма - это набор HTML-элементов, таких как <input>
, <select>
, <textarea>
и пр., которые заполняются пользователем, отправляются на сервер и обрабатываются с помощью PHP. Простой пример формы:
<form>
<input type="text" name="title">
<textarea name="content"></textarea>
</form>
В этой форме есть 2 поля для заполнения (input и textarea), а также кнопка отправки формы.
Если мы заполним эту форму любыми значениями и нажмём на кнопку, то переместимся на страницу с примерно таким URL: /?title=123&content=456
.
Итак, давайте разбираться, что тут вообще происходит.
Формы можно передавать с помощью методов GET и POST. Указывается метод с помощью атрибута method тега form:
<form method="POST">
</form>
Если метод не указан, то по умолчанию форма отправляется методом GET.
Формы, отправляемые методом GET, передают данные через URL-адрес.
Соответственно GET-параметр - это параметр, передаваемый в URL-адресе. Например, разберём URL /index.php?name=Vasya&price=1000
по частям:
/index.php
- ссылка на сам скрипт?
- символ, с которого всегда начинается перечисление GET-параметровname=Vasya
- это первый GET-параметр с ключом name и значением Vasya&
- разделитель между GET-параметрамиprice=1000
- это второй GET-параметр с ключом price и значением 1000Ну а раз мы эти параметры передали, значит теперь можем получить их в PHP. Для этого существует суперглобальный массив $_GET.
В отличие от обычных переменных, этот массив виден в любой области видимости, в т.ч. внутри функций. Внутри этого массива хранятся GET-параметры текущего запроса в виде ассоциативного массива.
Получить доступ к этим параметрам можно так:
echo $_GET['name'] . ' ' . $_GET['price'];
Когда вы отправляете форму, браузер получает ключ и значение каждого элемента (ключ указывается в атрибуте name, значение - то, что ввёл пользователь) и подставляет их в новый URL-адрес, на который затем и переходит.
Поэтому важно указывать атрибут name каждому элементу формы, иначе этот элемент не отправится на сервер.
Итак, создадим простенькую форму и добавим ей PHP-обработчик:
<?php
if(isset($_GET['form'])) {
echo $_GET['title'] . ' : ' . $_GET['content'] . '<br>';
} else {
echo 'Форма не отправлена';
}
?>
<form>
<input type="text" name="title">
<textarea name="content"></textarea>
<button name="form">Отправить</button>
</form>
Теперь при отправке заполненной формы PHP выведет на экран то, что мы в эту форму написали.
Когда вы заходите на любой сайт, вы делаете это методом GET. Вернее, ваш браузер сообщает серверу, что заход осуществляется методом GET. Когда вы переходите по страницам сайта - каждая страница запрашивается методом GET.
Однако у этого метода есть недостаток - GET-параметры видны в адресной строке. Это значит, что введённые в форму логин и пароль будут передаваться в URL-адресе, а значит видны в истории браузера, что очень нехорошо.
По этой причине для отправки форм, которые могут содержать конфиденциальную информацию, нужно всегда использовать метод POST. При использовании метода POST данные передаются в теле http-запроса, а не в URL.
Метод GET в формах чаще всего используется для поиска чего-либо (товаров, статей и т.д.).
Некоторые разработчики считают, что данные, передаваемые методом POST, имеют какую-то особую защиту, которая не позволяет злоумышленнику украсть или подменить их.
Это не так. Никакой дополнительной защиты у метода POST нет. Для защиты http-запросов нужно использовать https.
Данные, передаваемые методом POST, лежат в суперглобальном массиве $_POST. Теперь можно переписать нашу форму, чтобы она передавала данные методом POST:
<?php
if(isset($_POST['form'])) {
echo $_POST['title'] . ' : ' . $_POST['content'] . '<br>';
} else {
echo 'Форма не отправлена';
}
?>
<form method="post">
<input type="text" name="title">
<textarea name="content"></textarea>
<button name="form">Отправить</button>
</form>
Обработчик формы - это URL, на который отправится форма. По умолчанию форма отправляется на тот же URL-адрес, где она находится.
При желании вы можете отправлять форму не на текущий URL, а на какой-нибудь другой. Для этого достаточно указать путь к скрипту в атрибуте action:
<form action="/some_url.php">
<input type="submit">
</form>
В примере выше запрос будет отправлен скрипту /some_url.php.
Еще немного теории. В этой статье как передавать переменные и их значения между страницами. Итак, можно выделить три основных способа передачи переменных между PHP скриптами:
Каждый из этих вариантов удобен в конкретных случаях, и обычно, определить каким из массивов пользоваться не сложно. Зачем же передавать данные от одной страницы другой? Примеров масса, здесь и отправка html-формы на электронную почту, и авторизация пользователей, и работа корзины интернет магазина, а также различные фильтры и много много другого. На самом деле владеть методами работы с передачей данных между страницами необходимо любому, кто работает с PHP, без этого ну никуда. Итак, рассмотрим каждый метод передачи данных по очереди:
Как она происходит. Например, у вас есть страница, на которой динамически выводятся какие-либо данные. Чтобы было понятнее, возьмем интернет магазин (я думаю, практически каждый хоть раз сталкивался с написанием интернет магазинов, а если не сталкивался, то обязательно столкнется). Есть страница со списком товаров, и есть страница описания конкретного товара. Вывод описания товара осуществляется по его уникальному идентификатору в базе данных (естественно, я не рассматриваю случай, когда для каждого товара есть своя отдельная html страничка, на которую ведет ссылка из списка товаров, и я надеюсь что вы тоже уже переросли такие сайты). Задача заключается в следующем:
Есть две страницы: список товаров и описание товара. Как определить, описание какого товара показать пользователю, пришедшему со страницы списка товаров?
Решение:
http://домен.ру/product_list.php
- список товаровhttp://домен.ру/product_details.php
- описание конкретного товара. Чтобы передать идентификатор на страницу product_details.php нужно обратиться к ней по ссылке:http://домен.ру/product_details.php?product_id=идентификатор_продукта
и тогда значение идентификатора товара будет доступно как переменная $_GET['product_id']
. Ну и дальше можно его использовать в любом месте скрипта product_details.php. Обратите внимание, что все переменные передаются в адресной строке после знака вопроса ?
, чтобы предать несколько переменных их разделяют знаком &
. Например: http://домен.ру/product_list.php?category_id=1&order_by=price&order=DESC
. В этом примере мы передали файлу product_list.php переменные $_GET['category_id']
, $_GET['order_by']
и $_GET['order']
. Зачем это нужно? Например при сортировке списка товаров запрос к базе данных выглядит следующим образом: SELECT * FROM products ORDER BY price DESC
.
Передав переменные order_by
, order
и category_id
можно переписать наш запрос так: SELECT * FROM products WHERE category_id=$_GET['category_id'] ORDER BY $_GET['order_by'] $_GET['order'];
- таким образом можно писать фильтры для упорядоченного вывода данных.
Здесь уже не все так очевидно, как в случае $_GET, однако сложного тоже ничего нет. Каждый из нас ежедневно сталкивается с html-формами (авторизация, регистрация, поиск и т.д. и т.д.). А как и куда передаются данные, введенные вами в форме? Рассмотрим самую простую форму:
<form action="on_submit.php" method="post">
<input type="text" name="some_field" value="" />
<input type="submit" value="Отправить" />
</form>
Рассмотрим первую строку. Значение атрибута action
определяет файл обработчик формы, т.е. тот файл, которому будут доступны переменные формы. Атрибут action
может быть и пустым, тогда обрабатывать форму можно в той же странице, в которой она выводится.
Атрибут method
определяет, в какой массив будут помещены значения полей формы. Если method="get"
, переменные будут доступны в массиве $_GET
, если method="post"
- $_POST
. Теперь перейдем непосредственно к полям формы. Мы создали всего одно текстовое поле с атрибутом name="some_field"
, который и определяет имя переменной, которое будет соответствовать значение поля. Т.е., после нажатия кнопки отправить, доступ к значению поля some_field
можно получить как $_POST['some_field']
.
Обратимся к случаю, когда обработчик формы и сама форма находятся в одном файле. Вот пример кода:
<?php
if (empty($_POST)) {
?>
<form action="on_submit.php" method="post">
<input type="text" name="some_field" value="" />
<input type="submit" value="Отправить" />
</form>
<?php
}
else {
print_r($_POST);
}
Здесь мы проверяем, если массив $_POST
пустой, то выводим форму, если нет – распечатываем его содержимое. Обратите внимание, что если вместо функции empty
мы будем использовать функцию isset
, пример работать не будет, поскольку массив $_POST
существует всегда, а вот пустой он или нет определяем мы с вами.
Ну и наконец последний из массивов – массив $_SESSION
. Чтобы получить к нему доступ, нужно в начале каждого файла, который будет использовать этот массив запустить сессию функцией session_start()
. Ну а чтобы добавить переменную в массив нужно всего-лишь записать $_SESSION['some_var']='значение_переменной'
. Удобство массива $_SESSION
в том, что он существует, пока вы не закроете браузер. Например, вернемся опять к корзине товаров. Товары в ней описываются массивом $_SESSION['products']
, и к этому массиву можно получить доступ на каждой странице. Массив $_SESSION
удобно использовать при авторизации пользователей. Например, если пользователь авторизован, мы создаем переменную $_SESSION['login']
равную TRUE
или FALSE
, и если значение TRUE
, то мы разрешаем пользователю просмотр некоторых страниц, если FALSE
– то запрещаем.
Подводя итог, можно сказать, что каждый метод удобен в том или ином случае. Переменные массива $_GET
удобны для написания фильтров и условий; $_POST
– для передачи больших массивов, например текстовое описание и т.д. (передача данных методом $_POST
используется в панели управления сайтом для администрирования и добавления данных); $_SESSION
удобно использовать в тех случаях, когда доступ к переменным нам может понадобится на любой из страниц сайта.