Подтверждение почты — PHP?
все вроде хорошо, письмо отправляется, ссылка генерируется, но при переходе по ссылке, не удается активировать аккаунт, значение столбца в БД не изменяется с 0 на 1, выводится сообщение «Ошибка! Ваш аккуант не активирован. Обратитесь к администратору.», указанное в activation.php, других ошибок нет. В чем может быть проблема?
Сам код activation.php
if(isset($_GET['act']) AND isset($_GET['login'])) < $act = $_GET['act']; $act = stripslashes($act); $act = htmlspecialchars($act); $login = $_GET['login']; $login = stripslashes($login); $login = htmlspecialchars($login); >else < exit("Вы зашил на страницу без кода подтверждения!"); >$activ = mysql_query("SELECT id FROM users WHERE login='$login'"); //извлекаем идентификатор пользователя с данным логином $id_activ = mysql_fetch_array($activ); $activation = md5($id_activ['id']); if ($activation == $act)/сравниваем полученный из url и сгенерированный код mysql_query("UPDATE users SET activation='1' WHERE login='$login'"); echo "Ваш аккуант ".$login." успешно активирован!
Главная страница"; > else < echo "Ошибка! Ваш аккуант не активирован. Обратитесь к администратору.
Главная страница"; >
В чем может быть проблема?
ini_set(‘display_errors’,1);
error_reporting(E_ALL); ошибок не показывают
- Вопрос задан более трёх лет назад
- 1729 просмотров
2 комментария
Оценить 2 комментария
Подтверждение адреса электронной почты на PHP
Я получил множество вопросов от моих читателей, в большинстве из которых они спрашивали меня, как реализовать систему подтверждения адреса электронной почты с помощью PHP.
Ниже приведен базовый урок, объясняющий, как создать базу данных и надлежащий код активации. Реализация выполнена с помощью методов mysqli_() , так как методы mysql_() уже потеряли свои позиции.
База данных
Примерная таблица базы данных users содержит пять столбцов: идентификатор пользователя ( uid ), адрес электронной почты ( email ), пароль ( password ), активация ( activation ) и статус ( status ):
CREATE TABLE IF NOT EXISTS `users` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(300) NOT NULL UNIQUE, `password` varchar(300) NOT NULL, `activation` varchar(300) NOT NULL UNIQUE, `status` enum('0','1') NOT NULL DEFAULT '0', PRIMARY KEY (`uid`) )
HTML код
Содержит простой HTML код:
db.php
Файл конфигурации базы данных, измените имя пользователя, пароль, базу данных и основные значения URL:
index.php
Содержит PHP код, который сохраняет данные регистрации пользователя в таблицу users.
Здесь же находится генерация кода активации с помощью MD5 шифрования:
)$/'; if(preg_match($regex, $email)) < $password=md5($password); // encrypted password $activation=md5($email.time()); // encrypted email+timestamp $count=mysqli_query($connection,"SELECT uid FROM users WHERE email='$email'"); // проверка адреса электронной почты if(mysqli_num_rows($count) < 1) < mysqli_query($connection,"INSERT INTO users(email,password,activation) VALUES('$email','$password','$activation')"); // отправка письма на электронный ящик include 'smtp/Send_Mail.php'; $to=$email; $subject="Подтверждение электронной почты"; $body='Здравствуйте!
Мы должны убедиться в том, что вы человек. Пожалуйста, подтвердите адрес вашей электронной почты, и можете начать использовать ваш аккаунт на сайте.
'.$base_url.'activation/'.$activation.''; Send_Mail($to,$subject,$body); $msg= "Регистрация выполнена успешно, пожалуйста, проверьте электронную почту."; > else < $msg= 'Данный адрес электронный почты уже занят, пожалуйста, введите другой. '; >> else < $msg = 'Адрес, введенный вами, неверен. Пожалуйста, попробуйте еще раз.'; >> // HTML часть ?>
Send_Mail.php
В этом файле находится функция отправки сообщения, измените только SMTP хост, имя пользователя и пароль.
Здесь вы можете использовать элементы GMail SMTP для тестирования:
IsSMTP(true); // используем протокол SMTP $mail->IsHTML(true); $mail->SMTPAuth = true; // разрешить SMTP аутентификацию $mail->Host = "tls://smtp.yourwebsite.com"; // SMTP хост $mail->Port = 465; // устанавливаем SMTP порт $mail->Username = "SMTP_Username"; //имя пользователя SMTP $mail->Password = "SMTP_Password"; // SMTP пароль $mail->SetFrom($from, 'From Name'); $mail->AddReplyTo($from,'From Name'); $mail->Subject = $subject; $mail->MsgHTML($body); $address = $to; $mail->AddAddress($address, $to); $mail->Send(); > ?>
activation.php
Содержит PHP код, в котором статус пользователя, основанный на коде активации, обновляется со значения 0 до 1.
0) < $count=mysqli_query($connection,"SELECT uid FROM users WHERE activation='$code' and status='0'"); if(mysqli_num_rows($count) == 1) < mysqli_query($connection,"UPDATE users SET status='1' WHERE activation='$code'"); $msg="Ваш аккаунт активирован"; >else < $msg ="Ваш аккаунт уже активирован, нет необходимости активировать его снова."; >> else < $msg ="Неверный код активации."; >> ?> //HTML часть
Подтверждение адреса электронной почты
.htaccess
Скрипт перенаправления URL, который превращает
RewriteEngine On RewriteRule ^activation/([a-zA-Z0-9_-]+)/?$ activation.php?code=$1
CSS код
body < font-family: "Helvetica",Arial,sans-serif; font-weight: 500; color:#333; >label < width:100px; display:block; font-weight:bold; color:#666666; >#main < margin:0 auto; width:800px; >.input < padding:10px; font-size:14px; border:1px solid #999999; width:200px; margin-bottom:10px; >.button < padding:10px; background-color: #5fcf80 !important; border-color: #3ac162 !important; >.msg
Как сделать подтверждение почты php
В самых-самых простых словах, как подтвердить регистрацию или емайл у вас на сайте!?
Естественно, что первое. что нам понадобится это форма, при заполнении которой будет отправляться «что-то» на емайл для подтверждения.
Записать каким-то из способов на сайте данные по емейлу/регистрации!(сессия, куки, файл)
Создать и отправить » хитрую » ссылку на введенный емайл, который требуется проверить. По нажатию на которую, можно было бы, как-то, идентифицировать записанные данные и емайл.
И алгоритм, который все это сможет проверить, на совпадение и удалит временный файл/временную запись.
Это кажется сложным только с первого раза, но когда вы сами напишите этот скрипт, либо его скачаете. то вы сразу все поймете!
Что кажется самым сложным, из выше перечисленного!
Может быть хитрая ссылка!?
Давайте попробуем разобраться на примере файла, как это должно работать:
Подтверждение емайла/регистрации php -> через файл
Первый пример подтверждение регистрации/емайла через файл:
Начнем с емайла пользователя. пропустим его емайл через функцию md5, в качестве примера возьмем мой старый емайл (ed.wilson@mail.ru) -> это будет уникальный id пользователя:
echo md5(ed.wilson@mail.ru); результат : 6df9cb33ac41429237216d5edead97ac
Создаем файл с помощью file_put_contents и можем записать туда любую информацию -> например всю, которая была введена в форме регистрации. И у него будет хитрое название, это 6df9cb33ac41429237216d5edead97ac.txt
Ссылка для подтверждения емайла.
Далее нам нужна » хитрая » ссылка (это один из вариантов отправки, зашифрованного емайла в ссылке), если мы создаем вот такую ссылку и отправляем эту ссылку в письме для подтверждения емайла :
https://dwweb.ru/?registration= 6df9cb33ac41429237216d5edead97ac
Что дальше!? -> нам потребуется get запрос -> проверяем есть ли такой в адресной строке.
if($_GET[registration])
Далее нам нужно проверить есть ли такой файл и да! незабываем о безопасности -> strip_tags:
if(@file_exists( strip_tags($_GET[registration]) .’.txt’ ) )
Если файл существует, то совершаем какие-то действия!
И теперь нам остается весь скрипт собрать вместе!
Скачать скрипт -> «Подтверждение емайла/регистрации php -> через файл «
Скачать можно на странице со всеми скриптами
О скрипте -> «Подтверждение емайла/регистрации php -> через файл «
Скрипт создан лично мной. + проверен -> работает, как и описано ниже!
Внутри форма архива файл с формой — его можно загрузить куда-тов папку на сайт и протестировать.
Там единственное поле ввода для емайла.
Введите свой емайл и нажмите отправить, если все пройдет удачно, то вы получите письмо с выше рассмотренной хитрой ссылкой. Письмо будет отправлено простой функцией mail с помощью post, чтобы отправлять письмо в формате html -> см.здесь
Временный файл создастся в папке нахождения файла.
Если вы перейдете по ссылке в письме и файл был ранее создан и не удален, то вы увидите сообщение. что файл существует.
При повторном переходе по ссылке -> выдаст, что файл не существует!
Подтверждение емайла/регистрации php -> через cookie
Как вариант подтверждение емайл/регистрации через cookie!
Алгоритм скрипта подтверждение емайл/регистрации через cookie!
Пользователь отправляет форму,
Создается кука(cookie) с именем is_email и значением md5(емайл).
Если кука создана, то ему на введенный емайл отправляется опять же хитрая ссылка.
После получения ссылки -> пользователь проходит по ссылке.
Проверяется равна ли кука и get запрос из адресной строки.
Если все хорошо, то выводим данные, что кука существует -> удаляем куку.
При повторном использовании ссылки -> ответ «кука не существует!»
Скачать скрипт -> «Подтверждение емайла/регистрации php -> через cookie «
Скачать можно на странице со всеми скриптами
О скрипте -> «Подтверждение емайла/регистрации php -> через cookie «
Скрипт — копия предыдущего с некоторыми отличиями, которые и расписаны в основном описании.
Вместо создания файла, создается кука.
Вместо проверки существования файла, проверяется кука и get запрос.
В скрипте время существования cookie 3 часа = «5*60″(строка №30)
Подтверждение емайла/регистрации php -> через session
Когда мы говорим о подтверждении регистрации, то сокрее всего мы подразумеваем подтверждение емайла.
Из чего состоит скрипт(в архиве) подтверждения!?(Скрипт создан для того, чтобы появилось понимание того, как работает подобное подтверждение регистрации.)
Форма для отправки письма на почту.
1). У нас есть тег form
2). + method post
3), кнопка отправить submit
После того, как вы нажимаете отправить — создается ссылка(с get) вида:
https://dwweb.ru/’?registration=6df9cb33ac41429237216d5edead97ac
После получения почты, пользователь проходит по ссылке, где будет проверяться существование GET + сравнивание session и $id
Не забываем, что у сессии есть срок существования
Скачать скрипт «Подтверждение емайла/регистрации php через session «
Скачать можно на странице со всеми скриптами
Поисковые запросы на тему Подтверждения регистрации php
Дополнительно о поисковых запросах, которые кроме того, могут быть смешными, тупыми и т.д.
Подтверждение email php 2020
Интересный поисковый запрос подтверждение email php 2020, т.е. подтверждение email php в 2019 и в 2018 году, и в 2017 году отличаются!?
Это вам что, мода что-ли какая-то, чтобы изменяться с годами!?
Подтверждение регистрации по email
Здравствуйте!
Решил сделать регистрацию с подтверждением пароля по email. Наверное все было бы хорошо. Но почему-то UPDATE не сработал, но ответ положительный. Вот файл register.php, который занимается регистрацией и отправкой письма на указанную почту
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
session_start(); header("Content-Type: text/html; charset=utf-8"); include "DataBaze.php"; $post_data= filter_input_array(INPUT_POST,[ 'name'=>FILTER_SANITIZE_STRING, 'familiya'=>FILTER_SANITIZE_STRING, 'login'=>FILTER_SANITIZE_STRING, 'telephonenumber'=>FILTER_SANITIZE_STRING, 'email'=>FILTER_VALIDATE_EMAIL, 'password'=>[ 'filter'=>FILTER_VALIDATE_REGEXP, 'options'=>['regexp'=>'/./'] ], ]); if($post_data){ $empty_fields= array_filter (($post_data= array_map('trim',$post_data)), function($a) { return empty($a); }); if (count($empty_fields)){ echo ''; print_r($empty_fields); } else{ $sth= $DataBaze->prepare("SELECT COUNT(*)FROM `users` WHERE `login`=? OR `telephonenumber`=? OR `email`=?"); $sth->execute([ $post_data['login'], $post_data['telephonenumber'], $post_data['email'], ]); if ($sth->fetchColumn(0)){ echo ''; } else { $ip= $_SERVER['REMOTE_ADDR']; $images="https://hb.bizmrg.com/images_j99522iv/6.jpg"; $dok= "845nh8s9ze5t"; $nanodok= "35y6ru6y562335745st47rwebriudsrg1"; $serverdok= "otjhirhgorij40ty409b98yh98ywertb9c8rbieyr23b9ysqsj10"; $autoc="12345678910"; $code= SHA1($dok.$serverdok.$post_data['email'].$nanodok.$autoc.$post_data['login']); $subject = "Подтверждение регистрации"; $massage= "Здравствуйте! Спасибо за регистрацию на сайте Программирование! Что бы в дальнейшем пользоваться всеми функциями сайта Вам нужно активировать свой email. Для этого перейдите по ссылке http://aminpahn.beget.tech/reg/act.php?login=".$post_data['login']."&secret_key=".$code." С уважением, Администрация aminpahn.beget.tech"; mail($post_data['email'], $subject, $massage); $sth= $DataBaze->prepare("INSERT INTO `users`(`name`,`familiya`,`login`,`telephonenumber`,`email`,`email_verify`,`password`,`ip`,`img`) VALUES(:name,:familiya,:login,:telephonenumber,:email,:email_verify,:password,:ip,:img)"); $sth->bindValue(':name',$post_data['name'],\PDO::PARAM_STR); $sth->bindValue(':familiya',$post_data['familiya'],\PDO::PARAM_STR); $sth->bindValue(':login',$post_data['login'],\PDO::PARAM_STR); $sth->bindValue(':telephonenumber', $post_data['telephonenumber'],\PDO::PARAM_STR); $sth->bindValue(':email',$post_data['email'],\PDO::PARAM_STR); $sth->bindValue(':email_verify',$code,\PDO::PARAM_STR); $sth->bindValue(':password', password_hash($post_data['password'], PASSWORD_DEFAULT),\PDO::PARAM_STR); $sth->bindValue(':ip', $ip,\PDO::PARAM_STR); $sth->bindValue(':img',$images,\PDO::PARAM_STR); if ($sth->execute() ){ echo ''; } } } } ?>
Теперь файл act.php, который занимается проверкой значений и готовит вердикт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
include "DataBaze.php"; session_start(); if (isset($_GET['login'])) { $login =$_GET['login']; } else { exit ("Ошибка! Похоже, какие-то данные были утеряны при передачи их на сервер. Утерянная информация:ЛОГИН. Сожалеем об этом :( "); } if (isset($_GET['secret_key'])){ $code= $_GET['secret_key']; } else { exit("Ошибка! Похоже, какие-то данные были утеряны при передачи их на сервер. Утеренная информация: СЕКРЕТНЫЙ КЛЮЧ. Сожалеем об этом :( "); } $dok= "845nh8s9ze5t"; $nanodok= "35y6ru6y562335745st47rwebriudsrg1"; $serverdok= "otjhirhgorij40ty409b98yh98ywertb9c8rbieyr23b9ysqsj10"; $autoc="12345678910"; $activetrue= $DataBaze->prepare("SELECT `email` FROM `users` WHERE `login`=?"); $activetrue->execute([$login]); $row_chash= $activetrue->fetch(PDO::FETCH_ASSOC); $codekeygen= SHA1($dok.$serverdok.$row_chash['email'].$nanodok.$autoc.$login); if ($codekeygen == $code) { $ok= "YES"; $casuz= $DataBaze->prepare("UPDATE `users` SET `email_verify`= :email_verify WHERE `login`= :login"); $casuz->bindParam(':email_verify',$ok); $casuz->bindParam(':login',$login); echo "Ваш Е-мейл подтвержден! Теперь вы можете зайти на сайт под своим логином! Главная страница"; } else{ echo "Иногда, так бывает! Неизвестная ошибка, но уверяю Вас, что мы сделаем все возможное, что бы предотвратить это откровенное безобразие!"; } ?>
Ответ после перехода с email: «Ваш Е-мейл подтвержден! Теперь вы можете зайти на сайт под своим логином!
Но ключ в БД должен быть заменен на слов YES, но этого не происходит. Я не понимаю почему? Буду благодарен за помощь в этом вопросе.