You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP生成Excel考勤报表时Hours Assigned重复显示问题求助

解决PHP考勤报表中“Hours Assigned”重复显示的问题

问题原因

你当前的代码将Hours Assigned的输出逻辑放在了while循环内部,导致每遍历一条数据库记录就会打印一次该标题,自然会在多条记录时重复显示。

修复方案

只需要将Hours Assigned的输出代码移到循环之外,或者通过一个标志控制只打印一次即可。以下提供两种实现方式:

方式1:先打印标题再遍历所有记录(推荐,适合同讲师同课程的tot_hr一致的场景)

else if( $num_results > 0)
{ 
    // 先获取第一条记录的分配时长并打印标题
    $first_row = $result->fetch_assoc();
    extract($first_row);
    $hourstot = floor($tot_hr / 3600);
    $minutestot = floatval(($tot_hr / 60) % 60);
    
    echo "<h4 class='text-muted font-15 m-b-15'>  &nbsp; &nbsp; &nbsp; &nbsp;<b>* Hours Assigned : $hourstot : $minutestot  </b></h4>";
    echo "<h4 class='text-muted font-15 m-b-15'>  &nbsp; &nbsp; &nbsp; &nbsp;<b>----------------------------------------------------------------------------------------------------- </b></h4>";
    
    // 输出第一条记录的行数据
    echo "<tr>";
    $hours = floor($first_row['to_time'] / 3600);
    $minutes = floor(($first_row['to_time'] / 60) % 60);
    echo "<td></td>";
    echo "<td>{$first_row['rdate']}</td>";
    echo "<td>{$first_row['s_time']}</td>";
    echo "<td>{$first_row['e_time']}</td>";
    echo "<td>$hours h : $minutes m  </td>";
    echo "<td>{$first_row['coverage']}</td>";
    echo "<td></td>";
    echo "</tr>";
    
    // 遍历剩余的记录
    while( $row = $result->fetch_assoc() ){
        $hours = floor($row['to_time'] / 3600);
        $minutes = floor(($row['to_time'] / 60) % 60);
        
        echo "<tr>";
        echo "<td></td>";
        echo "<td>{$row['rdate']}</td>";
        echo "<td>{$row['s_time']}</td>";
        echo "<td>{$row['e_time']}</td>";
        echo "<td>$hours h : $minutes m  </td>";
        echo "<td>{$row['coverage']}</td>";
        echo "<td></td>";
        echo "</tr>";
    }
}

方式2:用标志变量控制只打印一次标题

else if( $num_results > 0)
{ 
    $is_header_printed = false; // 标志位:记录标题是否已打印
    
    while( $row = $result->fetch_assoc() ){
        extract($row);
        
        // 仅在第一次循环时打印标题
        if(!$is_header_printed){
            $hourstot = floor($tot_hr / 3600);
            $minutestot = floatval(($tot_hr / 60) % 60);
            
            echo "<h4 class='text-muted font-15 m-b-15'>  &nbsp; &nbsp; &nbsp; &nbsp;<b>* Hours Assigned : $hourstot : $minutestot  </b></h4>";
            echo "<h4 class='text-muted font-15 m-b-15'>  &nbsp; &nbsp; &nbsp; &nbsp;<b>----------------------------------------------------------------------------------------------------- </b></h4>";
            $is_header_printed = true;
        }
        
        // 输出当前记录的行数据
        echo "<tr>";
        $hours = floor($to_time / 3600);
        $minutes = floor(($to_time / 60) % 60);
        echo "<td></td>";
        echo "<td>{$rdate}</td>";
        echo "<td>{$s_time}</td>";
        echo "<td>{$e_time}</td>";
        echo "<td>$hours h : $minutes m  </td>";
        echo "<td>{$coverage}</td>";
        echo "<td></td>";
        echo "</tr>";
    }
}

额外注意

原代码中循环开头的echo "</tr>";属于多余代码,会导致HTML结构错误,修复时已移除。

内容的提问来源于stack exchange,提问作者Gutsy Creatives

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:20:22