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
相关产品推荐
相关产品推荐

