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

PHP实现员工活动月度报表查询功能的技术问询

实现月度员工活动报表筛选功能的解决方案

我来帮你搞定月度报表筛选的功能,结合你现有的代码,咱们分步骤来实现:

1. 添加前端月份选择表单

首先在页面顶部加一个简单的表单,让用户选择要查看的年月。用下拉框的方式比较直观,也可以用日期输入控件,这里给你用动态生成的下拉框示例:

<form method="POST" action="">
    <label for="reportMonth">选择报表月份:</label>
    <select name="reportMonth" id="reportMonth">
        <?php
        // 动态生成最近12个月的选项,默认选中当前月份
        for ($i = 0; $i < 12; $i++) {
            $date = date('Y-m', strtotime("-{$i} months"));
            $selected = ($_POST['reportMonth'] ?? date('Y-m')) == $date ? 'selected' : '';
            echo "<option value='{$date}' {$selected}>{$date}</option>";
        }
        ?>
    </select>
    <button type="submit">查看报表</button>
</form>

2. 修改SQL查询,加入月份过滤条件

假设你的每个活动表(Ad、Citi、ComOut等)都有记录活动日期的字段(比如ActivityDate,如果字段名不同记得对应修改),咱们在每个UNION ALL的子查询里加WHERE条件筛选指定月份的数据。一定要用参数化查询防止SQL注入,这是安全开发的基本要求。

3. 后端处理月份参数并执行查询

完善你的PHP代码,处理前端提交的月份参数,执行带参数的SQL查询:

<?php
$serverName = "";
$connectionInfo = array("Database" => "...", "UID" =>"...", "PWD"=>"..." );
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false){
    die(print_r(sqlsrv_errors(),true));
}

// 获取选中的月份,默认显示当前月份
$selectedMonth = $_POST['reportMonth'] ?? date('Y-m');
// 转换为当月第一天和最后一天的日期范围
$startDate = date('Y-m-01', strtotime($selectedMonth));
$endDate = date('Y-m-t', strtotime($selectedMonth));

// 修改后的SQL,加入月份过滤条件,使用参数占位符
$sql = "(SELECT Ad.[Act] 'Act', Ad.[Units] 'Units', Ad_Act.[Name] 
         FROM Ad 
         JOIN Ad_Act ON Ad.ActID = Ad_Act.ActAttend
         WHERE Ad.ActivityDate >= ? AND Ad.ActivityDate <= ?)
         UNION ALL
         (SELECT Citi.[Act2] 'Act', Citi.[Units2] 'Units', Citi_Act.[Name] 
          FROM Citi 
          JOIN Citi_Acts ON Citi.ActID2 = Citi_Act.ActAttend2
          WHERE Citi.ActivityDate >= ? AND Citi.ActivityDate <= ?)
         UNION ALL
         (SELECT ComOut.[Act3] 'Act', ComOut.[Units3] 'Units', ComOut_Act.[Name] 
          FROM ComOut 
          JOIN ComOut_Act ON ComOut.ActID3 = ComOut_Act.ActAttend3
          WHERE ComOut.ActivityDate >= ? AND ComOut.ActivityDate <= ?)
         UNION ALL
         (SELECT ReSchAct.[Act4] 'Act', ReSchAct.[Units4] 'Units', ReSch_Act.[Name] 
          FROM ReSchAct 
          JOIN ReSch_Act ON ReSchAct.ActID4 = ReSch_Act.ActAttend4
          WHERE ReSchAct.ActivityDate >= ? AND ReSchAct.ActivityDate <= ?)
         UNION ALL
         (SELECT TeEd.[Act5] 'Act', TeEd.[Units5] 'Units', TeEd_Act.[Name] 
          FROM TeEd 
          JOIN TeEd_Act ON TeEd.ActID5 = TeEd_Act.ActAttend5
          WHERE TeEd.ActivityDate >= ? AND TeEd.ActivityDate <= ?)";

// 准备参数数组,每个子查询都需要传入开始和结束日期
$params = array(
    $startDate, $endDate,
    $startDate, $endDate,
    $startDate, $endDate,
    $startDate, $endDate,
    $startDate, $endDate
);

// 执行参数化查询
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

$totalUnits = 0;
?>

4. 完善前端报表展示

把报表和表单结合,显示当前选中的月份,同时处理没有数据的情况:

<h3><?php echo $selectedMonth; ?> 月度员工活动报表</h3>
<table border="1">
    <tr>
        <th>Act</th>
        <th>Units</th>
        <th>Name</th>
    </tr>
    <?php 
    $hasData = false;
    while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) : 
        $hasData = true;
    ?>
    <tr>
        <td><?php echo $row['Act']; ?></td>
        <td><?php echo $row['Units']; ?></td>
        <td><?php echo $row['Name']; ?></td>
    </tr>
    <?php $totalUnits += intval($row['Units']); ?>
    <?php endwhile; ?>
    
    <?php if (!$hasData): ?>
    <tr>
        <td colspan="3">该月份暂无活动数据</td>
    </tr>
    <?php else: ?>
    <tr>
        <td></td>
        <td><strong>Total Units:</strong></td>
        <td><?php echo $totalUnits; ?></td>
    </tr>
    <?php endif; ?>
</table>

<?php sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?>

关键注意事项:

  • 字段名适配:如果你的活动表中日期字段不是ActivityDate,一定要替换成实际的字段名(比如AdDate、CreateDate等)。
  • SQL注入防护:坚持使用参数化查询,永远不要直接把用户输入拼接到SQL语句中。
  • 日期格式:确保数据库中日期字段的格式和PHP生成的Y-m-d格式兼容,如果是其他格式需要调整日期转换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:09