如何修复Uncaught SyntaxError: Unexpected token _ in JSON错误?
解决AJAX请求后JSON.parse的Unexpected token错误
首先,咱们直接揪出最核心的问题:你前端的JSON解析逻辑完全搞错了,这才导致了控制台的语法错误。
为什么会报错?
你后端通过json_encode返回的是单个JSON对象(就像你给出的示例那样),但前端却做了两个错误操作:
- 用
$.each去遍历这个单一对象——这会把对象的每个属性(比如note_record、deleted_status)拆成键值对来循环; - 在循环里又对属性值(比如字符串
"1_5cdb7ad317291.jpeg")调用JSON.parse,这个字符串根本不是有效的JSON格式,自然会抛出Unexpected token _的错误。
修复步骤
第一步:修正前端AJAX逻辑
直接去掉多余的遍历和重复解析,让jQuery自动帮你处理JSON:
$("[id^='deleteNotes']").click(function() { var id = $(this).closest('div').attr('id'); console.log(id); $.ajax({ url: "ajax/deleteidentifier.php", type: "post", data: { id_delete: id }, // 关键:告诉jQuery自动解析返回的JSON,不用手动parse dataType: "json" }) .done(function(result) { // 这里的result已经是解析好的JavaScript对象了 if (result.deleted_status === "n") { alert("Moved to deleted folder."); window.location.reload(); } else { alert("Note permanently deleted!"); window.location.reload(); } }) // 加上错误回调,方便后续排查问题 .fail(function(xhr, status, error) { console.error("AJAX请求出错:", error); console.error("服务器返回内容:", xhr.responseText); }); });
第二步:修复PHP代码的潜在问题
你的PHP代码还有两个严重问题,不仅可能导致JSON错误,还存在安全风险:
- SQL注入风险:直接把用户输入拼接到SQL语句里,这是高危操作;
- JSON输出不纯净:没有明确设置响应头,可能混入额外输出(比如警告、空格)破坏JSON格式。
修改后的PHP代码:
<?php include_once("../db.php"); include "../session.php"; $result_query_sql_deletedStatus_notes = []; if (isset($_POST["id_delete"])) { // 使用预处理语句防止SQL注入 $stmt = $conn->prepare("SELECT * FROM notes WHERE note_id = ?"); $stmt->bind_param("s", $_POST['id_delete']); $stmt->execute(); $query_sql_deletedStatus_notes = $stmt->get_result(); $result_query_sql_deletedStatus_notes = $query_sql_deletedStatus_notes->fetch_assoc(); if ($result_query_sql_deletedStatus_notes["deleted_status"] == "y") { if ($result_query_sql_deletedStatus_notes["note_type"] == "notes") { $stmt = $conn->prepare("DELETE FROM notes WHERE note_id = ?"); $stmt->bind_param("s", $_POST['id_delete']); $stmt->execute(); } else { $like_pattern = "image_uploads/" . $_POST['id_delete'] . "!_%"; $stmt = $conn->prepare("DELETE FROM notes WHERE image_directory LIKE ? ESCAPE '!'"); $stmt->bind_param("s", $like_pattern); $stmt->execute(); } } else { // 确保$date_time_curr已定义,否则会报错 if (!isset($date_time_curr)) { $date_time_curr = date("l, F j, Y. | h:i:s A"); } $like_pattern = "image_uploads/" . $_POST['id_delete'] . "!_%"; $stmt = $conn->prepare("UPDATE notes SET deleted_status='y', date_deleted = ? WHERE note_id = ? OR image_directory LIKE ? ESCAPE '!'"); $stmt->bind_param("sss", $date_time_curr, $_POST['id_delete'], $like_pattern); $stmt->execute(); } $stmt->close(); } $conn->close(); // 明确告诉浏览器返回的是JSON格式 header('Content-Type: application/json'); // 输出纯净的JSON echo json_encode($result_query_sql_deletedStatus_notes); ?>
额外排查技巧
如果修改后还是报错,打开Chrome控制台的「Network」标签,找到对应的AJAX请求,查看「Response」内容:
- 如果返回的内容里有PHP警告、错误信息或者多余空格,说明PHP代码有输出污染,需要修复这些警告(比如检查
$date_time_curr是否定义,include的文件有没有多余空格); - 如果返回的是标准JSON格式,再回头检查前端逻辑。
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

