Я пытаюсь создать скрипт регистрации пользователя.PDO проверка электронной почты
В моем сценарии registration.php
я проверяю входные данные пользователя и вставляю их в базу данных. Затем я хочу, чтобы отправить пользователю ссылку для подтверждения электронной почты с помощью SMTP с:
$user_activation_hash = sha1(uniqid(mt_rand(), true)); //creating ramdom string
$mail = new PHPMailer;
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';
$mail->Host = "info"; // SMTP server
$mail->Username = "info"; // SMTP account username
$mail->Password = "info"; // SMTP account password
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->Port = info; // set the SMTP port for the server
$mail->From = "info"; //the email the mail comes from
$mail->FromName = "someName"; //what name should be shown at the email
$mail->AddAddress($email); //where the mail should be sent to
$mail->Subject = "email validation"; //subject of the mail
//how the link should look in the mail the "url" should point to the verification.php file
$link = "url path to my verification.php script".'?verification_code='.urlencode($user_activation_hash);
//the message in the mail with the above link
$mail->Body = "Please click on this link to activate your account:".' '.$link;
if(!$mail->Send()) {
echo "there was an error sending the mail" . ' ' . $mail->ErrorInfo;
//if there is an error sending the mail then I delete it here
return false;
} else {
//here I update the user with the new random created string
$sql = 'UPDATE `user` SET verification = :verification WHERE Id = :Id';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':Id', $Id, PDO::PARAM_STR);
$stmt->bindParam(':verification', $user_activation_hash, PDO::PARAM_STR);
$stmt->execute();
$dbh = null;
return true;
}
Все это прекрасно работает до сих пор зарегистрированный пользователь получает письмо с случайной ссылкой, созданной.
здесь пример ссылки пользователь получает: http://url/to/verification.php?verification_code=80371b8ff9b0d5fb444f4be68c8b5a0d9757603b
Когда они нажимают на ссылку, они направлены на мой verification.php сценарий:
if(!empty($_GET['verification_code']) && isset($_GET['verification_code'])){
$verificationCode = $_GET['verification_code'];
//check the database for the verification code from the link
$sql = 'SELECT Id, verification FROM `user` WHERE verification = :verification AND isActive = 0';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':verification', $verificationCode, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch();
$Id = $row['Id'];
if (empty($row)){
echo "the account was not found";
}else{
//if they match. make the user active in db
$sql = 'UPDATE user SET isActive = 1, verification = NULL WHERE Id=:Id';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':Id', $Id, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch();
echo "The account has been activated!";
}
}
}
Хорошо, так вот моя головная боль, и я надеюсь, что смогу это объяснить правильно:
Все это работает. Когда я создаю первого пользователя, он работает после регистрации, я вижу код проверки в базе данных и когда я нажимаю ссылку, она активируется. Но следующие пользователи, получающие регистрацию, сразу активируются, когда я нажимаю скрипт registration.php! Это похоже на то, что оба сценария запускаются сразу, а затем делает ссылку активации совершенно ненужной.
Я понятия не имею, что вызывает подобное поведение. Это потому, что мое соединение pdo не закрыто должным образом из моего первого скрипта? Это потому, что PHP обычно запускает все сценарии в каталоге, когда только один я звонил? Это потому, что я не понимаю, как работает функция $ _GET?
я не могу найти возможный способ, почему это не должно работать так, вот некоторые из вещей, которые я уже пробовал:
- Я пытался регистрацией пользователя с сценарий verification.php закомментирована затем сначала раскомментируйте его и нажмите ссылку, отправляемую при регистрации пользователя. это работает.
- Я попытался переместить свой скрипт verify.php в другую папку. Ничего не помогло
- Я попытался закрыть соединение в файле verify.php, после чего сделал новый PDO. это тоже не сработало.
- Я пробовал много способов изменить метод $ _GET, но не успел.
UPDATE !: теперь я попытался увидеть, где именно код сломается, и я заметил что-то необычное. при запуске register.php пользователь устанавливается в базе данных как неактивный. Как только я получу электронное письмо со ссылкой. пользователь настроен на активный, без щелчка по ссылке
Скажите, пожалуйста, кто-то знает, что случилось.
после первого пользователя был активирован. Значение проверки равно null. Следующий пользователь, который приходит на страницу проверки, whosCheck_code не установлен (что означает null). Выполняет следующий запрос: выберите пользователя, где проверка = null. И это возвращает первого пользователя. – Pinoniq
да, но перед вторым пользователем, использует verify.php, он зарегистрировал учетную запись и, следовательно, получил новый код подтверждения, который он использует из электронной почты? – user3070161
Вы не указали нам, где в первом скрипте должен появиться '$ Id'. – CBroe