Проверка подтверждения электронной почты

У меня возникла проблема с подтверждением учетных записей пользователей. Я заставляю его вставлять данные, а затем отправлять ссылку для подтверждения, но когда по ней щелкают в электронном письме, она не обновляет «активную» строку с 0 на 1. Я возился с этим всю ночь, и это, вероятно, что-то простое, но в любом случае, если кто-нибудь может помочь, я был бы очень признателен.

Кроме того, если бы кто-нибудь мог дать какие-либо советы о том, как сделать это доказательство инъекции, я также был бы очень рад. Спасибо!

<?php

require ('classes/class.db.php');
require ('classes/class.pass.php');


try {

if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){  
    // Verify data  
    $search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'";
    $match = $db->num_rows( $query );

    if($match > 0){  

    $stmt = $db->prepare('UPDATE users (active) VALUES (:active) WHERE active = 0');
    $status = $stmt->execute(array(
    ':active' => 1));

        if( $status )
        {
            echo '<p>Your account has been activated, you can now login</p>';
        }
    }

}else{  
    echo '<p>Your account is already activated</p>';
}  


} catch (PDOException $e) {
        die($e->getMessage());
    }

?>

ОБНОВЛЕНИЕ №1

Пробовал то, что предложил Акам, но все еще получаю некоторые ошибки. Вот что у меня есть для моего утверждения.

$stmt = $db->prepare("UPDATE users SET active ='1' where active = '0' and email=:email AND email_hash=:email_hash");
$status = $stmt->execute(array(
':email' => $_GET['email'],
':email_hash' => $_GET['email_hash']
));

ОБНОВЛЕНИЕ №2

Похоже, проблема в $_GET['email_hash'], который нельзя отобразить или сохранить в переменной. Он не будет брать случайную хэш-строку со страницы signup.php и переносить ее на страницу verify.php, но адрес электронной почты переносится отлично. Я немного смущен и хотел бы, чтобы кто-нибудь разъяснил это для меня. Спасибо.

ОБНОВЛЕНИЕ №3

Проблема была такой же простой, как превратить $_GET['email_hash'] в $_GET['hash']. Спасибо еще раз!


person Devereaux    schedule 29.07.2013    source источник
comment
Вы уверены, что хотите обновить ВСЕ учетные записи пользователей?   -  person Your Common Sense    schedule 29.07.2013
comment
Нет, только тот пользователь, чья электронная почта совпадает.   -  person Devereaux    schedule 29.07.2013
comment
добавьте это после if($status).. else{echo $db->errorInfo()}   -  person    schedule 29.07.2013
comment
Кажется, проблема связана со строкой ':email_hash' =› $_GET['email_hash'], но до сих пор не могу понять, как ее решить.   -  person Devereaux    schedule 29.07.2013
comment
См. Обновление № 2. Как только я выясню это, я знаю, что это сработает.   -  person Devereaux    schedule 29.07.2013


Ответы (2)


Вы также можете сделать все одним запросом, не нужно сначала запрашивать, если вы пишете одинаковые условия в обновлении:

"UPDATE users SET active ='1' where active = '0' and email=:email AND hash=:email"
person Community    schedule 29.07.2013
comment
См. Обновление № 1 выше, пожалуйста - person Devereaux; 29.07.2013

Ваш UPDATE запрос содержит синтаксическую ошибку. Попробуйте изменить запрос на

$stmt = $db->prepare('UPDATE users SET active=:active WHERE active=0 AND email=:email AND email_hash=:email_hash');

А затем включите $email и $email_hash в свой ассоциативный массив во время выполнения оператора.

Кстати, вызов isset($var) && !empty($var) примерно эквивалентен написанию !empty($var). Согласно документации, потому что

empty($var)

соответствует

!isset($var) || $var == false,

отсюда следует, что !empty($var) конгруэнтно isset($var) && $var != false.

person Community    schedule 29.07.2013
comment
Пожалуйста, ознакомьтесь с подготовленными операторами - единственный правильный способ добавления переменной в запрос. - person Your Common Sense; 29.07.2013