Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CakePHP 2中编辑表:更新/插入错误_Php_Cakephp_Cakephp 2.0 - Fatal编程技术网

在CakePHP 2中编辑表:更新/插入错误

在CakePHP 2中编辑表:更新/插入错误,php,cakephp,cakephp-2.0,Php,Cakephp,Cakephp 2.0,问题:编辑条目时,SQL正在进行插入而不是更新 我有两个SQL表:users和users\u detail。 用户(id、角色、名称、密码)& 用户详细信息(id、地址、城市、用户id) 外键users\u detail.user\u id链接到users.id 我的cakephp应用程序中有一个表单可以编辑用户的详细信息,例如,如果用户想要编辑他的地址。 这是我的控制器: public function admin_edit_dashboard($id = null){

问题:编辑条目时,SQL正在进行插入而不是更新

我有两个SQL表:users和users\u detail。
用户(id、角色、名称、密码)
&
用户详细信息(id、地址、城市、用户id)

外键
users\u detail.user\u id
链接到
users.id

我的cakephp应用程序中有一个表单可以编辑用户的详细信息,例如,如果用户想要编辑他的地址。 这是我的控制器:

        public function admin_edit_dashboard($id = null){
    if (!$this->User->exists($id)) {
        throw new NotFoundException('Invalid user details');
    }
    if ($this->request->is('post') || $this->request->is('put')) {

        if ($this->User->UserDetail->save($this->request->data, true, ['id', 'address', 'city'])) {
            $this->Session->setFlash('The user has been saved');
            return $this->redirect(array('action' => 'dashboard'));
        } else {
            $this->Session->setFlash('The user could not be saved. Please, try again.');
        }
    } else {
        //$this->request->data = $this->User->read(null, $id);
        $user = $this->User->UserDetail->find('first', array(
            'conditions' => array(
                'UserDetail.user_id' => $id
            )
        ));
        $this->request->data = $user;
    }
    $this->set(compact('user'));
}
我的表格:

<?php echo $this->Form->create('UserDetail');?>
        <?php echo $this->Form->input('address', array('class' => 'form-control')); ?>
        <br />
        <?php echo $this->Form->input('city', array('class' => 'form-control')); ?>
        <br />
        <?php echo $this->Form->button('Submit', array('class' => 'btn btn-primary')); ?>
        <?php echo $this->Form->end(); ?>



但当我验证表单以编辑详细信息时,我有一个错误:

错误:SQLSTATE[23000]:完整性约束冲突:1062项“主”的重复项“0”

因为SQL查询不是更新,而是插入。我不知道为什么

SQL查询:插入到
蛋糕
用户详细信息
地址
城市
)值('roses street', "伦敦")

谢谢大家!


编辑:很有效,谢谢你的帮助!添加了良好的代码。

您的
用户
模型应该与
UserDetail
有关联,例如:

public $hasOne = array('UserDetail');
以及您在
UserDetail

public $belongsTo = array('User');
这样,您就不必使用
loadModel
,只需执行以下操作:

$this->User->UserDetail->find('first', array(...));
您应该从
userdetailscocontroller
action编辑用户详细信息

在视图中添加行以了解正在编辑的内容:

echo $this->Form->input('id');

然后用传递的
$this->request->data
进行保存。应该这样做。就像我说的,检查数据库中的表id,它必须是自动递增的。

您的
用户
模型应该与
用户详细信息
有关联,比如:

public $hasOne = array('UserDetail');
以及您在
UserDetail

public $belongsTo = array('User');
这样,您就不必使用
loadModel
,只需执行以下操作:

$this->User->UserDetail->find('first', array(...));
您应该从
userdetailscocontroller
action编辑用户详细信息

在视图中添加行以了解正在编辑的内容:

echo $this->Form->input('id');

然后用传递的
$this->request->data
进行保存。应该这样做。正如我所说的,检查数据库中的表id,它必须是自动递增的。

您不能通过告诉控制器来更新您的表

$this->UserDetail->save($this->request->data)
相反,你应该试着做一些类似的事情

//find that specific row in database and then update columns and save it

$this->UserDetail->set(array('address'=>$request->address,'city'=>$request->city));                
$this->UserDetail->save();
您的模型希望将其保存为
id=0
下的一个新的
user\u details
,因为您没有指定要更新它以及要更新哪些列,所以它已经存在


希望它有帮助

您不能只通过告诉控制器来更新您的表

$this->UserDetail->save($this->request->data)
相反,你应该试着做一些类似的事情

//find that specific row in database and then update columns and save it

$this->UserDetail->set(array('address'=>$request->address,'city'=>$request->city));                
$this->UserDetail->save();
您的模型希望将其保存为
id=0
下的一个新的
user\u details
,因为您没有指定要更新它以及要更新哪些列,所以它已经存在


希望对您有所帮助

您似乎有几个问题

$this->request->address
格式正确。表单数据作为
$this->request->data
传递,因此您应该使用
$this->request->data['UserDetail']['address']

如果要确保只保存特定字段,可以将这些字段作为
save()
的第三个参数传递,然后不需要事先使用
set()
:-

$this->UserDetail->save($this->request->data, true, ['id', 'address', 'city']);
SQL错误意味着
user\u details
表上的主键未设置为自动递增(应该设置)。这就是插入失败的原因

您还忘记传递要更新的记录的主键,因此Cake假设您要创建一个新记录。确保包含此内容,以便Cake知道如何使用
UPDATE
。例如,在视图表单中包括以下内容:-

echo $this->Form->hidden('id');

你似乎有几个问题

$this->request->address
格式正确。表单数据作为
$this->request->data
传递,因此您应该使用
$this->request->data['UserDetail']['address']

如果要确保只保存特定字段,可以将这些字段作为
save()
的第三个参数传递,然后不需要事先使用
set()
:-

$this->UserDetail->save($this->request->data, true, ['id', 'address', 'city']);
SQL错误意味着
user\u details
表上的主键未设置为自动递增(应该设置)。这就是插入失败的原因

您还忘记传递要更新的记录的主键,因此Cake假设您要创建一个新记录。确保包含此内容,以便Cake知道如何使用
UPDATE
。例如,在视图表单中包括以下内容:-

echo $this->Form->hidden('id');

谢谢,这很有帮助!但现在我的字段被检测为空白。它们没有经过验证。我不知道为什么。我已经更新了我的帖子,向你展示了我的新代码。谢谢你的帮助。现在试试,我已经更新了我的代码,因为我不知道你的输入字段的“名称”来自Form谢谢你的建议,这对我的帮助很大!谢谢,这很有帮助!但现在我的字段被检测为空白。它们没有经过验证。我不知道为什么。我已经更新了我的帖子,向你展示了我的新代码。谢谢你的帮助。现在试试,我已经更新了我的代码,因为我不知道你的输入字段的“名称”来自Form谢谢你的建议,这对我的帮助很大!谢谢你的建议,我已经更新了我的代码和我的第一篇帖子。谢谢你的建议,这对我的MonkeyNinja博士的解决方案帮助很大!谢谢你的建议,我已经更新了我的代码和我的第一篇帖子。谢谢你的建议,这对我的MonkeyNinja博士的解决方案帮助很大!在哪个控制器是
admin\u edit\u dashboard
?在哪个控制器是
admin\u edit\u dashboard
?感谢您的建议,它现在可以工作了!我将编辑我的第一个代码以显示正确的代码。非常适合天行者的建议。谢谢你的建议,现在可以用了!我将编辑我的第一个代码以显示正确的代码。天行者的建议非常完美。