You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:06:02