如何用PHP从MySQL获取动态内容生成三列Div布局网页
修复你的PHP动态生成三列布局代码问题
先帮你揪出原代码里的几个核心问题,这些就是导致代码跑不起来的关键:
数组处理踩坑:
- 你用
fetch_row()拿数据,返回的是索引数组,但后面却想用关联数组的方式$gets['message']调用,这直接就会报错。得改成fetch_assoc()来获取关联数组才行。 - 那行多余的
$get[] = var_export($gets);完全没必要,它会把数组转成字符串,直接破坏了原有的数据结构。
- 你用
循环逻辑混乱:
- 外层的
for循环固定只跑两次,根本没法根据数据量自动生成多行三列的结构。 - 内层
while ($card <=3)会陷入无限循环——不仅$card = $card++;是错误的自增写法(直接写$card++就行),而且条件应该设为$card < 3,同时每次生成完一个父div后还要重置$card的计数。
- 外层的
HTML输出与结构问题:
- 用
<和>输出HTML标签纯属多此一举,直接用<和>更清晰,而且echo用双引号包裹的话,变量解析也更方便。 - HTML里存在a标签嵌套的问题(外层
<a href="">里面又套了<a>),这是无效的HTML结构,会导致页面渲染出各种奇怪的问题。
- 用
跳转逻辑遗漏:
调用header("location:quickii.php")后没加exit()或die(),代码会继续往下执行,很可能引发不必要的bug。
修复后的完整代码
<?php $idurl = $_GET['u']; $gets = []; $stmts = $con->prepare("SELECT * FROM quickiimessage WHERE token =? "); $stmts->bind_param("s", $idurl); $stmts->execute(); $result = $stmts->get_result(); // 没有数据时跳转并终止代码 if ($result->num_rows === 0) { header("location:quickii.php"); exit(); } // 获取关联数组格式的数据,方便后续调用字段 while ($row = $result->fetch_assoc()){ $gets[] = $row; } $totalItems = count($gets); $itemsPerRow = 3; // 按每3个元素一组,循环生成父div for ($i = 0; $i < $totalItems; $i += $itemsPerRow) { echo '<div class="three_columns">'; // 生成当前组的子div,最后一组不足3个也能正常显示 for ($j = $i; $j < $i + $itemsPerRow && $j < $totalItems; $j++) { $item = $gets[$j]; ?> <div class="card"> <div class="socialdiv"> <a style="color:red;" href="#" class="fa fa-facebook"></a> <a style="color:mediumblue;" href="#" class="fa fa-twitter"></a> </div> <div class="names"> <div class="icons-internationalnews"> <a href="">Anonymous user</a> </div> </div> <div class="texts"> <span class="cliprendername"><?php echo htmlspecialchars($item['message']); ?></span> <span class="clip_chan_name"></span> <br> <span class="renderclips_views"><?php echo htmlspecialchars($item['dates']); ?></span> <br><br> </div> </div> <?php } echo '</div>'; } ?>
关键修改说明:
- 数据获取优化:改用
fetch_assoc()获取关联数组,终于能正常调用$item['message']和$item['dates']了。 - 循环逻辑重构:外层循环按每3个元素为一组,自动计算需要生成多少个父div;内层循环负责生成当前组的子div,哪怕最后一组不足3个也能正常显示。
- HTML结构修复:删掉了嵌套的a标签,同时用
htmlspecialchars()转义输出内容,既能防止XSS攻击,也能避免HTML解析错误。 - 跳转逻辑补全:在header跳转后添加
exit(),确保代码直接终止执行。 - 代码可读性提升:把HTML部分从echo字符串里拆出来,以后改样式或结构会方便很多。
内容的提问来源于stack exchange,提问作者Joseph-brown
相关产品推荐
相关产品推荐

