[Webshake] Курс «PHP для начинающих» - Часть 3

Делаем форму обратной связи

Наверняка на многих сайтах вы видели форму обратной связи. Как правило она позволяет наиболее быстрым образом отправить какое-то послание администраторам сайта, так как представляет собой простое текстовое поле, в которое можно просто ввести любой текст и нажать кнопку «Отправить». В данном уроке мы сделаем форму обратной связи на PHP.

Для большей простоты мы напишем скрипт, который будет записывать обращения пользователя в файл.

Сама форма будет выглядеть следующим образом:
форма обратной связи на PHP

Давайте создадим файл с именем feedback.php и напишем HTML-код формы.

<html>
<head>
    <title>Обратная связь</title>
</head>
<body>
<div style="text-align: center">
    <h1>Форма обратной связи</h1>
    <form action="feedback.php" method="post">
        <label for="text">Введите ваш текст:</label><br>
        <textarea name="text" id="text" cols="55" rows="5"></textarea><br>
        <input type="submit" value="Отправить">
    </form>
</div>
</body>
</html>

Давайте будем записывать данные, переданные пользователем в файл feedback.txt. Так как мы не хотим, чтобы данный файл был доступен всем желающим, нельзя положить его в папку www. Поэтому в папке myproject.loc рядом с папкой www создадим ещё одну папку с именем private. А внутри неё уже создадим файл feedback.txt.

Осталось только написать логику, которая будет сохранять текст, переданный пользователем.
Для этого нам нужно:

  1. Получить данные POST-запроса, и убедиться, что переданный текст не пустой
  2. Дозаписать в конец файла этот текст. При этом перед текстом следует добавить дату и время создания записи.

Делается это проще простого:

<?php
$result = null;
$text = $_POST['text'] ?? '';

if (!empty($text)) {
    $datetime = date(DATE_ATOM);
    $isWrote = (bool) file_put_contents(
        __DIR__ . '/../private/feedback.txt',
        $datetime . PHP_EOL . $text . PHP_EOL . PHP_EOL,
        FILE_APPEND
    );
    if ($isWrote === false) {
        $result = 'Не удалось отправить сообщение, попробуйте ещё раз.';
    } else {
        $result = 'Ваше сообщение успешно отправлено!';
    }
}
?>
<html>
<head>
    <title>Обратная связь</title>
</head>
<body>
<div style="text-align: center">
    <h1>Форма обратной связи</h1>
    <?php if ($result !== null): ?>
    <div><b><?= $result ?></b></div><br>
    <?php endif; ?>
    <form action="feedback.php" method="post">
        <label for="text">Введите ваш текст:</label><br>
        <textarea name="text" id="text" cols="55" rows="5"></textarea><br>
        <input type="submit" value="Отправить">
    </form>
</div>
</body>
</html>

Пройдёмся по тому, что для нас новенькое.

  • Функция date() возвращает дату в указанном формате. Ей мы передаём константу DATE_ATOM, которая содержит в себе строку: “Y-m-d\TH:i:sP”. В итоге будет сформирована следующая дата: 2018-04-09T06:13:38+03:00.
  • Далее мы видим приведение результата выполнения функции file_put_contents к типу boolean. Дело в том, что эта функция возвращает число байт, записанных в файл, или false – если произошла ошибка при записи. Таким образом, если мы хоть что-то записали, то после преобразования любого ненулевого числа к типу boolean мы получим true. Результат этого выражения мы положили в переменную isWrote (записано ли), и затем смотрим – если true, то в $result положим текст о том, что сообщение успешно отправлено, а иначе – положим туда текст с ошибкой.

Всё остальное нам уже знакомо.

Проверка

Давайте теперь проверим работу формы и отправим несколько сообщений.
Сообщение в форме обратной связи

После отправки сообщений будет выводиться соответствующее уведомление.
результат отправки формы обратной связи

Давайте теперь посмотрим содержимое файла feedback.txt.
Сохраненные сообщения из формы обратной связи

Как видим, всё записалось. Для того чтобы можно было связаться с отправителем, на форму стоит добавить поле email и записывать его тоже.

Вот и всё :slight_smile:

1 симпатия