Всем привет, неделю назад начал учить классы и подумал дайка попробую переделать свой процедурный стиль на ООП. И тут возникли проблемы, они и до этого были но исправить решил именно в ООП-ном стиле, ну так вот в чем суть вопроса, можно сказать вопросов несколько: 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 раз зарегистрировался и с теми же данными может опять придти зарегистрироваться? От дубляжей можно избавиться поставив какому-либо полю атрибут UNIQUE в таблице. или же при проверке сделать запрос в БД, проверить пользователя с таким же email или телефоном, если есть, в регистрации отказать, и послать восстанавливать пароль.
@karmay Нет зарегистрироваться повторно с тем же email и login-ном не получится, проверяю на существования. Сейчас я прошу вообще о другой помощи, что мне сделать с повторной отправкой ССЫЛКИ АКТИВАЦИИ, когда юзер остался на странице и начинает пинать эту страницу обновить обновить а ссылка в базу все новая и новая вставляется, как бороться с таким явлением) Совет если вопрос не понятен лучше внимательней прочитай его еще раз!!!
PHP: if(логин не занят){ $link ="INSERT INTO добавим в базу....; mail(отправить ссылку) } else 'логин занят, мне непонятно как тут письмо сможет оправиться'; даже если страницу обновить, опять придут те же данные, а они уже заняты, просто аккаунт не активирован. возможно я еще мал и глуп, извините.
1. После действий с базой и отправкой емыла перенаправлять на другую страницу - где и выводить текст, header("location : url"); Этим исключается возможность повторной отправки старницы 2. На всякий случай ... пере тем как insert делать - проверить в этой таблице - а не было ли уже такой записи - и только если нет - записывать
@ADSoft Вот об этом я и спрашивал, мне проверить только запись с ссылкой активации если да спасибо, буду пробовать что получится. @karmay Это я еще мал поверь, спасибо.
И причём тут ООП? После успешной обработки post-запроса нельзя ничего выводить пользователю. Любая успешная обработка post-запроса обязательно должна заканчиваться перенаправлением на новую страницу (то, что @ADSoft указал на в пункте 1), на которой и будет выведено твоё Есть мнение, что при в случае ошибки тоже делать перенаправление, а заполненные поля или ошибки сохранять в форму. Но я считаю, что можно и вывести сразу повторно форму с сообщениями об ошибках - если пользователь её обновит, в базу ничего всё равно не пойдёт. Ну тут спорно немного. Но если обработка post-запроса закончилось записью в базу данных - то обязательно PHP: header("Location: regsterSuccess.php"); die;
@mkramer Как какое, справлюсь с этим заданием сразу в эту же тему отпишусь еще с вопросом, а сейчас думаю.
Как оказалось, у меня регистрация работает правильно, даже без перенаправленный, а вот восстановление пароля работает не правильно, буду в нем пробовать совет @ADSoft использовать, если справлюсь отпишусь!
А что сложного-то в восстановлении пароля? Там те же самые проверки, если правильно ввёл email, то выслать новый пароль на почту и всё, можно ещё проверить секретный вопрос.
Правильно ли я понял, надо сделать примерно таки образом? Записал в куки после успеха, пробовал в сессию записывать, но если написать её удаление, то она сразу удаляется и не выведется надпись Регистрация прошла успешна index.php PHP: <form method="POST" action=""> <input type="text" name="login"> <input type="password" name="password"> <input type="submit"> </form> <?php if(!empty($_POST['login'])) { setcookie('reg', true, time()+10); header('Location: ./index.php'); } ?> <?php if(!empty($_COOKIE['reg'])) { require_once 'success.php'; } ?> success.php Код (Text): <h1>Регистрация прошла успешна</h2> <?php setcookie('reg', '', time()); ?>
@Dimon2x Ну в сессию лучше. Нафига в браузер пользователя сорить такой ерундой? И после header("Location:.."); следующая инструкция всегда die или exit, а у тебя всё равно включается файл success. И поэтому и из сессии что-то там удаляется
Вот так сделал, это хороший способ, а какой ещё есть? index.php PHP: <?php session_start();?> <form method="POST" action=""> <input type="text" name="login"> <input type="password" name="password"> <input type="submit"> </form> <?php if(!empty($_POST['login'])) { $_SESSION['reg'] = true; header('Location: ./index.php'); die(); } ?> <?php if(!empty($_SESSION['reg'])) { require_once 'success.php'; } ?> success.php PHP: <h1>Регистрация прошла успешна</h2> <?php $_SESSION['reg'] = false; ?>
А у меня вот все по другому, никаких редиректов, и куча всяких if-ов, т.е. я повесил значение на кнопку, проверяю, если $_POST['submit'] == add_user, например, то пошел работать код для добавления пользователя, и т.д., а после кнопки грузится та же самая страница, только выводится уже сообщение об ошибке или успехе PHP: $login_free = mysqli_fetch_assoc($result); // если запрос возвращает 0, т.е. пустой массив, if (empty($login_free)){ ### тут дальше код ### } else $reg_msg = 'Пользователь с таким логином уже зарегистрирован'; // регистрация if (!empty($reg_msg)) echo $reg_msg; причем, вот меня научили делать include(); а я часто в разных места встречаю require_once, кто может объяснить в чем разница, и что использовать лучше???
Мужики подкиньте идею мне пожалуйста. Как мне можно и редирект сделать и ошибку показать, кто какие идеи предоставит?
@karmay, редирект ещё делается, чтобы пользователю не выдавалось противнючее окошко, если он вдруг решит нажать F5. А то нажмёт, оно появится, пользователь решит, что сайт сломался, и репутация заказчика упадёт. Никто не говорит, что не нужно проверять на дублирование логина. Но и редирект тоже надо сделать @_ne_scaju_, так долго программируешь на php, и так и не научился сессиями пользоваться?
раньше никогда не обращал внимание, что оно на самом деле противнючее и предлагает отправить данные. А если это магаз, получится дублирование заказа жеж. Пойду читать про редиректы.
@mkramer а что сессия я ее в основном скрипте запустил все она мне всегда доступна, у меня единая точка входа.
@Dimon2x Как только так сразу, если хочешь чему то добиться надо к этому стремится!!! А не по этим курсам шастать. --- Добавлено --- Народ я более менее написал с другом то что хотелось, ну почти то что хотелось. Если возникнут вопросы отпишусь в эту тему.
Можно сделать так, чтобы скрипт знал сам когда время истекло и по истечению времени удалял ту или иную запись из базы?