PHP-регистрация пользователя: форма, база данных и безопасный пароль

Короткий ответ: регистрация пользователя на PHP делается через HTML-форму, серверную проверку данных, хеширование пароля функцией password_hash() и сохранение пользователя в базу данных через PDO

Самое важное: пароль нельзя хранить в базе в открытом виде. Даже в учебном проекте нужно сразу привыкать к password_hash() и password_verify(). Это не усложнение ради красоты, а базовый минимум безопасности

Структура учебного проекта

Пример будет состоять из трех файлов

registration-demo/
  db.php
  register.php
  users.sql

Для запуска нужен PHP, локальная база MySQL или MariaDB и веб-сервер. Для учебной проверки можно использовать XAMPP, Open Server, MAMP или обычный локальный сервер с настроенной базой

Таблица пользователей

Файл users.sql

create table users (
    id int unsigned auto_increment primary key,
    email varchar(255) not null unique,
    password_hash varchar(255) not null,
    created_at timestamp default current_timestamp
);

Поле password_hash хранит не пароль, а результат хеширования. Поле email сделано уникальным, чтобы один email не регистрировался несколько раз

Подключение к базе через PDO

Файл db.php

<?php

$pdo = new PDO(
    'mysql:host=localhost;dbname=registration_demo;charset=utf8mb4',
    'root',
    '',
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
);

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

Форма регистрации

Файл register.php

<?php
require __DIR__ . '/db.php';

$error = '';
$success = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = trim($_POST['email'] ?? '');
    $password = $_POST['password'] ?? '';

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = 'Введите корректный email';
    } elseif (strlen($password) < 8) {
        $error = 'Пароль должен быть не короче 8 символов';
    } else {
        $passwordHash = password_hash($password, PASSWORD_DEFAULT);

        try {
            $stmt = $pdo->prepare(
                'insert into users (email, password_hash) values (:email, :password_hash)'
            );

            $stmt->execute([
                'email' => $email,
                'password_hash' => $passwordHash,
            ]);

            $success = 'Пользователь зарегистрирован';
        } catch (PDOException $exception) {
            $error = 'Пользователь с таким email уже существует';
        }
    }
}
?>

<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Регистрация на PHP</title>
</head>
<body>
    <h1>Регистрация пользователя</h1>

    <?php if ($error !== ''): ?>
        <p style="color: red;"><?php echo htmlspecialchars($error); ?></p>
    <?php endif; ?>

    <?php if ($success !== ''): ?>
        <p style="color: green;"><?php echo htmlspecialchars($success); ?></p>
    <?php endif; ?>

    <form method="post">
        <label>
            Email
            <input type="email" name="email" required>
        </label>

        <label>
            Пароль
            <input type="password" name="password" required>
        </label>

        <button type="submit">Зарегистрироваться</button>
    </form>
</body>
</html>

Что здесь происходит

filter_var() проверяет email. Это не идеальная проверка всех жизненных случаев, но хороший базовый фильтр для учебной формы

password_hash() создает безопасный хеш пароля. Алгоритм выбирается через PASSWORD_DEFAULT, чтобы PHP мог использовать актуальный рекомендованный вариант

prepare() и execute() защищают SQL-запрос от подстановки пользовательского ввода напрямую в строку запроса. Это базовый способ не получить SQL-инъекцию

Как проверить результат

Запустите проект через локальный сервер, откройте register.php, введите email и пароль. После успешной отправки проверьте таблицу users: в ней должен появиться email и длинная строка в password_hash, но не сам пароль

Если зарегистрировать тот же email повторно, должна появиться ошибка

Что добавить для настоящего проекта

Учебная регистрация — только основа. Для реального сайта нужны подтверждение email, CSRF-защита, нормальная обработка ошибок, ограничение частоты запросов, вход пользователя через password_verify(), сессии и восстановление пароля

Но начинать лучше именно с этой базы: форма, проверка, хеш, база, подготовленный запрос

Мини-практика

Добавьте поле name, сохраните его в базе и выведите сообщение Пользователь Иван зарегистрирован. Затем сделайте отдельную страницу входа, где email ищется в базе, а пароль проверяется через password_verify()

Частые ошибки

Хранят пароль как обычный текст Так делать нельзя. Используйте password_hash() при регистрации и password_verify() при входе

Пишут SQL-запрос строкой с переменными Используйте подготовленные запросы PDO, особенно когда данные приходят из формы

Проверяют форму только в браузере Атрибут required удобен, но серверная проверка все равно обязательна

Показывают пользователю внутреннюю SQL-ошибку Логировать ошибку можно, но на странице лучше показывать человеческое сообщение

Что почитать дальше по PHP

Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x