使用jsGrid通过Ajax新增数据库行时$_POST变量为空的问题
jsGrid新增数据时JSON错误与参数未定义问题解决
我来帮你搞定这个问题,其实核心是前后端数据格式不匹配,再加上一处逻辑小错误,咱们一步步来修复:
先搞懂错误根源
你现在遇到两个核心问题:
- PHP报
Undefined index: name/last_name/id:因为前端发的是JSON格式数据,但PHP默认只会解析表单格式的数据到$_POST,JSON数据不会自动存入$_POST,所以拿不到参数。 - 前端JSON解析错误:因为PHP里的
var_dump($_POST)和Notice错误信息提前输出,导致后端返回的内容不是纯JSON,前端解析时出错。
另外还有个明显的逻辑问题:你用jsGrid的insertItem(新增数据)方法,但后端写的是UPDATE(修改已有数据)语句,两者完全不对应!新增数据应该用INSERT INTO语句。
步骤1:修正前端AJAX请求
你的前端代码里,contentType设为了JSON格式,但data直接传了对象,jQuery会默认把对象转成key=value的表单格式,和你设置的contentType冲突。修改成把对象转成JSON字符串发送:
$(function() { $("#grid").jsGrid({ height: "70%", width: "100%", filtering: true, editing: true, inserting: true, sorting: true, paging: true, autoload: true, controller: { insertItem: function(item) { return $.ajax({ url: "items.php", type: "POST", contentType : "application/json; charset=utf-8", data: JSON.stringify(item), // 把item转为标准JSON字符串 dataType: "json", }); }, }) })
步骤2:后端PHP解析JSON数据
PHP不会自动解析JSON格式的POST请求,需要手动从原始输入流读取并解析,同时修正SQL语句为新增逻辑:
switch($_SERVER["REQUEST_METHOD"]) { case "POST": // 读取前端发送的JSON原始数据 $jsonInput = file_get_contents('php://input'); $data = json_decode($jsonInput, true); // 先检查必要参数是否存在,避免Notice错误 if(!isset($data['name'], $data['last_name'])) { http_response_code(400); header("Content-Type: application/json"); echo json_encode(['error' => '缺少必要的name或last_name参数']); exit; } // 注意:新增数据用INSERT INTO,不是UPDATE!如果你的id是自增主键,不需要传id $result = $bdd->prepare('INSERT INTO t_test (name, last_name) VALUES (:name, :last_name)'); $executeSuccess = $result->execute([ 'name' => $data['name'], 'last_name' => $data['last_name'] // 如果你的id不是自增主键,再加上'id' => $data['id'] ]); // 返回纯JSON响应,务必删除所有调试输出(比如var_dump) header("Content-Type: application/json"); echo json_encode(['success' => $executeSuccess]); break; }
额外注意事项
- 调试用的
var_dump一定要删掉,不然会破坏JSON响应的纯格式,导致前端解析失败。 - 如果你的表
id字段是自增主键,新增数据时不需要传递id,数据库会自动生成;如果id需要手动指定,再在INSERT语句和execute参数里加上id字段。
内容的提问来源于stack exchange,提问作者user9793197
相关产品推荐
相关产品推荐

