0

我正在使用 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;            
    }

}

这是我的引导程序中的自定义路由:

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

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

我在 DB 表中的单元格activation_code是 VARCHAR,长度为 24(因为生成的代码长度为 24 个符号)。

尴尬时刻

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

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

也许你能告诉我这里出了什么问题?有什么练习吗?

4

2 回答 2

0

尝试http://framework.zend.com/manual/1.12/en/zend.db.profiler.html查看生成的 SQL。

于 2012-12-30T18:24:18.560 回答
0

我得先问这个:

有什么意义:$activation_code = preg_replace("/[^0-9]/","", $activation_code);看起来您正在用任何内容替换激活代码中的所有值。

您将激活码传递给$where 参数的方式已被弃用。在某些地方,语法可能仍然有效,但在其他地方却不行。

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具有非常有用的过滤器和验证器。

于 2012-12-31T03:06:59.790 回答