我正在构建一个用户可以更改密码的页面。他们必须填写两个字段,两个字段必须匹配才能更改,然后在成功时将其重定向到其个人资料页面。
到目前为止,我已经构建了以下方法:
public function changePassword()
{
$user = $this->User->find('first', array(
'conditions' => array(
'User.id' => $this->Auth->user('id'))
));
if ($this->request->is('post') || $this->request->is('put'))
{
if ($this->User->save($this->request->data))
{
$this->User->saveField('password', AuthComponent::password($this->request->data['User']['password2']));
$this->Session->setFlash(__('Your password has been changed!'));
$this->redirect(array('controller'=>'profiles','action'=>'view','userName'=>$user['User']['username']));
}
else
{
$this->Session->setFlash(__('Whoops! Something went wrong... try again?'));
}
}
}
这是表格:
<?php echo $this->Form->create(); ?>
<?php echo $this->Form->input('id',array('type'=>'hidden')); ?>
<?php echo $this->Form->input('password1',array('type'=>'text','label'=>array('text'=>'Enter your new password'))); ?>
<?php echo $this->Form->input('password2',array('type'=>'text','label'=>array('text'=>'Confirm your new password'))); ?>
<button type="submit">Save</button>
<?php echo $this->Form->end(); ?>
因此,您可以看到计划是使用password2中的内容,并使用安全散列将其保存在数据库密码字段中。但是会发生什么呢?它会创建一个新的用户而不是空白数据......我在这里做错了什么?我如何比较两个密码字段...
答案 0 :(得分:1)
最可能的问题是你以某种方式将表单中的id丢失回控制器操作。 没有数据数组中存在的id,蛋糕假定它必须创建一个条目。
所以调试你发布的数据并确保它没有丢失,或者在保存之前手动分配id。
$this->request->data['User']['id'] = $this->Session->read('Auth.User.id');
PS:从您的方法看,您的隐藏“id”字段始终为空,因为$ user数据未从控制器传递下来!
答案 1 :(得分:1)
公共功能恢复() {
if ($this->request->is('post') )
{
$this->loadModel('AclManagement.User');
$passwords = AuthComponent::password($this->data['User']['password']);
$this->User->query("UPDATE users SET password = '".$passwords."' WHERE password_change = '".$this->request->data['User']['id']."' ");
$this->Session->setFlash(__('Password Saved Sucessfully'), 'success');
$this->redirect(array('action' => 'login'));
}
else
{
$this->set('resettoken', $_REQUEST['id']);
}
}
答案 2 :(得分:0)
$this->request->data['User']['password2'] = AuthComponent::password($this->request->data['User']['password2']);
$this->User->save($this->request->data);
当您的表单与auth用户id
一起提交时,如果您使用请求数据执行save()
,则蛋糕只会更新您的记录,而不是由于id
字段而创建(如果有的话)记录存在于表中的id
。上面的代码只需在请求数据中使用哈希密码更新password2
。
答案 3 :(得分:0)
您不应该在表单中指定操作编辑吗?
echo $this->Form->create('User', array('action' => 'edit'));