【问题标题】:Activation mail and hash check processed from mysql_* into PDO激活邮件和哈希检查从 mysql_* 处理到 PDO
【发布时间】:2017-05-20 02:03:13
【问题描述】:

这里是 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>';
}

条件结束这里的代码:

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

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

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

【问题讨论】:

  • 你面临的问题是你没有得到你需要的结果吗?
  • 你的问题是什么
  • 你是如何散列的?
  • 代码在 mysql_* 中完美运行,但在 PDO 中无法运行,某处出现错误 stackoverflow.com/questions/43986473/…
  • 阅读全文,你就会明白这个问题!

标签: php pdo


【解决方案1】:

您检查了 $_GET,但后来使用了 $_POST。

【讨论】:

  • @Grofman:请不要编辑其他人对您问题的回复,因为您的问题非常不清楚,您不能接受简单的帮助 cmets(错误地发布为答案)。谢谢。
  • 我已删除答案,非常感谢您的建议,对不起
  • @Grofman 似乎您的数据库在选择时没有填充 rowCount。 php.net/manual/en/pdostatement.rowcount.php > 对于大多数数据库,PDOStatement::rowCount() 不会返回受 SELECT 语句影响的行数,您在此站点上有一个如何解决此问题的示例。
【解决方案2】:

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

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

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

您应该使用$_GET rowCount 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。 因此,行数在选择时不可靠,

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

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>';
    }

【讨论】:

  • 非常感谢!!!!!!!!!!!!!!!!!!!谢谢!!!谢谢!!!谢谢!!!谢谢!!!谢谢
  • 有人给了我负面评价,我没有15分给你……没关系,非常感谢!
  • @Grofman:在任何情况下你都接受了 15 次。还有另一个提示:如果您查看代码,您可以完全省去第一个查询。仅当该用户/哈希存在时,更新查询才会运行(和更新)。奖励是,你会得到 rowCount 设置。这里提出的fetchall 仍然不能始终与行数一起使用,并且在任何情况下都不应该这样做,因为它没有必要。你只想更新。数据库已经为您解决了这个问题。只需检查更新是否有效以及有多少行受到影响。
  • @hakre 如果您是反对者,请解释它的用途是什么?至于我的代码,这里没有rowCount
  • 我没有投反对票,但是如果您执行 fetchAll 操作只是为了计算行数,这是错误的建议(因为它永远没有必要),而是建议进行更改,使该查询变得多余。我可以想象有人(但不是我)触发了 d/v。我的答案中已经有这个参考,它很好地概述了这一点:stackoverflow.com/a/16776839/367456
【解决方案3】:

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

$match = $search->rowCount();

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

相反,要找出是否存在至少匹配,您可以使用fetch() 获取“第一”行,如果存在,则存在匹配:

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

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

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

参考:

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多