mysql_affered_rows () обходной путь? - PullRequest
1 голос
/ 12 января 2012

Я использую этот код как часть сценария подтверждения по электронной почте.Это прекрасно работает, за исключением того, что я не могу найти способ различить, когда кто-то предоставил неверный адрес электронной почты, и когда он просто обновил страницу (т.е. уже подтвердил свою учетную запись).Единственное, о чем я могу думать, это поместить поле метки времени в таблицу users, которая всегда обновляется, но я надеюсь, что есть лучший способ.Я думал, что REPLACE подойдет, но, хотя email уникален, это не первичный ключ.

if (isset ($email, $token, $correctToken)){    
    $success = FALSE; //Set the $success variable so that we don't get an error when testing for it later
    if ($token == $correctToken) {
        $confirm = mysql_query("UPDATE users
                        SET conf = 'TRUE'
                        WHERE email = '$email'");
        if (mysql_affected_rows() == 1) {
            echo "Thank you!  Your email address is confirmed and your account is actived.";
            $success = TRUE;
        }
    }
    if (!$success) {
        echo "There was a problem with the confirmation.  Try the link in your email again or contact us at Support@WiseRenters.com";
        // Send  email to admin to notify of error
        exit;
    }
}

Заранее спасибо за совет!Билли

РЕДАКТИРОВАТЬ: переменные $email и $token предоставляются через $ _GET или $ _POST, в случае, если это не было очевидно.

1 Ответ

1 голос
/ 12 января 2012

Перенаправление не позволит им обновиться - но что, если они снова нажмут на ссылку в своем электронном письме?

Вы должны проверить, активирован ли текущий пользователь или нет.

$sql = "SELECT id, conf FROM users WHERE email = '{$email}'";
$exec = mysql_query($sql) or die(mysql_error());
list( $id, $conf ) = mysql_fetch_row($exec);

if( $conf ) {
    // Redirect them to their profile with a message saying "your account has already been activated"
    header("Location: /profile?already_activated");
    exit;
}

// your code
$confirm = mysql_query("UPDATE users
                    SET conf = 'TRUE'
                    WHERE id = '{$id}'");

В ответ на ваш комментарий:

Имейте в виду, это только добавит дополнительный запрос для пользователя, который еще не активирован. Если они активированы, происходит перенаправление, и на странице все еще выполняется только 1 запрос.

Чтобы немного оптимизировать это, вы можете выбрать идентификатор пользователя и статус подтверждения на основе адреса электронной почты. Затем, если их нужно активировать, вы можете активировать их по идентификатору пользователя, а не по электронной почте. Так как целочисленный ключ намного быстрее, объединенное время 2 запросов будет примерно таким же, как и 1 запрос, который вы обновляете на основе строкового столбца. Я обновил код, чтобы отразить это.

Кроме того, эта страница, вероятно, будет доступна не очень часто. Любая оптимизация будет действительно микро- и не очень полезной.

Кстати, я надеюсь, что вы используете mysql_real_escape_string в письме, и что conf является логическим значением true / false, а не строкой 'true' / 'false'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...