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

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

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 :) .

Метки: , , , ,
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

11 thoughts


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

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

  2. Renar

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

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

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

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

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

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

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

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

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

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

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

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

  6. > 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;

    }

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

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

Напишите комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *