2015-12-04 59 views
1

(我一直尋找和發現這裏的答案很多年了。這是我的第一篇文章,希望我做的是正確的......)PDO與BASE64_ENCODE工作部分

在我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> 

當我比較的代碼($代碼)與存儲在表中的代碼,它是正確的(相同的),因爲它應該是。

的問題是,當我按照激活鏈接,我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> 
      "; 
    } 
} 

繼驗證鏈接從電子郵件需要與$鍵

$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,具體是::

我verify.php,然後錯誤
$id = $reg_user->lastID();  
$key = base64_encode($id); 
$id = $key; 

的原因,我認爲這是$關鍵,是因爲電子郵件的驗證帳戶鏈接看起來是這樣的:

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

現在,我清楚地知道的不多,我在被承認一個初學者,但MTUz位似乎是什麼問題。我能想到的唯一的事情就是MTU是超越某種東西的東西。

我承認我沒有嘗試過其他任何東西,因爲我不知道從哪裏開始。

請指點我正確的方向。

謝謝。

信貸的劇本原作者: codingcage(點)的COM/2015/09 /註冊登記的電子郵件驗證,忘記密碼,php.html

+0

「MTUz」在base64表示中僅僅是「153」。任何你認爲似乎只是一個整數的原因? –

+0

謝謝。代碼是我從帖子中的信用鏈接中得到的。問題不在於爲什麼使用base64,而是:base64代碼是否正確生成,如果是這樣,爲什麼它不能解碼,就像在我的帖子的verify.php代碼中一樣。有沒有比base64更好的選擇? – jamie

+0

你確定它沒有正確解碼嗎?很多你的代碼只是假設什麼都不會失敗。基本的調試:'var_dump($ _ GET)',看看收到了什麼,'var_dump($ id)'看看解碼的內容等等... –

回答

0

主要FAIL我的一部分。

@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> INSERT INTO tbl_user <新註冊用戶。

SECOND> INSERT INTO tbl_another <我需要的東西。

所以顯然`lastInsertId();'正在從tbl_another取得ID。

而且lastInsertId就是這樣,>>最後< <

我簡單地改變INSERT INTO的順序,使tbl_users' ID是最後

所有現在可以正常工作。我覺得這樣一個白癡 - 花上幾天時間,然後脫離絕望 - 在這裏尋求幫助。

無論如何,謝謝你的時間。 傑米。

PS:如何將此帖標記爲已解決? [編輯]找到它 - 點擊複選標記接受答案,對嗎?但明天只能這樣做。