如何解决AJAX触发MySQL更新不执行但直接访问接口正常的问题
故障可能原因
- Bootstrap自带的alert dismiss逻辑优先级高于你绑定的onClick事件:你给关闭按钮加了
data-dismiss="alert"属性,Bootstrap监听到点击后会立刻从DOM中删除整个提示框元素,你绑定的updateId函数里的异步AJAX请求还没完成发送就被中断,导致后端没有收到请求,自然不会执行更新逻辑。你直接访问接口能成功,说明后端逻辑本身没问题,问题出在前端请求没正常发出去。 - 相对路径匹配错误:你在AJAX里请求的是相对路径
dismisssuccess.php,如果你的notifications-success.php文件不在站点根目录,或者访问该页面的URL路径和dismisssuccess.php所在路径不一致,就会导致请求404,后端自然收不到参数。你直接访问接口的时候用的是正确的绝对路径,所以能正常执行。 - 异步请求未做状态校验:当前你只发送了异步请求,没有监听请求的完成/错误状态,就算请求被中断或者出错你也感知不到,也无法确认请求是否真的送达后端。
修复方案
- 移除关闭按钮的
data-dismiss="alert"属性,不要让Bootstrap自动关闭提示框,改成在AJAX请求成功后手动关闭。 - 修改
updateId函数,添加请求状态监听,确认请求完成后再执行关闭操作,同时可以把请求路径改成绝对路径避免路径错误:
function updateId(id, btnElem) { var xmlhttp = new XMLHttpRequest(); // 这里改成你站点对应的绝对路径,比如如果dismisssuccess.php在根目录就写"/dismisssuccess.php" xmlhttp.open("GET", "/dismisssuccess.php?id=" + id, true); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { // 请求成功后再手动关闭当前alert btnElem.closest('.alert').remove(); } } xmlhttp.send(); }
- 调整按钮的onClick调用,把当前按钮元素传进去:
<button type="button" class="close" onClick="updateId('<?php echo $row['id'];?>', this)" aria-label="Close" style="float:left!important; border:0; background:none;"><span aria-hidden="true">×</span></button>
- 后端更新逻辑建议改用MySQL预处理语句,避免直接拼接参数带来的SQL注入风险:
// 原来的update语句替换成预处理逻辑 $update = $mysqli->prepare("UPDATE notifications SET seen = 1 , seenby = ? WHERE id = ?"); $update->bind_param("si", $ip, $id); $update->execute();
内容的提问来源于stack exchange,提问作者Ryham Ali Maher Abouelnour
相关产品推荐
相关产品推荐

