Link in progress
Обо мне
PHP_SELF. isset(). Уроки PHP

php_self-isset-уроки-phpДоброго времени суток.
Немножко изменить уроки. Начиная с этого урока я буду составлять план урока, так, как это делают в учебных заведениях.

План урока:
1. Объединение HTML файла и PHP обработчика и применение функции isset();
2. Повторный вывод HTML формы, если в ней есть незаполненные поля;
3. Повторный вывод HTML формы и запоминание ранее ведённых данных. PHP_SELF;
4. Вывод ошибок под полями формы;
5. Заключение и несколько слов о следующем уроке.

1. Объединение HTML файла и PHP обработчика.

На примере страницы add_mailer.php. Когда мы уводим данные и забываем заполнить одно из полей, мы видим ошибку и что бы ее исправить, мы возвращаемся средствами браузера назад и вынуждены заполнять все поля заново. А что если мы выведем ошибку и форму в одном файле? Конечно, это не сбережет ранее веденные данные, но уже нам не нужно будет делать лишнюю манипуляцию возврата.
Давайте объединим файл HTML и PHP в один файл PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<!DOCTYPE html>
<html>
<head>
<title>PHP_SELF. Isset(). Уроки PHP</title>
    <meta http-equiv="Content-Type" content="text/html; charset="utf-8" />
    <link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>

<div id="body">

<?php
if (isset($_POST['submit'])) {
//Записываем данные пришедшие из формы в переменные
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
//Если все поля не заполненные
if (empty($firstname) && empty($lastname) && empty($email)) {
    echo "Вы забыли указать имя, фамилию и E-mail!";
    $need_form = 'ok';
    };
// Если не заполненное $firstname и не заполненное $lastname и заполненное $email
if (empty($firstname) && empty($lastname) && (!empty($email))) {
    echo "Вы забыли указать имя и фамилию!";
    $need_form = 'ok';
    };
// Если не заполненное $firstname и заполненное $lastname и не заполненное $email
if (empty($firstname) && (!empty($lastname)) && empty($email)) {
    echo "Вы забыли указать имя и E-mail!";
    $need_form = 'ok';
    };
// Если заполненное $firstname и не заполненное $lastname и не заполненное $email
if ((!empty($firstname)) && empty($lastname) && empty($email)) {
    echo "Вы забыли указать фамилию и E-mail!";
    $need_form = 'ok';
    };
// Если не заполненное $firstname и заполненное lastname и заполненное $email
if (empty($firstname) && (!empty($lastname)) && (!empty($email))) {
    echo "Вы забыли указать имя!";
    $need_form = 'ok';
    };
// Если заполненное $firstname и не заполненное $lastname и заполненное $email
if (!empty($firstname) && empty($lastname) && (!empty($email)))  {
    echo "Вы забыли указать фамилию!";
    $need_form = 'ok';
    };
// Если заполненное $firstname и заполненное $lastname и не заполненное $email
if ((!empty($firstname)) && (!empty($lastname)) && empty($email)) {
    echo "Вы забыли указать E-mail!";
    $need_form = 'ok';
    };
// Если все поля заполненные
if ((!empty($firstname)) && (!empty($lastname)) && (!empty($email))) {
        //Подключаемся к БД
        $connect = mysqli_connect('hostname', 'login', 'pass', 'BDname', ) or die ('Нет подключения к базе данных');
        //Записываем запрос к БД в переменную
        $query = "INSERT INTO store_list VALUES ('$firstname', '$lastname', '$email')";

        // Выполняем отправку запроса в БД
        mysqli_query($connect, $query) or die ('Не удалось записать данные в БД');

        // Закрываем соединение с БД
        mysqli_close($connect);

        echo "Подписка успешно совершена. Ждите рассылку.";
        $need_form = 'No';
    };
};

?>
<p style="font-size:18pt; text-align:center;">Мой супер-маркет<p />
  <form method="post" action="<?PHP $_SERVER['PHP_SELF']?>">
    <label for="firstname">Имя:</label>
    <input type="text" id="firstname" name="firstname" /><br />
    <label for="lastname">Фамилия:</label>
    <input type="text" id="lastname" name="lastname" /><br />
    <label for="email">Ваш E-mail</label>
    <input type="text" id="email" name="email" /><br />
    <div class="send">
        <input type="submit" id="send" value="Отправить" name="submit" />
        </div>
  </form>
</div>

<div id="right">
    &#9658; <a href="add_mail.html">Добавить подписчика</a><br />
    &#9658; <a href="send_mail.html">Рассылка сообщений</a><br />
    &#9658; <a href="dell_mail.html">Удалить подписчика</a>
</div>
</body>
</html>

php_self-isset-уроки-php_Error01
Теперь давайте откроем наш файл: http://my.domain/add_mailer.php. И нам сразу выдало ошибку. Почемe выводится ошибка, если мы не нажимали на отправку формы? Вот тут нам и пригодится isset(). PHP не знает, открыли вы эту страницу впервые или после нажатия на кнопку «ОТПРАВИТЬ». Напишем код, который будет сообщать PHP о том, была ли форма отравлена при помощи кнопки «ОТПРАВИТЬ»:

1
2
3
if (isset($_POST['submit'])) {
    код, который выполнится, если форма была отправлена кнопкой ОТПРАВИТЬ
};

Теперь PHP знает, когда страница http://my.domain/add_mailer.php была открыта впервые и данные формы проверять не нужно, а когда форма была отправлена кнопкой «ОТПРАВИТЬ» – данные уже проверять нужно.

2. Повторный вывод HTML формы, если в ней есть незаполненные поля;

Сейчас у нас форма выводится всегда, независимо от того, была ошибка или нет. Это хорошо, если у формы были ошибки, но если форма была заполнена правильно, и данные были успешно добавленные в базу данных, повторный вывод формы может ввести в заблуждение пользователя, который хочет подписаться на вашу рассылку. Нам нужно уведомить PHP, когда нужно выводить HTML форму, а когда нет. Для этого используем простой способ:

1
$need_form = 'ok';

Вы скажете, что это такое и как оно нам поможет? Смотрите, у нас есть восемь условий, восемь возможных действий поведение PHP скрипта. В каждую из них вложим выше написанный код, но там, где все условия соблюдены и данные отправляются в БД, форма нам не нужно и присвоим ей значение:

1
$need_form = 'No';

Получается, если есть ошибка – вывести форму и саму ошибку. Если ошибки нет – отправить данные в БД, вывести сообщение об успешном добавлении подписчика в БД и форму выводит не нужно. Что бы не увеличивать длину страницы, скачайте внизу страницы файлы урока, и посмотрите, как это работает.

3. Повторный вывод HTML формы и запоминание ранее ведённых данных;

Конечно, у нас уже и форма выводится и ошибки показываются, когда нужно. Но форма всегда обновляется и выводится пустая. А что если сделать так, при условии вывода ошибки, форма будет запоминать ранее заполненные данные? Хорошая идея, что упростить нам жизнь. HTML сам по себе не умеет сохранять данные. Первый момент который нужно знать – это куда отправляет данные форма action=»add_mailer.php». Оно хорошо работает, но если вы случайный образом или специальным переименуете этот файл, оно уже работать не будет. Для того, что бы уменьшить проблемы в будущем, мы будем используем суперглобальную переменную $_SERVER[‘PHP_SELF’]. Эта переменная PHP, которая отправляет данные формы сама на себя. Используем это в нашем скрипту:

1
<form method="post" action="$_SERVER['PHP_SELF']">

И проверим работоспособность нашего кода. Не работает! Посмотрите внимательно, почему не работает. $_SERVER[‘PHP_SELF’]. – суперглобальная переменная PHP, а мы ее вставили как обычный код HTML, а нам нужно, что бы его распознавал PHP:

1
<form method="post" action="<?PHP $_SERVER['PHP_SELF']?>">

А вот теперь все работает так, как нужно! Это не супер новация, но это будет считаться хорошим кодом. Теперь перейдем к тому, как сделать форму интеллектуальной. В каждой поле input можно присвоить стандартный текст свойством value. Например:

1
<input type="text" id="firstname" name="firstname" value="Ваше имя!"/><br />

php_self-isset-уроки-php_01

Результат этого кода вы можете смотреть на скриншоте. Что бы форма выводила текст, данные, которые были введены до нажатия кнопки «ОТПРАВИТЬ», нужно создать переменные, которые будут содержать данные конкретного поля формы и выводить их содержание в форме value. Например:

1
<input type="text" id="firstname" name="firstname" value="<?PHP echo $firstname?>"/><br />

Что тут происходит: при захождении на форму, страницу формы в первый раз, наши переменные пустые, и в полях ничего не будет. Как только в поле формы было что вписано и была нажата кнопка «ОТПРАВИТЬ», уже в дело вступает PHP код проверки, иными словами – код валидации формы. Первое что у нас происходит – это получение и заполнение переменных с $_POST.

$_POST – может принимать вид $_GET, если в передачи формы используется метод GET, а не POST: method=»post».

1
2
3
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];

Далее у нас идет проверка на заполнение форм, но нам это уже не интересно. Получается, что у нас уже есть возможность вывести данные формы, которые были отправленные нажатием кнопки «ОТПРАВИТЬ».

4. Вывод ошибок под полями формы.

Форма умеет запоминать данные, ошибка выводится и это только после нажатия кнопки «ОТПРАВИТЬ». Можно и выводит ошибки и сверху формы, так как оно есть сейчас, но я думаю, что лучше выводить ошибки под конкретным полем, что бы человек знал, где конкретно нужно править. И так, начнем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if (empty($firstname) && empty($lastname) && empty($email)) {
    $error_firstname = 'Вы забыли указать имя!';
    $error_lastname = 'Вы забыли указать фамилию!';
    $error_email = 'Вы забыли указать E-mail!';
    $need_form = 'ok';
    };
// Если не заполненное $firstname и не заполненное $lastname и заполненное $email
if (empty($firstname) && empty($lastname) && (!empty($email))) {
    $error_firstname = 'Вы забыли указать имя!';
    $error_lastname = 'Вы забыли указать фамилию!';
    $need_form = 'ok';
    };
// Если не заполненное $firstname и заполненное $lastname и не заполненное $email
if (empty($firstname) && (!empty($lastname)) && empty($email)) {
    $error_firstname = 'Вы забыли указать имя!';
    $error_email = 'Вы забыли указать E-mail!';
    $need_form = 'ok';
    };
// Если заполненное $firstname и не заполненное $lastname и не заполненное $email
if ((!empty($firstname)) && empty($lastname) && empty($email)) {
    $error_lastname = 'Вы забыли указать фамилию!';
    $error_email = 'Вы забыли указать E-mail!';
    $need_form = 'ok';
    };
// Если не заполненное $firstname и заполненное lastname и заполненное $email
if (empty($firstname) && (!empty($lastname)) && (!empty($email))) {
    $error_firstname = 'Вы забыли указать имя!';
    $need_form = 'ok';
    };
// Если заполненное $firstname и не заполненное $lastname и заполненное $email
if (!empty($firstname) && empty($lastname) && (!empty($email)))  {
    $error_lastname = 'Вы забыли указать фамилию!';
    $need_form = 'ok';
    };
// Если заполненное $firstname и заполненное $lastname и не заполненное $email
if ((!empty($firstname)) && (!empty($lastname)) && empty($email)) {
    $error_email = 'Вы забыли указать E-mail!';
    $need_form = 'ok';
    };

Вставил весь код. Всмотритесь в него. Что тут происходит: если сохраняется какое-то условие, например когда мы забыли указать имя подписчика, у нас присваивается переменной $error_firstname соответствующий текст ошибки. И так у всех остальных случаях. Для того, что бы эти ошибки выводились, нужно написать что-то подобное:

1
2
3
4
5
6
7
8
9
10
11
<label for="firstname">Имя:</label>
    <input type="text" id="firstname" name="firstname" value="<?PHP echo $firstname?>"/><br />
        <?php if ($error_firstname){ echo '<span class="error">' . $error_firstname . '</span><br />';}?>
    <label for="lastname">Фамилия:</label>
    <input type="text" id="lastname" name="lastname" value="<?PHP echo $lastname?>"/><br />
        <?php if ($error_lastname){ echo '<span class="error">' . $error_lastname . '</span><br />';}?>
    <label for="email">Ваш E-mail</label>
    <input type="text" id="email" name="email" value="<?PHP echo $email?>"/><br />
        <?php if ($error_email){ echo '<span class="error">' . $error_email . '</span><br />';}?>
    <div class="send">
        <input type="submit" id="send" value="Отправить" name="submit" />

php_self-isset-уроки-php_Error02

Как видно с кода, мы выводим данные переменных, если они существуют и не пустыне под каждым полем формы. Обратите внимание, что вывод данных переменных написано через конструкцию if(), что есть хорошим методом написания кода. Чуть не забыл о стилях, внесите в конец файла style.css:

1
2
3
4
5
.error {
    color: red;
    padding: 0 0 0 20px;
    font-style: italic;
}

5. Заключение и несколько слов о следующем уроке.

Как обещал в этом уроке я написал урок, где мы будем применять функцию isset(). Думаю писать плюсы о объединении файла HTML с PHP нет нужды, вы сами можете увидеть их в самом уроке. Сегодня узнали о новой суперглобальной переменной PHP_SELF, в контексте $_SERVER[‘PHP_SELF’]. Научились делать «умную форму», выводит ошибки в местах ошибок, что предает плюсу к юзабилити нашей мини CMS.В следующем уроке поговорим о проблемах дублей E-mail адресов, как их можно удалить из базы данных и узнаем что такое уникальный идентификатор записей в таблице БД.

С наилучшими намерениями, ProIN!

Скачать файлы урока:
lesson_files

PHP_SELF. isset(). Уроки PHP: 1 комментарий

  1. Алексей

    Удобно, когда есть план урока! Спасибо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Max quality, min price, min time expenditure
Send me a message to: work@glogla.net
Portfolio