Пишем систему пользователей сайта на PHP. Часть 4. Функция восстановления паролей

7 сентября 2008 | Kalimdor

Вообщем полезная опция для пользовательской системы, ведь ни для кого не секрет, что юзер на сайте существо забывчивое :) и зачастую свой пароль он не помнит. Именно поэтому функция восстановления пароля на сайте нужна. На этот раз код будет оформлен в виде функции. Где и в каком месте её применить, решать вам :) .

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
<?php
  // Функция восстановления пароля, в качестве аргументов принимает почтовый ящик дескриптор соединения с базой данных,  название сайта и мыло отправителя и возвращает true, если операция восстановления пароля прошла успешно, false в противном случае
  function restoration_password ($email, $dbdeskriptor, $site_name, $adm_mail)
    {
      // Проверим валидность мыла
      if(!preg_match("/^[dw-_.]+@[dw-.]+.[w]{2,4}/i",$email))
        {
          mysql_close ($dbdeskriptor);
          echo "Некорректно введён e-mail адрес";
          return false;
        }
      // Составим запрос к базе данных
      $query_select = "SELECT `login`,`pass` FROM `user` WHERE mail="$email"";
      // Проведём запрос к базе данных
      $ath = mysql_query ($query_select, $dbdeskriptor);
      // Проверим успешность запроса
      if (!$ath)
        {
          mysql_close ($dbdeskriptor);
          echo "Ошибка базы данных";
          return false;
        }
      // Извлечём результаты запроса
      $result = mysql_fetch_assoc ($ath);
      // Проверим на NULL результат запроса
      if (isset ($result ['user']))
        {
          mysql_close ($dbdeskriptor);
          include "Такого e-mail в базе нет!";
          return false;
        }
      // Если пользователь существует, сгенерируем для него новый пароль, состоящий из 6 знаков
      $simvols = array ("0","1","2","3","4","5","6","7","8","9",
                        "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                        "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
      for ($key = 0; $key < 6; $key++)
        {
          shuffle ($simvols);
          $string = $string.$simvols[1];
        }
      // Найдём хеш пароля
      $pass = md5 ($string);
      // Составим запрос к базе данных
      $query_update = "UPDATE user SET pass = "$pass" WHERE mail="$email"";
      // Проведём запрос
      $ath = mysql_query ($query_update, $dbdeskriptor);
      // Проверим результат запроса
      if (!$ath)
        {
          mysql_close ($dbdeskriptor);
          echo "Ошибка базы данных";
          return false;
        }
      // Вышлем письмо с логином и новым паролем пользователю
      $ath = mail ("$email", "Восстановление пароля на сайте {$site_name}", "Вы запросили восстановление логина и/или пароля на сайте {$site_name}. Ваш логин и новый пароль:n
            Логин: {$result['login']}n
            Пароль: {$string}"
, "From: amin <{$adm_mail}>");
      // Проверим успешность отправки
      if (!$ath)
        {
          include "Ошибка при отправке письма";
          return false;
        }
      echo "Пароль восстановлен";
      return true;
    }
?>

Ну собственно всё, ничего сложно в функции нет.
____________________________________________
Постовый.
Обзор блогосферы от Virtual-lab.
Рецепт заработка от Спрута.
А здесь можно выйграть iPhone :) .

Похожие записи:


Комментарии (11):


 

Немного не по теме, но... наблюдаю какие-то странные проблемы с отображением сайта. В rss вместо русских букв одни вопросы. На сайте нормально но попадаются «артефакты» типа: регистрации пользова�, Mazin Форматы сетевой гр�…, Kalimdor Пишем систему поль�

(фаерфокс 3.0.1, rss-плагин sage-too, кодировка utf-8)

 

Renar

Да, рсс сейчас глюкануло, вроде починил.

> регистрации пользова�, Mazin Форматы сетевой гр�…, Kalimdor Пишем систему поль�

Это такой уж виджет последних комментариев, не спорю, поправить надо.

 

А что делает дескриптор, и как работает:

if (!preg_match («/^[\d\w-_\.]+@[\d\w-\.]+\.[\w]{2,4}/i»,$email))

я просто это не совсем понял(

Макс
 

> А что делает дескриптор

Дескриптор — это указатель на соединение с базой, файлом или ещё с чем-то. Он нужен для дальнейшей работы.

> if (!preg_match (”/^[\d\w-_\.]+@[\d\w-\.]+\.[\w]{2,4}/i”,$email))

Проверка мыла по регулярному выражению. Если не соответствует шаблону — шлёт нафиг.

 

а где задаётся дескриптор?

Макс
 

> а где задаётся дескриптор?

Его возвращает функция коннекта. Если ты про соединение с БД, то смотри предыдущие статьи. Скрипт — там.

 

> if (isset ($result ['user']))

> {

> mysql_close ($dbdeskriptor);

> include “Такого e-mail в базе нет!”;

> return false;

> }

1. В выборке из базы фигурируют ‘login’ и ‘pass’, а проверка идет ключику ‘user’

2. Возможно имелась ввиду проверка (!isset ($result[...])), а то получается если выборка не пустая -> пишем что e-mail не найден.

В итоге эти две ошибки себя компенсируют: элемент массива не находится, поэтому условие никогда не выполняется )))

Правильный кусочек:

if (!isset ($result ['login']))

{

mysql_close ($dbdeskriptor);

include “Такого e-mail в базе нет!”;

return false;

}

 

+ функция include в этом блоке крайне неуместна

 

и в строке 61: include “Ошибка при отправке письма”;

лучше написать: echo “Ошибка при отправке письма”;

Трекбеки:

 
 
Blogseller » 100% для партнеров!
9 сентября 2008 в 11:06    
 

Подписаться, не комментируя