CRM系统分页筛选失效求助:翻页后筛选条件重置
解决CRM分页翻页时筛选条件丢失的问题
这个问题很典型——你的翻页链接里没有携带筛选参数,所以点击下一页/上一页时,后台无法获取之前的筛选条件,导致SQL查询回到了未筛选的状态。下面是具体的解决步骤和代码修改:
核心问题分析
你当前的翻页URL只传递了controller、action、cid和page这几个参数,但用户设置的5项筛选条件并没有被包含在链接里。当点击翻页时,$_GET里没有筛选参数,控制器中用来拼接筛选条件的$cont变量就变成了空值,最终执行的SQL就是未筛选的查询。
解决方案步骤
1. 确保控制器正确获取并保留筛选条件
首先,你需要在控制器中明确获取所有筛选参数(以下示例假设你的5项筛选是客户名称、邮箱、城市、状态、客服人员,你可以根据实际字段调整),并安全地组装到$cont中:
// 1. 获取所有筛选参数,默认空值防止报错 $searchName = $_GET['search_name'] ?? ''; $searchEmail = $_GET['search_email'] ?? ''; $searchCity = $_GET['search_city'] ?? ''; $searchState = $_GET['search_state'] ?? ''; $searchSupport = $_GET['search_support'] ?? ''; // 2. 安全组装筛选条件(务必做SQL注入防护!) $cont = ''; if (!empty($searchName)) { // 用mysqli_real_escape_string转义用户输入,避免SQL注入 $escapedName = mysqli_real_escape_string($db, $searchName); $cont .= " AND cu.customer_name LIKE '%{$escapedName}%'"; } if (!empty($searchEmail)) { $escapedEmail = mysqli_real_escape_string($db, $searchEmail); $cont .= " AND cu.email LIKE '%{$escapedEmail}%'"; } // 其他3项筛选条件按照同样的方式添加... // 3. 分页逻辑保持不变 if (!isset($_GET['page']) or !is_numeric($_GET['page'])) { $page = 0; } else { $page = (int)$_GET['page']; } // 后续的查询和数据组装保持不变 $customerslist = array(); $customers = $db->query("select cu.email, cu.notinterested, cu.version, cu.autoresponder, cu.customer_support, cu.verified, cu.verified_date, cu.customer_id, cu.customer_name, cu.address, cu.telephone_no, cu.email, cu.person_incharge, cu.designation, ct.city_name, st.state_name, emp.username from customers as cu left join state as st on st.id = cu.state left join city as ct on ct.id = cu.city left join tbllogin as emp on emp.employee_id = cu.customer_support where cu.customer_name!='' and cu.customer_support>0 and cu.company_id='".$cid."' ".$cont." ".$order_by." limit ".$page.",100"); foreach($customers->fetchAll() as $cl) { $customerslist[] = $cl; }
2. 修改视图的翻页链接,携带所有筛选参数
在视图中,你需要把当前的所有筛选参数附加到翻页URL上。用http_build_query()自动拼接参数,能避免手动拼接出错:
<?php // 收集所有需要传递的参数:固定参数+筛选参数 $baseParams = [ 'controller' => 'customers', 'action' => 'index', 'cid' => $cid, // 把当前的所有筛选参数加进来 'search_name' => $_GET['search_name'] ?? '', 'search_email' => $_GET['search_email'] ?? '', 'search_city' => $_GET['search_city'] ?? '', 'search_state' => $_GET['search_state'] ?? '', 'search_support' => $_GET['search_support'] ?? '' ]; // 处理下一页链接 $nextt = $page + 100; $nextParams = $baseParams; $nextParams['page'] = $nextt; $nextQuery = http_build_query($nextParams); if ($sno > 100) echo '<a href="?'.$nextQuery.'"><b>Next</b></a>'; // 处理上一页链接 $prev = $page - 100; $prevParams = $baseParams; $prevParams['page'] = $prev; $prevQuery = http_build_query($prevParams); ?> <?php if ($prev >= 0) echo '<a href="?'.$prevQuery.'"><b>Previous</b></a>'; ?>
额外注意事项
- SQL注入防护:永远不要直接把用户输入的参数拼接到SQL语句中,一定要用转义函数或者PDO预处理语句(更推荐),避免被攻击。
- 通用化参数收集:如果筛选条件很多,可以用循环遍历
$_GET,排除page、controller、action这些固定参数,自动收集所有筛选参数,后续新增筛选条件时不用修改翻页代码。 - 表单回显:记得在筛选表单的输入框中回显当前的筛选值,比如
<input type="text" name="search_name" value="<?php echo htmlspecialchars($_GET['search_name'] ?? ''); ?>">,这样用户翻页时能看到当前的筛选条件。
内容的提问来源于stack exchange,提问作者Masum
相关产品推荐
相关产品推荐

