如何在Location ID变化时为PHP生成的表格添加换行?
问题
我有一个包含数百条记录的FIDS_Hardware数据表,每条记录都带有Location ID。目前通过以下SQL语句查询数据:
SELECT LocationID, deviceName, companyname, record_ID,location, location,orderby FROM FIDS_Hardware WHERE deviceTypeCode = 5 AND monitor = 1 ORDER BY hotelID ASC, orderby ASC
并使用PHP代码生成HTML表格,当前逻辑是每5个单元格换行。我希望实现当Location ID发生变化时,表格自动开启新行。现有PHP代码如下:
$Limit2 = 5; $Count2 = 0; echo "<table border='0' width='100%' cellspacing='2'>"; while ($row_ConfMon = mysqli_fetch_assoc($ConfMon)) { $locationid = $row_ConfMon['hotelID']; $RoomNo2 = $row_ConfMon['deviceName']; $companyname = $row_ConfMon['companyname']; $recordID = $row_ConfMon['record_ID']; $location = $row_ConfMon['location']; $DownDate = date("d-m-y", $row_ConfMon['uptime']); $DownTime = date("H:i", $row_ConfMon['uptime']); if($row_ConfMon['NoDevice'] == 1) { if($Count2 < $Limit2) { if($Count2 == 0) { echo "<tr>"; } echo "<a href=\"confmon.php\" target=\"_self\"><td class=\"roomviewpurple\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div> <div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } else { $Count2 = 0; echo "</tr><tr><a href=\"confmon.php\" target=\"_self\"><td class=\"roomviewpurple\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div><div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } $Count2++; } elseif($row_ConfMon['MobileDisplay'] == 1 && $row_ConfMon['messageCount'] == 2) { if($Count2 < $Limit2) { if($Count2 == 0) { echo "<tr>"; } echo "<a href=\"confmon.php\" target=\"_self\"><td class=\"roomviewamber\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div> <div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } else { $Count2 = 0; echo "</tr><tr><a href=\"confmon.php\" target=\"_self\"><td class=\"roomviewamber\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div><div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } $Count2++; } elseif($row_ConfMon['messageCount'] == 2) { if($Count2 < $Limit2) { if($Count2 == 0) { echo "<tr>"; } echo "<a href=\"confmon.php\" target=\"_self\"><td class=\"roomviewred\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div> <div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } else { $Count2 = 0; echo "</tr><tr><a href=\"confmon.php\" target=\"_self\"><td class=\"roomviewred\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div><div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } $Count2++; } else { if($Count2 < $Limit2) { if($Count2 == 0) { echo "<tr>"; } echo "<td class=\"roomviewgreen\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div><div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td>"; } else { $Count2 = 0; echo "</tr><tr><td class=\"roomviewgreen\" valign=\"top\"><div class=\"coltitle\"><a href=\"confmon_hist.php?recordID=$recordID\" target=\"_self\">$companyname</a></div><div class=\"confmontime2\">$location<br />$RoomNo2<br /></div><span class=\"confmontime\">$DownDate<br /><div class=\"confmontime2\">$DownTime</div><br /></span></td></a>"; } $Count2++; } } echo "</tr></table>";
当前表格按每5个单元格换行,我希望当Location ID变化时,表格自动开启新行,请问该需求能否实现?
解决方案
完全可以实现,核心思路是跟踪上一条记录的Location ID,每次循环时对比当前记录的Location ID,若不同则强制换行并重置计数器,具体实现如下:
修改后的完整PHP代码
$Limit2 = 5; $Count2 = 0; $prev_locationid = null; // 新增:跟踪上一个Location ID echo "<table border='0' width='100%' cellspacing='2'>"; while ($row_ConfMon = mysqli_fetch_assoc($ConfMon)) { $locationid = $row_ConfMon['hotelID']; $RoomNo2 = $row_ConfMon['deviceName']; $companyname = $row_ConfMon['companyname']; $recordID = $row_ConfMon['record_ID']; $location = $row_ConfMon['location']; $DownDate = date("d-m-y", $row_ConfMon['uptime']); $DownTime = date("H:i", $row_ConfMon['uptime']); // 核心逻辑:Location ID变化时强制换行 if ($prev_locationid !== null && $locationid !== $prev_locationid) { // 关闭当前行(如果已有单元格) if ($Count2 > 0) { echo "</tr>"; $Count2 = 0; // 重置计数器 } } // 确定TD的样式类和外层链接 $tdClass = "roomviewgreen"; $outerLink = ""; if($row_ConfMon['NoDevice'] == 1) { $tdClass = "roomviewpurple"; $outerLink = "<a href=\"confmon.php\" target=\"_self\">"; } elseif($row_ConfMon['MobileDisplay'] == 1 && $row_ConfMon['messageCount'] == 2) { $tdClass = "roomviewamber"; $outerLink = "<a href=\"confmon.php\" target=\"_self\">"; } elseif($row_ConfMon['messageCount'] == 2) { $tdClass = "roomviewred"; $outerLink = "<a href=\"confmon.php\" target=\"_self\">"; } // 生成TD内容 $tdHtml = "<td class=\"{$tdClass}\" valign=\"top\"> <div class=\"coltitle\"><a href=\"confmon_hist.php?recordID={$recordID}\" target=\"_self\">{$companyname}</a></div> <div class=\"confmontime2\">{$location}<br />{$RoomNo2}<br /></div> <span class=\"confmontime\">{$DownDate}<br /><div class=\"confmontime2\">{$DownTime}</div><br /></span> </td>"; // 拼接外层链接(如果有) if ($outerLink) { $tdHtml = $outerLink . $tdHtml . "</a>"; } // 原有每5个单元格换行的逻辑 if($Count2 < $Limit2) { if($Count2 == 0) { echo "<tr>"; } echo $tdHtml; } else { $Count2 = 0; echo "</tr><tr>" . $tdHtml; } $Count2++; $prev_locationid = $locationid; // 更新上一个Location ID } // 关闭最后一行和表格 if ($Count2 > 0) { echo "</tr>"; } echo "</table>";
关键说明
- Location ID跟踪:新增
$prev_locationid变量,每次循环结束时更新为当前记录的Location ID,下一次循环时对比两者,若不一致则触发换行逻辑。 - 强制换行处理:当Location ID变化时,若当前行已有单元格,先关闭该行并重置计数器,后续记录将从新行开始。
- 代码重构:将重复的TD生成逻辑抽离,减少冗余代码,后续修改样式或内容更便捷。
- HTML结构修复:确保所有行都能正确关闭,避免出现不完整的HTML标签。
内容的提问来源于stack exchange,提问作者DCJones
相关产品推荐
相关产品推荐

