can';t更新CakePHP中的现有记录
我编写了一个编辑函数来更新用户信息,我的代码:can';t更新CakePHP中的现有记录,cakephp,sql-update,cakephp-2.0,cakephp-model,editmodel,Cakephp,Sql Update,Cakephp 2.0,Cakephp Model,Editmodel,我编写了一个编辑函数来更新用户信息,我的代码: if($this->request->is('post')){ $this->request->data['User']['password']=Security::hash($this->request->data['User']['password'],'sha1', Configure::read('Security.salt')); $thi
if($this->request->is('post')){
$this->request->data['User']['password']=Security::hash($this->request->data['User']['password'],'sha1', Configure::read('Security.salt'));
$this->request->data['User']['type'] = '2';
$this->request->data['User']['username'] = $username;
//debug($this->request->data);
if($this->User->validates()){
$this->User->set($this->request->data['User']);
if ($this->User->save($this->request->data,false)) {
$this->Session->setFlash(__('The user has been saved'));
$this->redirect($this->root.'index');
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}
}
但是我检查了这个函数:$this->User->exists()从不返回true,在我的情况下,用户表键是username,当我编辑username时,这个函数可以将新信息保存为新记录,但是当我没有编辑username时,a无法保存新信息,为什么它会这样工作,我如何更正我的函数以编辑记录?相信我,您几乎总是希望在表中有一个
id
。添加它并使其成为主键
现在看起来是这样的:
if($this->request->is('post')){
// Think about using AuthComponent:
// $this->request->data['User']['password'] = AuthComponent::password($this->request->data['User']['password']);
$this->request->data['User']['password'] = Security::hash($this->request->data['User']['password'],'sha1', Configure::read('Security.salt'));
$this->request->data['User']['type'] = '2';
$this->request->data['User']['username'] = $username;
$this->User->id = $id;
// Checking if the user exists.
if(!$this->User->exists()){
// If not, tell it here.
}
if($this->User->validates()){
if ($this->User->save($this->request->data, false)) {
$this->Session->setFlash(__('The user has been saved'));
$this->redirect($this->root.'index');
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}else{
// Something went wrong.
}
}
如果您的主键有username,每次不同时,CakePHP都会创建一个新记录
现在,我将通过AJAX调用为您提供函数read
,也许它会对您有所帮助
// Function for creating and updating users.
public function update(){
// If the request is AJAX (from Ext-JS).
if($this->request->is('ajax')){
// Prepare data for CakePHP. $this->request->data['ModelName'] => array of data.
$this->request->data['User'] = $this->request->data;
// If there is "id" in data, then it's "edit".
// If there is no "id" in data, then it's "add".
if($this->request->data['id'] != null){
// Setting "id" for user so the CakePHP could use "save", "saveAll", "exits" or
// any other function for a particular user.
$this->User->id = $this->request->data['id'];
// Checking if the user exists.
if (!$this->User->exists()) {
// If there is no user with a given "id", remove the data (security reasons).
// Put the "success" and "message" (message) properties.
$this->request->data = array();
$this->request->data['success'] = false;
$this->request->data['message'] = "No user with this id.";
// Return the message to Ext-JS.
return new CakeResponse(array('body' => json_encode($this->request->data)));
}
// List of fields to save.
$fieldList = array('id', 'first_name', 'last_name', 'username', 'role_id', 'language_id', 'status', 'last_login', 'created', 'modified');
// Only if there is an password provided by user, save it.
if($this->request->data['User']['password'] != ''){
array_push($fieldList, 'password');
}
// If you are here, then there is a user with a given "id" and you are editing that user.
if ($this->User->save($this->request->data, true, $fieldList)) {
// Remove any data except the "success" and "message" (message) properties (security reasons).
$this->request->data = array();
$this->request->data['success'] = true;
$this->request->data['message'] = "The user has been changed.";
}else {
// If you are here, something went wrong with editing a user. Remove the data (security reasons).
// Put the "success" and "message" (message) properties.
$this->request->data = array();
$this->request->data['success'] = false;
$this->request->data['message'] = "Error with editing.";
}
}else{
// If you are here, then you are adding a new user (because there is no "id" in data). Create a new row in table.
$this->User->create();
// Try to save the user with data from $this->request->data['User'].
if ($this->User->save($this->request->data)) {
// If you are here, then everything is ok. Remove any data and tell that to Ext-JS with "success" and "message" (message) properties.
$this->request->data = array();
$this->request->data['success'] = true;
$this->request->data['message'] = "The user has been added.";
}else{
// If you are here, something probably went wrong with $this->request->data['User'].
// Remove any data (security reasons) and tell that to Ext-JS with "success" and "message" (message) properties.
$this->request->data = array();
$this->request->data['success'] = false;
$this->request->data['message'] = "Something went wrong with adding a user.";
}
}
// Return any data to Ext-JS, despite the success.
// $this->request->data['success'] => (true | false).
// $this->request->data['message'] => (message for Ext-JS).
return new CakeResponse(array('body' => json_encode($this->request->data)));
}
}
现在,您将会话
消息发送给用户,而不是返回新的CakeResponse
。调试代码
在此之前,在问题代码中,没有任何一点进行过以下操作:
- 调用
create
- 在模型上调用
set
save
但是我检查了这个函数:$this->User->exists()从不返回true
由于不需要调用create
,set
或设置User->id
属性,因此应该这样做
请参阅文档
可以显式调用验证
,但也没有必要Save
已经调用了验证——同样地,如果您的代码有效,您将运行两次验证规则
请参考以下中的示例:
public function edit($id) {
if ($this->request->is('post')) {
if ($this->Recipe->save($this->request->data)) {
$this->Session->setFlash('Recipe Saved!');
$this->redirect('/recipes');
}
}
$this->set('recipe', $this->Recipe->findById($id));
}
尝试以下步骤
如果($this->User->save($this->request->data,false)){
}那么表的主键是用户名,您想更新该键吗?为什么不添加一个
id
字段来简化您的生活。我想更新此记录的所有字段,但此代码只能创建新记录$user\u info
中有数据吗?将debug($user\u info)
放在if($this->request->is('post')){
部分上方。在更改表格后,您是否编辑了模型
?
public function edit($id) {
if ($this->request->is('post')) {
if ($this->Recipe->save($this->request->data)) {
$this->Session->setFlash('Recipe Saved!');
$this->redirect('/recipes');
}
}
$this->set('recipe', $this->Recipe->findById($id));
}
$this->Session->setFlash(__('Recipe Saved!'));
return $this->redirect(array('action' => 'view_users'));