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

AJAX/JSON调用PHP脚本无法在客户端填充数据(数据库查询正常)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:55:28