You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:39:10