Форумы портала PHP.SU » » Работа с СУБД » Правильная регистрация

Страниц (1): [1]
 

1. Dezmonds - 12 Мая, 2011 - 14:42:29 - перейти к сообщению
Многоуважаемые , помогите пожалуйста! Перелапатил тонну сообщений и что-то никак не могу сделать Недовольство, огорчение Проблема в следующем...

При нажатии на F5 в обработчике файла регистрации. Данный повторно заносятся в базу! После этого, если нажать еще раз на F5, то пишет, что логин существует такой уже и мыло...
Во общем помогите с кодом. Что поправить, чтобы был хороший, качественный,правильный код! Буду чрезмерно благодарен!

Понимаю, что есть лишние проверки, но все же.. Как написать правильно?


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login); echo "Вы не заполнили форму логин.<br />";exit();} }
  5. if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);echo "Вы не заполнили форму Ф.И.О.<br />";exit();} }
  6. if (isset($_POST['mail'])) { $mail = $_POST['mail']; if ($mail == '') { unset($mail);echo "Вы не заполнили форму E-mail.<br />";exit();} }
  7. if (isset($_POST['password'])) { $password = $_POST['password']; if ($password == '') { unset($password);echo "Вы не заполнили форму Пароль.<br />";exit();} }
  8. if (isset($_POST['password2'])) { $password2 = $_POST['password2']; if ($password2 == '') { unset($password2);echo "Вы не заполнили форму повтор пароля.<br />";exit();} }
  9.  
  10. if (!$_POST['login'])
  11. {
  12.         echo "Вы не заполнили форму логин.";
  13.         }
  14. else
  15. {
  16.         $login =($_POST['login']);
  17.        
  18. }
  19.  
  20. if (!$_POST['name'])
  21. {
  22.         echo "Вы не заполнили форму Ф.И.О.";
  23. }
  24. else
  25. {
  26.         $name =($_POST['name']);
  27. }
  28.  
  29. if (!$_POST['mail'])
  30. {
  31.         echo "Вы не заполнили форму E-mail:Пожалуйста, указывайте реальный е-mail, на него предет подтверждение регистрации в Клубе «Osako»";
  32. }
  33. else
  34. {
  35.         $mail =($_POST['mail']);
  36. }
  37.  
  38. if($_POST["mail"]&& !ereg("^[^@]+@([a-z\-]+\.)+[a-z]{2,4}$",$_POST["mail"]))
  39. {
  40.         echo "Введите корректный формат электронной почты";
  41.         exit();
  42. }
  43.  
  44.  
  45. if (!$_POST['password'])
  46. {
  47.         echo "Вы не заполнили форму Пароль";
  48. }
  49. else
  50. {
  51.         $password =($_POST['password']);
  52. }
  53.  
  54. if (!$_POST['password2'])
  55. {
  56.         echo "Вы не заполнили форму повторного воода Пароля";
  57. }
  58. else
  59. {
  60.         $password =($_POST['password2']);
  61. }
  62.  
  63. if ($_POST['password'] != $_POST['password2'])
  64. {
  65.         echo "Введенные пароль не совпадают.";
  66. }
  67. else
  68. {
  69.  $password = ($_POST['password']);
  70.  $password2 = ($_POST['password2']);   
  71. }
  72.  
  73. //если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
  74.     $login = stripslashes($login);
  75.     $login = htmlspecialchars($login);
  76.         $name = stripslashes($name);
  77.     $name = htmlspecialchars($name);
  78.         $mail = stripslashes($mail);
  79.     $mail = htmlspecialchars($mail);
  80.         $password = stripslashes($password);
  81.     $password = htmlspecialchars($password);
  82.         $password2 = stripslashes($password2);
  83.     $password2 = htmlspecialchars($password2);
  84.  //удаляем лишние пробелы
  85.     $login = trim($login);
  86.         $name = trim($name);
  87.         $mail = trim($mail);
  88.     $password = trim($password);
  89.         $password2 = trim($password2);
  90.        
  91.  
  92.  
  93. include("admin/db.php");
  94.  
  95.  
  96.  
  97.  
  98. $result = mysql_query("SELECT id FROM users WHERE login='".$login."' OR mail = '".$mail."'",$db); //извлекаем из базы все данные о пользователе с введенным логином
  99.     $myrow = mysql_fetch_array($result);
  100.  
  101. if (!$result)
  102.     {
  103.       echo "Ошибка!Что то с соединением! Строка 129";
  104.       mysql_close ($db);
  105.       exit ();
  106.     }                          
  107. $resultats = mysql_fetch_assoc ($result);
  108.   // Проверяем свободность
  109.   if (isset ($resultats['id']))
  110.     {
  111.       echo "Ошибка! Походу логин занят!";
  112.       mysql_close ($db);
  113.       exit ();
  114.     }                          
  115.                                
  116.   // Если всё нормально, заносим данные в базу данных
  117.   // Сформируем данные
  118.   $pass = md5 ($password);
  119.   // Сформируем запрос
  120.   $query_insert = "INSERT INTO users VALUES (0,'$login','$name','$mail','$pass');";
  121.   // Проведём запрос к БД
  122.   $ath = mysql_query ($query_insert, $db);
  123.   // Проверим успешность запроса
  124.   if (!$ath)
  125.     {
  126.       echo "Ошибка!Что то с соединением! Строка 152<br />";
  127.       mysql_close ($db);
  128.       exit ();
  129.     }
  130.         else {
  131.   // Закроем соединение с БД
  132.   mysql_close ($db);
  133.   // Выведем сообщение об успешной регистрации
  134.   echo "Регистрация прошла успешно";                           
  135.                                
  136.         }
  137.                                
  138.                                
  139.  
  140.         ?>
  141.  
2. EuGen - 12 Мая, 2011 - 14:47:32 - перейти к сообщению
После того, как пользователь зарегистрировался, делайте перенаправление скрипта самого на себя при помощи, например, header.
Только помните, что при использовании этого Вам нужно позаботиться, чтоб скрипт ничего не выводил (в Вашем случае это "Регистрация прошла успешно")
3. Dezmonds - 12 Мая, 2011 - 15:01:24 - перейти к сообщению
Думал, касаемо этого, а если все же как-то по другому сделать ? Более правильно. Потому, что если после регистрации пользователь попробует зарегистрироваться с тем же логином, или мылом, то ему это без проблем удастся.. Вообще ничего не могу понять...вроде ошибок в коде нет.. может просто глаза замылил.. Помогите в коде разобраться.
4. EuGen - 12 Мая, 2011 - 15:05:49 - перейти к сообщению
Dezmonds пишет:
о ему это без проблем удастся

Почему же это?
Все действия произведены, пользователь добавился. И если он попробоует снова - то следуя логике Вашего же скрипта это ему не удастся.
5. Dezmonds - 12 Мая, 2011 - 15:11:25 - перейти к сообщению
EuGen пишет:
Dezmonds пишет:
о ему это без проблем удастся

Почему же это?
Все действия произведены, пользователь добавился. И если он попробоует снова - то следуя логике Вашего же скрипта это ему не удастся.

Сам не знаю.. но так оно и есть.. видимо где то грубейшая ошибка Недовольство, огорчение
6. Dezmonds - 12 Мая, 2011 - 17:33:49 - перейти к сообщению
Многоуважаемые, помогите, нужно разобраться Улыбка Что тут ни так с проверкой логина, и почему записывается абсолютно такое же значение в БД.
7. Zuldek - 12 Мая, 2011 - 17:40:16 - перейти к сообщению
Dezmonds пишет:
Многоуважаемые, помогите, нужно разобраться Улыбка Что тут ни так с проверкой логина, и почему записывается абсолютно такое же значение в БД.

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

Когда у вас идёт запись нового юзера в базу - 0,'$login','$name','$mail','$pass'. В какое поле записывается значение "0" ?.
Есть подозрение что может писаться как раз в поле для id. И при проверке функцией isset для массива, как вам известно, когда значение ноль у элемента массива, условие вернёт вам False, проверка пройдёт и логин будет записан повторно.

Структуру таблицы в студию, либо, если "Ах точно!", — исправляйте.
8. Dezmonds - 12 Мая, 2011 - 18:44:48 - перейти к сообщению
Zuldek пишет:

код у вас кошмарный.
Согласен полностью! ) Поправил, но ситуацию это не изменило:

PHP:
скопировать код в буфер обмена
  1.  
  2.   $pass = md5 ($password);
  3.   // Сформируем запрос
  4.   $result2 = mysql_query ("INSERT INTO users (login,name,mail,password) VALUES ('$login','$name','$mail','$pass')");
  5.  
  6.   // Проверим успешность запроса
  7.   if (!$result2)
  8.     {
  9.       echo "Ошибка!Что то с соединением! Строка 152<br />";
  10.       mysql_close ($db);
  11.       exit ();
  12.     }
  13.         else {
  14.   // Закроем соединение с БД
  15.   mysql_close ($db);
  16.   // Выведем сообщение об успешной регистрации
  17.   echo "Регистрация прошла успешно";                           
  18.                                
  19.         }
  20.                                
  21. }
  22. else { echo "Видимо вы не ввели не заполнили поля...";}
  23.  
  24.  
  25.         ?>                     
  26.  


Какая то видимо проблема как раз таки в проверки пользователя в таблице. Код начинает проверять, только после того, как ты зарегистрировался, нажал F5 или ввел данные повторно, он добавил поле, и только потом после нажатия обновления, пишет, якобы такой пользователь уже есть..
9. Zuldek - 12 Мая, 2011 - 22:32:38 - перейти к сообщению
ещё раз покажи код всего срипта после испралений
10. Dezmonds - 13 Мая, 2011 - 10:03:34 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. if($_POST['submit']) {
  4.  
  5. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login); echo "Вы не заполнили форму логин.<br />";exit();} }
  6. if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);echo "Вы не заполнили форму Ф.И.О.<br />";exit();} }
  7. if (isset($_POST['mail'])) { $mail = $_POST['mail']; if ($mail == '') { unset($mail);echo "Вы не заполнили форму E-mail.<br />";exit();} }
  8. if (isset($_POST['password'])) { $password = $_POST['password']; if ($password == '') { unset($password);echo "Вы не заполнили форму Пароль.<br />";exit();} }
  9. if (isset($_POST['password2'])) { $password2 = $_POST['password2']; if ($password2 == '') { unset($password2);echo "Вы не заполнили форму повтор пароля.<br />";exit();} }
  10.  
  11. if (!$_POST['login'])
  12. {
  13.         echo "Вы не заполнили форму логин.";
  14.         }
  15. else
  16. {
  17.         $login =($_POST['login']);
  18.        
  19. }
  20.  
  21. if (!$_POST['name'])
  22. {
  23.         echo "Вы не заполнили форму Ф.И.О.";
  24. }
  25. else
  26. {
  27.         $name =($_POST['name']);
  28. }
  29.  
  30. if (!$_POST['mail'])
  31. {
  32.         echo "Вы не заполнили форму E-mail:Пожалуйста, указывайте реальный е-mail, на него предет подтверждение регистрации в Клубе «Osako»";
  33. }
  34. else
  35. {
  36.         $mail =($_POST['mail']);
  37. }
  38.  
  39. if($_POST["mail"]&& !ereg("^[^@]+@([a-z\-]+\.)+[a-z]{2,4}$",$_POST["mail"]))
  40. {
  41.         echo "Введите корректный формат электронной почты";
  42.         exit();
  43. }
  44.  
  45.  
  46. if (!$_POST['password'])
  47. {
  48.         echo "Вы не заполнили форму Пароль";
  49. }
  50. else
  51. {
  52.         $password =($_POST['password']);
  53. }
  54.  
  55. if (!$_POST['password2'])
  56. {
  57.         echo "Вы не заполнили форму повторного воода Пароля";
  58. }
  59. else
  60. {
  61.         $password =($_POST['password2']);
  62. }
  63.  
  64. if ($_POST['password'] != $_POST['password2'])
  65. {
  66.         echo "Введенные пароль не совпадают.";
  67. }
  68. else
  69. {
  70.  $password = ($_POST['password']);
  71.  $password2 = ($_POST['password2']);   
  72. }
  73.  
  74. //если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
  75.     $login = stripslashes($login);
  76.     $login = htmlspecialchars($login);
  77.         $name = stripslashes($name);
  78.     $name = htmlspecialchars($name);
  79.         $mail = stripslashes($mail);
  80.     $mail = htmlspecialchars($mail);
  81.         $password = stripslashes($password);
  82.     $password = htmlspecialchars($password);
  83.         $password2 = stripslashes($password2);
  84.     $password2 = htmlspecialchars($password2);
  85.  //удаляем лишние пробелы
  86.     $login = trim($login);
  87.         $name = trim($name);
  88.         $mail = trim($mail);
  89.     $password = trim($password);
  90.         $password2 = trim($password2);
  91.        
  92.  
  93.  
  94. include("admin/db.php");
  95.  
  96.  
  97.  
  98.  
  99. $result = mysql_query("SELECT login FROM users WHERE login='$login' OR mail = '$mail'",$db); //извлекаем из базы все данные о пользователе с введенным логином
  100.     $myrow = mysql_fetch_array($result);
  101.  
  102. if (!$result)
  103.     {
  104.       echo "Ошибка!Что то с соединением! Строка 129";
  105.       mysql_close ($db);
  106.       exit ();
  107.     }                          
  108. $resultats = mysql_num_rows ($result);
  109.   // Проверяем свободность
  110.   if ($resultats>0)
  111.     {
  112.       echo "Извините, возможно такой логин или e-mail уже используються на сайте";
  113.       exit ();
  114.           mysql_close ($db);
  115.      
  116.     }                          
  117.                                
  118.   // Если всё нормально, заносим данные в базу данных
  119.   // Сформируем данные
  120.  
  121.   // Сформируем запрос
  122.   $result2 = mysql_query ("INSERT INTO users (login,name,mail,password) VALUES ('$login','$name','$mail','$password')");
  123.  
  124.   // Проверим успешность запроса
  125.   if (!$result2)
  126.     {
  127.       echo "Ошибка!Что то с соединением! Строка 152<br />";
  128.       mysql_close ($db);
  129.       exit ();
  130.     }
  131.         else {
  132.   // Закроем соединение с БД
  133.   mysql_close ($db);
  134.   // Выведем сообщение об успешной регистрации
  135.   echo "Регистрация прошла успешно  Вы можете зайти в наш клуб, перейдя по сылке:<a href='user_home.php'>Вход</a>
  136. ";                             
  137.                                
  138.         }
  139.                                
  140. }
  141. else { echo "Видимо вы не ввели не заполнили поля...";}
  142.  
  143.  
  144.         ?>     


Решил проблему кстати я Улыбка

PHP:
скопировать код в буфер обмена
  1. $resultats = mysql_num_rows ($result);
  2.   // Проверяем свободность
  3.   if ($resultats>0)
  4.     {
  5.       echo "Извините, возможно такой логин или e-mail уже используються на сайте";
  6.       exit ();



Остался только вопрос по оптимизации. Как написать правильно, чтобы регистрация была максимально хорошей. Чтобы с максимальной защитой... Про шифрование паролей пока, что не будем говорить...


И попутно еще вопрос.. после того как, пользователь допустим. что то не ввел у меня код прерывается exit()... Соответственно весь остальной дизайн на сайте тоже не отображается.. как это можно сделать чтобы все отображалось, но код после exit ничего не обрабатывал. Спасибо
11. AdMeen - 13 Мая, 2011 - 10:14:48 - перейти к сообщению
Dezmonds пишет:
Остался только вопрос по оптимизации. Как написать правильно, чтобы регистрация была максимально хорошей. Чтобы с максимальной защитой... Про шифрование паролей пока, что не будем говорить...


Во-первых, шифрование паролей - это уже половина защиты. Во-вторых, я так думаю, что если бы кто-то написал идеальный код, мы бы все уже пользовались им давно. А так, у вас mysql injection пройдет, введите ограничение по длине логина/пароля для начала.

Используйте не exit, а, например, переменную сессии


Добавляйте в него найденые ошибки, в конце проверяйте пустоту.
12. Dezmonds - 13 Мая, 2011 - 12:52:52 - перейти к сообщению
Еще возникло куча вопросов...
PHP:
скопировать код в буфер обмена
  1. <?PHP  
  2.         session_start();
  3.     // Проверяем, пусты ли переменные логина и id пользователя
  4.     if (empty($_SESSION['login']) or empty($_SESSION['id']) or empty($_SESSION['password']))
  5.     {
  6.     // Если пусты, то мы не выводим ссылку
  7.     echo " Видимо вы еще не вступили в наш замечательный клуб. Пожалуйста,<br><a href='./registration.php'>пройдите регистрацию</a>";
  8. exit();
  9.     }
  10.     else
  11.     {
  12.    $login = $_SESSION['login'];
  13.    $id = $_SESSION['id'];
  14.    $password = $_SESSION['password'];
  15.    include("admin/db.php");
  16.    
  17.    
  18.    
  19.    $result = mysql_query("SELECT password FROM users WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином
  20.     $myrow = mysql_fetch_array($result);
  21.  
  22. if (!$myrow)
  23.     {
  24.       echo "Ошибка!Что то с соединением! Строка 58<br />";
  25.       mysql_close ($db);
  26.       exit ();
  27.     }                          
  28. $resultats = mysql_fetch_array ($result);
  29.   // проверка на существование пользователя сессии с таким же логином
  30.   if ($resultats['password'] == $password)
  31.     {
  32.                
  33.  
  34.    $data = mysql_query("SELECT * FROM users",$db); //извлекаем из базы все данные о пользователе с введенным логином
  35.     $myrow2 = mysql_fetch_array($data);
  36.  
  37. if (!$myrow2)
  38.     {
  39.       echo "Ошибка!Что то с соединением! Строка 58<br />";
  40.       mysql_close ($db);
  41.       exit ();
  42.     }                          
  43. $datas = mysql_fetch_array ($data);
  44.  
  45.  
  46.  
  47.       echo "  
  48.  
  49.           <form action=''>
  50.                                                 <div class='row'>
  51.                                                         <label for='login'>Логин:</label>
  52.                                                         <a href='javascript: void();' class='hint'>Ваш логин. По которому осуществляется вход на сайт</a>
  53.                                                         <input class='text' type='text' name='login' id='login' value='".$_SESSION['login']."'/>
  54.                                                 </div>
  55.                                                 <div class='row'>
  56.                                                         <label for='name'>Ф.И.О.:</label>
  57.                                                         <a href='javascript: void();' class='hint inactive'></a>
  58.                                                         <input class='text' type='text' name='name' id='name' value='".$datas['name']."'/>
  59.                                                 </div>
  60.                                                 <div class='row'>
  61.                                                         <label for='password'>Пароль:</label>
  62.                                                         <a href='javascript: void();' class='hint'>Введите пароль</a>
  63.                                                         <input class='text' type='password' name='password' id='password'  value='".$datas['password']."'/>
  64.                                                 </div>
  65.                                                 <div class='row'>
  66.                                                         <label for='confirm'>&nbsp;</label>
  67.                                                         <a href='javascript: void();' class='hint'>Введите пароль 2</a>
  68.                                                         <input class='text' type='password' name='password' id='password'  value='".$datas['password']."'/>
  69.                                                 </div>
  70.                                                 <div class='buttons'>
  71.                                                         <a href='javascript: void();' class='button submit'>Изменить</a>
  72.                                                 </div>
  73.                                         </form>
  74.        
  75.                
  76.                                 </div></div>
  77.  
  78.                                 <h3>Дополнительные данные</h3>
  79.                                 <div class='box form-box'><div class='decor1'></div><div class='decor2'></div><div class='wrapper'>
  80.                                
  81.                                         <form action=''>
  82.                                                 <div class='row'>
  83.                                                         <label for='avatar'>Аватар:</label>
  84.                                                         <a href='javascript: void();' class='hint'>Введите логин</a>
  85.                                                         <span class='file-box'>
  86.                                                                 <input class='text' type='text' name='avatar' id='avatar' />
  87.                                                                 <div class='but'></div>
  88.                                                                 <input type='file' class='filefield' name='avatar_file' />
  89.                                                         </span>
  90.                                                 </div>
  91.                                                 <div class='row long-label'>
  92.                                                         <label for='number'>Клубный номер:</label>
  93.                                                         <a href='javascript: void();' class='hint inactive'></a>
  94.                                                         <input class='text' type='text' name='number' id='number' value='".$datas['id']."'/>
  95.                                                 </div>
  96.                                                 <div class='row'>
  97.                                                         <label for='about'>О себе:</label>
  98.                                                         <a href='javascript: void();' class='hint'>Введите пароль</a>
  99.                                                         <textarea>".$datas['user_text']."</textarea>
  100.                                                 </div>
  101.                                                 <div class='buttons'>
  102.                                                         <a href='javascript: void();' class='button submit'>Изменить</a>
  103.                                                 </div>
  104.                                         </form>
  105.                                         ";
  106. }
  107. else
  108. {
  109.  echo "Пароли не совпадают";
  110.  exit ();
  111.  mysql_close ($db);
  112.  
  113. }}
  114.      ?>


Логика должна быть такая: Из файла 1.php получаем сессии в файл 2.php , если есть сессии login, password, id, тогда соединимся с БД и проверим, действительно ли совпадать пароль который мы присвоили сессии с паролем в БД. у пользователя по которому мы проверяем. Если все верно, тогда соединяемся опять с БД, вытаскиваем нужные нам значения, выводим формы, засовываем полученные значения в них...

Проблема в следующем: Почему мне постоянно пишет, Пароли не совпадают....

Понимаю, что наверно достал, но все же. очень надеюсь на вашу помощь. Заранее Огромное спасибо!
13. Dezmonds - 14 Мая, 2011 - 16:45:36 - перейти к сообщению
Кто-нибудь.. выручайте.. Огорчение

 

Powered by ExBB FM 1.0 RC1