使用Ajax实现Bootstrap卡片无刷新3秒自动更新MySQL数据问题排查
排查Ajax无刷新更新Bootstrap卡片的问题
让我帮你梳理下代码里的问题,一步步解决这个无刷新更新的故障:
1. Ajax请求参数设置错误
你当前的Ajax配置里,processData: false和contentType: false是专门用来处理**文件上传(FormData)**的场景,但你的请求只是普通的POST请求(还没传任何数据),这两个参数会导致请求格式异常,服务器无法正确解析请求。
修改后的Ajax代码,加上错误回调方便排查:
setInterval( (function x() { $.ajax({ type: "POST", url: "vTagInfoCall.php", // 删掉processData和contentType,用默认值即可 success: function(result) { $("#inputFieldDisplay").html(result); }, // 新增错误回调,控制台能直接看到请求失败的原因 error: function(xhr, status, error) { console.error("Ajax请求出错:", status, error); console.error("服务器响应内容:", xhr.responseText); } }); return x; })(), 3000);
2. PHP文件的输出与逻辑问题
你的vTagInfoCall.php有几个容易忽略的错误:
session_start()必须放在所有输出之前(包括ob_start()),否则会触发"headers already sent"的致命错误,导致内容无法正常输出;- 没有检查数据库连接和查询是否成功,万一数据库连不上或者SQL写错,你根本看不到错误;
ob_start()开启了输出缓冲,但没有用ob_end_flush()结束缓冲,可能导致内容无法正常发送到前端。
修改后的PHP代码:
<?php // session_start必须放在最顶部,确保没有任何输出之前 session_start(); ob_start(); include "db.php"; // 先检查数据库连接是否成功 if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } $tagQuery = "SELECT * FROM vtagdetails WHERE status = 0"; $tagQueryExecute = mysqli_query($conn, $tagQuery); // 检查SQL查询是否执行成功 if (!$tagQueryExecute) { die("SQL查询失败: " . mysqli_error($conn)); } $openItems = mysqli_num_rows($tagQueryExecute); while($tagQueryRows = mysqli_fetch_array($tagQueryExecute)){ $srNumber = $tagQueryRows['srNumber']; $Name = $tagQueryRows['Name']; $Code = $tagQueryRows['Code']; $customerName = $tagQueryRows['customers']; $Type = $tagQueryRows['Type']; echo '<form method="post"> <div class="card cardBodyStyle"> <div class="card-body"> <div class="row"> <input type="text" name="srNum" value="'.$srNumber.'" hidden> <input type="text" name="tpCode" value="'.$Code.'" hidden> <div class="col-sm"><i class="fab fa-500px"></i> '.$Name.'</div> <div class="col-sm"><i class="fas fa-atom"></i> '.$Type.'</div> <div class="col-sm"><i class="fas fa-globe fa-spin"></i> '.$customerName.'</div> </div> </div> </div> </form><br>'; } // 结束输出缓冲,确保内容全部发送到前端 ob_end_flush(); ?>
3. 快速排查技巧
- 先手动在浏览器地址栏访问
vTagInfoCall.php,看看能不能正常输出卡片的HTML代码。如果访问时页面报错,那就是PHP代码的问题,根据报错信息调整即可; - 如果手动访问正常,再看浏览器控制台的错误信息(就是我们新增的error回调输出的内容),比如是不是请求路径错误(404)、跨域问题(同域下基本不会出现)。
额外优化建议
因为你只是获取数据,没有提交任何表单内容,其实可以把Ajax的type改成GET,这样更符合语义,PHP代码不需要做任何修改。
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

