jQuery Ajax设置dataType为json时success回调不生效问题
问题成因
你遇到的问题由两个独立的低级错误共同导致:
- 前端Ajax配置的成功回调名拼写错误:你写的是
succes,正确写法是success(少写了末尾的s)。jQuery无法识别拼写错误的配置项,所以哪怕后端返回完全合法的JSON,成功回调也永远不会被触发,这就是你观察到“纯输出JSON时success内alert完全不执行”的核心原因。 - 后端PHP输出不符合JSON规范:你在返回JSON前额外执行了
echo "true";,最终响应内容是true{"status":"OK","nombre":"xxx"...}这类拼接字符串,不是合法JSON格式。jQuery配置dataType: 'json'时会自动对响应做JSON解析,遇到这种非法格式就会抛出你看到的SyntaxError异常,直接进入error回调;如果响应中夹杂其他非JSON内容,jQuery解析失败后会将响应识别为普通文本/HTML,自然无法正常读取结构化业务数据。
额外隐患:你当前PHP代码把查询结果放在while循环中输出,如果查询命中多条记录,会连续输出多段JSON字符串拼接的内容,同样属于非法JSON格式,会触发解析错误。另外当前SQL语句直接拼接用户传入的rfc参数,存在严重SQL注入风险。
修复方案
前端代码修正
将拼写错误的回调名修正为success即可,修正后代码如下:
$(document).on("click", "#btnEditarInstructor", function(event) { event.preventDefault(); let rfc = $(this).attr("value"); $.ajax({ type: "POST", url: "../utils/ajax/ajax_consulta_instructor.php", data: { rfc: rfc, }, dataType: "json", // 修正此处拼写错误 success: function(response) { console.log(response); // 后续业务逻辑写在这里 if (response.status === 'OK') { // 正常处理返回的讲师数据 } }, error: function(request, status, error) { console.log("解析错误", request.responseText, status, error); }, }); })
后端PHP代码修正
核心原则:JSON接口只能输出唯一一段合法JSON字符串,不能有任何额外输出(包括echo的零散字符、PHP报错信息、BOM头、HTML标签等)。建议在输出前明确声明JSON响应头,同时修复SQL注入隐患、避免循环多次输出,修正后代码参考:
<?php // 明确声明JSON响应头 header('Content-Type: application/json; charset=utf-8'); $rfc = $_POST['rfc']; // 建议改用PDO或mysqli预处理语句,此处仅为示例修复逻辑 $sql = "SELECT * FROM instructores WHERE rfc = '$rfc'"; $sql_run = mysqli_query($con, $sql); $datos = []; // 单条查询不需要while循环,直接取一次结果即可 if ($row = mysqli_fetch_array($sql_run)) { $datos['status'] = 'OK'; $datos['nombre'] = $row['nombre']; $datos['apellidos'] = $row['apellidos']; $datos['email'] = $row['email']; $datos['tipo_promotor'] = $row['tipo_promotor']; } else { $datos['status'] = 'ERROR'; $datos['msg'] = '未查询到对应讲师信息'; } // 所有逻辑处理完后,统一输出一次JSON echo json_encode($datos); exit; ?>
注意:上线前请务必将SQL拼接写法替换为预处理参数绑定写法,避免SQL注入漏洞。
内容的提问来源于stack exchange,提问作者Luis Villegas
相关产品推荐
相关产品推荐

