2012-01-12 114 views
1

我使用此代碼作爲電子郵件確認腳本的一部分。它工作的很好,除非我找不出一種方法來區分何時有人提供了無效的電子郵件地址,以及何時他們只是刷新了頁面(即已經確認了他們的賬戶)。我能想到的唯一想法是在users表中添加一個時間戳記字段,該表格始終得到更新,但我希望有更好的方法。我認爲REPLACE會做的伎倆,但是,雖然email是唯一的,它不是主要關鍵。mysql_affected_rows()解決方法?

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 [email protected]"; 
     // Send email to admin to notify of error 
     exit; 
    } 
} 

在此先感謝您的建議! Billy

編輯:$email$token變量通過$ _GET或$ _POST提供,如果不明顯。

+1

爲什麼不將它們重定向到單獨的頁面進行確認?如果成功,他們將無法刷新頁面。 – Aknosis 2012-01-12 15:48:36

+0

我比添加到數據庫更喜歡那個選項。成功設置$ _SESSION變量怎麼辦?這應該工作,對吧? – JeepFreak 2012-01-12 15:52:46

+0

重定向會阻止他們刷新,但如果他們再次點擊他們電子郵件中的鏈接呢?看到我的答案。 – andrewtweber 2012-01-12 15:57:10

回答

1

重定向會阻止他們刷新 - 但如果他們再次點擊他們電子郵件中的鏈接呢?

你應該檢查當前用戶是否被激活。

$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是一個布爾真/假而不是字符串'真'/'假'。

+0

添加另一個查詢來檢查並查看用戶是否已被確認似乎可以解決問題;這是迄今爲止最好的選擇,但有沒有更有效的方法?感謝您的答覆! – JeepFreak 2012-01-12 16:10:51

+0

我更新了我的答案。你可以稍微優化它,但是真的,運行2個小的查詢而不是1個並不會對你造成太大的傷害。請記住,激活頁面可能不會獲得相對於其他站點的更多流量,因此,此處的優化只能提供很大的幫助。 – andrewtweber 2012-01-12 16:31:44

+0

P.S.除了確認檢查之外,您還應該執行Aknosis建議的重定向。 – andrewtweber 2012-01-12 16:33:26