Трусливый form php. Форма отправки данных в PHP (POST, GET)
Ни для кого не является секретом, что наиболее распространенным способом взаимодействия html-страницы с сайтом является форма. Форма (то есть, html-элемент образуемый тегом form) используется и бесплатными почтовыми службами, электронными магазинами и многими другими типами сайтов.
Обработка простых форм посредством PHP не представляет никакого труда. Однако время от времени возникает потребность обработать форму, содержащую несколько однотипных полей, притом, что их количество может изменяться в широком диапазоне и их количество заранее не известно. В PHP предусмотрено для таких случаев обработка однотипных полей как массива значений.
Рассмотрим подробнее варианты для разных типов полей.
Текстовые поля
Под текстовыми полями в этой статье понимаются элементы, создаваемые тегам input со значением параметра type равным text и тегом textarea . Организовать обработку формы состоящей из нескольких таких полей проще всего. На листинге ниже приведен листинг с html-разметкой для такой формы.
Как видно из листинга, имена для элементов формы, с точки зрения PHP , являются элементами массива. Поэтому PHP -сценарий, который будет обрабатывать эту форму, будет воспринимать все множество текстовых полей этой формы как единый массив. К отдельным элементам можно обращаться по индексам или использовать перечисление при помощи команд list и each , как это сделано в следующем примере.
n"; ?>
Переключатели
Переключателями (checkbox ) в этой статье называются элементы, создаваемые тегам input со значением параметра type равным checkbox . Форма для использования переменного количества «переключателей » строится абсолютно так же. Обратите внимание, что выбор конкретного значения переключателя (то есть значение свойства value) не важен. Пример приведен в листинге ниже:
Однако обработка такой формы отличается от обработки, описанной для текстовых полей. В данном случае необходимо определить, включил или нет посетитель сайта тот или иной переключатель. Если включил — то соответствующий элемент массива существует, если нет — то отсутствует. В следующем листинге приведен пример PHP сценария, который распечатывает включенные переключатели:
Радио-кнопки
Перед тем как описывать обработку радио-кнопок необходимо вспомнить, как они работают. Суть радио-кнопок (элементы созданные тегами input со значением параметра type равным radio ) заключается в том что, выбирая одну кнопку, пользователь автоматически снимает выделение с другой кнопки из этого же набора. Кнопки объединяются в набор очень просто: у всех кнопок в наборе одно и тоже имя.
А вот значения (то есть параметры value ) у кнопок в наборе — разные. И на сайт будет отправлено значение выбранной кнопки с именем набора. Так же как и в случае с текстовыми полями и переключателями имена наборов радио-кнопок должны оформляться как имена элементов массива в PHP. Пример такой формы приведен в следующем листинге:
Обработка радио-кнопок объединяет идеи, использование при обработке, как текстовых полей, так и переключателей. Если автор html-страницы не установил значение по умолчанию, а пользователь не выбрал определенную кнопку в наборе радио-кнопок, то данный элемент будет отсутствовать в массиве (как для переключателей).
Если же кнопка выбрана, то соответствующий элемент массива будет содержать ее значение (как для текстовых полей). Ниже приведен листинг примера, обрабатывающего форму с несколькими наборами радио-кнопок.
n"; ?>
Таким образом, ничего сложного в обработке сложных форм нет.
В одной из прошлых тем уже рассматривалось получение данных из формы. В данной теме я подробнее расскажу, как правильно осуществляется отправка формы на сервер, а также обработка формы в PHP.
Отправка формы
Поле для ввода. Самыми распространёнными элементами формы являются различные поля для ввода. Они создаются при помощи тэга многих типов и тэга
1 |
|
select. Из тэга
12 |
Интересы |
Радиокнопка. У всех радиокнопок из одной группы атрибут name должен иметь одинаковое значение. Это значение не только устанавливает имя параметра, но и объединяет радиокнопки в группу, из которой можно выбрать только одну радиокнопку. Атрибут value устанавливается разный. Добавим радиокнопки в форму:
Чекбокс. В отличие от радиокнопок, каждый чекбокс - это отдельный элемент формы. Все чекбоксы независимы друг от друга и каждый отправляет свои данные на сервер. Атрибут name у всех чекбоксов должен быть разный, а атрибут value может быть либо одинаковый, либо разный. Однако у чекбокса нет каких-то конкретных данных. Он может быть либо выбран либо нет. Поэтому устанавливать ему длинное значение нет смысла. Ему можно задать значение в один символ, например, 1. На сервере смысл этого значения будет такой: если значение есть, то чекбокс был выбран, а если никакого значения нет, значит он не выбран. Добавим чекбоксы в форму и создадим кнопку оправки формы:
Обработка данных из форм
В предложенном примере создана форма отправляющая данные скрипту с названием takeform.php. Поэтому нужно создать этот скрипт. Это будет не просто программа, а страница, которая будет формироваться в зависимости от данных, получаемых из формы. Форму отправляем методом POST. Скрипт берёт эти данные из суперглобального массива $_POST . Элементы массива можно просто использовать в скрипте, но если с ними нужно много работать, то писать каждый раз название элемента неудобно. Проще записать значение в переменную и обращаться к ней. Создадим файл takeform.php и запишем в переменные значения из первых двух элементов формы:
takeform.php:
В тег
13 |
if (!empty($self))
{
echo " О себе: "; echo "".$self." ";
}
|
select. Текст из полей для ввода обычно используется сам по себе. Он записывается в базу данных или выводится на страницу. Но данные из других элементов формы используются несколько по-другому. Получив данные из формы, скрипт не выводит их, а определяет на их основе, какие действия нужно выполнять. Сформируем часть страницы в зависимости от выбора пользователем пункта списка:
Обратите внимание, открывающий тэг
Идёт до обработки данных, в строке 19, а закрывающий - в конце, в строке 28. Таким образом, на части разделён не только HTML код, но и конкретный тэг. Это обычная практика.
Радиокнопка. У всех радиокнопок одной группы одинаковый атрибут value . Соотвотсвоенно, для всей группы создаётся один элемент массива $_POST . В него будет записано значение из той радиокнопки, которую выберет пользователь. Добавим на страницу результат выбора радиокнопки:
Чекбокс. Каждый чекбокс обрабатывается отдельно. Обычно чекбокс не содержит конкретных данных, поэтому просто проверяется содержит он значение или нет. Если значение есть, значит пользователь его выбрал и это учитывается при обработке данных формы. Добавим на страницу информацию о том, что выбрал пользователь:
Так данные из форм отправляются на сервер и обрабатывабтся в PHP скриптах. В зависимости от разных задач, работа с формами осуществляться иначе, но на основе приведённых примеров Вы сможете легко использовать данные из форм так, как Вам нужно.
Сегодня будем работать над созданием красивой HTML формы обратной связи для сайта, работающей на PHP и имеющею встроенную защиту от спама. Никаких особых знаний вам не потребуется, достаточно будет основ html и элементарной логики. Я дам готовые файлы, которые вы сможете вставить на сайт без изменений или скорректировать под свои нужды.
Недавно я делал статью о том, как сделать с помощью плагина Contact Form 7. Также просто можно сделать форму обратной связи на Joomla и других популярных CMS.
Но, что делать сайтам, которые не используют популярные CMS? – Остается делать все руками.
Кроме того, использование обратной связи без плагинов возможно и для WordPress. Лишние плагины создают немалую нагрузку на сервера и отказ от них позволяет ускорить работу сайта.
Заказать установку и настройку готовой формы за 500 рублей можно здесь (это для тех кому лень руками поработать или навыка недостаточно).
Принцип работы формы обратной связи на html
Наша форма будет иметь 5 полей для ввода данных – имя, электронный адрес, телефон, адрес сайта, текст сообщения (вы сможете удалить или изменить их самостоятельно).
Все поля, кроме адреса веб сайта будут обязательны для заполнения (это вы тоже сможете настроить самостоятельно).
Для полей с email адресом и сайтом будет проводиться обязательная проверка правильности ввода данных.
Конечная форма связи будет иметь вот такой вид:
Для работы контактной формы, созданной на html, требуется 3 элемента.
Первый отвечает за структуру самой формы, за тип и количество полей ввода данных. Это обычный html код.
Второй отвечает за обработку данных, которые пользователь вводит в поля формы. Он определяет, что, куда и в каком виде пересылать, после того, как будет нажата кнопка отправки сообщения. Для реализации используется специальный PHP скрипт.
Третий отвечает за внешний вид. Устанавливает размеры и расположение полей ввода данных, добавляет различные цвета и эффекты. Это все задается CSS стилями.
Демо версия формы
Настройку каждого из этих элементов мы с вами разберем по шагам.
Создание HTML макета
Чтобы не делать статью слишком длинной и не добавлять отдельно каждый элемент, я приведу полный html код, а ниже опишу каждый блок и возможные изменения.
Для обозначения форм в html используется тег
, внутри которого заполняются необходимые параметры.Начнем с первой строки.
class=”contact_form” – указываем класс, для того, чтобы в будущем задать CSS стили.
action=”contact-form.php” – указываем название файла со скриптом, который будет обрабатывать данные формы и осуществлять отправку сообщения. Если файл лежит в той же папке, что и страница с формой, то достаточно указать только название файла, если в другой, то нужно будет указать и путь к файлу.
Дальше идут 4 блока
Отвечающих за вывод полей для ввода данных, по названиям понятно, какой за что отвечает. Сами поля выводятся с помощью тегов , внутри которого задаются следующие характеристики:
Type – отвечает за тип вводимых данных, text – обычный текст, email – электронный адрес, такие поля автоматически проверяются на правильность (должна присутствовать @), tel – телефон, url – адрес сайта.
Name – собственное название самого элемента, оно необходимо, что скрипт знал как использовать данные каждого поля. Если вы сделаете несколько полей одного типа, то вам необходимо каждому полю присвоить свое name.
Placeholder – это подсказка, находящаяся внутри поля, текст, замещающий пустое поле элемента. Ее можно изменить или удалить, на работу формы она не влияет.
Required – этот параметр указывает на то, что поле обязательно для заполнения. Вы можете самостоятельно решить, какие элементы обязательны, а какие нет.
pattern=”(http|https)://.+” – эта конструкция служит для проверки корректности поля веб сайт, указывает на то, что адрес обязательно должен содержать http://текст или https://текст , в противном случае будет ошибка.
Для некоторых полей задана всплывающая подсказка, которая появляется при выборе элемента. Ее задет , где form_hint является классом элемента (его свойства прописываются в CSS). Текст во всплывающей подсказке для каждого поля контактной формы можно задать любой. Если такая фишка вам не нужна – просто удалите весь тег .
Поля для ввода самого сообщения размечается тегом
Защита от спама – невидимое поле с именем name=bezspama. У него стоит стиль display:none – это значит поле невидимо людям, но боты его будут заполнять на автомате.
И завершающий элемент любой формы – кнопка отправки сообщения, она задается тегом , имеющим свой класс для настройки внешнего вида и тип “submit”.
Для добавления или удаления полей, достаточно убрать ненужные или вставить новые по аналогии с существующими, прописав для них все свойства и имена.
Оформление CSS стилями
Если вы посмотрите в браузере на то, что получилось, то увидите нечто корявое и непривлекательное. Для того, чтобы у нас получилась красивая форма обратной связи, придется поработать над ее стилями (html будет недостаточно).
Если вы владеете CSS, то задать оформление для всех элементов формы сможете без проблем, тут даже не потребуется моя помощь.
Если же вы не знакомы со стилями, то я просто дам вам готовый файл, в котором уже все прописано таким образом, что ваша форма будет идентична той, что в примере.
Подключить стили можно двумя способами:
- Скопировать содержимое файла в файл style.css, который уже есть на вашем сайте (добавьте в самый конец)
- Поместить файл, который я дал, на ваш хостинг и подключить его.
Подключаются файлы стилей следующим кодом , размещаемым внутри
. Если файл со стилями (styles.css) находится не в одной папке с html страницей, то пропишите полный путь до него.В файле со стилями, который я дал, каждый элемент подписан, поэтому, вы можете вносить в него любые изменения – менять цвета, размеры, форму, эффекты. Владея самыми базовыми знаниями, вы сможете легко его править.
Настройка PHP кода (добавлена защита от спама)
Как и в случае со стилями, я дам вам готовый код, обрабатывающий HTML форму обратной связи и защищающий от спама. Этот файл адаптирован для конкретной конфигурации и, если вы захотите задать новые поля или удалить существующие, в него придется вносить изменения. Поэтому, я расскажу вам, как он работает, чтобы вы поняли, что нужно менять.
Для сайтов, использующих кодировку windows-1251 и версию php 5.4+, в код нужно будет внести дополнение, связанное с функцией htmlspecialchars. Покажу его ниже. Иначе, вместо кириллицы будут приходить пустые поля.
Помните, в свойствах формы (в html файле) мы указывали параметр action=”contact-form.php”. Вам нужно создать файл с названием contact-form.php и поместить в него находящийся ниже код.
\r\n Reply-To: $email \r\n"; if (mail($address, $sub, $mes, $from)) { header("Refresh: 5; URL=https://сайт"); echo "
";} else { header("Refresh: 5; URL=https://сайт"); echo " ";} } exit; /* Выход без сообщения, если поле bezspama заполнено спам ботами */ ?>/* Задаем переменные */ $name = htmlspecialchars ($_POST [ "name" ] ) ; $email = htmlspecialchars ($_POST [ "email" ] ) ; $tel = htmlspecialchars ($_POST [ "tel" ] ) ; $website = htmlspecialchars ($_POST [ "website" ] ) ; $message = htmlspecialchars ($_POST [ "message" ] ) ; $bezspama = htmlspecialchars ($_POST [ "bezspama" ] ) ; /* Ваш адрес и тема сообщения */ $sub = "Сообщение с сайта ХХХ" ; /* Формат письма */ $mes = "Сообщение с сайта ХХХ.\n Имя отправителя: $name Электронный адрес отправителя: $email Телефон отправителя: $tel Сайт отправителя: $website Текст сообщения: $message" ; if (empty ($bezspama ) ) /* Оценка поля bezspama - должно быть пустым*/ /* Отправляем сообщение, используя mail() функцию */ $from = "From: $name <$email> \r\n Reply-To: $email \r\n" ; if (mail ($address , $sub , $mes , $from ) ) { header () ; echo "
Письмо отправлено, через 5 секунд вы вернетесь на страницу XXX" ; } else { header ("Refresh: 5; URL=https://сайт" ) ; echo "
Письмо не отправлено, через 5 секунд вы вернетесь на страницу YYY" ; } exit ; /* Выход без сообщения, если поле bezspama заполнено спам ботами */ |
Первым делом нам необходимо задать переменные, которые будут обрабатываться php кодом. Для того, чтобы не запутаться, присваиваем им такие же имена, как были в самой форме, только начинаются все переменные со знака $. Сама команда присвоения значения имеет такой вид:
$название = htmlspecialchars($_POST["название"]);
$ название= htmlspecialchars ($ _POST [ "название" ] ) ; |
Если вы добавляли какие-то дополнительные поля данных, то в блоке переменных допишите их имена.
Не все переменные мы берем из формы. Как минимум, адрес электронной почты, на который придет письмо (ваш адрес) указывается отдельно. В данном случае это переменная $address – впишите в ее значение свой электронный ящик.
Также, в данном примере явным образом задано значение переменной $sub – она будет выдавать тему письма. Можно добавить тему сообщения в HTML форму в виде текстового поля (наподобие name), и брать значение этой переменной оттуда.
В блоке формат письма настраивается то сообщение, которое получите вы. Он может отличаться от того, что было написано в поле textarea под названием message. Я просто сделал еще одну переменную $mes и включил в нее дополнительный текст и важные данные отправителя (имя, почту, телефон, сайт). Эту часть вы можете сконфигурировать так, как вам удобно.
Чтобы получаемые вами письма подписывались именем отправителя, и в них включался их обратный адрес, а не адрес сервера, на котором находится ваш php файл, мы задаем новую переменную $from, в нее включаем имя и электронный ящик отправителя письма.
Затем функция mail осуществляет отправку письма по заданным параметрам. В случае успешной отправки появляется сообщение о том, что письмо отправлено, а через 5 секунд пользователя перебрасывает на страницу вашего сайта (адрес страницы и время задержки вы можете изменить). Если письмо отправить не удалось, появляется сообщение, что письмо не отправлено и через 5 секунд идет переход на страницу сайта, аналогичным образом вы можете задать адрес страницы и время.
Вставка формы на страницу сайта
Для того, чтобы вставить созданную вами форму обратной связи, вам нужно скопировать html код формы и вставить его в ту часть кода страницы, где вы хотите вывести обратную связь для сайта.
Еще раз хочу напомнить, если файл с PHP программой находятся не в той же папке, что и страница, на которой размещен html код, то в коде самой формы нужно прописать полный путь к нему, иначе, работать не будет, так как форма не найдет файл обработчик.
Скачать файлы контактной формы
Активный анти спам с вводом данных в поле
Спамеры действуют с помощью различных программных средств и некоторые боты умеют обходить защиту с пустым полем, которая встроена в базовую версию. Если они вас начинают донимать, то можно применить вместо или дополнительно простую защиту со вводом данных в специальное поле. Например, сделать математическое выражение с просьбой ввести ответ или задать какой-либо простой вопрос. Больших изменений в форме это не потребует.
Я покажу как изменить код формы и PHP обработчик для использования этого метода антиспама. При желании вы можете не менять защиту с пустым полем, а добавить соответствующие строки в код и у вас будет работать одновременно 2 метода – по идее, должно быть более эффективно.
Первым делом нам необходимо добавить поле для ввода и вопрос в HTML код. В качестве основы у нас уже есть строка 25 (input name = “bezspama” ). Это поле невидимо. Мы превращаем его в обычное. Для этого всю строку меняем на вот такой блок:
|
Вместо математического выражения 2+2*2 можете ввести любые данные – это визуальный вопрос для пользователя. Из поля input мы убрали стиль display:none и добавили обязательность заполнения.
Следующим шагом меняем данные в PHP обработчике, чтобы он делал проверку уже не на пустоту этого поля, а на правильность введенных данных. Проверка у нас делалась в строке 25 выражением empty ($bezspama ) . Мы меняем это выражение и будем делать проверку равенства заполненного поля заранее заданному числу. В моем примере, математическое выражение равно 6, поэтому вся строка будет выглядеть вот так.
В основном, для передачи параметров используются методы POST
и GET
.
Главное отличие методов POST
и GET
заключается в способе передачи информации. В методе GET
параметры передаются через адресную строку (URL
), т.е. в HTTP
-заголовке запроса, в то время как в методе POST
параметры передаются через тело HTTP
-запроса и никак не отражаются в адресной строке.
1. Кнопки – Тег
Тег создает на веб-странице кнопки и по своему действию напоминает результат, получаемый с помощью тега
(с параметром type="button | reset | submit"
). В отличие от этого тега, предлагает расширенные возможности по созданию кнопок. Например, на подобной кнопке можно размещать любые элементы HTML
, в том числе изображения. Используя стили, можно определить вид кнопки путем изменения шрифта, цвета фона, размеров и других параметров.
Теоретически, тег должен располагаться внутри формы, устанавливаемой элементом . Тем не менее, браузеры не выводят сообщение об ошибке и корректно работают с тегом , если он встречается самостоятельно. Однако, если необходимо результат нажатия на кнопку отправить на сервер, помещать в контейнер обязательно. Закрывающий тег
обязателен.
Параметры:
disabled
– блокирует доступ и изменение элемента.
type
– тип кнопки
value
– Значение кнопки, которое будет отправлено на сервер или прочитано с помощью сприптов.
Параметр DISABLED
Блокирует доступ и изменение кнопки. Она в таком случае отображается серой и недоступной для активации пользователем. Кроме того, такая кнопка не может получить фокус путем нажатия на клавишу Tab
, мышью или другим способом. Тем не менее, такое состояние кнопки можно изменять через скрипты.
Определяет тип кнопки, который устанавливает ее поведение в форме. По внешнему виду кнопки разного типа никак не различаются, но у каждой такой кнопки свои функции. Значение по умолчанию: button .
Аргументы:
button – Обычная кнопка.
reset – Кнопка для очистки введенных данных формы и возвращения значений в первоначальное состояние.
Submit – Кнопка для отправки данных формы на сервер.
Параметр VALUE Определяет значение кнопки, которое будет отправлено на сервер. На сервер отправляется пара «имя=значение », где имя задается параметром name тега , а значение - параметром value . Значение может, как совпадать с текстом на кнопке, так быть и самостоятельным. Также параметр value применяется для доступа к данным через скрипты.1.1. Кнопка (input type=button)
1.2. Кнопка с изображением (input type=image)
Кнопки с изображениями аналогичны по действию кнопке Submit
, но представляют собой рисунок. Для этого задаем type=image
и src="image.gif"
.
Когда пользователь щелкнет где-нибудь на изображении, соответствующая форма будет передана на сервер с двумя дополнительными переменными – sub_x и sub_y . Они содержат координаты нажатия пользователя на изображение. Опытные программисты могут заметить, что на самом деле имена переменных, отправленных браузером, содержат точку, а не подчеркивание, но PHP автоматически конвертирует точку в подчеркивание.
1.3. Кнопка отправки формы (input type=submit)
Служит для отправки формы сценарию. При создании кнопки для отправки формы необходимо указать 2 атрибута: type="submit"
и value="Текст кнопки"
. Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.
РНР
-сценарий не требуется.
1.4. Массив кнопок (submit) для выбора варианта действий
2. Кнопка сброса формы (Reset)
При нажатии на кнопку сброса (reset
), все элементы формы будут установлены в то состояние, которое было задано в атрибутах по умолчанию, причем отправка формы не производиться.
РНР
-сценарий не требуется.
3. Флажок (checkbox)
Флажки checkbox предлагают пользователю ряд вариантов, и разрешает произвольный выбор (ни одного, одного или нескольких из них).
$go) { echo $index." - > ".$go."
"; }; };
4. Переключатель(radio)
Переключатели radio предлагают пользователю ряд вариантов, но разрешает выбрать только один из них.
Пример 1.
Пример 2.
\n"; ?>
5. Текстовое поле (text)
При создании обычного текстового поля размером size и максимальной допустимой длины maxlength
символов, атрибут type принимает значение text
. Если указан параметр value
, то поле будет отображать указанный в переменной value. При создании поля не забывайте указывать имя поля, т.к. этот атрибут является обязательным.
6. Поле для ввода пароля (password)
Полностью аналогичен текстовому полю, за исключением того, что символы, набираемые пользователем, не будут отображаться на экране.
7. Скрытое текстовое поле (hidden)
Позволяет передавать сценарию какую то служебную информацию, не отображая её на странице.
8. Выпадающий список (select)
Тэг
Список начинается с парных тегов
Если необходимо создать выпадающий с предсказуемой последовательностью. Например, список с годами с 2000 по 2050. То используется следующий прием.
9. Многострочное поле ввода текста (textarea)
Многострочное поле ввода текста позволяет отправлять не одну строку, а сразу несколько. При необходимости можно указать атрибут readonly
, который запрещает редактировать, удалять и изменять текст, т.е. текст будет предназначен только для чтения. Если необходимо чтобы текст был изначально отображен в многострочном поле ввода, то его необходимо поместить между тэгами
Существует параметр wrap
– задание переноса строк. Возможные значения:
off
– отключает перенос строк;
virtuals
– показывает переносы строк, но отправляет текст как он введен;
physical
– переносы строк оставляются в исходном виде.
По умолчанию тег
Для того, чтобы в многострочном текстовом поле соблюдалось html-форматирование (перенос строк по средством тега
или
), то используйте функцию nl2br()
:
10. Кнопка для загрузки файлов (browse)
Служит для реализации загрузки файлов на сервер. При создании текстового поля также необходимо указать тип поля type
как "file"
.
Способы общения браузера с сервером
Способов, предоставляемых протоколом HTTP
, немного. Это важная информация. Никаких других способов нет. На практике используются два:
GET
– это когда данные передаются в адресной строке, например, когда пользователь жмет ссылку.
POST
– когда он нажимает кнопку в форме.
Метод GET
Чтобы передать данные методом GET
не надо создавать на HTML
-странице форму (использовать формы для запросов методом GET
вам никто не запрещает) – достаточно ссылки на документ с добавлением строки запроса, которая может выглядеть как переменная=значение. Пары объединяются с помощью амперсанда &, а к URL
страницы строка присоединяется с помощью вопросительного знака «?
».
Но можно не использовать пары ключ=значение, если надо передать всего одну переменную – для этого надо после знака вопроса написать ЗНАЧЕНИЕ
(не имя) переменной.
Преимущество
передачи параметров таким способом заключается в том, что клиенты, которые не могут использовать метод POST
(например, поисковые машины), все же смогут, просто пройдя по ссылке, передать параметры скрипту и получить содержимое.
Недостаток
в том, что просто изменив параметры в адресной строке, пользователь может повернуть ход сценария непредсказуемым образом и это создает огромную дыру в безопасности, в сочетании с неопределенными переменными и register_globals on
или кто-нибудь может узнать значение важной переменной (например ID
-сеcсии), просто посмотрев на экран монитора.
:
- для доступа к общедоступным страницам с передачей параметров (повышение функциональности)
- передача информации, не влияющей на уровень безопасности
:
- для доступа к защищенным страницам с передачей параметров
- для передачи информации, влияющей на уровень безопасности
- для передачи информации, не подлежащей модифицированию пользователем (некоторые передают текст SQL
-запросов.
Метод POST
Передать данные методом POST
можно только с помощью формы на HTML
странице. Основное отличие POST
от GET
в том, что данные передаются не в заголовке запроса а в теле, следовательно, пользователь их не видит. Модифицировать можно только изменив саму форму.
Преимущество
:
- большая безопасность и функциональность запросов с помощью форм методом POST
.
Недостаток
:
- меньшая доступность.
Для чего следует использовать
:
- для передачи большого объема информации (текст, файлы..);
- для передачи любой важной информации;
- для ограничения доступа (например, использовать для навигации только форму – возможность, доступная не всем программам-роботам или грабберам-контента).
Для чего не следует использовать
:
PHP
способен принимать файл, загружаемый при помощи любого браузера,. Это дает возможность загружать как текстовые, так и бинарные файлы. Вместе с PHP
-аутентификацией и функциями для работы с файловой системой, вы получаете полный контроль над тем, кому разрешено загружать файлы, и над тем, что делать с файлом после его загрузки.
Страница для загрузки файлов может быть реализована при помощи специальной формы, которая выглядит примерно так:
//Форма для загрузки файлов
В приведенном выше примере "URL
"
необходимо заменить ссылкой на PHP
-скрипт. Скрытое поле MAX
_FILE_SIZE
(значение необходимо указывать в байтах) должно предшествовать полю для выбора файла, и его значение является максимально допустимым размером принимаемого файла. Также следует убедиться, что в атрибутах формы вы указали enctype="multipart/form-data"
, в противном случае загрузка файлов на сервер выполняться не будет.
Внимание
Опция MAX
_FILE_SIZE
является рекомендацией браузеру, даже если бы PHP
также проверял это условие. Обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Тем не менее, ограничение PHP
касательно максимального размера обойти невозможно. Вы в любом случае должны добавлять переменную формы MAX
_FILE_SIZE
, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась.
Как определить метод запроса?
Напрямую:
Getenv("REQUEST_METHOD");
вернет GET или POST .
Какой способ следует применять?
Если форма служит для запроса некой информации, например – при поиске, то ее следует отправлять методом GET
. Чтобы можно было обновлять страницу, можно было поставить закладку и/или послать ссылку другу.
Если же в результате отправки формы данные записываются или изменяются на сервере, то следует их отправлять методом POST
, причем обязательно, после обработки формы, надо перенаправить браузер методом GET
. Так же, POST
может понадобиться, если на сервер надо передать большой объём данных (у GET
он сильно ограничен), а так же, если не следует "светить" передаваемые данные в адресной строке (при вводе логина и пароля, например).
В любом случае, после обработки POST
надо всегда перенаправить браузер на какую-нибудь страницу, пусть ту же самую, но уже без данных формы, чтобы при обновлении страницы они не записывались повторно.
Как передать данные в другой файл непосредственно из тела PHP -программы методом GET и POST ?
Пример, для демонстрации отправки данных методом POST и GET одновременно и получения ответа от сервера.
$url = "http://test.ru/patch/file.php?var=23&var2=54"; $parse_url = parse_url($url); $path = $parse_url["path"]; // путь до файла (/patch/file.php) if($parse_url["query"]) // если есть список параметров $path .= "?" . $parse_url["query"]; // добавляем (?var=23&var2=54) $host= $parse_url["host"]; // тут получаем хост (test.ru) $data = "var3=test&var4=".urlencode("еще тест"); $fp = fsockopen($host, 80, $errno, $errstr, 10); if ($fp) { $out = "POST ".$path." HTTP/1.1\n"; $out .= "Host: ".$host."\n"; $out .= "Referer: ".$url."/\n"; $out .= "User-Agent: Opera\n"; $out .= "Content-Type: application/x-www-form-urlencoded\n"; $out .= "Content-Length: ".strlen($data)."\n\n"; $out .= $data."\n\n"; fputs($fp, $out); // отправляем данные while($gets=fgets($fp,2048)) // читаем данные построчно и выводим их. { print $gets; } fclose($fp); } ?>