我正在使用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);
数据库表中的尴尬的时刻
它一直使激活过程失败。它总是返回false;
如果我转到数据库,用任意数字替换生成的代码1,1231231231234甚至生成的代码本身(201212301653302670595490)它都会激活。
也许你可以告诉我这里出了什么问题?任何练习?
答案 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具有非常有用的过滤器和验证器。