AJAX/JSON调用PHP脚本无法在客户端填充数据(数据库查询正常)
看起来你的核心问题是PHP脚本返回了HTML内容而非预期的纯JSON,导致jQuery的AJAX因为dataType: 'json'的解析要求触发了错误回调。我们一步步来排查和解决:
先明确错误根源
控制台的Unexpected token '<'提示,说明AJAX拿到的响应内容是HTML(比如页面标签、错误提示的HTML代码),不是符合格式的JSON。常见的触发原因有这些:
1. 检查PHP脚本的输出纯净度
PHP脚本里任何多余的输出(空格、换行、日志内容、错误提示)都会破坏JSON的格式:
- 多余的输出来源:
- 你的
config.php或其他引入的文件,开头<?php前有没有空格、换行?结尾的?>可以直接删掉(避免后面的空格被输出)。 - 注意
mLogString($jsonData);这个函数——如果它是把日志内容直接输出到HTTP响应里(而不是写到日志文件),那这会在JSON前面插入额外内容,直接导致JSON无效。这个日志应该写到服务器的日志文件里,而不是返回给前端。 - PHP执行时的警告/错误,如果开启了
display_errors,会以HTML形式输出,混进JSON里。开发阶段可以把错误写到日志,不要输出到响应:// 在PHP脚本最开头添加 ini_set('display_errors', 0); error_reporting(E_ALL); ini_set('error_log', '/path/to/your/server/error.log'); // 替换成你的日志路径
- 你的
2. 给PHP脚本添加JSON响应头
明确告诉浏览器和jQuery返回的是JSON类型,避免解析歧义:
在PHP输出JSON之前,添加这行代码:
header('Content-Type: application/json');
3. 修复AJAX的冗余代码
你在success回调里写了response = JSON.parse(response);——但dataType: 'json'已经让jQuery自动把响应解析成了JavaScript对象,再调用JSON.parse会报错,直接删掉这行就行。
修改后的success回调:
success: function (response) { console.log('success start'); console.log(response); // 已经是解析后的对象,直接用 console.log('success end'); // 比如可以直接取数据:response[0].你的字段名 },
4. 验证PHP脚本的URL是否正确
先手动在浏览器里访问这个PHP脚本的完整路径,带上YearID参数(比如http://你的域名/xxx/db_includes/get_DR_Design.php?YearID=2024),看返回的是不是纯JSON内容。如果返回的是404页面或其他HTML,说明你的$_SESSION['Web_Application_Root_Directory']拼接的路径有问题,得先把URL调对。
5. 修复SQL注入风险(额外提醒)
你的SQL语句直接拼接了用户输入的$iYearID:
$sSQL = "SELECT * FROM tb_Design WHERE Year_ID = " . $iYearID;
这存在SQL注入风险,建议改成参数化查询(以ODBC为例):
// 用?作为占位符 $sSQL = "SELECT * FROM tb_Design WHERE Year_ID = ?"; $stmt = odbc_prepare($oDB->connection, $sSQL); odbc_execute($stmt, [$iYearID]); // 把参数数组传进去 $oRst = odbc_fetch_array($stmt);
最终调整后的PHP脚本示例
<?php // 关闭前端错误输出,转存到日志 ini_set('display_errors', 0); error_reporting(E_ALL); ini_set('error_log', '/var/log/php_errors.log'); // 替换成你的实际路径 require_once $_SERVER['DOCUMENT_ROOT'] . '/DR/lib_includes/config.php'; // 先校验参数合法性 if (!isset($_POST['YearID']) || !is_numeric($_POST['YearID'])) { http_response_code(400); header('Content-Type: application/json'); echo json_encode(['error' => '无效的年份参数']); exit; } $iYearID = intval($_POST['YearID']); $DRDesignArray = []; $oDB = new cDatabase(); // 参数化查询避免注入 $sSQL = "SELECT * FROM tb_Design WHERE Year_ID = ?"; $stmt = odbc_prepare($oDB->connection, $sSQL); odbc_execute($stmt, [$iYearID]); while ($row = odbc_fetch_array($stmt)) { $DRDesignArray[] = $row; } // 设置JSON响应头,输出纯JSON header('Content-Type: application/json'); echo json_encode($DRDesignArray); exit; // 强制结束脚本,避免后续意外输出 ?>
最后排查小技巧
打开浏览器开发者工具(F12),切换到「Network」标签,触发年份选择的change事件,找到对应的AJAX请求:
- 看「Request URL」是否正确
- 看「Response」标签里的内容,就能直接看到PHP返回的到底是JSON还是HTML,这是最快定位问题的方法。
内容来源于stack exchange

