PHP循环动态生成卡片时重复显示MySQL首条name字段的问题
问题分析与解决方案
你的代码问题出在嵌套循环逻辑错误以及MySQLi结果集的指针特性上:
- 第一次执行内层
while($query_row=mysqli_fetch_array($query_burn))时,会把$query_burn结果集的指针移动到末尾,后续再调用mysqli_fetch_array直接返回false,内层循环不再执行。 - 你看到重复显示第一条
name,大概率是误加了不必要的内层循环,实际需求只是遍历$result中的每条name生成卡片。
修正方案1:仅遍历$result生成卡片(最符合你的需求)
如果目标是为$result中的每个name生成独立卡片,直接去掉内层循环即可:
<?php while($row = mysqli_fetch_array($result)) { ?> <div class="col-lg-3"> <!-- Card with header and footer --> <div class="card"> <div class="card-header"><?php echo $row['name']; ?></div> <div class="card-body"> <h5 class="card-title">Card with header and footer</h5> Ut in ea error laudantium quas omnis officia. Sit sed praesentium voluptas. </div> <div class="card-footer"> Footer </div> </div><!-- End Card with header and footer --> </div> <?php } ?>
修正方案2:需结合两个结果集的数据
如果确实需要同时使用$result和$query_burn的内容,先将$query_burn的结果存入数组,避免指针耗尽的问题:
<?php // 提前将$query_burn的结果存入数组,可反复遍历 $burn_records = []; while($query_row = mysqli_fetch_array($query_burn)) { $burn_records[] = $query_row; } ?> <?php while($row = mysqli_fetch_array($result)) { ?> <?php foreach($burn_records as $query_row) { ?> <div class="col-lg-3"> <!-- Card with header and footer --> <div class="card"> <div class="card-header"><?php echo $row['name']; ?></div> <div class="card-body"> <h5 class="card-title">Card with header and footer</h5> Ut in ea error laudantium quas omnis officia. Sit sed praesentium voluptas. </div> <div class="card-footer"> Footer </div> </div><!-- End Card with header and footer --> </div> <?php } ?> <?php } ?>
核心原理说明
MySQLi的mysqli_fetch_array函数会移动结果集的内部指针,每次调用返回当前指针位置的行,然后指针后移。当指针到达结果集末尾时,后续调用会返回false,循环终止。因此,未存储的结果集只能被遍历一次,嵌套循环中内层结果集会被一次性耗尽,导致外层后续迭代无法触发内层循环。
内容的提问来源于stack exchange,提问作者Rafay Siddiqui.
相关产品推荐
相关产品推荐

