Формы на PHP
От разметки до письма в почте
Разметка формы
<form action="/send.php" method="post">
<input type="text" name="name" required>
<input type="email" name="email" required>
<textarea name="message"></textarea>
<button type="submit">Отправить</button>
</form>
Атрибут name обязателен — по нему PHP находит поле. method="post" не показывает данные в адресной строке и не ограничен длиной, как get.
Приём данных
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');
}
Проверка метода отсекает прямые переходы на /send.php. trim() убирает пробелы, ?? '' защищает от отсутствующего поля — иначе будет предупреждение о неопределённом индексе.
Валидация
Проверять нужно на сервере, а не только через атрибуты вроде required: их легко обойти, отправив запрос напрямую.
$errors = [];
if (mb_strlen($name) < 2) $errors[] = "Укажите имя";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "Неверный email";
if (mb_strlen($message) < 10) $errors[] = "Короткое сообщение";
Для длины используйте mb_strlen, иначе русский текст посчитается по байтам и лимит сработает втрое раньше.
Вывод обратно в форму
Если есть ошибки, страницу показывают заново, а введённое сохраняют. Обязательно экранируйте при выводе:
<input name="name" value="<?= htmlspecialchars($name, ENT_QUOTES) ?>">
Без htmlspecialchars пользователь может вписать в поле разметку и скрипт — это XSS.
Отправка письма
$to = "gerasimovs@bk.ru";
$subject = "Заявка с сайта";
$body = "Имя: $name\nEmail: $email\n\n$message";
$headers = "From: no-reply@majorsky.ru\r\nContent-Type: text/plain; charset=utf-8";
mail($to, $subject, $body, $headers);
Функция mail() отправляет письмо от имени сервера, поэтому домен должен иметь SPF и DKIM — иначе письма уезжают в спам. На реальном проекте лучше SMTP через PHPMailer.
Защита от спама
- Скрытое поле-ловушка. Человек его не видит, бот заполняет — форма отбрасывается.
- CSRF-токен. Одноразовый код в сессии, без которого форма не принимается.
- Ограничение частоты. Не больше одной заявки с одного IP в минуту.
- Капча. Крайняя мера, когда остальное не помогает.
Частые ошибки
- Нет проверки метода. Скрипт срабатывает при простом открытии адреса.
- Данные вставляются в SQL без подготовки. Прямая SQL-инъекция.
- Вывод без экранирования. XSS в поле «ваше сообщение».
- Нет подтверждения. Пользователь нажал кнопку и не понял, ушло ли письмо.
Нужен сайт, а не статья?
Подключу формы к почте, базе и CRM: валидация, антиспам, уведомления. С 2009 года, по договору, с поддержкой после запуска.
Полезно по теме: PHP с нуля, синтаксис PHP, MySQL и PDO.