带有base64_encode的PDO部分工作

时间:2015-12-04 14:30:29

标签: php pdo

(我总是在这里搜索并找到答案多年。这是我的第一篇文章,希望我做得对...)

在我的user_class.php中是注册的所有代码,验证忘记了pw,发送邮件等等。还有这个功能:

USER_CLASS.php

public function lastID()
{
    $stmt = $this->conn->lastInsertId();
    return $stmt;
}

在我的signup.php中,一切都按预期工作;该行正确插入数据库tbl_users,代码来自:

SIGNUP.php

$code = md5(uniqid(rand()));

此外,电子邮件使用激活链接正确发送,如下面的代码所示。

SIGNUP.php

else
{
    if($reg_user->register($uname,$email,$upass,$code,$iagree,$userip))
    {           
        $id = $reg_user->lastID();      
        $key = base64_encode($id);
        $id = $key;


        $message = "                    
                    Hello $uname,
                    <br /><br />
                    Welcome to XXXXX.<br/>
                    To complete your registration  please , follow the link below:<br/>
                    <br /><br />
                    <a href='http://example.com/verify.php?id=$id&code=$code'>Click here to Activate your account.</a>

当我将代码($ code)与存储在表中的代码进行比较时,它应该是正确的(相同)。

问题是,当我按照激活链接时,我的verify.php页面无法在表格中找到该记录:

VERIFY.php

if(empty($_GET['id']) && empty($_GET['code']))
{
    $user->redirect('index.php');
}

if(isset($_GET['id']) && isset($_GET['code']))
{
    $id = base64_decode($_GET['id']);
    $code = $_GET['code'];

    $statusY = "Y";
    $statusN = "N";

$stmt = $user->runQuery("SELECT userID,userStatus FROM tbl_users WHERE userID=:uID AND tokenCode=:code LIMIT 1");
$stmt->execute(array(":uID"=>$id,":code"=>$code));
$row=$stmt->fetch(PDO::FETCH_ASSOC);
if($stmt->rowCount() > 0)
{
    if($row['userStatus']==$statusN)
    {
        $stmt = $user->runQuery("UPDATE tbl_users SET userStatus=:status WHERE userID=:uID");
        $stmt->bindparam(":status",$statusY);
        $stmt->bindparam(":uID",$id);
        $stmt->execute();   

        $msg = "
               <div class='alert alert-success'>
               <button class='close' data-dismiss='alert'>&times;</button>
                  <strong>Thank you.</strong>  Your Account is now activated : <a href='index.php'>Login here</a>
               </div>
               ";   
    }
    else
    {
        $msg = "
               <div class='alert alert-error'>
               <button class='close' data-dismiss='alert'>&times;</button>
                  Your Account is already Activated : <a href='index.php'>Login here</a>
               </div>
               ";
    }
}
else
{
    $msg = "
           <div class='alert alert-error'>
           <button class='close' data-dismiss='alert'>&times;</button>
           No Account Found : <a href='signup.php'>Signup here</a>
           </div>
           ";
  } 
}

在电子邮件中的验证链接后,我转到verify.php,然后是错误:

$msg = "
           <div class='alert alert-error'>
           <button class='close' data-dismiss='alert'>&times;</button>
           No Account Found : <a href='signup.php'>Signup here</a>
           </div>
           ";

我认为问题在于signup.php,特别是使用$ key:

$id = $reg_user->lastID();      
$key = base64_encode($id);
$id = $key;

我认为它是$ key的原因是因为该电子邮件的验证帐户链接如下所示:

http://www.example.com/verify.php?id=MTUz&code=c74f01c3ea3edf807b21fc4ea28a41cb

现在,我显然不太了解,我承认自己是初学者,但MTUz位似乎是个问题。我唯一能想到的就是MTU可以做的事超过某些东西。

我承认我还没有尝试过任何其他因素,因为我不知道从哪里开始。

请指出正确的方向。

谢谢。

CREDIT给剧本的原作者: codingcage(点)的COM / 2015/09 /登录登记的电子邮件验证-忘记密码-php.html

1 个答案:

答案 0 :(得分:0)

我的主要失败。

@Marc B - 谢谢,var_dump($_GET)是指出我的错误。

我为我的愚蠢错误占用你的时间而道歉。

除了user_class.php中的以下内容之外,任何代码都没有任何问题:

public function lastID()
{
    $stmt = $this->conn->lastInsertId();
    return $stmt;
}

具体为lastInsertId();

最后一个id当然是verify.php正在寻找的内容:

$id = base64_decode($_GET['id']);

这一切都正常工作。

问题(我的错误)是:

我有两个INSERT INTO语句;

FIRTS&gt; INSERT INTO tbl_user&lt;新注册用户。

第二个&gt; INSERT INTO tbl_another&lt;我需要的东西。

很明显`lastInsertId();&#39;从tbl_another获取身份证。

而lastInsertId就是这样,&gt;&gt;最后&lt;&lt;

我只是改变INSERT INTO的顺序,以便tbl_users&#39; ID是最后一次

现在一切正常。我觉得这样一个白痴 - 花上几天然后出于绝望 - 在这里寻求帮助。

无论如何,谢谢你的时间。 杰米。

PS:我如何将这篇文章标记为已解决? [编辑]找到它 - 点击复选标记接受答案,对吗?但明天才能这样做。