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

jQuery AJAX调用PHP操作数据库失败,始终触发fail回调

排查AJAX请求始终触发fail回调的问题

问题场景

点击模态框中的「Modifica」按钮(ID为pulsanteModificaLibro)时,AJAX请求始终进入fail回调,无法完成数据库更新操作。

相关代码

HTML代码

<div class="modal-footer">
    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Chiudi</button>
    <button type="submit" id="pulsanteModificaLibro" class="btn btn-primary">Modifica</button>
</div>

jQuery AJAX代码

$(document).on('click', '#pulsanteModificaLibro', function(event) {
  event.preventDefault();

  var idLibro = this.getAttribute("data-id"); // 提取图书ID

  alert($('#sottotitoloLibroModifica').val());

  var libroMod = new FormData();

  libroMod.append('titolo', $('#titoloLibroModifica').val());
  libroMod.append('sottotitolo', $('#sottotitoloLibroModifica').val());
  libroMod.append('autore', $('#autoreLibroModifica').val());
  libroMod.append('casa', $('#casaLibroModifica').val());
  libroMod.append('anno', $('#annoLibroModifica').val());
  libroMod.append('volume', $('#volumeLibroModifica').val());
  libroMod.append('pagine', $('#pagineLibroModifica').val());
  libroMod.append('genere', $('#genereLibroModifica').val());
  libroMod.append('trama', $('#tramaLibroModifica').val());
  libroMod.append('tipologia', $('#tipologiaLibroModifica').val());
  libroMod.append('sede', $('#sedeLibroModifica').val());
  libroMod.append('scaffale', $('#scaffaleLibroModifica').val());

  $.ajax({
      url: '../PHP/getUser.php?az=modificaSchedaLibroFinale&idLibro=' + idLibro,
      data: libroMod,
      processData: false,
      contentType: false,
      type: 'POST',
      dataType: 'json'
    })
    .done(function(data) {
      alert("Andata!!");
    })
    .fail(function(xhr, status, error) {
      console.log("请求状态: " + status);
      console.log("错误信息: " + error);
      console.log("服务器响应: " + xhr.responseText);
      alert("Ciao");
    });
});

PHP代码

if($_REQUEST['az']=="modificaSchedaLibroFinale") {
    $id=$_GET['idLibro'];
    
    $sql="select prest_lib from libro where id_libro=:id_libro";
    $dbo->query($sql);
    $dbo->bind(":id_libro",$id);
    $book=$dbo->single();
    
    $sql="UPDATE libro SET autore_lib=:autore_lib, titolo_lib=:titolo_lib, sottotitolo_lib=:sottotitolo_lib, volume_lib=:volume_lib, pag_lib=:pag_lib, casa_ed_lib=:casa_ed_lib, anno_lib=:anno_lib, genere_lib=:genere_lib, descr_lib=:descr_lib, tipo_lib=:tipo_lib, prest_lib=:prest_lib, scaffale_lib=:scaffale_lib, edificio_lib=:edificio_lib where id_libro=:id_libro";
    $dbo->query($sql);
    $dbo->bind(":autore_lib", $_POST['autore']);
    $dbo->bind(":titolo_lib", $_POST['titolo']);
    $dbo->bind(":sottotitolo_lib", $_POST['sottotitolo']);
    $dbo->bind(":volume_lib", $_POST['volume']);
    $dbo->bind(":pag_lib", $_POST['pagine']);
    $dbo->bind(":casa_ed_lib", $_POST['casa']);
    $dbo->bind(":anno", $_POST['anno']);
    $dbo->bind(":genere_lib", $_POST['genere']);
    $dbo->bind(":descr_lib", $_POST['trama']);
    $dbo->bind(":tipo_lib", $_POST['tipologia']);
    $dbo->bind(":prest_lib", $book['prest_lib']);
    $dbo->bind(":scaffale_lib", $_POST['scaffale']);
    $dbo->bind(":edificio_lib", $_POST['sede']);
    $dbo->bind("id_libro", $id);
    $dbo->execute();
    
    $sql="select * from libro";
    $dbo->query($sql);
    $row=$dbo->resultset();
    
    echo json_encode($row);
    exit();
}

问题排查与修复方案

1. HTML按钮缺失data-id属性

AJAX中通过this.getAttribute("data-id")获取图书ID,但按钮标签未定义该属性,导致idLibro为null,PHP端拿到无效ID,直接引发数据库操作失败。

修复:给按钮添加data-id属性并填充真实图书ID(实际场景需动态赋值):

<button type="submit" id="pulsanteModificaLibro" class="btn btn-primary" data-id="123">Modifica</button>

2. PHP参数绑定的两处错误

  • 参数名不匹配:更新语句中字段为anno_lib,但绑定参数名写成:anno,导致SQL无法匹配参数,执行失败。
    修复:将:anno改为:anno_lib
    $dbo->bind(":anno_lib", $_POST['anno']);
    
  • 参数名缺少冒号:绑定id_libro时写成id_libro,正确参数名应为:id_libro,缺少冒号会导致参数绑定失败。
    修复:添加冒号
    $dbo->bind(":id_libro", $id);
    

3. 未处理数据库查询失败场景

如果$dbo->single()查询不到对应图书(比如ID不存在),$book会返回false或null,后续访问$book['prest_lib']会抛出PHP错误,导致输出内容不是合法JSON,触发AJAX的fail回调。

修复:增加查询结果判断:

$book = $dbo->single();
if (!$book) {
    echo json_encode(['error' => '图书不存在']);
    exit();
}

4. 补充调试信息与错误捕获

当前AJAX的fail回调仅弹出提示,无法定位具体错误原因。建议扩展回调打印详细信息,同时在开发环境开启PHP错误输出。

修复:修改AJAX的fail回调:

.fail(function(xhr, status, error) {
    console.log("请求状态: " + status);
    console.log("错误信息: " + error);
    console.log("服务器响应: " + xhr.responseText);
    alert("请求失败,请查看控制台日志");
});

在PHP开头添加错误输出配置(仅开发环境使用):

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

5. 确保JSON输出合法

PHP执行过程中若出现错误,输出内容会包含错误信息,导致JSON格式不合法,AJAX因解析失败进入fail回调。建议输出JSON前清空缓冲并设置响应头:

ob_clean();
header('Content-Type: application/json');
echo json_encode($row);
exit();

内容的提问来源于stack exchange,提问作者Elisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:41