За последние 24 часа нас посетили 17327 программистов и 1723 робота. Сейчас ищут 1604 программиста ...

Регистрация пользователей помощь с логикой

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 16 ноя 2017.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем привет, неделю назад начал учить классы и подумал дайка попробую переделать свой процедурный стиль на ООП. И тут возникли проблемы, они и до этого были но исправить решил именно в ООП-ном стиле, ну так вот в чем суть вопроса, можно сказать вопросов несколько:

    1. Как при регистрации предотвратить отправку повторной ссылки активации аккаунта?
    А то-есть юзер заполнил данные, все поля проверились на корректность, и при успешной проверке и правильном заполнении данных регаем юзера + сразу же отправляем ему ссылку активации, на экран вывожу уведомления "Вы зарегистрированы проверьте почту".
    Но тут не задача, если юзер остался на странице уведомления, и начинает обновлять страницу не выходя с нее, в базу вставляется дополнительные поля с новым ключем например:
    ---------------------------------------------------
    id......user_id......key.........time
    1(int) 2(int) key1(varchar) time(int)
    2(int) 2(int) key2(varchar) time(int)
    3(int) 2(int) key3(varchar) time(int)
    ---------------------------------------------------
    не трудно догадаться что в каком поле хранится.

    Ну так вот посоветуйте мне что сделать чтобы не захламлять базу не нужными повторными полями?
    Что с юзером лучше сделать, перенаправить его или логику перестроить как либо, или же есть какой-то вариант получше?
    Можно как то проверить существования записи, если я делаю при регистрации insert при успешном заполнении формы если да где эту запись лучше проверить?

    Код покажу позже если нужен будет.
    Всем спасибо за выделенное свое время, и хороший развернутый ответ, которой жду от вас!!!
     
    #1 _ne_scaju_, 16 ноя 2017
    Последнее редактирование: 16 ноя 2017
  2. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Как-то сложновато простые вопросы заданы. А пользователь 1 раз зарегистрировался и с теми же данными может опять придти зарегистрироваться?
    От дубляжей можно избавиться поставив какому-либо полю атрибут UNIQUE в таблице.
    или же при проверке
    сделать запрос в БД, проверить пользователя с таким же email или телефоном, если есть, в регистрации отказать, и послать восстанавливать пароль.
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @karmay
    Нет зарегистрироваться повторно с тем же email и login-ном не получится, проверяю на существования.
    Сейчас я прошу вообще о другой помощи, что мне сделать с повторной отправкой ССЫЛКИ АКТИВАЦИИ, когда юзер остался на странице и начинает пинать эту страницу обновить обновить а ссылка в базу все новая и новая вставляется, как бороться с таким явлением)
    Совет если вопрос не понятен лучше внимательней прочитай его еще раз!!!
     
    #3 _ne_scaju_, 16 ноя 2017
    Последнее редактирование: 16 ноя 2017
  4. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    PHP:
    1. if(логин не занят){
    2. $link ="INSERT INTO добавим в базу....;
    3. mail(отправить ссылку)
    4. }
    5. else 'логин занят, мне непонятно как тут письмо сможет оправиться';
    даже если страницу обновить, опять придут те же данные, а они уже заняты, просто аккаунт не активирован.
    возможно я еще мал и глуп, извините.
     
    _ne_scaju_ нравится это.
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.858
    Симпатии:
    748
    Адрес:
    Татарстан
    1. После действий с базой и отправкой емыла перенаправлять на другую страницу - где и выводить текст, header("location : url"); Этим исключается возможность повторной отправки старницы
    2. На всякий случай ... пере тем как insert делать - проверить в этой таблице - а не было ли уже такой записи - и только если нет - записывать
     
    _ne_scaju_ нравится это.
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @ADSoft
    Вот об этом я и спрашивал, мне проверить только запись с ссылкой активации если да спасибо, буду пробовать что получится.
    @karmay
    Это я еще мал поверь, спасибо.
     
    #6 _ne_scaju_, 16 ноя 2017
    Последнее редактирование: 16 ноя 2017
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    И причём тут ООП? После успешной обработки post-запроса нельзя ничего выводить пользователю. Любая успешная обработка post-запроса обязательно должна заканчиваться перенаправлением на новую страницу (то, что @ADSoft указал на в пункте 1), на которой и будет выведено твоё
    Есть мнение, что при в случае ошибки тоже делать перенаправление, а заполненные поля или ошибки сохранять в форму. Но я считаю, что можно и вывести сразу повторно форму с сообщениями об ошибках - если пользователь её обновит, в базу ничего всё равно не пойдёт. Ну тут спорно немного. Но если обработка post-запроса закончилось записью в базу данных - то обязательно
    PHP:
    1. header("Location: regsterSuccess.php"); die;
     
    Dimon2x нравится это.
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Как какое, справлюсь с этим заданием сразу в эту же тему отпишусь еще с вопросом, а сейчас думаю.
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Как оказалось, у меня регистрация работает правильно, даже без перенаправленный, а вот восстановление пароля работает не правильно, буду в нем пробовать совет @ADSoft использовать, если справлюсь отпишусь!
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    А что сложного-то в восстановлении пароля? Там те же самые проверки, если правильно ввёл email, то выслать новый пароль на почту и всё, можно ещё проверить секретный вопрос.
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    По подробней о секретном вопросе когда его нужно проверять?
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Когда захочешь
     
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Правильно ли я понял, надо сделать примерно таки образом? Записал в куки после успеха, пробовал в сессию записывать, но если написать её удаление, то она сразу удаляется и не выведется надпись Регистрация прошла успешна

    index.php

    PHP:
    1. <form method="POST" action="">
    2.     <input type="text" name="login">
    3.     <input type="password" name="password">
    4.     <input type="submit">
    5. </form>
    6.  
    7. <?php
    8.     if(!empty($_POST['login'])) {
    9.         setcookie('reg', true, time()+10);
    10.         header('Location: ./index.php');
    11.     }
    12. ?>
    13.  
    14. <?php
    15.     if(!empty($_COOKIE['reg'])) {
    16.         require_once 'success.php';
    17.     }
    18.    
    19. ?>
    success.php

    Код (Text):
    1. <h1>Регистрация прошла успешна</h2>
    2.  
    3. <?php
    4.     setcookie('reg', '', time());
    5. ?>
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x Ну в сессию лучше. Нафига в браузер пользователя сорить такой ерундой? И после header("Location:.."); следующая инструкция всегда die или exit, а у тебя всё равно включается файл success. И поэтому и из сессии что-то там удаляется
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Вот так сделал, это хороший способ, а какой ещё есть?

    index.php

    PHP:
    1. <?php session_start();?>
    2.  
    3. <form method="POST" action="">
    4.     <input type="text" name="login">
    5.     <input type="password" name="password">
    6.     <input type="submit">
    7. </form>
    8.  
    9. <?php
    10.     if(!empty($_POST['login'])) {
    11.         $_SESSION['reg'] = true;
    12.         header('Location: ./index.php');
    13.         die();
    14.     }
    15. ?>
    16.  
    17. <?php
    18.     if(!empty($_SESSION['reg'])) {
    19.         require_once 'success.php';
    20.     }
    21.    
    22. ?>
    success.php

    PHP:
    1. <h1>Регистрация прошла успешна</h2>
    2.  
    3. <?php
    4.     $_SESSION['reg'] = false;
    5. ?>
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Параметр передавать можно в гете: ?success=1 или ?error=Пользователь%20дурак, но редирект по-любасу
     
  17. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    А у меня вот все по другому, никаких редиректов, и куча всяких if-ов, т.е. я повесил значение на кнопку, проверяю, если $_POST['submit'] == add_user, например, то пошел работать код для добавления пользователя, и т.д., а после кнопки грузится та же самая страница, только выводится уже сообщение об ошибке или успехе
    PHP:
    1. $login_free = mysqli_fetch_assoc($result);
    2.                         // если запрос возвращает 0, т.е. пустой массив,
    3.                 if (empty($login_free)){
    4. ### тут дальше код  ###
    5. }
    6. else $reg_msg =  'Пользователь с таким логином уже зарегистрирован';
    7.  
    8. // регистрация
    9.         if (!empty($reg_msg)) echo $reg_msg;
    причем, вот меня научили делать include(); а я часто в разных места встречаю require_once, кто может объяснить в чем разница, и что использовать лучше???
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Мужики подкиньте идею мне пожалуйста. Как мне можно и редирект сделать и ошибку показать, кто какие идеи предоставит?
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @karmay, редирект ещё делается, чтобы пользователю не выдавалось противнючее окошко, если он вдруг решит нажать F5. А то нажмёт, оно появится, пользователь решит, что сайт сломался, и репутация заказчика упадёт. Никто не говорит, что не нужно проверять на дублирование логина. Но и редирект тоже надо сделать
    @_ne_scaju_, так долго программируешь на php, и так и не научился сессиями пользоваться?
     
    karmay нравится это.
  20. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    раньше никогда не обращал внимание, что оно на самом деле противнючее и предлагает отправить данные. А если это магаз, получится дублирование заказа жеж. Пойду читать про редиректы.
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    а что сессия я ее в основном скрипте запустил все она мне всегда доступна, у меня единая точка входа.
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    И это тебе мешает положить туда ошибки и сделать редирект?
     
  23. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    запишись на курс
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    Как только так сразу, если хочешь чему то добиться надо к этому стремится!!!
    А не по этим курсам шастать.
    --- Добавлено ---
    Народ я более менее написал с другом то что хотелось, ну почти то что хотелось.
    Если возникнут вопросы отпишусь в эту тему.
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Можно сделать так, чтобы скрипт знал сам когда время истекло и по истечению времени удалял ту или иную запись из базы?