2015-02-19 11 views
0

Я пытаюсь создать скрипт регистрации пользователя.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 пользователь устанавливается в базе данных как неактивный. Как только я получу электронное письмо со ссылкой. пользователь настроен на активный, без щелчка по ссылке

Скажите, пожалуйста, кто-то знает, что случилось.

+0

после первого пользователя был активирован. Значение проверки равно null. Следующий пользователь, который приходит на страницу проверки, whosCheck_code не установлен (что означает null). Выполняет следующий запрос: выберите пользователя, где проверка = null. И это возвращает первого пользователя. – Pinoniq

+0

да, но перед вторым пользователем, использует verify.php, он зарегистрировал учетную запись и, следовательно, получил новый код подтверждения, который он использует из электронной почты? – user3070161

+0

Вы не указали нам, где в первом скрипте должен появиться '$ Id'. – CBroe

ответ

1

проблема является первым пользователем при регистрации таблица была совершенно пустой но когда второй пользователь зарегистрирован и введите verification.php без значения получить его ищет пользователь, который имеет проверочный = нуль (первый пользователь) и заполните код esily, так что все, что вам нужно, это изменить свой код.

просто отредактируйте первый запрос при проверке.PHP-файл вместо этого

$sql = 'SELECT Id, verification FROM `user` WHERE verification = :verification'; 

сделать это как этот

$sql = 'SELECT Id, verification FROM `user` WHERE verification = :verification AND isActive = 0'; 

для проверки того, что если значение передается или не

if(isset($_GET["verification_code"]){ 
    $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 ($Id == null){ 
     echo "the account was not found"; 

    }else{ 

// check if the verificationcode found in the database, matches the verificationcode from the link 
if ($row['verification'] !== $verificationCode) { 

    //checking if it already exists and if there is an error then deleting the user 

} 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!"; 

} 
} 
} 
+0

это не сработало. Но verify.php получает свое значение GET из ссылки? Я прав? я просто обновляю вопрос с примера моей ссылки, отправленной зарегистрированному пользователю – user3070161

+0

. Первое, что единственный способ сделать это - получить значение из URL-адреса, это не проблема, проблема была решена - вы изменяете значение isActive для значение по умолчанию, которое вводит его в базу данных, и другое, что вы можете сделать, это проверить, отправлено ли значение get или нет. Я редактирую свой ответ для этого –

+0

. Кажется, что это работает! Я не могу понять, почему, хотя .. потому что теперь мой $ checkCode пуст? как он может все еще найти пользователя и запустить UPDATE? когда $ checkCode пуст, я не могу найти пользователя с помощью метода select? могу я? – user3070161