Заполнение форм в браузере php
PHP Суперглобальные переменные $_GET и $_POST используются для сбора данных формы.
PHP - Простая HTML форма
В приведенном ниже примере показана простая форма HTML с двумя полями ввода и кнопкой отправки:
Пример
Для отображения представленных данных вы можете просто повторить все переменные. "Welcome.html" выглядит так:
Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>
На выходе может быть что-то вроде этого:
Пример
и "welcome_get.html" выглядит так:
Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>
Код выше довольно прост. Однако самое главное отсутствует. Вам необходимо проверить данные формы, чтобы защитить ваш скрипт от вредоносного кода.
Подумайте о БЕЗОПАСНОСТИ при обработке форм PHP!
Эта страница не содержит проверки формы, она просто показывает, как вы можете отправлять и извлекать данные формы.
Однако на следующих страницах будет показано, как обрабатывать формы PHP с учетом требований безопасности! Надлежащая проверка данных формы важна для защиты вашей формы от хакеров и спамеров!
GET и POST
И GET, и POST создают массив (например, array( key1 => value1, key2 => value2, key3 => value3, . )). Этот массив содержит пары ключ / значение, где ключи (key) - это имена элементов управления формы, а значения (value) - входные данные пользователя.
И GET, и POST обрабатываются как $_GET и $_POST. Это суперглобальные переменные, что означает, что они всегда доступны, независимо от области видимости, и вы можете получить к ним доступ из любой функции, класса или файла, не делая ничего специально.
$_GET - это массив переменных, переданных в текущий скрипт через параметры URL.
Когда использовать GET?
Информация, отправленная из формы с помощью метода GET, видна всем (все имена и значения переменных отображаются в URL-адресе). GET также имеет ограничения на количество информации для отправки. Ограничение составляет около 2000 символов. Однако, поскольку переменные отображаются в URL-адресе, можно добавить страницу в закладки. Это может быть полезно в некоторых случаях.
GET может использоваться для отправки нечувствительных данных.
Примечание: GET никогда не должен использоваться для отправки паролей или другой конфиденциальной информации!
Когда использовать POST?
Кроме того, POST поддерживает расширенные функции, такие как поддержка двоичного ввода из нескольких частей при загрузке файлов на сервер.
Однако, поскольку переменные не отображаются в URL-адресе, невозможно добавить страницу в закладки.
Разработчики предпочитают POST для отправки данных формы.
Далее в учебнике вы узнаете, как можно обрабатывать PHP-формы безопасным способом!
Одно из главнейших достоинств PHP - то, как он работает с формами HTML. Здесь основным является то, что каждый элемент формы автоматически становится доступным вашим программам на PHP. Для подробной информации об использовании форм в PHP читайте раздел Переменные из внешних источников. Вот пример формы HTML:
В этой форме нет ничего особенного. Это обычная форма HTML без каких-либо специальных тегов. Когда пользователь заполнит форму и нажмёт кнопку отправки, будет вызвана страница action.php . В этом файле может быть что-то вроде:
Здравствуйте, <?php echo htmlspecialchars ( $_POST [ 'name' ]); ?> .Вам <?php echo (int) $_POST [ 'age' ]; ?> лет.
Пример вывода данной программы:
Если не принимать во внимание куски кода с htmlspecialchars() и (int) , принцип работы данного кода должен быть прост и понятен. htmlspecialchars() обеспечивает правильную кодировку "особых" HTML-символов так, чтобы вредоносный HTML или Javascript не был вставлен на вашу страницу. Поле age, о котором нам известно, что оно должно быть число, мы можем просто преобразовать в int , что автоматически избавит нас от нежелательных символов. PHP также может сделать это автоматически с помощью модуля filter. Переменные $_POST['name'] и $_POST['age'] автоматически установлены для вас средствами PHP. Ранее мы использовали суперглобальную переменную $_SERVER , здесь же мы точно так же используем суперглобальную переменную $_POST , которая содержит все POST-данные. Заметим, что метод отправки (method) нашей формы - POST. Если бы мы использовали метод GET, то информация нашей формы была бы в суперглобальной переменной $_GET . Кроме этого, можно использовать переменную $_REQUEST , если источник данных не имеет значения. Эта переменная содержит смесь данных GET, POST, COOKIE.
В PHP можно также работать и с XForms, хотя вы найдёте работу с обычными HTML-формами довольно комфортной уже через некоторое время. Несмотря на то, что работа с XForms не для новичков, они могут показаться вам интересными. В разделе возможностей PHP у нас также есть короткое введение в обработку данных из XForms.
User Contributed Notes 3 notes
According to the HTTP specification, you should use the POST method when you're using the form to change the state of something on the server end. For example, if a page has a form to allow users to add their own comments, like this page here, the form should use POST. If you click "Reload" or "Refresh" on a page that you reached through a POST, it's almost always an error -- you shouldn't be posting the same comment twice -- which is why these pages aren't bookmarked or cached.
You should use the GET method when your form is, well, getting something off the server and not actually changing anything. For example, the form for a search engine should use GET, since searching a Web site should not be changing anything that the client might care about, and bookmarking or caching the results of a search-engine query is just as useful as bookmarking or caching a static HTML page.
Also, don't ever use GET method in a form that capture passwords and other things that are meant to be hidden.POST is not more secure than GET.
The reasons for choosing GET vs POST involve various factors such as intent of the request (are you "submitting" information?), the size of the request (there are limits to how long a URL can be, and GET parameters are sent in the URL), and how easily you want the Action to be shareable -- Example, Google Searches are GET because it makes it easy to copy and share the search query with someone else simply by sharing the URL.
Security is only a consideration here due to the fact that a GET is easier to share than a POST. Example: you don't want a password to be sent by GET, because the user might share the resulting URL and inadvertently expose their password.
However, a GET and a POST are equally easy to intercept by a well-placed malicious person if you don't deploy TLS/SSL to protect the network connection itself.
As a bonus, if you use TLS you minimise the risk of your users getting code (ADs) injected into your traffic that wasn't put there by you.
Передача данных в адресной строке
Одним из простых способов передачи данных php сценарию является адресная строка браузера, где после знака ? вы можете указать набор параметров в формате имя_параметра=значение если параметров несколько они разделяются сиvволом & . Например:
Все переданные параметры можно получить в сценарии script.php следующим образом:
Здесь мы выводим на экран глобальный массив $_GET функцией print_r() , если вы всё сделали правильно, то в браузере вы увидите примерно такой результат:
Справка: $_GET — это ассоциативный массив переменных, переданных php сценарию через адресную строку браузера (параметры URL). Обратите внимание, что данный массив не только заполняется для GET-запросов (отправляемых формой), а скорее для всех запросов со строкой запроса (обращения поисковых роботов, запросы к API и т.п.). Аналогично есть глобальный массив $_POST в который попадают переменные отправленные методом POST и массив $_REQUEST в который попадают все переменные из POST и GET запросов.
Такой способ передачи данных скрипту используется редко, обычно для тестирования (чтобы не писать html-форму) или когда вы пишите какой-то простой скрипт для промежуточной задаче и нужен некий «механизм» его запуска, можно поставить условие в сценарии на наличие параметра start=yes в адресной строке.
Трансляция формы
Теперь перейдём непосредственно к теме статьи. Для продолжения нам придётся сверстать небольшую форму, я предлагаю сделать её внутри тестового скрипта script.php из примеров выше. Вот пример html-формы:
Обратите внимание на атрибуты формы:
- action — адрес скрипта который будет обрабатывать запрос от формы и
- method — метод передачи данных
Параметр method по умолчанию равен get, но я привык указывать его явно. Так же обратите внимание на то, что у каждого поля формы ОБЯЗАТЕЛЬНО должен быть атрибут name именно значение из атрибута name попадёт в адресную строку как имя_параметра. Если вы не укажете name у полей формы, вы не сможете корректно обработать переданные скрипту данные. Давайте отправим тестовые данные через форму и посмотрим результат.
Адресная строка при этом содержит всё что мы вводили в поля формы:
Пример максимально упрощён.
Обработка списков
Работа с выпадающим списком selectbox мало чем отличается от обычных полей, тут больше отличие со стороны HTML, давайте добавим в нашу форму небольшой selexbox для наглядной демонстрации:
Обратите внимание что у поля selectbox атрибут name указывается непосредственно в теге <select> а вот value — значение поля указывается внутри у тегов <option> . Более того, по умолчанию при выводе формы в браузере, в поле selectbox всегда выбрано первое доступное значение. Т.е. при передаче данных скрипту, в параметре $_GET[‘gov’] всегда будет выбрано «Среднее». Чтобы этого избежать, обычно добавляют дополнительный <option> в начало с пустым атрибутом value. Тогда пользователю нужно будет непосредственно выбрать доступную в выпадающем списке опцию. Так же это позволяет легко отфильтровать переданные пустые значения на стороне сервера (в php скрипте). После корректировки наше поле «Образование» приобретает такой вид:
Обработка массивов
Что делать когда нужно передать несколько значений одного параметра? Например то же образование у человека может быть и средне-специальное и высшее. Можно добавить атрибут multipli в наш selectbox или использовать поле типа checkbox. Давайте превратим наш selextbox в checkbox.
Обратите внимание на квадрантные скобки в атрибуте name наших checkbox-ов, эти скобки означают что вы можете передать несколько значений под одним именем в данном случае edu ( сокращение от английского education — образование ) . Если заполнить форму и выбрать несколько образований, параметр edu будет передан как массив:
Это очень удобно, особенно для обработки сложных форм с множеством параметров.
Особенности отправки checkbox
Обратите внимание на прошлый пример. При использовании checkbox не нужно создавать отдельное поле с пустым value как это было у selectbox. Дело в том, что если вы не выбрали ни одно значение из предложенных checkbox-ов, этот параметр вовсе не будет отправлен на сервер. Это следует учитывать в вашем скрипте и делать дополнительную проверку на существование переменной в глобальном массиве $_GET.
Передача файла
Для отправки файла средствами веб-формы предусмотрено специальное поле file, давайте добавим его в нашу форму. Но прежде чем это сделать, нужно внести изменения в тег <form> а именно:
- Изменить метод передачи данных на post
- Добавить атрибут enctype=«multipart/form-data»
Так же следует отметить, что данные о переданном на сервер файле попадают в отдельный глобальный массив $_FILES откуда мы можем их получить и корректно обработать файл.
Я добавил вот такой код перед формой, чтобы наглядно продемонстрировать содержимое глобальных массивов $_POST и $_FILES:
Отправляем форму, получаем такую картину:
Как видите поле resume не попало в массив $_POST а сразу перешло в массив $_FILES. Php сам определяет какие данные, каким методом и какого типа были переданы и распределяет их по доступным глобальным массивам.
Безопасность
Одно из главных правил при обработке форм на php — НИКОГДА не доверяйте данным пришедшим с формы. Вам нужно обязательно отфильтровать каждое поле на стороне сервера, даже если на клиенте у вас стоит jQuery валидатор и прочие javascript обработчики призванные предотвратить некорректную или злонамеренную отправку данных через форму на сервере.
Существует множество способов фильтрации данных, один из приёмов это так называемый «Белый список» когда вы точно знаете что в переменной age у вас может быть только целочисленное значение в диапазоне от 18 до 60, вы можете проверить переменную на int а так же входит ли число в заданный диапазон.
Поле email можно проверять при помощи регулярного выражения на соответствие определённому шаблону, например:
И тому подобное. Всегда помните что все данные приходящие из формы несут потенциальную опасность и их нужно тщательно проверить. А на этом всё. По мере работы буду добавлять в статью «живые примеры» и детали. Желаю удачи!
Функции и конструкции языка использованные в статье: intval(), is_numeric()
Формы используют для отправки какой-либо информации на сервер, которую необходимо как-то обработать.
Места использования форм:
- Создание регистрации и авторизации
- Создание блока комментариев
- Создание обращения в техническую поддержку (тикеты)
Создаём форму на HTML
Код формы необходимо помещать в <body> HTML документа.
Я пропущу скелет документа дальше, чтобы было более понятно.
В атрибут action нужно указать обработчик формы (PHP-скрипт). Если поле пусто, значит, обработку формы выполнил тот скрипт, в котором расположена сама форма. В атрибут method нужно указать метод отправки формы (post или get). У каждого свои плюсы и минусы. Вкратце: post отправляет данные так, что пользователь не может их увидеть, а get — так, что они видны в URL-строке браузера.
Наглядный пример get:
Наглядный пример post:
Немного по PHP:
При отправке формы методом POST данные записываются в суперглобальный массив $_POST.
При отправке формы методом GET данные записываются в суперглобальный массив $_GET.
В форме мы сделали 3 <input>. Первые два — поле ввода логина и пароля. Третий — кнопка отправки формы.
Тег <input> имеет атрибут type="". Для каждого случая указывают свой тип ввода. Допустим, text устанавливают для текста, submit — для отправки формы по атрибуту (action), а password — для пароля (чтобы он отображался звёздочками *).
Кроме того, тег <input> имеет атрибут name="" и атрибут value="". Value — стандартное значение элемента, name — предназначено для того, чтобы обработчик формы мог его идентифицировать.
Создаём обработчика формы
Мы перешли к самому интересному моменту статьи. Если мы обрабатываем форму на другой странице (action="example.php"), то после нажатия кнопки подтверждения вас перекинет на указанную страницу.
Если action пуст, то страница с формой перезагрузится.
В самом верху скелета документа (перед <!DOCTYPE html>) открываем теги PHP и обрабатываем форму:
В самом верху PHP-тега заводим 2 новые переменные, которые по стандарту пусты:
В проверке на пароль:
В проверке на логин:
В форме HTML:
Добавляем после тега <input> вставку PHP (в данном случае <?= ?>), так как мы только выводим переменную. Суть проста: если ошибки в логине нет, тогда $error_login пуст, а следственно, ничего не выводится, иначе выводим там ошибку.
Теперь доработаем форму, чтобы она сохраняла значения полей.
В самом начале добавляем 2 переменные:
То есть мы заносим в переменные значения из суперглобального массива $_POST.
И немного изменяем нашу HTML-форму:
Заключение
Как видите, создать хорошую форму на PHP не так уж и сложно. Проверки, которые я показал в этой статье, не обязательно должны быть. Вы можете придумывать свои (любые) проверки на поля ввода, используя PHP. Надеюсь, что вам понравилась моя статья, и вы выучили что-то новое.
Перед чтением см. новые уроки раздела "Важное", которые появились выше.
- Урок №
новая вкладка с new.code.mu
часть 1 - Урок №
новая вкладка с new.code.mu
часть 2 - Урок №
новая вкладка с new.code.mu
часть 3 - Урок №
новая вкладка с new.code.mu
часть 4 - Урок №
новая вкладка с new.code.mu
часть 5 - Урок №
новая вкладка ютуб
пагинация
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
- Урок №
новая вкладка с new.code.mu
Абстрактные классы - Урок №
новая вкладка с new.code.mu
Введение в интерфейсы - Урок №
новая вкладка с new.code.mu
Применение интерфейсов - Урок №
новая вкладка с new.code.mu
Параметры методов в интерфейсе - Урок №
новая вкладка с new.code.mu
Объявление конструктора в интерфейсе - Урок №
новая вкладка с new.code.mu
Наследование интерфейсов друг от друга - Урок №
новая вкладка с new.code.mu
Интерфейсы и instanceof - Урок №
новая вкладка с new.code.mu
Реализация нескольких интерфейсов - Урок №
новая вкладка с new.code.mu
Наследование от класса и реализация интерфейса - Урок №
новая вкладка с new.code.mu
Константы в интерфейсах
Новый урок в данном разделе
Трейты
- Урок №
новая вкладка с new.code.mu
Введение в трейты - Урок №
новая вкладка с new.code.mu
Несколько трейтов - Урок №
новая вкладка с new.code.mu
Конфликты методов - Урок №
новая вкладка с new.code.mu
Модификаторы доступа - Урок №
новая вкладка с new.code.mu
Приоритет методов - Урок №
новая вкладка с new.code.mu
. текст, код Статические свойства - Урок №
новая вкладка с new.code.mu
. текст, код Статические методы - Урок №
новая вкладка с new.code.mu
Абстрактные методы - Урок №
новая вкладка с new.code.mu
Трейты в трейтах
ООП Магия
Практика
- Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс Arr - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс Ticket - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс TicketCollection - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс Date - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс Interval - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс File
Практика: классы как набор методов
- Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс ArrayConvertor - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс TagHelper - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс FormHelper - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс TableHelper - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс SessionShell - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс CookieShell - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс FileManipulator - Урок №
новая вкладка с new.code.mu
. текст, код Практика: класс databaseShell TODO cart корзина flash шаблонизатор роутер контроллер кеш логи фалидатор
Формы - это элементы HTML страницы, в которые пользователь может вводить данные, например, свое имя, фамилию, возраст, логин и пароль и так далее.
Эти данные затем могут быть получены в PHP и обработаны нужным нам образом.
К примеру, пользователь вводит свое имя и фамилию в форму, нажимает на кнопку отправки и введенные данные уходят на сервер в PHP. Там мы можем получить введенные имя и фамилию и, к примеру, сохранить их в базу данных.
Как сделать форму на HTML
Форма создается с помощью тега form. Этот тег имеет два важных атрибута.
Атрибут action задает адрес страницы сайта, на которую будут отправляться введенные данные. Если оставить этот атрибут пустым - форма отправится на текущую страницу сайта.
Атрибут method задает способ отправки формы. Может принимать значение GET или POST. При отправки методом GET данные из формы будут видны в адресной строке, а при отправке методом POST - не видны.
Имейте ввиду, что PHP код страницы с формой выполнится не один раз, как может показаться, а два раза - первый раз пользователь зайдет на страницу сайта, заполнит форму, нажмет на кнопку отправки, данные из формы отправятся на сервер и PHP код страницы начнет выполнятся сначала.
Поля формы
Внутри тега form можно располагать различные элементы формы: поле ввода input, кнопку отправки формы, многострочное поле ввода textarea и некоторые другие элементы, которые нам пока не нужны.
Пример формы
Как получить данные из формы в PHP
Мы можем получить данные, которые ввел пользователь в форму, в PHP коде. Это делается с помощью глобальных массивов $_GET, $_POST, $_REQUEST.
В $_GET будут лежать данные, отправленные методом GET, в $_POST будут лежать данные, отправленные методом POST, а $_REQUEST - данные, отправленные и тем, и другим методом одновременно.
Как именно это делается: пусть в форме есть инпут с атрибутом name="user". Тогда после отправки этой формы мы можем получить данные из этого инпута таким образом: $_GET['user'] (или $_POST['user'], или $_REQUEST['user']).
Сохраняем значения полей формы после отправки
Давайте сделаем так, чтобы при отправке формы не стирались значения из инпутов:
Пример выше будет генерировать предупреждение PHP при первом заходе на страницу - в случае, когда отправка формы еще не была сделана. Исправим это:
Дополнительные материалы
Рекомендую посмотреть видео из заочного курса: скачайте его по данной ссылке.
Читайте также: