You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

向PHP提交JSON报错:解析JSON时遇意外符号<

解决JSON提交到PHP时的解析错误问题

咱先把这个错误的本质说透:"There was an error parsing JSON data Unexpected token < in JSON at position 0",核心是你的PHP脚本返回的不是合法的JSON内容,而是带HTML标签的输出(比如PHP的报错提示、意外的空格或者调试打印内容),JSON解析器一看到开头的<直接就懵了,所以抛出了这个错误。

下面一步步排查和解决:

1. 先排查PHP代码的基础问题

  • 检查create.php的开头:<?php标签前面绝对不能有任何字符(包括空格、换行、HTML注释),哪怕一个不起眼的空格,都会导致PHP提前输出内容,直接破坏JSON的纯格式。
  • 检查代码里有没有echoprint这类调试输出,或者有没有触发PHP的警告/错误(比如未定义变量、数据库连接失败),这些情况都会让PHP输出带HTML标签的错误信息,而不是你期望的JSON。

2. 正确处理JSON输入的PHP代码示例

你得用file_get_contents('php://input')来读取POST请求体里的JSON数据,不能用$_POST(因为$_POST只处理表单编码的数据)。下面是修正后的核心代码片段:

<?php
// 必要的响应头,确保返回纯JSON格式
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// 读取请求体中的JSON数据
$json_raw = file_get_contents('php://input');
// 解析JSON为关联数组
$request_data = json_decode($json_raw, true);

// 检查JSON解析是否成功
if(json_last_error() !== JSON_ERROR_NONE) {
    http_response_code(400);
    echo json_encode(["message" => "无效的JSON数据"]);
    exit;
}

// 验证必填字段
if(empty($request_data['name']) || empty($request_data['price']) || empty($request_data['category_id'])) {
    http_response_code(400);
    echo json_encode(["message" => "缺少必填字段"]);
    exit;
}

// 接下来处理MySQL插入逻辑(以PDO为例)
try {
    $pdo = new PDO("mysql:host=你的数据库地址;dbname=你的数据库名", "用户名", "密码");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->prepare("INSERT INTO 你的表名 (name, price, description, category_id) VALUES (:name, :price, :description, :category_id)");
    $stmt->bindParam(':name', $request_data['name']);
    $stmt->bindParam(':price', $request_data['price']);
    $stmt->bindParam(':description', $request_data['description']);
    $stmt->bindParam(':category_id', $request_data['category_id']);

    if($stmt->execute()) {
        http_response_code(201);
        echo json_encode(["message" => "记录创建成功"]);
    } else {
        http_response_code(500);
        echo json_encode(["message" => "创建记录失败"]);
    }
} catch(PDOException $e) {
    http_response_code(500);
    // 注意:生产环境不要暴露具体错误信息,只返回通用提示
    echo json_encode(["message" => "数据库错误:" . $e->getMessage()]);
}
?>

3. ARC工具的测试注意事项

  • 确保请求方法选择POST
  • 请求头必须添加Content-Type: application/json
  • 提交的JSON数据要放在请求体里,别当成表单参数提交

按照上面的步骤调整后,应该就能解决这个JSON解析错误了。

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

火山引擎 最新活动