MySQL查询返回结果异常:始终仅获取最后一条记录问题求助
解决MySQL查询结果中所有记录复用最后一条文件夹名称的问题
我一眼就看出问题所在了——你第一个while循环的逻辑完全错了,导致$rep_header_activite最后只会保留最后一条类型记录的值,后面遍历活动图片时自然全用了这个最后值。
问题根源分析
你看这段代码:
while ( $data_type_activite = mysqli_fetch_array( $req_activite ) ) { $rep_header_activite = trim($data_type_activite['nom_type_activite']); }
每次循环都会把$rep_header_activite覆盖成当前行的类型名称,循环结束后,变量里就只剩最后一行的nom_type_activite了,所以后面所有图片的路径都会用这个最后一个文件夹名。
高效解决方案:合并SQL查询
最简洁的方式是合并你的两个SQL查询,把类型名称直接关联到主查询里,这样一次查询就能拿到所有需要的数据,不用分开两次查询,也不会出现变量覆盖的问题。
修改后的完整代码:
<?php require( '../core/libs/connexion.php' ); // 合并查询,一次性获取活动、画廊和对应的类型名称 $sql_mal = 'SELECT G.*, A.*, T.nom_type_activite FROM galleries AS G LEFT JOIN activites AS A ON G.id_gallerie=A.fk_id_gallerie LEFT JOIN type_activites AS T ON T.id_type_activite=A.fk_id_type_activite WHERE A.fk_id_destination="2"'; $req_mal = mysqli_query( $connexion, $sql_mal )or die( mysqli_error( $connexion ) ); // 直接遍历主查询结果,每个活动都能拿到对应的类型名称 while ( $contents_mal = mysqli_fetch_array( $req_mal ) ) { // 直接从当前行获取类型名称,不用依赖外部变量 $rep_header_activite = trim($contents_mal['nom_type_activite']); $id_de_activite = $contents_mal['id_activite']; echo '<div class="row"> <div class="col s12 m3"> <div class="card"> <div class="card-image small"> <img src="../00_sources/images/gallerie/activites/cards/'.$rep_header_activite.'/' . $contents_mal[ 'img_thumb' ] . '" alt="' . $contents_mal[ 'titre_prin_activite' ] . '"/> </div> <div class="card-action"> <span>' . $contents_mal[ 'titre_prin_activite' ] . '</span> </div> </div> </div> </div>'; } ?>
额外优化说明
- 合并查询后,每条活动记录都会附带对应的
nom_type_activite,彻底解决了变量覆盖的问题 - 我把
img的alt属性改成了活动标题titre_prin_activite,比用图片文件名更友好,符合SEO规范 - 去掉了多余的
global声明,你根本不需要把这些变量设为全局的
内容的提问来源于stack exchange,提问作者Rabah
相关产品推荐
相关产品推荐

