За последние 24 часа нас посетили 30465 программистов и 1807 роботов. Сейчас ищут 800 программистов ...

Помогите разобраться с генератором строки

Тема в разделе "PHP для новичков", создана пользователем Stairdeck, 12 май 2015.

  1. Stairdeck

    Stairdeck Активный пользователь

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Привет всем. У меня возникла одна проблема, сейчас опишу её суть.
    Я сделал систему регистрации и всё такое, конечно же делаю с подтверждением Email.
    1.Генерируется 5 символов.
    2.Отправляется всё это дело на почту.
    3.Вводишь код подтверждения в форму и всё чики пуки.
    У меня всё работает, НО, когда я нажимаю кнопочку подтвердить, этот генератор делает новую строку, и она получается не равна той, которую я отправил по Email.
    Код прилагаю ниже.

    P.s Часть кода взял со статьи на Хабре, но это не важно.
    P.s.s Прошу не обсирать код, т.к. я его писал так специально, чтобы как можно быстрее выяснить проблему и всё такое.

    Код (PHP):
    1. <?php
    2. if(isset($_COOKIE['mail']))
    3. {    
    4.  
    5. include 'data/dbconfig.php';
    6.  
    7. function generateCode($length=5) 
    8.     {
    9.         $chars = "ABCDEFGHIJKLMNOPRQSTUVWXYZ0123456789";
    10.         $code = "";
    11.         $clen = strlen($chars) - 1;  
    12.         while (strlen($code) < $length) 
    13.         {
    14.             $code .= $chars[mt_rand(0,$clen)];  
    15.         }
    16.         return $code;
    17.     }
    18.         
    19. $key = generateCode(5);
    20. $mail = $_COOKIE['mail'];
    21.  
    22. $query = mysql_query("SELECT * FROM users WHERE user_email='".$mail."'");
    23. $data = mysql_fetch_assoc($query);
    24.         
    25.         $to = $mail; 
    26.         $subject = "Регистрация на сайте"; 
    27.         $message = ' <p>Текст письма</p> </br> <b>Уважаемый '.$data['user_login'].', </b> </br>Вы зарегистрировались на нашем сайте. </br> Вот Ваш код: '.$key.'';
    28.         $headers  = "Content-type: text/html; charset=windows-1251 \r\n"; 
    29.         $headers .= "From: От кого письмо <from@example.com>\r\n"; 
    30.         $headers .= "Reply-To: reply-to@example.com\r\n"; 
    31.         //mail($to, $subject, $message, $headers); 
    32.         
    33. if(isset($_POST['confirm']))
    34.     {
    35.         if($_POST['code'] == $key)
    36.         {
    37.             mysql_query("UPDATE users SET user_status='1' WHERE user_id='".$data['user_id']."'");
    38.             print "Регистрация завершена";
    39.             setcookie("mail", $mail, time()-60*60*24*30);    
    40.         }
    41.         else
    42.         {
    43.             print "Неверный код - ".$_POST['code']." не соответствует   ".$key." ";
    44.         }
    45.     }
    46. }
    47.  
    48. else 
    49. {
    50.     header("Location: index.php"); 
    51. }
    52. ?>
    53. <form method="POST">
    54. Администрация сайта требует правильности вводимых Email,<br>
    55. К Вам на почту, было выслано письмо с кодом,<br>
    56. Введите его здесь:<?php print $key ?><br><br>
    57. <input name="code" type="text" maxlength="5"><a>   </a><input name="confirm" type="submit" value="Подтвердить"> 
    58. </form>
    59. </html>
    Спасибо.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Оберни $key = generateCode(5); в проверку, нужно ли генерировать код заново.
    Либо не удивляйся, что генератор случайной строки генерирует случайные строки.
     
  3. Stairdeck

    Stairdeck Активный пользователь

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    А можно узнать, каким образом? Я просто не до конца понимаю
     
  4. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Генерируете 5 символов, высылаете на почту юзверю, тут же эти 5 символов заносите в бд к логину этого юзверя. когда юзверь вводит эти 5 символов - сверять их со строкой из бд
     
  5. Stairdeck

    Stairdeck Активный пользователь

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Это проще простого, я уже и сам думал если честно, но всё таки не хотелось засорять бд, тем более если можно обойтись без неё
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Юзуйте мемкеш и храните в оперативке. Да и не засорите вы ее. 5 символов на юзера - не велик засор.
     
  7. Stairdeck

    Stairdeck Активный пользователь

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Спасибо попробую. Но если же есть возможность запилить без использования бд, напишите пожалуйста, мало ли
     
  8. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Ну я бы, например, сделал так:
    одна таблица юзера, основная, где: лог, пасс, вся нужная шляпа, активация.
    Где активация может иметь значения 1 или 0, т.е. активирован аккаунт или нет.
    Вторая таблица, временная. Где есть только логин и 5-символьный код активации.
    По умолчанию в первой таблице активация стоит в 0.
    Как юзер вводит свой код активации, он сверяется с кодом во второй таблице. Если коды совпадают - строка во второй таблице удаляется, а в первой таблице активация апдейтится в 1
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Но мемкешеры и есть способ без использования БД, Карл...