使用PHP开发jQuery DataTables报Invalid JSON response错误如何解决
DataTables Invalid JSON Response 问题修复方案
问题本质
该错误的核心原因是服务端返回的响应内容不是合法JSON格式,要么是PHP报错输出混入了响应体,要么是返回的结构不符合DataTables服务端处理的规范。
代码错误点
1. 未定义变量错误
服务端代码执行SQL查询后将结果存在$query变量中,但后续遍历数据集时错误使用了不存在的$results变量,PHP会抛出Notice级错误,输出内容直接破坏JSON格式。
2. 记录数统计逻辑错误
- 统计总记录数时使用
fetchColumn()仅能获取结果集第一行的第一列值,而非总行数,应该调整统计逻辑直接统计行数 recordsTotal和recordsFiltered字段赋值颠倒:recordsTotal对应未过滤的总记录数,recordsFiltered对应搜索过滤后的记录数
3. 排序逻辑风险
$_POST['order'][0]['column']返回的是前端表格列的索引值,直接拼接进SQL作为排序字段会导致字段不存在报错,建议增加索引到字段名的映射。
4. 异常返回格式错误
异常处理中返回带<br/>标签的字符串,不符合DataTables要求的响应结构,会导致JSON解析失败。
修复后的服务端代码
<?php require_once '../DBConnection/dbConfig.php'; // 先获取未过滤的总记录数 $total_all_rows = $dbh->query("SELECT COUNT(*) FROM `getDocuments`")->fetchColumn(); $sql = "SELECT * FROM `getDocuments` WHERE 1=1"; // 排序字段映射,防止SQL注入和字段不存在错误 $column_map = [ 0 => 'documentId', 1 => 'document_name', 2 => 'country_name', 3 => 'shared', 4 => 'user', 5 => 'uploadDate' ]; if(isset($_POST['search']['value'])) { $search_value = $_POST['search']['value']; $sql .= " AND (document_name like ?"; $sql .= " OR country_name like ?"; $sql .= " OR user like ?)"; } if(isset($_POST['order'])) { $column_index = $_POST['order'][0]['column']; $column_name = isset($column_map[$column_index]) ? $column_map[$column_index] : 'documentId'; $order = $_POST['order'][0]['dir'] === 'asc' ? 'asc' : 'desc'; $sql .= " ORDER BY ".$column_name." ".$order; } else { $sql .= " ORDER BY documentId desc"; } $params = []; if(isset($search_value)){ $like_val = "%{$search_value}%"; $params[] = $like_val; $params[] = $like_val; $params[] = $like_val; } $length = intval($_POST['length']); if($length != -1) { $start = intval($_POST['start']); $sql .= " LIMIT ?, ?"; $params[] = $start; $params[] = $length; } try { // 预处理查询避免SQL注入 $query = $dbh->prepare($sql); $query->execute($params); $count_rows = $query->rowCount(); $data = array(); // 修复变量名错误 while($row = $query->fetch(PDO::FETCH_ASSOC)) { $sub_array = array(); $sub_array[] = $row["documentId"]; $sub_array[] = $row["document_name"]; $sub_array[] = $row["country_name"]; $sub_array[] = $row["shared"]; $sub_array[] = $row["user"]; $sub_array[] = $row["uploadDate"]; $sub_array[] = '<a href="javascript:void();" data-id="'.$row['documentId'].'" class="btn btn-info btn-sm editbtn" >Edit</a> <a href="javascript:void();" data-id="'.$row['documentId'].'" class="btn btn-danger btn-sm deleteBtn" >Delete</a>'; $data[] = $sub_array; } $output = array( 'draw'=> intval($_POST['draw']), 'recordsTotal' =>$total_all_rows, 'recordsFiltered'=> $count_rows, 'data' => $data ); // 强制返回JSON格式头 header('Content-Type: application/json'); echo json_encode($output); } catch (PDOException $e){ header('Content-Type: application/json'); echo json_encode([ 'draw' => intval($_POST['draw']), 'error' => "数据库错误: " . $e->getMessage() ]); } ?>
验证方法
可以打开浏览器开发者工具的「网络」面板,找到getDocuments.php请求,查看响应内容,就能直接看到具体的报错信息,方便后续排查。
内容的提问来源于stack exchange,提问作者Crystal Chain
相关产品推荐
相关产品推荐

