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

