2013-02-10 158 views
0

我正在寫PHP以激活用戶帳戶...... 代碼被過濾,消毒,密碼加密,並且我用PDO來存儲數據.... 一旦數據存儲,我有一個標題重定向,引導用戶點擊他們註冊的電子郵件地址上的激活鏈接。PHP帳戶激活邏輯

一切工作正常,我正在使用PDO RowCount()告訴重定向繼續並運行,但我在MySql數據庫中添加了一個哈希列來幫助激活鏈接,然後被查詢以實際激活帳戶,所以RowCount已經被填充,重定向只會繞過表單本身。所以我寫了一些代碼來使重定向工作,它的確如此,但是它仍然繞過表單本身.....我需要這段代碼來運行頭重定向,說數據庫已經被填充通過表單,但我需要它停止繞過表單本身,只是繼續前進和重定向。

下面的代碼....應要求提供更多的代碼.....

try{ 
    $checkEmail = $db->prepare('SELECT email FROM users WHERE email = :email'); 
    $checkEmail->bindParam(':email', $clean['email']); 
    $checkEmail->execute(); 
    $result = $checkEmail->fetch(); 
    print_r($result); 
    } catch(PDOException $e) { 
    $e->getMessage(); 
    } 
    if ($result[0] === $clean['email']){ 

      header('Location:verifyemail.php'); 



    } 

的$乾淨[「電子郵件」]是當前的電子郵件地址,在編程邏輯。但似乎PHP已經有一些價值,因此形式被繞過。

回答

0

我可能完全誤解這個代碼片斷的意圖,但如果在第一次加載頁面,$clean['email']NULL(因爲沒有形式的輸入已被處理),我認爲if條件將永遠是正確的:

  1. PDO取代與佔位符NULL取代的運行,因此相當於SELECT email FROM users WHERE email = NULL
  2. 沒有行匹配(保證,因爲即使NULL = NULL是SQL假)
  3. $result[0]是未定義的,因爲第ËSQL查詢返回行
  4. 因此,$result[0]$clean['email']都計算爲PHP NULL,因此相同的
  5. 重定向火災

[更新,從評論]我覺得這個做法會比其他一切工作NULL輸入;你只需要檢測$clean['email']沒有提供的情況。也許if (! empty($clean['email']) && $result[0] === $clean['email']) { ... }

+0

是的,所以我只需要一塊數據說數據庫剛剛被填充rowCount()做到了這一點,但是一旦我將哈希插入到數據庫中,它就被繞過了,因爲數據庫至少自動填充一列。我正在用PDO查看columnCount(),但我認爲首先需要查詢數據庫。我需要的是一個PDO方法,它說x列的字面剛剛被填充,去和重定向..... – 2013-02-10 20:25:22

+0

@AntPower我認爲這種方法將適用於NULL輸入以外的任何東西;你只需要檢測'$ clean ['email']'沒有被提供的情況。也許'if(!empty($ clean ['email'])&& $ result [0] === $ clean ['email']){...}' – IMSoP 2013-02-10 20:29:24

+0

現在就試試吧...... ..謝謝.... – 2013-02-10 20:32:57