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

PDO新手技术问询:仅显示tipo为2的artigo却输出空DIV的问题排查

问题分析与解决方案

嘿,我来帮你排查下问题所在~你遇到的空DIV标签问题,核心原因是没有检查第二次查询是否真的返回了符合条件的文章,哪怕$result_artigo没查到tipo=2的内容(此时$row_artigo是false),代码还是会直接输出DIV标签,自然就出现了空内容的容器。

而且你的代码还存在可以优化的地方——完全不需要做两次数据库查询,直接把tipo=2的过滤条件加到主查询里,从源头就筛选出符合要求的文章,既减少数据库交互次数,也能彻底避免空DIV的问题。

修改后的完整代码

$registos_por_pagina = 10;
// 总记录数查询:加入a.tipo=2条件
$result_total_registos = $pdo->prepare("SELECT * FROM artigo_categoria a_c INNER JOIN artigo a ON a.id = a_c.artigo WHERE a_c.categoria = :id AND a.estado = 1 AND a.tipo = 2");
$result_total_registos->execute(array('id' => $id));
$total_registos = $result_total_registos->rowCount();

// 列表数据查询:同样加入a.tipo=2条件,去掉多余的二次查询
$result_registo = $pdo->prepare("SELECT * FROM artigo_categoria a_c INNER JOIN artigo a ON a.id = a_c.artigo WHERE a_c.categoria = :id AND a.estado = 1 AND a.tipo = 2 ORDER BY a.id DESC LIMIT 0, :registos_por_pagina");
// 注意:LIMIT的参数需要绑定为整数类型,避免字符串解析问题
$result_registo->bindParam(':id', $id, PDO::PARAM_INT);
$result_registo->bindParam(':registos_por_pagina', $registos_por_pagina, PDO::PARAM_INT);
$result_registo->execute();

$contador = 1;
while ($row_registo = $result_registo->fetch(PDO::FETCH_ASSOC)) {
    // 直接使用主查询的结果,无需二次查询
    if ($contador==1 || $contador==2) {
        echo '<div class="artigo-fotografia-autor"> <img src="backoffice/utilizadores/'.$row_registo['autor'].'.jpg" alt="'.$row_registo['autor'].'"> <h4 class="destaque-titulo-pequeno mt-10">'.$row_registo['titulo'].'</h4> </div>';
    } else {
        echo '<div class="artigo-fotografia-autor"> <img src="backoffice/utilizadores/'.$row_registo['autor'].'.jpg" alt="'.$row_registo['autor'].'"> <h4 class="destaque-titulo-pequeno mt-10">'.$row_registo['titulo'].'</h4> </div>';
    }
    $contador++;
}

额外说明

  1. 为什么优化查询?:原来的二次查询会在循环里执行N次(每页最多10次),增加数据库负载,合并查询后只需要2次请求(总记录数+列表数据),性能更优。
  2. 参数绑定的细节:LIMIT的参数如果用execute()的数组传递,可能会被当作字符串处理,所以改用bindParam()并指定PDO::PARAM_INT类型,避免潜在的语法错误。
  3. 如果坚持保留二次查询的写法(不推荐),必须在输出DIV前加判断:
$row_artigo = $result_artigo->fetch();
// 只有查询到有效数据时才输出
if($row_artigo) {
    if ($contador==1 || $contador==2) {
        // 输出内容
    } else {
        // 输出内容
    }
    $contador++;
}

内容的提问来源于stack exchange,提问作者Henrique Guimarães

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:22:47