如何在PHP中按类别筛选并打印itr表数据?
实现按类别筛选报表数据的方案
没问题,我来帮你搞定这个筛选功能!咱们可以通过表单提交+动态SQL查询的方式在同一个PHP文件里实现,步骤很清晰,我给你拆解一下:
1. 完善筛选表单的提交逻辑
首先得把你现有的下拉框放到一个<form>里,这样选中类别后才能把数据提交给PHP处理。咱们用POST方法提交到当前页面(不用跳转到其他文件):
<form method="POST" action=""> <label for="category">Please select category:</label> <select style="width:22%;" class="form-control" name="category" id="category" required="required"> <option value="">--Select category--</option> <option value="RESIDENT" <?php echo isset($_POST['category']) && $_POST['category'] == 'RESIDENT' ? 'selected' : ''; ?>>RESIDENT</option> <option value="4Ps" <?php echo isset($_POST['category']) && $_POST['category'] == '4Ps' ? 'selected' : ''; ?>>4Ps</option> </select> <br /> <button type="submit" class="btn btn-primary">筛选</button> </form>
这里加了几个实用细节:
- 给
<select>加了id和label对应,符合HTML规范 - 添加了提交按钮,明确触发筛选操作
- 用PHP判断当前提交的类别,让下拉框保持选中状态(用户体验更友好)
2. 修改PHP查询逻辑,动态过滤数据
接下来要修改你的PHP查询部分,根据表单提交的类别动态生成SQL语句。重点要注意SQL注入风险,所以咱们用预处理语句来处理,绝对不要直接把用户输入拼到SQL里:
<?php // 假设你的数据库连接$conn已经在前面定义好了(比如mysqli_connect的代码) $category = isset($_POST['category']) ? trim($_POST['category']) : ''; // 初始化查询和参数 $sql = "SELECT * FROM itr"; $params = []; $types = ''; // 如果有选中的类别,添加WHERE条件 if (!empty($category)) { $sql .= " WHERE category = ?"; // 这里假设你的类别字段名叫`category`,如果不是要改成你实际的字段名! $params[] = $category; $types = 's'; // 标记参数为字符串类型 } // 保留原来的LIMIT 30限制 $sql .= " LIMIT 30"; // 预处理语句防止SQL注入 $query = $conn->prepare($sql); if (!empty($params)) { $query->bind_param($types, ...$params); } $query->execute(); $result = $query->get_result(); ?>
⚠️ 重要提醒:这里我假设你的itr表中存储类别的字段名叫category,如果你的实际字段名不一样(比如type或者classification),一定要把WHERE category = ?里的category改成你真实的字段名!
3. 更新表格渲染代码
最后把原来的循环渲染部分改成用预处理后的结果集,同时优化循环逻辑(原来的for循环会在数据不足30条时输出空行,用while循环更合理):
<table> <tr> <th style="padding-right:80px;padding-left:150px;"> <center>Name</center> </th> <th style="padding-right:10px;padding-left:15px;"> <center>Age</center> </th> <th style="padding-right:10px;padding-left:20px;"> <center>Gender</center> </th> <th style="padding-right:30px;padding-left:40px;"> <center>Purok</center> </th> </tr> <?php $a = 1; while ($fetch = $result->fetch_array()) { ?> <tr> <!-- 这里你原来的代码重复输出了firstname,我改成了firstname+lastname,如果你实际字段名不同可以调整 --> <td><?php echo $a.". ".$fetch['firstname']." ".$fetch['lastname']?></td> <td><center><?php echo $fetch['age']?></center></td> <td><center><?php echo $fetch['gender']?></center></td> <td><center><?php echo $fetch['address']?></center></td> </tr> <?php $a++; } $query->close(); $conn->close(); ?> </table>
完整整合后的代码
把上面的部分拼起来,完整的可运行代码大概是这样:
<?php // 这里替换成你的数据库连接代码 $conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名') or die(mysqli_error()); ?> <!DOCTYPE html> <html> <head> <title>ITR报表</title> </head> <body> <!-- 筛选表单 --> <form method="POST" action=""> <label for="category">Please select category:</label> <select style="width:22%;" class="form-control" name="category" id="category" required="required"> <option value="">--Select category--</option> <option value="RESIDENT" <?php echo isset($_POST['category']) && $_POST['category'] == 'RESIDENT' ? 'selected' : ''; ?>>RESIDENT</option> <option value="4Ps" <?php echo isset($_POST['category']) && $_POST['category'] == '4Ps' ? 'selected' : ''; ?>>4Ps</option> </select> <br /> <button type="submit" class="btn btn-primary">筛选</button> </form> <br /> <!-- 报表表格 --> <table> <tr> <th style="padding-right:80px;padding-left:150px;"> <center>Name</center> </th> <th style="padding-right:10px;padding-left:15px;"> <center>Age</center> </th> <th style="padding-right:10px;padding-left:20px;"> <center>Gender</center> </th> <th style="padding-right:30px;padding-left:40px;"> <center>Purok</center> </th> </tr> <?php $category = isset($_POST['category']) ? trim($_POST['category']) : ''; $sql = "SELECT * FROM itr"; $params = []; $types = ''; if (!empty($category)) { $sql .= " WHERE category = ?"; // 务必修改成你实际的类别字段名! $params[] = $category; $types = 's'; } $sql .= " LIMIT 30"; $query = $conn->prepare($sql); if (!empty($params)) { $query->bind_param($types, ...$params); } $query->execute(); $result = $query->get_result(); $a = 1; while ($fetch = $result->fetch_array()) { ?> <tr> <td><?php echo $a.". ".$fetch['firstname']." ".$fetch['lastname']; ?></td> <td><center><?php echo $fetch['age']?></center></td> <td><center><?php echo $fetch['gender']?></center></td> <td><center><?php echo $fetch['address']?></center></td> </tr> <?php $a++; } $query->close(); $conn->close(); ?> </table> </body> </html>
关键注意事项
- 字段名匹配:一定要确认你的
itr表中存储类别的字段名,把代码里的category改成实际的字段名(比如classification、type等)。 - SQL注入防护:用预处理语句绑定参数是核心,绝对不要直接把用户输入拼到SQL里,这能有效避免安全漏洞。
- 用户体验优化:保留下拉框的选中状态,让用户清晰知道当前筛选的是哪个类别。
内容的提问来源于stack exchange,提问作者TechieMickey
相关产品推荐
相关产品推荐

