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

CodeIgniter4中PUT请求返回200但MySQL数据置为null的解决方法

解决PUT请求返回200但数据库字段被设为null的问题

以下是针对CodeIgniter4后端+Retrofit场景的排查和解决步骤:

1. 修正PUT参数的获取方式

CodeIgniter4默认不会自动解析PUT请求的表单/JSON参数到getPost()方法中,直接用$this->request->getPost('字段名')会获取到null,导致更新时传入空值。正确的做法是解析请求体:

// 获取JSON格式的请求体
$requestData = json_decode($this->request->getBody(), true);
// 按需读取参数,比如
$username = $requestData['username'] ?? '';
$email = $requestData['email'] ?? '';

如果是表单格式的PUT请求,可使用$this->request->getRawInput()来获取参数。

2. 验证Postman请求的正确性

  • 确认请求Body类型:若传JSON,必须选择raw -> JSON,并填写合法的JSON结构,比如:
{
  "username": "updated_name",
  "email": "updated@example.com"
}
  • 检查请求URL是否包含正确的更新ID(比如/api/user/update/123),避免更新了错误的记录或无记录,误以为字段被设为null。

3. 检查模型的更新配置

如果使用CodeIgniter4的内置Model:

  • 确保模型的allowedFields属性包含了你要更新的所有字段,否则这些字段会被过滤,更新时设为null:
class UserModel extends Model
{
    protected $table = 'users';
    protected $allowedFields = ['username', 'email', 'phone']; // 必须列出允许更新的字段
}
  • 调用update()方法时,要传入非null的字段数组,比如:
$model->update($userId, [
    'username' => $requestData['username'],
    'email' => $requestData['email']
]);

如果传入的数组中某个字段值为null,数据库对应字段就会被更新为null,若要保留原字段值,可先查询原记录,再合并参数:

$original = $model->find($userId);
$updateData = array_merge($original, $requestData);
$model->update($userId, $updateData);

4. 排查Retrofit的请求序列化

  • 确保Retrofit接口正确配置了PUT请求,并且请求体使用@Body注解传递:
@PUT("user/update/{userId}")
Call<ResponseBody> updateUser(@Path("userId") int userId, @Body UserUpdateRequest request);
  • 确认实体类的字段名与后端一致,若有命名差异(比如后端是user_name,前端是userName),需添加@SerializedName注解映射:
public class UserUpdateRequest {
    @SerializedName("username")
    private String userName;
    @SerializedName("email")
    private String email;
    // getter和setter
}

5. 调试确认参数值

在控制器中临时添加调试代码,确认接收到的参数是否正确:

$requestData = json_decode($this->request->getBody(), true);
var_dump($requestData); // 查看参数是否为预期值
exit;

如果输出为null或空数组,说明参数没有正确传递,需要检查Postman或Retrofit的请求配置。


内容的提问来源于stack exchange,提问作者BUdiAKmal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:30:18