
本文详解为何 fetch() 单独调用会导致首行数据“消失”,并提供规范、安全的 PDO 查询写法,确保所有记录(包括第一行)完整渲染到 HTML 表格中。
本文详解为何 `fetch()` 单独调用会导致首行数据“消失”,并提供规范、安全的 pdo 查询写法,确保所有记录(包括第一行)完整渲染到 html 表格中。
在使用 PDO 查询数据库时,一个常见却极易被忽视的错误是:在遍历结果前意外消耗了第一条记录。您当前的代码正是如此:
$rezervasyonsor = $conn->prepare("SELECT * FROM reservations");
$rezervasyonsor->execute();
$rezervasyoncek = $rezervasyonsor->fetch(PDO::FETCH_ASSOC); // ❌ 问题根源:此处已取走第一行!
紧接着,您又用 while 循环再次调用 fetch():
while ($rezervasyoncek = $rezervasyonsor->fetch(PDO::FETCH_ASSOC)) { ... }
由于 fetch() 是游标前进式读取,第一次单独调用已将内部指针移至第二行,因此循环实际从第二行开始遍历——导致首行数据永远无法显示。
✅ 正确做法:避免预取,直接循环
对于无需参数绑定的静态查询(如 SELECT * FROM reservations),应优先使用更简洁、语义更清晰的 query() 方法,并跳过任何前置 fetch() 调用:
<?php include 'admin_navbar.php';
// ✅ 正确:直接 query + while fetch,无预取干扰
$rezervasyonsor = $conn->query("SELECT * FROM reservations");
?>
随后,在 HTML 表格中直接循环输出:
<?php while ($row = $rezervasyonsor->fetch(PDO::FETCH_ASSOC)): ?>
<tr>
<td style="overflow:hidden; white-space:nowrap;"><?php echo htmlspecialchars($row['startDate']); ?></td>
<td style="overflow:hidden; white-space:nowrap;"><?php echo htmlspecialchars($row['returnDate']); ?></td>
<td style="overflow:hidden; white-space:nowrap;"><?php echo htmlspecialchars($row['carName']); ?></td>
<td style="overflow:hidden; white-space:nowrap;"><?php echo htmlspecialchars($row['price']); ?></td>
<td style="overflow:hidden; white-space:nowrap;"><?php echo htmlspecialchars($row['situation']); ?></td>
<td>
<center>
<a href="islem_admin_reservations.php?reservationid=<?php%20echo%20(int)%24row['reservationid'];%20?>">
<button class="btn btn-primary btn-xs">Edit</button>
</a>
</center>
</td>
<td>
<center>
<a href="islem_admin_reservations.php?reservationid=<?php%20echo%20(int)%24row['reservationid'];%20?>&carid=<?php%20echo%20(int)%24row['carid'];%20?>&addStock=deleteReservation">
<button class="btn btn-danger btn-xs">End Reservation</button>
</a>
</center>
</td>
</tr><?php endwhile; ?>
⚠️ 关键注意事项
- prepare() vs query():prepare() 主要用于含用户输入的动态 SQL(如 WHERE id = ?),需配合 bindParam() 防注入;纯静态查询用 query() 更高效、更直观。
- 安全输出:务必对输出到 HTML 的字段使用 htmlspecialchars()(如 $row['carName']),防止 XSS 攻击;对 ID 类整型参数建议强制 (int) 类型转换。
- 资源管理:PDOStatement 对象在脚本结束时自动释放,无需手动关闭,但避免在循环内重复执行相同查询。
-
空结果处理:可添加 if ($rezervasyonsor->rowCount() === 0) { echo '
'; } 提升用户体验。No reservations found.
遵循以上写法,即可彻底解决“首行数据不显示”问题,同时保障代码安全性与可维护性。











