PHP и методы передачи данных GET и POST

Современные веб-ресурсы не просто предоставляют информацию посетителю, но и взаимодействуют с ним. Для взаимодействия с пользователем нужно получать некоторую информацию от него. Для получения данных есть несколько методов, очень распространенные методы GET и POST. И соответственно в PHP есть поддержка этих методов передачи данных GET и POST. Посмотрим, как работают эти методы.

 


Метод GET

 

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

Если у вас локальный сервер, то обычно домен будет localhost, и тогда предыдущая запись будет выглядеть
Код
http://localhost/script.php?num=10

В этом случае мы передаем параметр num равный 10. Для добавления следующих параметров сценарию нужно использовать разделитель - амперсант (&), например
Код
http://домен.ru/script.php?num=10&type=new&v=text

В данном случае мы передали скрипту три параметра: num со значением 10, type со значением "new" и v со значением "text".
Для получения этих параметров в скрипте нужно использовать встроенный массив $_GET. Ключами этого массива будут названия параметров. В нашем случае нужно использовать $_GET["num"], $_GET["type"],$_GET["v"]. Эти элементы массива и будут содержать значения переданных параметров. Для демонстрации этого примера создайте файл script.php следующего содержания
Код
<html>
<head>
<title>Проверка метода GET в PHP</title>
</head>
<body>
<?php
echo ($_GET["num"]."<br>");
echo ($_GET["type"]."<br>");
echo ($_GET["v"]);
?>
</body>
</html>

И теперь вызовите этот файл в браузере
Код
http://путь/script.php?num=10&type=new&v=text

и вы увидите переданные параметры в окне браузера. Но если вы вызовите этот файл без дополнительных параметров http://путь/script.php , то увидите ошибки, которые выдаст интерпретатор PHP, о том, что таких элементов массива $_GET нет. Проверке данных получаемых от пользователя можно посветить не одну статью, поэтому в этой статье я не буду затрагивать этот момент.
Как вы, наверное, понимаете заставлять пользователя набирать данные в адресной строке браузера не очень хорошо и совсем неудобно. Поэтому для приема данных от пользователя нужно использовать html-формы. Напишем простенькую html-форму.
Код
<form action="script.php" method="get" >
Введите число <input type="text" name="num" value="" /><br/>
У Вас есть компьютер? <select name="type">
<option value="yes">Да</option>
<option value="no">Нет</option>
</select><br/>
Ваш комментарий:<br/>
<textarea name="v" ></textarea><br/>
<input type="submit" name="bsubmit" value="Отправить" />
</form>

Немного прокомментирую созданную форму. Формы создаются тегом 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.
Код
<html>
<head>
<title>Форма для передачи данных методом GET и PHP</title>
</head>
<body>
<form action="script.php" method="get" >
Введите число <input type="text" name="num" value="" /><br/>
У Вас есть компьютер? <select name="type">
<option value="yes">Да</option>
<option value="no">Нет</option>
</select><br/>
Ваш комментарий:<br/>
<textarea name="v" ></textarea><br/>
<input type="submit" name="bsubmit" value="Отправить" />
</form>
</body>
</html>

Введите в поля формы какие-либо значения и нажмите кнопку "Отправить". После нажатия кнопки браузер откроет другую страницу (script.php), и в окне браузера будут отображены данные, которые вы ввели. Я думаю понятно почему: браузер передаст данные сценарию script.php, и в скрипте эти данные будут обработаны и выведены на экран.

 


Метод POST

 

Теперь давайте рассмотрим, как работает метод POST.
Для отправки данных методом POST нужно использовать HTML-формы. Как мы помним, что за способ отправки данных формы отвечает атрибут method тега form. Поэтому нужно в атрибуте method тега form указать значение POST. В остальном форма может быть та же, как и для метода GET. Изменим нашу форму, которую мы уже использовали для передачи данных способом GET, для передачи методом POST.
Код
<form action="script_post.php" method="post" >
Введите число <input type="text" name="num" value="" /><br/>
У Вас есть компьютер? <select name="type">
<option value="yes">Да</option>
<option value="no">Нет</option>
</select><br/>
Ваш комментарий:<br/>
<textarea name="v" ></textarea><br/>
<input type="submit" name="bsubmit" value="Отправить" />
</form>

Как видите, форма осталась та же за исключением атрибутов method и action. Теперь данные будут передаваться сценарию script_post.php. Поместим нашу форму на странице forma_post.php.
Код
<html>
<head>
<title>Форма для передачи данных методом POST и PHP</title>
</head>
<body>
<form action="script_post.php" method="post" >
Введите число <input type="text" name="num" value="" /><br/>
У Вас есть компьютер? <select name="type">
<option value="yes">Да</option>
<option value="no">Нет</option>
</select><br/>
Ваш комментарий:<br/>
<textarea name="v" ></textarea><br/>
<input type="submit" name="bsubmit" value="Отправить" />
</form>
</body>
</html>

Теперь надо написать сценарий, который будет обрабатывать данные нашей формы.
Для получения в скрипте данных переданным методом POST нужно использовать встроенный массив $_POST. Ключами этого массива будут названия параметров. В нашем случае нужно использовать $_POST["num"], $_POST["type"],$_POST["v"]. Эти элементы массива и будут содержать значения переданных данных. Как видите отличие от использования способа GET, выражается лишь в использовании массива $_POST. Поэтому нам не составит труда написать файл script_post.php:
Код
<html>
<head>
<title>Проверка метода POST в PHP</title>
</head>
<body>
<?php
echo ($_POST["num"]."<br>");
echo ($_POST["type"]."<br>");
echo ($_POST["v"]);
?>
</body>
</html>

Теперь откройте файл forma_post.php в браузере. Введите какие-нибудь данные в поля формы и нажмите кнопочку "Отправить". Сейчас, наверное, вы заметили отличие метода POST от GET - в адресной строке браузера не появились данные формы. Данные методом POST нельзя передать через адресную строку браузера. Это существенное отличие нужно запомнить.
В PHP в независимости, каким способом были отправлены данные - методом POST или методом GET - получить данные можно используя массив $_REQUEST.

 

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

 

При использовании метода GET данные передаются путем добавления к URL-адресу. Таким образом, они будут видны пользователю, что с точки зрения безопасности не всегда хорошо. Также максимальный объем передаваемых данных будет зависеть от браузера - от максимально-допустимого количества символов адресной строке браузера.
При использовании метода POST данные не будут видны пользователю (не отображаются в адресной строке браузера). И поэтому они более защищены, а, следовательно, и программа обрабатывающая эти данные более защищена в плане безопасности. Также объем передаваемых данных практически ни чем не ограничен.
Выбирая способ передачи данных нужно учитывать приведенные особенности и останавливаться на наиболее приемлемом методе.
Опубликовано 14 июня 2009 г.
Комментарии к публикации
Всего комментариев: 31
прохожий: Гость | 11.08.2009, 16:35 #
простенько
прохожий: Сергей | 27.03.2013, 22:08 #
Да, может и простенько, зато понятно. Месяц изучаю РНР, теперь хоть разобрался с этими $_post и $_get. Принцип работы понятен.
прохожий: Марат | 11.07.2014, 20:08 #
Может быть и просто, но зато очень круто...
прохожий: Гость | 11.08.2009, 16:36 #
как передать без формы?
Суперадмин: | 11.08.2009, 18:35 #
Данные можно передать серверу без формы используя Ajax-технологии.
прохожий: Гость | 14.09.2009, 03:17 #
Оформить URL на подобии GET-запроса, тогда оно будет доступно в _GET
прохожий: Гость | 11.10.2009, 00:10 #
А можно на php отправить по методу post без формы
Суперадмин: | 11.10.2009, 04:00 #
На PHP можно отправлять различные данные. Посмотрите сокеты PHP. Если я ничего не путаю: есть упрощенные вариант - функция CURL.
прохожий: Гость | 12.10.2009, 21:44 #
Вот без формы
http://webi.ru/webi_articles/6_7_f.html
прохожий: Гость | 19.05.2010, 23:19 #
отличная статья. очень помогла
прохожий: Гость | 17.03.2010, 00:53 #
как отправить параметры формы без submit
Суперадмин: | 27.03.2010, 07:51 #
Можно на javascript: нужно использовать метод submit() объекта отправляемой формы.
прохожий: Гость | 17.04.2010, 19:22 #
Чувак, я тя обожаю!!!
прохожий: Гость | 25.05.2010, 22:14 #
Хорошая статья. Спасибо автору.
прохожий: Гость | 09.09.2010, 00:58 #
А как получить часть переданных данных?
в ссылке я пишу
echo "<a href=b.php?id=".urlencode($zap[$i]['id']." ".$zap[$i]['name']).">link</a>";
а в файлике b.php мне нужен только к примеру один элемент ['name']
$a = $_GET['id']['name']; но так не работает.
прохожий: Гость | 09.09.2010, 01:21 #
Спасибо разобрался.
в файлике b.php пишем
<?php
include "config.php";
$a = "SELECT * FROM user_sak WHERE id=".$_GET['id'];
$res = mysql_query($a, $link);
for($i=0;$i<mysql_num_rows($res);$i++)
{
$zap[$i] = mysql_fetch_array($res);
echo $zap[$i]['name'];
}
?>
Суперадмин: | 09.09.2010, 20:45 #
Ужас! :) Так делать нельзя:

$a = "SELECT * FROM user_sak WHERE id=".$_GET['id'];

Понятие SQL-инъекции вам знакомо? Смотрите
http://yandex.ru/yandsearch?text=sql-%D0%B8%D0%BD%D1%8A%D0%B5%D0%BA%D1%86%D0%B8%D1%8F&from=fx3&clid=46510&lr=35
прохожий: Гость | 09.10.2010, 03:34 #
Спасибо админ! Нашёл нужную информацию!!!
прохожий: Dimon0014 | 14.03.2011, 07:34 #
Круто, без заморочек.Спасибо:)
прохожий: Серега | 06.04.2011, 17:22 #
Очень толковая информация. Лишь благодаря ей я понял все-все нюансы работы post и get. Благодарю. Обязательно кину ссылку на своем ресурсе на ваш.
прохожий: Vesta | 25.05.2011, 21:17 #
Спасибо, толково и без воды, по-больше ы таких статей
прохожий: Руслан | 11.01.2012, 14:45 #
Спасибо огромное))
прохожий: SkyAn | 14.06.2012, 22:34 #
E-mail: написать сообщение
А как реализовать передачу данных с таблицы уже заполненой в форму. К примеру, есть товар с названием. Человек заинтересовался и захотел спросить вопрос. нажимает на ссылку и попадает на форму отправки письма, где тема заполнена уже названием товара.
прохожий: Декстер | 20.07.2012, 14:01 #
Благодарю, статья дельная. Учусь писать тесты на пхп, открыла мне глаза на один важный нюанс
прохожий: Оксана | 29.04.2013, 19:41 #
E-mail: написать сообщение
Об объёме передаваемых данных автор упомянул кратко, немного дополню.
Длина URL ограничена 1024 символами, поэтому выбирая метод GET, необходимо помнить об этом ограничении.
С помощью POST метода можно передавать данные намного большего объёма. Тут лимит устанавливается веб-сервером, по-умолчанию равен 2M.
Суперадмин: | 06.05.2013, 23:48 #
Длина url ограничивается возможностями браузеров. Есть статья http://paradigm.ru/url-max-length , исходя из которой, получается предел в 2048 символов (минимальная длина в браузере IE).
На данные POST ограничений нет. Число которое вы привели: 2M - это стандартное ограничение в самом php, а не в сервере (к примеру, Apache). И обычно этот лимит увеличивают, как минимум до нескольких мегабайт.
прохожий: Олег | 20.08.2013, 17:07 #
Спасибо, помогло))
прохожий: Roman | 11.01.2015, 05:54 #
Спасибо, автору статьи. Всё очень понятно!
прохожий: Юра | 10.06.2015, 23:12 #
Спасибо. Искал, как получить значения параметров из url. В вашей статье все понятно и просто описано.
прохожий: Игорь | 03.07.2015, 10:15 #
E-mail: написать сообщение
При использование метода post в базу записывается пустаю строка, меняю на get и все нормально, в чем может быть проблема?
прохожий: Некто | 08.07.2015, 16:17 #
Большое спасибо автору статьи. Очень помогло.
Вход в аккаунт
Новости сайта