维修工单表格排序与过滤功能异常排查求助
问题修复方案
1. 排序功能异常(ID排序混乱)
原因
SQL查询中ORDER BY子句写死了按work_orders.status排序,完全未使用前端传入的$sort参数,导致无论点击哪个表头,结果都只按工单状态排序;状态相同的记录无固定排序规则,因此出现ID 21排在20之前的混乱情况。
修复代码
修改Repairtable.php中的$query变量,替换ORDER BY部分以使用传入的$sort和$order参数:
// 先对排序字段做安全映射,避免非法字段导致SQL错误 $allowed_sort_fields = [ 'id' => 'work_orders.id', 'device_name' => 'devices.type', 'name' => 'customers.name', 'service_request_id' => 'devices.service_request_id', 'status' => 'work_orders.status' ]; $sort_column = isset($allowed_sort_fields[$sort]) ? $allowed_sort_fields[$sort] : 'work_orders.id'; // 重构查询语句 $query = "SELECT work_orders.id, devices.type AS device_name, customers.name, work_orders.status, devices.service_request_id, devices.issues FROM work_orders INNER JOIN devices ON work_orders.device_id = devices.id INNER JOIN customers ON devices.customer_id = customers.id $where ORDER BY $sort_column $order LIMIT 10 OFFSET 0";
2. 状态下拉框无法过滤数据
原因
SQL WHERE子句中OR与AND的优先级冲突:AND优先级高于OR,原条件会被解析为:
WHERE (customers.name LIKE '%%' OR devices.type LIKE '%%') OR (devices.issues LIKE '%%' AND work_orders.status='Awaiting Repair')
这意味着只要前两个搜索条件满足(空搜索时匹配所有记录),无论status值是什么都会被查询出来,导致过滤失效。
修复代码
将所有OR连接的搜索条件用括号包裹,确保status的AND条件作用于整个搜索逻辑:
// 原代码 $where = "WHERE customers.name LIKE '%$search%' OR devices.type LIKE '%$search%' OR devices.issues LIKE '%$search%'"; // 修改后 $where = "WHERE (customers.name LIKE '%$search%' OR devices.type LIKE '%$search%' OR devices.issues LIKE '%$search%')";
修改后,添加status条件的WHERE子句会正确解析为:
WHERE (customers.name LIKE '%%' OR devices.type LIKE '%%' OR devices.issues LIKE '%%') AND work_orders.status='Awaiting Repair'
额外小问题修复
Repairtable.php中的错误输出使用了未定义的$conn变量,需改为$db:
// 原代码 if ($db->error) { die("Query failed: " . $conn->error); } // 修改后 if ($db->error) { die("Query failed: " . $db->error); }
内容的提问来源于stack exchange,提问作者Jaiden Watling
相关产品推荐
相关产品推荐

