формы в PHP и формы в HTML

| Автор: / School-PHPSchool-PHP.com | Количество просмотров: 11308
PHP начинает свою работу тогда, когда появляется взаимодействие пользователя с сайтом, то есть через формы (всё остальное можно было бы реализовать и без PHP).

Давайте разберём пример №1. Мы создадим простую форму по вводу логина и пароля и если данные введены правильно, то уведомим об этом пользователя:
<?php
error_reporting(-1);
ini_set('display_errors','On');
header("Content-Type: text/html; charset=utf-8");

if(isset($_POST['login'],$_POST['password']) && $_POST['login'] === 'admin' && $_POST['password'] === '123') {
    $access = 1;
}
?>
<html>
<body>
<?php if(isset($access) && $access === 1) { ?>
    <div>Здравствуйте, <?=htmlspecialchars($_POST['login']);?></div>
<?php } else { ?>
    <form action="" method="post">
        <input type="text" name="login" placeholder="Введите логин">
        <input type="password" name="password" placeholder="введите пароль">
        <input type="submit" value="Войти на сайт!">
    </form>
<?php } ?>
</body>
</html>


Давайте разберёмся по шагам. Не смотря на то, что код выполняет свою работу сверху вниз, но разработку я начинал именно с создания самой форму. Я указал action="" , то есть пустым, это значит, что форма будет отправлена на эту же страницу для обработки кода вновь (сверху вниз начиная с первой строчки). Мы можем без труда указать action="https://vk.com" и форма будет отправлена на посторонний сайт. Ровно так и делают жулики, которые создают фейк-страницы социальных сетей, где Вы вводите форму и у Вас воруют пароли, но форма сама по себе отправляется на сайт социалки и Вы там авторизируетесь. То есть пользователь даже не заметит, что он вводил пароль на чужом сайте.

Так же я указал метод передачи данных POST. POST - тело запроса, на простом языке скрытый способ передачи данных. Есть ещё метод GET, который передаёт через адресную строку. К примеру через GET Ваш запрос выглядел бы:
/index.php?login=admin&password=123

Синтаксис такой, после файла-обработчика ставится знак вопроса, а далее переданные данные в формате ключ=значение указываются и соединяются знаком & . Это значит, что мы передали на указанный скрипт 2 переменных:
$_GET['login'] = 'admin';
$_GET['password'] = '123';

Если метод указан POST, то:
$_POST['login'] = 'admin';
$_POST['password'] = '123';

Эти строчки писать НЕ НАДО, они пишутся автоматически на нулевой строчке самим нашим кодом, нам лишь достаточно с ним работать и его использовать. Как Вы могли заметить, мы именно с ними работаем на строчке 6-ой.

Вернёмся на минутку в разницу между POST и GET и запомним отличия:
1) POST скрыт, GET - видимый. Это значит, что проходя кто-то из Ваших друзей за спиной видит какие данные Вы указали в форму, даже если данные скрыты. Поэтому важные формы всегда сделаны методом POST.
2) GET указывается в адресной строке, то есть можно выделить адресную строку и передать её своим знакомым и друзьям и они откроют страницу с переданными параметрами. GET используют в интернет-магазинах, когда в фильтре указывают не все товары отображать, а только специальные, к примеру:
store.php?category=iphone

store.php выводит список товаров в нашем интернет-магазине, если передать категорию=iphone, то выведутся все модели айфона. Если эту ссылку передать друзьям, то им тоже сразу выведется список айфонов!

Зная эти 2 простых отличия Вы без труда сможете выбрать правильный метод передачи данных. У нас идёт авторизация, мы эти данные прячем от посторонних глаз, чтобы даже наш сосед не видел, что мы ввели пароль "123", поэтому применили метод POST.

Форма состоит из 3-х тегов:
1) type="text" - текстовое поле, password - текстовое поле, где введённые символы заменяются звёздочкой (маскируются), submit - кнопка отправки формы!
2) name="login" - это значит, что мы передадим именно:
$_POST['login']

И содержание переменной будет то, что мы укажем в данном инпуте.
3) placeholder - значение-подсказка, она указывается серым цветом, по умолчанию, и если человек начнёт вводить свои значения, то подсказка пропадёт.

Как PHP обрабатывает форму


Итак, мы указали форму внутри тега body, это надо понимать, ведь никто не отменял структуру HTML при разработке сайта. Обработка формы всегда помещается в начале, до тега html. То есть не должно быть вывода информации на экран ранее, чем указан тег html.

Чтобы обработать форму мы указали функцию isset, которая проверила "существуют ли указанные переменные". Давайте подключать логику. Если существует, то выполняются данные внутри условной конструкции, если не существуют - то не выполняется! Логично? Да! Так вот, существуют тогда, когда они были переданы, вновь логика, а значит если форма была отправлена, то она передала данные, если передала данные, то мы выполнили проверку.

Вторая часть проверки:
$_POST['login'] === 'admin' && $_POST['password'] === '123'

Выполняется ровно следом за проверкой isset, и если проверка isset была удовлетворительна, то есть переменные существуют! Хочу заметить, что нельзя сразу писать вторую часть, первая часть проверки на isset всегда обязательная для всех видов форм! Если Вы уберёте левую часть проверки с isset, то получите ошибки.

Итого, если существуют переменные (а они существуют когда форма отправлена), и значение переменных будет равно требуемым admin и 123, то мы создаём переменную $access. Она символичная, но ключевая! Определяет, авторизировались ли мы или нет.

Кодом ниже мы наконец-то дошли до блока HTML вновь. И если обратите внимание, то там как раз идёт проверка на эту созданную переменную. Код такой: если переменная создана, то мы приветствуем пользователя, если не создана, то выводим форму, чтобы пользователь её заполнял.

=================

Давайте скажем выводы того, что мы только что написали. Мы создали код, который создаёт идентификатор доступа ($access) в том случае, если форма была отправлена и данные введены корректно. Мы вывели приветствие, если идентификатор существует, то есть форма была отправлена и данные введены корректно, и мы вывели форму, если идентификатор не был создан, а он не создаётся в случае если форма не была отправлена или данные были не корректными.

Конечно же можно этот код сделать чуть проще:
<html>
<body>
<?php if(isset($_POST['login'],$_POST['password']) && $_POST['login'] === 'admin' && $_POST['password'] === '123') { ?>
    <div>Здравствуйте, <?=htmlspecialchars($_POST['login']);?></div>
<?php } else { ?>
    <form action="" method="post">
        <input type="text" name="login" placeholder="Введите логин">
        <input type="password" name="password" placeholder="введите пароль">
        <input type="submit" value="Войти на сайт!">
    </form>
<?php } ?>
</body>
</html>


И представленный код выше так же будет работать. Но писать код так будет неправильно по той причине, что он жестко создаёт правила "мы дошли до тега body и теперь должны вывести текст". Как Вы знаете, что после авторизации большинство сайтов перенаправляют Вас на другую страницу. Допустим, gmail.com после авторизации отправляет Вас на страницу https://mail.google.com/mail/u/0/#inbox (входящие). В программировании на PHP существует одно главное правило, либо Вы перенаправляете человека, либо Вы ему выводите текст на этой странице. То есть перенаправление на другую страницу должно быть именно до первого вывода информации на экран. Вы можете написать код, которым легко можно манипулировать. Во втором случае перенаправление мы не можем сделать по той причине, что у нас уже начался вывод тега html! В свою очередь изменить первый код очень просто:

<?php
error_reporting(-1);
ini_set('display_errors','On');
header("Content-Type: text/html; charset=utf-8");

if(isset($_POST['login'],$_POST['password']) && $_POST['login'] === 'admin' && $_POST['password'] === '123') {
    header("Location: https://mail.google.com/mail/u/0/#inbox");
    exit;
}
?>
<html>
<body>
<?php if(isset($access) && $access === 1) { ?>
    <div>Здравствуйте, <?=htmlspecialchars($_POST['login']);?></div>
<?php } else { ?>
    <form action="" method="post">
        <input type="text" name="login" placeholder="Введите логин">
        <input type="password" name="password" placeholder="введите пароль">
        <input type="submit" value="Войти на сайт!">
    </form>
<?php } ?>
</body>
</html>


Как Вы видите, мы лишь изменили 1 строчку кода и код стал работать иначе, теперь при корректном вводе данных Вы перенаправляетесь на другую страницу или другой сайт. Если быть более гибким и добавить уведомления о вводе данных, то можно сделать так:

<?php
error_reporting(-1);
ini_set('display_errors','On');
header("Content-Type: text/html; charset=utf-8");

if(isset($_POST['login'],$_POST['password'])) {
    if($_POST['login'] === 'admin' && $_POST['password'] === '123') {
        header("Location: https://mail.google.com/mail/u/0/#inbox");
        exit;
    } else {
        $error = 'Вы неправильно ввели логин или пароль';
    }
}
?>
<html>
<body>
<?php if(isset($error)) { ?>
    <div>Здравствуйте, <?=htmlspecialchars($error);?></div>
<?php } ?>

<form action="" method="post">
    <input type="text" name="login" placeholder="Введите логин">
    <input type="password" name="password" placeholder="введите пароль">
    <input type="submit" value="Войти на сайт!">
</form>
</body>
</html>


Новый код позволяет проверить корректность введённого логина и пароля, а если Вы ввели неправильно, то создаёт сообщение с ошибкой. Если сообщение с ошибкой существует, то его выводим на экран. Форма выводится всегда. Понятно дело, если корректно были введены логин и пароль, то код не успеет дойти до вывода формы, а пользователь уже будет перенаправлен на новую страницу.


========================

Я показал Вам стандартное поведение работы с формами в PHP. Я не буду расширять знания и добавлять чекбоксы, радио-кнопки, загрузку файлов, потому что в противном случае эта статья превратится в 100 раз длиннее. Программирование - это очень много информации, хороший программист тот, кто больше помнит информации и применяет её правильно, а плохой тот, кто не знает или не помнит, а если и помнит, то ленится правильно применять. Я выше показал не только правильный код, но и постарался объяснить основные моменты, почему именно так код правильно писать, а не иначе.

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



Комментарии о School-PHP (0):


Напишите свой комментарий:
Имя:
E-mail:
на него отправится ответ
Skype Станислава:
напишите мой скайп
(есть внизу страницы)
Введите комментарий:

* Комментарий при отправке отправляется на пре-модерацию. Вынужденная защита от спама, чтобы сайт был чистым.

Персональный блог Ускова Станислава: School-PHP.com

В основном в данном блоке идут посадочные страницы с целью привлечения аудитории из Google и Yandex. Под каждый поисковый запрос создаётся отдельная страница, в итоге мы получаем много статей на разные темы, при этом полезны только для того, кто был заинтересован именно этим запросом. Для остальных же всё же советую сосредоточиться на прохождении общей программы курса!
Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы