JS Ajax发送JSON至PHP解析失败,无法更新数据库字段求助
问题分析与解决方案
你遇到的核心问题在于PHP解析JSON时的类型错误,另外还有几个细节需要调整,我一步步给你拆解:
1. 核心错误:JSON解码后的访问方式不对
你的PHP代码里用了json_decode($json, true),第二个参数true表示将JSON解码为关联数组,而不是对象。但你却用了对象的访问语法$json_decode->{'name'},这就导致无法获取到name的值。
修正方法:
把对象访问改成数组下标访问:
// 错误写法 $getnme=$json_decode->{'name'}; // 正确写法 $getnme = $json_decode['name'];
如果想保持对象访问的方式,你可以去掉json_decode的第二个参数(或者设为false),这样会返回对象:
$json_decode = json_decode($json); // 不带第二个参数,返回对象 $getnme = $json_decode->name;
2. 其他需要修复的细节
(1)SQL注入风险
你的SQL语句直接拼接变量,存在严重的SQL注入风险,必须改用预处理语句:
// 替换原来的SQL代码 $sql = "UPDATE user1 SET name=? WHERE id=1"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $getnme); // "s"表示字符串类型 if ($stmt->execute()) { echo "Record updated successfully"; } else { echo "Error updating record: " . $conn->error; } $stmt->close();
(2)响应格式混乱
你设置了header('Content-type: application/json'),但输出的是普通文本(echo $getnme;和更新提示),这会导致响应格式不符合声明的类型。建议统一返回JSON格式的响应:
// 先收集响应数据 $response = []; if ($stmt->execute()) { $response['status'] = 'success'; $response['message'] = 'Record updated successfully'; $response['name'] = $getnme; } else { $response['status'] = 'error'; $response['message'] = 'Error updating record: ' . $conn->error; } // 输出JSON echo json_encode($response);
(3)前端可以优化的点
虽然前端代码本身没问题,但可以添加错误处理逻辑,比如请求失败时的提示:
request.onreadystatechange=function() { if (request.readyState == 4) { if (request.status == 200) { // Success! alert("yes"); var resp = JSON.parse(request.responseText); // 因为后端返回JSON,所以解析一下 document.getElementById("sum").innerHTML=resp.message; } else { // 处理请求失败的情况 alert("请求失败:" + request.status); } } }
最终修正后的完整代码
前端JavaScript:
function datasend(obj) { var flickr = {"name": "vivek", "age":"18"}; var data = JSON.stringify(flickr); var request = new XMLHttpRequest(); request.open("POST", "getvalue.php", true); request.setRequestHeader("Content-Type", "application/json"); request.onreadystatechange=function() { if (request.readyState == 4) { if (request.status == 200) { var resp = JSON.parse(request.responseText); alert("操作成功"); document.getElementById("sum").innerHTML=resp.message; } else { alert("请求出错,状态码:" + request.status); } } } request.send(data); }
后端PHP(getvalue.php):
<?php header('Content-type: application/json'); $json = file_get_contents('php://input'); $json_decode = json_decode($json, true); // 先检查是否成功解码,以及name是否存在 if (!$json_decode || !isset($json_decode['name'])) { echo json_encode([ 'status' => 'error', 'message' => '无效的JSON数据或缺少name字段' ]); exit; } $getnme = $json_decode['name']; include 'db.php'; // 使用预处理语句防止SQL注入 $sql = "UPDATE user1 SET name=? WHERE id=1"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $getnme); $response = []; if ($stmt->execute()) { $response['status'] = 'success'; $response['message'] = 'Record updated successfully'; $response['updated_name'] = $getnme; } else { $response['status'] = 'error'; $response['message'] = 'Error updating record: ' . $conn->error; } echo json_encode($response); // 关闭连接 $stmt->close(); $conn->close(); ?>
这样调整后,就能正确获取JSON中的name值并更新到数据库,同时代码的安全性和健壮性也提升了。
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

