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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:54:39