2012-12-30 91 views
0

我正在使用ZEND工作項目提交更新查詢後用戶激活碼不會激活

一個非常奇怪且非邏輯的事情不斷髮生。

當用戶註冊它生成激活碼的寫入DB:

//Generate Activation Code; 
$activation_code = date('YmdHis'); 
$activation_code .= substr(number_format(time() * rand(),0,'',''),0,10); 
在數據庫中,我得到了前

。像這樣的代碼:

用戶應該去鏈接/user/activation/201212301653302670595490

我得到這個PARAM與控制器:

public function activateAction() { 

$activation_code = htmlentities(trim($this->_getParam('activation_code', 0))); 
$activation_code = preg_replace("/[^0-9]/","", $activation_code); 


    $usersModel = new Users_Model_DbTable_Users(); 
    $result = $usersModel->activUser($activation_code); 

    if($result) { 

     $this->view->message = 'Your account is activated. You may now Login.'; 

    } else { 

     $this->view->message = 'Something went wrong.'; 

    } 
} 

此操作調用我的模型的函數:

public function activUser($activation_code) { 

    $data = array(
     'status' => 2 
    ); 

    if($this->update($data, 'activation_code = '. $activation_code)) { 
     return true;    
    } 

} 

這是我Bootstrap中的自定義路由:

$activateUserRoute = new Zend_Controller_Router_Route("user/activate/:activation_code", array(
    'module' => 'users', 
    'controller' => 'manage', 
    'action' => 'activate' 
)); 

$router->addRoute('activateUserRoute', $activateUserRoute); 

我的單元激活代碼在DB表中是長度爲24('cuz生成的代碼長度爲24個符號)的VARCHAR。

的尷尬時刻

它一直未能激活過程。它總是返回false;

如果我去DB,用任何數字1,1231231231234甚至生成的代碼本身(201212301653302670595490)替換生成的代碼,它執行激活。

也許你可以告訴我這裏有什麼問題嗎?任何做法?

+1

Mikey,你有一個自定義的路線設置? URL'/ user/activation/201212301653302670595490'中的'activation'操作與您的'activate'操作不匹配。如果我們可以看到你正在使用什麼路線,那麼我們可以確定'$ this - > _ getParam('activation_code',0)'的值是多少。 – toneplex

+0

@toneplex是的我有我的自定義路由,問題是它工作正常,任何值,我直接在表中通過phpMyAdmin寫入,並且它與第一項(我的意思是當表中只有1個用戶)。我使用自定義路線更新了這個問題。 – mrGott

+1

嘗試將更新語句更改爲以下內容 '$ where = $ this-> getAdapter() - > quoteInto('activation_code =?',$ activation_code); if($ this-> update($ data,$ where){ return true; } – toneplex

回答

0

我得aske這一個第一:

什麼是點:$activation_code = preg_replace("/[^0-9]/","", $activation_code);它看起來像要更換什麼也沒有激活碼的所有值。

您將激活碼傳遞給$where parameter的方式已被棄用。在某些地方,這種語法可能仍然適用於其他語言,但它不適用。

public function activUser($activation_code) { 

    $data = array(
     'status' => 2 
    ); 
    $where = $this->getAdapter()->quoteInto('activation_code = ?', $activation_code); 
    //update() returns number of rows updated, 
    if($this->update($data, $where) === 0) { 
     return false;    
    } else { 
     return true; 
    } 
} 

因爲update()回報在當前的if()聲明更新任何不真實條件的行數是不準確的。 IT可能在大多數時間正常工作...
如果您測試的是準確更新的行數,並且如果沒有返回該數字,則會失敗。

htmlentities()可能不是過濾輸入參數的最佳選擇。您可能會更好地過濾您所知道的數據類型。 Zend_Filter_Input包含可能非常有用的過濾器和驗證器。