PHP+AJAX按ID查询记录异常:点击不同按钮显示相同数据
问题分析与解决方案
核心问题排查方向
点击所有View按钮都显示同一条记录,大概率是前端获取的ID不准确或后端SQL查询存在隐患导致的,以下是具体修复步骤:
1. 修复前端ID获取的空白问题
当前通过text()获取ID时,可能因为HTML中的换行、空格等空白字符导致ID值带冗余内容,传递给后端后查询出错。
修改AJAX代码中获取ID的部分,添加trim()去除空白:
<script> $(document).ready(function () { $('.view_btn').click(function (e) { e.preventDefault(); // 添加trim()去除空白字符 var p_id = $(this).closest('tr').find('.patient_id').text().trim(); console.log(p_id); // 打开此日志,确认点击不同按钮时输出的ID是否正确 $.ajax({ type: "POST", url: "Modals/viewHistory/view_medical_itr.php", data: { 'checking_viewbtn': true, 'patient_id': p_id, }, success: function (response){ $('.patient_viewing').html(response); $('#medical_itr').modal('show'); } }); }); }); </script>
2. 修复后端SQL注入风险与类型问题
原代码直接拼接SQL存在注入风险,且未对ID进行类型校验,可能导致查询异常。改用预处理语句,并强制转换ID为整数:
include_once("connections/connections.php"); $con = connection(); if(isset($_POST['checking_viewbtn'])){ // 强制转换为整数,确保ID为合法数字 $p_id = (int)$_POST['patient_id']; // 使用预处理语句避免SQL注入,同时确保查询精准 $sql = "SELECT * FROM medical_itr WHERE id = ?"; $stmt = $con->prepare($sql); $stmt->bind_param("i", $p_id); // "i"表示参数为整数类型 $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); }
3. 修复PHP循环初始化问题
原do-while循环会先执行一次输出,此时$row可能未被正确初始化(依赖之前的变量值),导致数据异常,建议改为while循环:
<tbody> <?php while($row = $medical_itr->fetch_assoc()){ ?> <tr> <td class="patient_id"><?php echo $row['id']; ?></td> <td><?php echo $row['family_number']; ?></td> <td><?php echo $row['Age'];?></td> <td><?php echo $row['chief_complaints']; ?></td> <td><?php echo $row['diagnosis']; ?></td> <td><?php echo $row['medication_treatment']; ?></td> <td><?php echo $row['added_at']; ?></td> <td> <div class="col-2"> <a href="#" class="btn btn-primary view_btn mb-2">view</a> </div> </td> </tr> <?php } ?> </tbody>
验证步骤
- 打开浏览器控制台,点击不同行的View按钮,查看
console.log(p_id)输出的ID是否与表格中显示的一致; - 执行上述修复后,测试不同行的View按钮是否能正确显示对应记录。
内容的提问来源于stack exchange,提问作者Joe Rick
相关产品推荐
相关产品推荐

