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
相关产品推荐
相关产品推荐

