Php как сделать восстановление пароля
Изучайте, как восстановить пароль с помощью PHP: просмотрите примеры и узнайте, как создать форму восстановления, используя сессии, письма и защитные вопросы.
Восстановление пароля в системе с помощью PHP - не слишком сложная задача. Для ее решения достаточно добавить несколько страниц к сайту. Так, на первой странице будет форма восстановления пароля. После заполнения формы пользователю придет письмо с ссылкой для смены пароля. После перехода по ссылке на второй странице появится форма ввода нового пароля. А на третьей странице после успешной смены пароля пользователь получит подтверждение. Таким образом, для восстановления пароля необходимо создать следующие страницы:
Страница с формой восстановления пароля
На данной странице пользователь должен ввести свой email адрес. После этого будет отправлено письмо с ссылкой для смены пароля. Код страницы должен выглядеть следующим образом:
<?php
// Проверка на отправление формы
if(isset($_POST['submit'])) {
// Проверка на заполненность полей
if(empty($_POST['email'])) {
$error = 'Введите email адрес';
} else {
// Проверка на валидность email адреса
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$error = 'Неверный email адрес';
} else {
// Проверка на существование пользователя с таким email адресом в базе данных
$stmt = $db->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0) {
// Проверка на просроченность ссылки для смены пароля
$user = $result->fetch_assoc();
if(time() - $user['forgot_password_timestamp'] > 86400) {
// Генерация случайного хеша
$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
$numChars = strlen($chars);
$string = '';
for($i = 0; $i < 10; $i++) {
$string .= substr($chars, rand(1, $numChars) - 1, 1);
}
$hash = sha1($string);
// Запись хеша и времени запроса в базу данных
$stmt = $db->prepare("UPDATE users SET forgot_password_hash = ?, forgot_password_timestamp = ? WHERE email = ?");
$stmt->bind_param("sis", $hash, time(), $_POST['email']);
$stmt->execute();
// Отправка письма с ссылкой для смены пароля
$to = $_POST['email'];
$subject = 'Смена пароля';
$message = 'Для смены пароля перейдите по ссылке: http://example.com/forgot_password.php?email='.$_POST['email'].'&hash='.$hash;
$headers = 'From: example@example.com' . "rn" .
'Reply-To: example@example.com' . "rn" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
}
$success = 'На ваш email адрес было отправлено письмо с ссылкой для смены пароля';
} else {
$error = 'Пользователь с таким email адресом не найден';
}
}
}
}
?>
<form action="" method="post">
<input type="text" name="email" placeholder="Email адрес">
<input type="submit" name="submit" value="Отправить">
</form>
На этой странице происходит проверка данных введенных пользователем. Если проверка проходит успешно, то происходит генерация случайного хеша. Этот хеш и время запроса записываются в базу данных. Затем происходит отправка письма пользователю со ссылкой для смены пароля.
Страница с формой для смены пароля
На данной странице происходит проверка данных переданных через параметры запроса. Если проверка проходит успешно, то в форме появляется поле для ввода нового пароля. Код страницы должен выглядеть следующим образом:
<?php
// Проверка на передачу параметров запроса
if(isset($_GET['email']) && isset($_GET['hash'])) {
// Проверка на существование пользователя с таким email адресом в базе данных
$stmt = $db->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param("s", $_GET['email']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0) {
// Проверка на просроченность ссылки для смены пароля
$user = $result->fetch_assoc();
if(time() - $user['forgot_password_timestamp'] > 86400) {
$error = 'Ссылка для смены пароля устарела';
} else {
// Проверка на совпадение хешей
if($_GET['hash'] == $user['forgot_password_hash']) {
// Проверка на отправление формы
if(isset($_POST['submit'])) {
// Проверка на заполненность полей
if(empty($_POST['password']) || empty($_POST['password_confirm'])) {
$error = 'Заполните все поля';
} else {
// Проверка на совпадение паролей
if($_POST['password'] != $_POST['password_confirm']) {
$error = 'Пароли не совпадают';
} else {