激活邮件和哈希检查从mysql_ *处理到PDO

时间:2017-05-19 09:02:51

标签: php pdo

这是mysql_ *代码:

Activation mail and hash check

PDO:

有人看到了解决方案吗?

    if (isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash'])){
        // Verify data
        $search = $db->prepare("SELECT email, hash, active FROM users WHERE email=:email AND hash=:hash AND active=0"); 
        $search->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
        $search->bindParam(':hash', $_POST['hash'], PDO::PARAM_STR);
        $search->execute();
        //$match  = $search->fetch(PDO::FETCH_ASSOC);
        $match = $search->rowCount();

这部分条件存在问题

    if($match > 0){
                // We have a match, activate the account
                $db->prepare("UPDATE users SET active= 1 WHERE email=:email AND hash=:hash AND active=0");
                $db->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
                $db->bindParam(':hash', $_POST['hash'], PDO::PARAM_STR);
                $db->execute();




    echo '<div class="statusmsg">Your account has been activated, you can now login</div>';
    }else{
                // No match -> invalid url or account has already been activated.
                echo '<div class="statusmsg">The url is either invalid or you already have activated your account.</div>';
            }


    }else{
        // Invalid approach
        echo '<div class="statusmsg">Invalid approach, please use the link that has been send to your email.</div>';
}
  

条件在这里完成代码:

网址无效或您已激活帐户。

  

但它应该在这里完成代码:

您的帐户已被激活,您现在可以登录。

3 个答案:

答案 0 :(得分:1)

你检查$ _GET但稍后使用$ _POST。

答案 1 :(得分:0)

流程中的问题与这行代码绑定:

$match = $search->rowCount();

您正在执行SELECT查询,而rowCount仅适用于INSERTDELETEUPDATE次查询。

相反,要找出是否存在leas匹配,您可以使用fetch()来获得&#34;首先&#34;行,如果存在,则匹配:

...
$match = $search->fetch();
if ($match) {
    ...

作为防止这行代码的另一种替代方法,您理论上也可以完全删除第一个SELECT查询并首先执行第二个UPDATE查询,然后使用{{1}进行检查无论用户是否更新过。

您的代码还有更多可供评论的内容,例如您验证哈希值的逻辑,因为它们没有时间限制,哈希的生成甚至是未知但通常很关键。

参考:

答案 2 :(得分:0)

您的代码中几乎没有错误,

首先,您在此处使用的$_POST不存在。

$search->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$search->bindParam(':hash', $_POST['hash'], PDO::PARAM_STR);

你应该使用$_GET rowCount返回由相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。 在rowcount之前,在select上不可靠,

下面是您可以用来实现您所寻找的工作代码。     

if (isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash'])){

        $email = $_GET['email'];
        $hash = $_GET['hash'];

        $search = $db->prepare("SELECT email, hash, active FROM users WHERE email=:email AND hash=:hash AND active=0"); 
         $search->bindParam(':email', $email, PDO::PARAM_STR);
        $search->bindParam(':hash', $hash, PDO::PARAM_STR);
        $search->execute();

        $match = $search->fetchall(PDO::FETCH_ASSOC);

        if(count($match) > 0){
            //then match exists activate the profile

            $stmt = $db->prepare("UPDATE users SET active= 1 WHERE email= ?  AND hash= ? AND active=0")->execute(array($email,$hash));

            if(!$stmt){

                    print_r($db->errorInfo());

            }else{
                    //account activated
                 echo '<div class="statusmsg">Your account has been activated, you can now login</div>';
            }

        }else{

             // No match -> invalid url or account has already been activated.
                echo '<div class="statusmsg">The url is either invalid or you already have activated your account.</div>';
        }

    }else{

        // Invalid approach
        echo '<div class="statusmsg">Invalid approach, please use the link that has been send to your email.</div>';
    }