PHP中while循环读取记录跳过首条的问题及循环展示需求
解决while循环忽略第一条数据库记录的问题
嘿,这个问题我之前也踩过坑!大概率是你在进入while循环之前,提前调用了一次fetch()方法,把第一条记录取走却没处理,导致循环只能从第二条开始。我结合你的代码片段给你梳理下解决方案:
问题根源
常见的错误写法是这样的(你可能不小心这么写了):
$sql->execute(); $row = $sql->fetch(); // 这里取走了第一条记录,却没做任何处理 while($row = $sql->fetch()) { // 循环里只能拿到第二条及以后的记录 }
正确的while循环写法
直接把fetch()放在循环条件里,这样每一次循环都会取一条新记录,包括第一条:
if (isset($_SESSION['patient_no'])) { $patient_id = $_SESSION['patient_no']; // 注意SQL里的占位符要带冒号,和bindParam保持一致 $sql = $db->prepare("SELECT * FROM patient_record JOIN medicine_potency ON reference_no=:reference_id AND patient_code=:reference_no"); if (!$sql) { print_r($sql->errorInfo()); } else { // 绑定参数时记得带冒号,参数类型要匹配 $sql->bindParam(':reference_id', $patient_id, PDO::PARAM_INT); // 这里假设你要绑定的第二个参数也是patient_id,根据你的实际需求调整 $sql->bindParam(':reference_no', $patient_id, PDO::PARAM_INT); $sql->execute(); // 核心:直接在循环条件中fetch,不会漏第一条 while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { // 处理每条记录,比如输出字段 echo "患者编号:" . $row['patient_no'] . "<br>"; echo "药品信息:" . $row['potency_name'] . "<br>"; // 其他字段按需输出 } } }
非循环方式(一次性获取所有记录)
如果你不想用while循环,可以用fetchAll()一次性取出所有结果,再用foreach遍历:
if (isset($_SESSION['patient_no'])) { $patient_id = $_SESSION['patient_no']; $sql = $db->prepare("SELECT * FROM patient_record JOIN medicine_potency ON reference_no=:reference_id AND patient_code=:reference_no"); if (!$sql) { print_r($sql->errorInfo()); } else { $sql->bindParam(':reference_id', $patient_id, PDO::PARAM_INT); $sql->bindParam(':reference_no', $patient_id, PDO::PARAM_INT); $sql->execute(); // 一次性获取所有记录到数组 $allRecords = $sql->fetchAll(PDO::FETCH_ASSOC); // 用foreach遍历处理 foreach ($allRecords as $row) { echo "患者姓名:" . $row['patient_name'] . "<br>"; // 其他字段处理 } } }
额外检查点
- 先在数据库客户端(比如phpMyAdmin、Navicat)里执行你的SQL语句,传入实际的
patient_id,确认确实返回了多条记录,排除SQL本身的问题 - 确保绑定参数时,参数名和SQL里的占位符完全一致(包括冒号),否则参数绑定失败会导致查询结果异常
- 不要在循环前调用任何
fetch()相关方法,避免消耗第一条记录
内容的提问来源于stack exchange,提问作者muneeb
相关产品推荐
相关产品推荐

