@_ne_scaju_ PHP: if ($rows < 0) { //почему МЕНЬШЕ нуля? $time - time(); //почему МИНУС, а не равно? --- Добавлено --- По идее примерно так должно быть: PHP: if (count($rows) > 0) { $num = 30; //здесь задаешь срок жизни ссылки в секундах if ((time() - $rows['time']) < $num) { echo 'Активация прошла успешно!'; } else { echo 'Истёк срок активации!'; } } else { $err[] = 'Ключ активации не верен!'; }
@MouseZver На примере покажи, пожалуйста. --- Добавлено --- @_ne_scaju_ @igordata @Sergey_Tsarev Меня вообще интересует, что надо перед проверкой ключа для активации, сделать, проверить пользователя что он в базе есть, и как то узнать потом есть у него ключ активации или нет, и истек срок времени ключа или нет. Я так понял?
ты не можешь ничего проверить. пока не выбрал из базы ключ активации - тебе вообще не понятно с кем ты имеешь дело. выбирай ключ, проверяй время, смотри номер юзера, скоторым связан ключ. победа.
@Sergey_Tsarev Вроде с проверкой времени разобрался, проверка идет. А как же номер юзера проверить, если ключ я записываю в другую таблицу и у меня между ними нету связей. Ну там форегин кей или еще что то. @igordata Смотри делаю запрос на выборку ключа, то-есть он перешел по ссылке и сразу проверяю ключ, если ключ правильный, проверяю на время если все хорошо, СМОТРЕТЬ номер юзера, по каким принципам? Или ты предлагаешь после проверки ключа, делать запрос на выборку юзера? Правда не пойму. У меня активация говорю проходит, но я так понимаю, запрос не понимает у меня что он активировал) И кого) То ли ручки кривые, у кого-то, не буду тыкать пальцем
ну да. Ты же пишешь, как тебе игорь подсказывал, id юзера в таблицу с ключами активации? Вообще, не скучно тебе вот так, чужими мозгами программировать? Начинай думать уже сам
@mkramer Запросы как раз я сам пишу, мне лишь меня надо направить правильное русло) Кстати по времени я не разобрался протестировал, и опять увидел косяки, он всегда пишет что истек времени активации. Я и так стараюсь думать своей головой честное слово) --- Добавлено --- @mkramer @igordata @MouseZver @Sergey_Tsarev Вот так я хочу произвести активацию пользователя, и что же не так? Активация не происходит именно в таблице users: PHP: if(isset($_GET['key'])){ //Проверяем ключ $stmt = $pdo->prepare("SELECT * FROM `userscheck` WHERE `email_check_activation` = :key"); $stmt->bindValue(':key', $_GET['key'], PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if (count($rows) > 0) { $num = 30; //здесь срок жизни ссылки в секундах if ((time() - $rows['time']) < $num) { echo 'Активация прошла успешно!'; } else { echo 'Истёк срок активации!'; } } else { $err[] = 'Ключ активации не верен!'; } if(count($err) > 0) echo showErrorMessage($err); else{ //Получаем адрес пользователя $email = $rows[0]['user_email']; //Активируем аккаунт пользователя $sql = 'UPDATE `users` SET `user_activation` = 1 WHERE `user_email` = :user_email'; $stmt = $pdo->prepare($sql); $stmt->bindValue(':user_email', $email, PDO::PARAM_STR); $stmt->execute(); //Отправляем письмо об успешной активации $title = 'Ваш аккаунт успешно активирован'; $message = 'Поздравляем ваш акаунт успешно активирован'; sendMessageMail($email, $mail_autor, $title, $message); echo "<script>document.location.href('?go=register&active=ok');</script>"; } } Кто может увидеть косяк с моей стороны? Подскажите пожалуйста. Кстати, а при регистрации, мне надо задать срок жизни ссылки? А то я не задаю ее, а только при проверки ключа, проверяю на время прошло или нет.
Ну за 30 секунд ты не успеешь открыть почту, найти письмо, перейти по ссылке. Поставь нормальное время. минут 5-10 хотя бы. А так, ты ещё такое дело пойми. Ни у кого в голове интерпретатора php нету. Возьми и напечатай, к примеру, (time()-$rows['time']), посмотри, что выходит. Думаешь, у @Fell-x27 или @igordata, или у кого угодно из здесь присутствующих всё с первого запуска работает как надо? Так бывает очень редко, поэтому придумали отладку. У тебя что? Если OpenServer, к примеру, там уже поднят xdebug, настрой IDE и отлаживай. Или просто делай отладочную печать.
@mkramer Я же написал, проверку по времени делаю 30сек для того чтобы проверить срабатывает скрипт или нет. Чтобы не ждать 10-15 минут. Да у меня OpenServer. Ну а принцип в коде правильный?
Ура нашел косяк) Почему не активировало пользователя) А вот почему: PHP: //Получаем адрес пользователя $email = $rows[0]['user_email']; Мы же берем адрес из таблицы checkusers Значит надо было написать так: PHP: //Получаем адрес пользователя $email = $rows[0]['email']; Ну теперь активирует пользователя) Но время не проверят истекло или нет) Надо посидеть и подумать как же сделать) Сразу после проверки и обновления статуса что пользователь активировал себя, я делаю запрос на удаления из таблицы checkusers, чтобы не засорять ее. Хочу еще добавить такое, если время активации прошло то удалить из таблицы checkusers и таблицы users данные. Но у меня проверка не идет по времени( Ну не подается она мне А вот на счет такого, при регистрации надо устанавливать время сколько действует эта ссылка которую отправляю на почту? Или же когда делаю активацию аккаунта?
@MouseZver Смотри при регистрации я делаю так: PHP: //Солим созданный пароль пользователя $password = password_hash($_POST['password'], PASSWORD_DEFAULT); /*Если все хорошо, пишем данные в базу*/ $reg = $pdo->prepare("INSERT INTO `users` (`user_login`, `user_email`, `user_password`, `user_reg_date`, `user_role`) VALUES (:user_login, :user_email, :user_password, NOW(), 3)"); $reg->bindValue(':user_login', $_POST['login'], PDO::PARAM_STR); $reg->bindValue(':user_email', $_POST['email'], PDO::PARAM_STR); $reg->bindValue(':user_password', $password, PDO::PARAM_STR); if($reg->execute()){ //Создаем уникальную строку, для активации пользователя $email_check_activation = RandomToken(); //переменная для работы с временем для активации аккаунта $time = time(); /*Вставляем в базу строку для активации аккаунта*/ /*ЗДЕСЬ НАДО УКАЗЫВАТЬ ВРЕМЯ СКОЛЬКО ОНО ДЕЙСТВУЕТ ИЛИ ЭТО ДЕЛАТЬ ПРИ АКТИВАЦИИ АККАУНТА?*/ $activation = $pdo->prepare("INSERT INTO `userscheck` (`email`, `email_check_activation`, `time`) VALUES ('".$email."','".$email_check_activation."','".$time."')"); $activation->execute(); Вот этого я понять не могу, при активации задавать время или при регистрации? Да и для времени я использую обычный varchar() может в этом проблема? А надо указывать date или еще что? --- Добавлено --- @MouseZver Уже как только не пробовал создать время активации не получилось( Натолкните пожалуйста меня, в правильном направлении: Пробовал так последний результат, но толку ноль. PHP: if(isset($_GET['key'])){ $act = $_GET['key']; $act = stripslashes($act); $act = htmlspecialchars($act); //Проверяем ключ $email_activation = $pdo->prepare("SELECT * FROM `userscheck` WHERE `email_check_activation` = :key"); $email_activation->bindValue(':key', $act, PDO::PARAM_STR); $email_activation->execute(); $rows = $email_activation->fetchAll(PDO::FETCH_ASSOC); if ($rows > 0) { $time = time(); $num = 10000; //здесь задаешь срок жизни ссылки в секундах if ((time() - $rows['time']) > $num) { echo 'Все супер вы активированы'; }else{ echo 'Время активации истекло'; } }else{ $err[] = 'Вроде активация прошла, но что то пошло не так!'; }
@Sergey_Tsarev Та хоть даже так пишу, толку ноль: PHP: if (count($rows) > 0) { $time = time(); $num = 3000; //здесь задаешь срок жизни ссылки в секундах if ((time() - $rows['time']) < $num) { echo 'Активация прошла успешно!'; } else { echo 'Истёк срок активации!'; } } else { $err[] = 'Ключ активации не верен!'; }
@_ne_scaju_, Чувак, кончай тупить, сделай var_export($rows), посмотри, что там у тебя, потом var_export($time() - $rows['time']), посмотри, что там у тебя. Расставь контрольные точки по скрипту, если слабо XDebug настроить - посмотри значения переменных в контрольных точках. Контрольные точки через die() можно расставлять. Ну это вот как-то так работает, а не так: ой, сделал, не получилось, запостил на форум. @denis01, дай ему, плиз, свою подборку ссылок про дебаг.
@mkramer array ( 0 => array ( 'id' => 9, 'email' => 'user@yandex.ru', 'email_check_activation' => 'd3f60503c838d4a5c8e0ea6079ceae1fe11ceb3efe46417598ceabae4f954b38', 'time' => '1493235795', ), )1493235816 Мне эта строка не о чем не говорит, ну сравнил время не много разное. И что? Дальше от куда копать?
@_ne_scaju_ Файл подключения к базе данных connect_db.php PHP: <?php $host = 'localhost'; //хост $db = 'test'; //имя базы данных $user = 'root'; //имя пользователя $pass = '0000'; //пароль $charset = 'utf8'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $opt = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $pdo = new PDO($dsn, $user, $pass, $opt); ?> Форма регистрации registration.htm HTML: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Регистрация</title> </head> <body> <form method="post" action="reg_action.php"> <label>Почта:</label> <input type="email" name="email"> <label>Пароль:</label> <input type="password" name="password"> <input type="submit" value="Регистрация"> </form> </body> </html> Скрипт регистрации reg_action.php PHP: <?php //подключаемся к базе данных include_once $_SERVER['DOCUMENT_ROOT'].'/connect_db.php'; if ($_POST['email'] && $_POST['password']): $email = $_POST['email']; $password = $_POST['password']; //фильтруем данные //вносим данные в таблицу user $registration = $pdo->prepare('INSERT INTO `users` (`email`, `password`, `status`) VALUES (?, ?, 0)'); $registration->execute([$email, $password]); //статус записываем как 0, значит что пользователь не активирован $id = $pdo->lastInsertId(); //получаем id созданной записи $time = time(); //записываем в переменную текущее время $activation_key = md5(uniqid(rand(), true)); //генерируем уникальную строку для активации //вносим запись в таблицу activation $activation = $pdo->prepare('INSERT INTO `activation` (`id`, `activation_key`, `time`) VALUES (?, ?, ?)'); $activation->execute([$id, $activation_key, $time]); //отправляем письмо $to= $email; //получатель $subject = 'Подтверждение регистрации'; //тема $message = 'Для подтверждения регистрации перейдите по ссылке: http://site.ru/activation.php?activation_key='.$activation_key; //текст //заголовки $headers= "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; //отправляем mail($to, $subject, $message, $headers); echo 'На ваш почтовый ящик отправлено письмо с ссылкой для завершения регистрации!'; else: echo 'Поля не заполнены!'; endif; ?> Скрипт активации activation.php PHP: <?php //подключаемся к базе данных include_once $_SERVER['DOCUMENT_ROOT'].'/connect_db.php'; if ($_GET['activation_key']): $activation_key = $_GET['activation_key']; //фильтруем данные //делаем запрос к таблице activation и //проверям есть ли там запись с таким ключом $check = $pdo->prepare('SELECT COUNT(0) AS ROW_COUNT FROM `activation` WHERE `activation_key` = ?'); $check->execute([$activation_key]); //подсчитываем количество строк в ответе $num = $check->fetch(); $count = $num['ROW_COUNT']; if($count > 0): //делаем запрос к таблице activation и получаем данные в виде ассоциативного массива $query = $pdo->prepare('SELECT * FROM `activation` WHERE `activation_key` = ?'); $query->execute([$activation_key]); $result = $query->fetch(); //проверяем просрочена ли активация или нет $limit_time = 6000; //время жизни активации в секундах $id = $result['id']; if((time()-$result['time']) <= $limit_time): //меняем статус с таблице user на 1 $activation = $pdo->prepare('UPDATE `users` SET `status` = 1 WHERE `id` = ?'); $activation->execute([$id]); //удаляем запись из таблицы activation $delete = $pdo->prepare('DELETE FROM `activation` WHERE `id` = ?'); $delete->execute([$id]); echo 'Пользователь активирован!'; else: //удаляем запись из таблицы activation $delete = $pdo->prepare('DELETE FROM `activation` WHERE `id` = ?'); $delete->execute([$id]); echo 'Ссылка просрочена!'; endif; else: echo 'Неправильный ключ активации!'; endif; else: echo 'Не указан ключ активации!'; endif; ?>
@Sergey_Tsarev Спасибо, посмотрел, что я не так делал, и понял что не так делал, взял конечно твой пример, а дальше будем с ним работать. ВСЕМ спасибо за обсуждения этой темы, вопрос решен.
Для валидации данных можно использовать js. http://codeharmony.ru/materials/134 https://habrahabr.ru/post/180279/ Если будешь использовать JS и AJAX, то все так и будет. Тебе все равно придётся в этом разобраться, для того например чтобы сразу показать человеку что email, который он ввел, уже зарегистрирован в системе.
Ну к этому я приду со временем. А что в js или ajax можно делать запросы, он от куда узнает, что такой пользователь есть в базе. Для начало вроде надо вытащить данные SELECT а потом наверное что-то с js или ajax делать.
AJAX будет посылать запрос в PHP скрипт. В скрипте ты делаешь выборку из базы по email, который ввел пользователь. После этого скрипт возвращает результат, например количество строк. Если вернул 0, значит пользователя с таким адресом нет и значит регистрация возможна, а если вернет 1, значит выводишь сообщение "Адрес занят!" --- Добавлено --- Чтобы было легче используй библиотеку Jquery.