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

Uncaught SyntaxError JSON解析报错 新增分类未入库问题排查求助

问题根因定位

1. 前端JSON解析错误原因

后端PHP运行时先输出了Notice级错误信息:Undefined index: error in D:\Honlap\xampp\htdocs\eshop\app\controllers\ajax.php on line 17,PHP默认的错误输出是HTML格式,开头就是<字符,之后才输出你拼接的JSON字符串,导致整体返回内容不是合法JSON,前端JSON.parse执行失败就抛出了Unexpected token < in JSON的报错。

2. 分类未写入数据库原因

核心问题有3个:

  • 第17行判断逻辑错误:你直接读取$_SESSION['error']但没有提前判断该键是否存在,即使$category->create()执行失败写入了$_SESSION['error'],当前判断逻辑也会先抛Notice,打断正常执行流
  • 未校验创建方法返回结果:你调用创建方法后直接判断$_SESSION['error'],如果创建方法执行失败但没有写入$_SESSION['error'],就会直接走成功分支返回添加成功的提示,实际数据根本没写入数据库
  • 前端提交逻辑漏洞:collect_data方法中输入校验不合法弹出提示后没有终止执行,会把空值、纯数字等不合法内容提交到后端,也会导致创建失败
修复方案

第一步:修复后端第17行的session判断逻辑

把第17行的判断改成先判断键是否存在,再判断值是否非空:

// 原代码(第17行)
if($_SESSION['error'] != ""){
// 修改后
if(isset($_SESSION['error']) && $_SESSION['error'] != ""){

如果你的项目没有全局启动session,还需要在index()方法最开头加一行:

session_start();

第二步:增加创建方法返回值判断

如果$category->create()方法执行成功返回true、失败返回false的话,在判断session之前先判断创建结果:

$check = $category->create($data);
// 新增判断
if(!$check){
    $arr['message'] = "分类创建失败,请检查输入";
    $arr['message_type'] = "error";
    $arr['data'] = "";
    echo json_encode($arr);
    exit;
}
// 后面再接原来的session判断逻辑

第三步:修复前端提交逻辑漏洞

在collect_data方法的输入校验后加终止执行的逻辑:

function collect_data(e){
    var category_input = document.querySelector("#category");
    if(category_input.value.trim() == "" || !isNaN(category_input.value.trim())){
        alert("Please enter a valid category name");
        return; // 新增这行,校验不通过就不往下执行
    }
    var data = category_input.value.trim();
    send_data({
        data:data,
        data_type:'add_category'
    });
}

第四步:(可选)优化配置与调试逻辑

  • 生产环境关闭PHP错误输出到响应体,在项目入口文件加配置,避免PHP错误信息污染接口返回:
// 关闭错误输出到页面
ini_set('display_errors', 0);
// 错误信息写入日志即可
ini_set('log_errors', 1);
  • 前端增加JSON解析错误捕获,避免控制台直接抛出异常:
function handle_result(result){
    if(result != ""){
        try{
            var obj = JSON.parse(result);
            // 原有逻辑保留
            if(typeof obj.message_type != 'undefined'){
                if(obj.message_type == "info"){
                    alert(obj.message);
                    show_add_new();
                }
                else{
                    alert(obj.message);
                }
            }
        }catch(e){
            console.log("接口返回非JSON内容:", result);
            alert("系统异常,请稍后重试");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:45:08