提交更新查询后,用户激活码不会激活

时间:2012-12-30 13:09:54

标签: php mysql zend-framework

我正在使用ZEND

开展项目

一种非常奇怪和不合逻辑的事情不断发生。

当用户注册它时会生成一个激活码,写入DB:

//Generate Activation Code;
$activation_code = date('YmdHis');
$activation_code .= substr(number_format(time() * rand(),0,'',''),0,10);

在我得到的数据库中。代码如下: 201212301653302670595490

用户应该转到/user/activation/201212301653302670595490

我通过控制器得到了这个参数:

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); 
数据库表中的 activation_code 是VARCHAR,长度为24('生成的代码长度为24个符号)。

尴尬的时刻

它一直使激活过程失败。它总是返回false;

如果我转到数据库,用任意数字替换生成的代码1,1231231231234甚至生成的代码本身(201212301653302670595490)它都会激活。

也许你可以告诉我这里出了什么问题?任何练习?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我首先要问这个:

有什么意义:$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具有非常有用的过滤器和验证器。