PDO Fetch()查询无返回记录时无法正确输出提示字符串问题
问题原因
你的代码问题出在最终的空数据判断逻辑上:
PDOStatement::fetch()在结果集没有更多行可取时会返回false,也就是说无论查询是否返回了记录,while循环结束后$row的值都是false- 按照PHP弱类型比较规则,
false == 0的判定结果为真,所以不管有没有符合要求的帖子,最后都会输出空数据提示。
修复方案
方案1:新增计数标志位(改动最小,适配你现有过滤逻辑)
如果你的业务逻辑需要过滤$db_processed === 'yes'的帖子才展示,用这个方案最准确:
<?php isset($_GET['username']) ? $username = $_GET['username'] : (header("Location: login.php") && exit()); $stmt = $connection->prepare("SELECT * FROM posts WHERE username = :username"); $stmt->execute([':username' => $username]); // 新增有效帖子计数变量 $valid_post_count = 0; while ($row = $stmt->fetch()) { $db_post_id = htmlspecialchars($row['image_id']); $db_title = htmlspecialchars($row['image_title']); $db_tags = htmlspecialchars($row['image_tags']); $db_processed= htmlspecialchars($row['user_processed']); $db_username = htmlspecialchars($row['username']); $db_profile_image_filename = htmlspecialchars($row['profile_image']); if ($db_processed === 'yes') { $valid_post_count++; ?> <article> <!-- HTML goes here that includes above data from database --> </article> <?php } } // 只有有效帖子数为0时才输出提示 if ($valid_post_count === 0) { echo "no data to show"; } ?>
方案2:用rowCount()直接判断查询结果(无需过滤状态时使用)
如果不需要判断$db_processed状态,只要查询无结果就输出提示,可以直接调用PDO的行数统计方法:
<?php isset($_GET['username']) ? $username = $_GET['username'] : (header("Location: login.php") && exit()); $stmt = $connection->prepare("SELECT * FROM posts WHERE username = :username"); $stmt->execute([':username' => $username]); if ($stmt->rowCount() === 0) { echo "no data to show"; } else { while ($row = $stmt->fetch()) { // 原有帖子渲染逻辑 } } ?>
额外优化提示:原有header跳转逻辑后建议加
exit终止代码执行,避免跳转后后端逻辑继续运行带来的安全风险。
内容的提问来源于stack exchange,提问作者pjk_ok
相关产品推荐
相关产品推荐

