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

PHP中引入table.php时如何仅筛选状态为OPEN的工单

问题解答:引入table.php时仅展示OPEN状态工单

核心结论

你尝试的include 'ticket_table.php?status=' . $statusFilter;这种带URL参数的方式完全不可行。因为include/require是PHP的文件系统级加载机制,不是发起HTTP请求,后面的?status=xxx会被当作文件名的一部分,导致找不到文件报错,同时也不会被解析为$_GET参数。

正确实现思路

在include之前定义全局变量,让table.php直接读取该变量,再将状态过滤条件整合到SQL查询逻辑中。同时必须注意SQL注入风险——你的原始代码存在明显的注入漏洞,建议使用预处理语句修复。

具体代码修改

1. 修改index.php

直接在include前定义过滤变量,不需要加URL参数:

<body>
    <?php
    $statusFilter = 'Open';
    include 'table.php'; // 注意文件名要和实际文件一致,你原代码里写的ticket_table.php需对应实际文件名
    ?>
</body>

2. 修改table.php

重点调整状态过滤逻辑,整合到所有场景的SQL中,并修复注入问题:

<?php
include 'menu.php';
include 'connection.php';
require_once 'location.php';
$locationName = $locations[$n];

// 读取外部传入的状态过滤值,默认留空则不过滤
$statusFilter = isset($statusFilter) ? $statusFilter : null;

// 保留原有排序参数逻辑
$order = isset($_GET['order']) ? $_GET['order'] : 'title';
$sort = isset($_GET['sort']) && in_array($_GET['sort'], ['DESC', 'ASC']) ? $_GET['sort'] : 'ASC';
$newSort = ($sort === 'ASC') ? 'DESC' : 'ASC';

// 初始化SQL基础结构
$sqlBase = "SELECT tickets.id_ticket, tickets.name, tickets.location, tickets.priority, departments.department_name, tickets.title, tickets.creation_date, tickets.status, tickets.update_date, COUNT(files.file_id) AS FileCount
            FROM tickets
            INNER JOIN departments ON tickets.department_id = departments.department_id
            LEFT JOIN files ON tickets.id_ticket = files.ticket_id
            WHERE tickets.hidden = 0 ";

// 添加状态过滤条件
if ($statusFilter) {
    $sqlBase .= "AND tickets.status = ? ";
}

// 根据用户角色拼接完整SQL
if (isset($_SESSION['loggedin'])) {
    $departmentID = $_SESSION['department_id'];
    if ($departmentID == 0) {
        // 管理员用户逻辑
        $sql = $sqlBase . "GROUP BY tickets.id_ticket ORDER BY tickets.title ASC";
    } else {
        // 普通部门用户逻辑
        $sql = $sqlBase . "AND tickets.department_id = ? GROUP BY tickets.id_ticket ORDER BY $order $sort";
    }
} else {
    // 未登录用户按位置过滤逻辑
    $sql = $sqlBase . "AND tickets.location = ? GROUP BY tickets.id_ticket ORDER BY $order $sort";
}

// 使用预处理语句执行查询,彻底避免SQL注入
$stmt = $conn->prepare($sql);
$paramIndex = 1;
// 绑定状态过滤参数
if ($statusFilter) {
    $stmt->bind_param('s', $statusFilter);
    $paramIndex++;
}
// 绑定部门或位置参数
if (isset($_SESSION['loggedin'])) {
    if ($departmentID != 0) {
        $stmt->bind_param('i', $departmentID);
    }
} else {
    $stmt->bind_param('s', $locationName);
}
$stmt->execute();
$result = $stmt->get_result();

// 后续工单展示逻辑保留...
?>

关键说明

  • include后,index.php中定义的$statusFilter会直接共享到table.php的作用域,可直接读取
  • 所有动态参数都通过预处理语句绑定,彻底杜绝SQL注入风险
  • 状态过滤条件被整合到所有用户场景的SQL中,确保无论管理员、普通用户还是未登录用户,都会只展示OPEN状态的工单

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:58:16