Codeigniter执行UPDATE查询时新增行而非更新数据的问题
问题原因
你遇到的UPDATE操作变新增的核心问题有三处:
- SQL里的命名占位符语法写错了。CodeIgniter 4的命名参数绑定只要求占位符前加单冒号,格式为
:参数名,你写的:参数名:双冒号格式会导致参数绑定完全失效,WHERE条件无法匹配到你要更新的目标主键行。 - 视图里存储主键
id_client的输入框是普通文本框,没有做隐藏/只读处理,值容易被篡改,一旦传入空值/不存在的ID,UPDATE会匹配不到任何记录。 - 代码里没有在更新执行后加重定向,用户提交完如果刷新页面,可能触发重复提交,如果你的路由或方法里混了新增逻辑,就会插入新行。
修复方案
1. 修正控制器代码
把SQL里所有占位符的尾部冒号删掉,同时给主键参数加强制类型转换,执行完更新后加页面跳转:
public function editClientSubmit() { $params = [ 'id_client' => (int)$this->request->getPost('id_client'), 'code' => $this->request->getPost('code'), 'name' => $this->request->getPost('name'), 'nif' => $this->request->getPost('nif'), 'address' => $this->request->getPost('address'), 'postal_code_1' => $this->request->getPost('postal_code_1'), 'postal_code_2' => $this->request->getPost('postal_code_2'), 'city' => $this->request->getPost('city'), ]; $db = db_connect(); $db->query( "UPDATE clients SET code = :code, name = :name, nif = :nif, address = :address, postal_code_1 = :postal_code_1, postal_code_2 = :postal_code_2, city = :city WHERE id_client = :id_client", $params ); $db->close(); // 跳转到对应页面,避免重复提交 return redirect()->to(site_url('main/clientList')); }
调试阶段可以打开$db->getLastQuery()输出实际执行的SQL,确认WHERE条件的id值正确传入。
2. 修正视图代码
把主键id的输入框改成隐藏域,避免前端用户篡改值:
<?php helper("form"); echo form_open('main/editclientsubmit'); // 主键用隐藏域传递,不需要展示在页面上 echo form_hidden('id_client', $client->id_client); ?> <div class="form-group"> <input type="text" name="code" placeholder="Código" value="<?= $client->code ?>"> <input type="text" name="name" placeholder="Nome" value="<?= $client->name ?>"> <input type="text" name="nif" placeholder="NIF" value="<?= $client->nif ?>"> <input type="text" name="address" placeholder="Morada" value="<?= $client->address ?>"> <input type="text" name="postal_code_1" placeholder="Código Postal" value="<?= $client->postal_code_1 ?>"> <input type="text" name="postal_code_2" placeholder="Código Postal 2" value="<?= $client->postal_code_2 ?>"> <input type="text" name="city" placeholder="Cidade" value="<?= $client->city ?>"> </div> <input type="submit" value="Actualizar"> <?= form_close() ?>
额外排查
如果改完上述代码还是出现新增记录,检查两个点:
- 确认路由配置中
main/editclientsubmit只绑定了更新方法,没有错误指向新增客户端的逻辑 - 检查
clients表是否存在UPDATE触发器,触发器内是否写了INSERT相关逻辑
内容的提问来源于stack exchange,提问作者C0C45
相关产品推荐
相关产品推荐

