PHP分页传递POST数据问题:翻页后查询结果丢失
PHP分页查询翻页结果清空问题解决方法
你的判断完全正确:核心问题是查询逻辑被包裹在isset($_POST['submit'])的条件判断中。点击分页链接属于GET请求,不会触发这个POST判断,因此查询代码不会执行,结果自然清空。下面提供两种可直接落地的解决方案:
方案一:用Session存储查询参数(适合不需要分享搜索链接的场景)
思路
表单提交时将过滤后的查询参数存入Session,后续不管是POST提交还是GET翻页,都从Session读取参数执行查询,保证翻页时条件不丢失。
修改后的PHP核心代码
// 必须在页面最开头启动Session session_start(); // 优先从Session读取查询参数,其次是POST,最后为空 $sub_id = $_SESSION['search_params']['sub-id'] ?? $_POST['sub-id'] ?? ''; $submitter = $_SESSION['search_params']['submitter'] ?? $_POST['submitter'] ?? ''; $sub_start_date = $_SESSION['search_params']['sub-start-date'] ?? $_POST['sub-start-date'] ?? ''; $sub_end_date = $_SESSION['search_params']['sub-end-date'] ?? $_POST['sub-end-date'] ?? ''; $sub_policy = $_SESSION['search_params']['sub-policy'] ?? $_POST['sub-policy'] ?? ''; $total_results = array(); $paginated_results = array(); $total_rows = 0; $results = false; // 处理表单提交:更新Session中的查询参数 if (isset($_POST['submit'])) { unset($_POST['submit']); $errors = error_check(); // 过滤空参数 $filtered_data = array_filter($_POST, function ($value) { return $value !== ''; }); // 将有效参数存入Session $_SESSION['search_params'] = $filtered_data; } // 只要Session存在查询参数,就执行查询(覆盖POST提交和GET翻页场景) if (!empty($_SESSION['search_params'])) { $query_string = http_build_query($_SESSION['search_params']); try { // 以下保留你原有的分页、查询、绑定、执行逻辑,无需修改 $per_page = 10; $page = isset($_GET['page']) ? $_GET['page'] : 1; $start_from = ($page - 1) * $per_page; $query = "SELECT * FROM submissions WHERE 1=1"; $inputs = array( 'submission_id' => $sub_id, 'submitter' => $submitter, 'policy' => $sub_policy, 'sub_start_date' => $sub_start_date, 'sub_end_date' => $sub_end_date ); // ... 此处省略你原有的WHERE子句拼接、计数查询、参数绑定、执行逻辑 $rows_found = $stmt->fetchAll(PDO::FETCH_ASSOC); $paginated_results = $rows_found; $results = true; } catch (Exception $e) { error_log("查询错误:" . $e->getMessage()); array_push($errors, "查询失败,请重试。"); } } // 可选:添加重置搜索功能 if (isset($_GET['reset'])) { unset($_SESSION['search_params']); header("Location: " . $_SERVER['PHP_SELF']); exit; }
方案二:将POST参数转为GET参数(适合需要分享搜索结果链接的场景)
思路
表单提交时,将过滤后的参数拼接成GET请求URL并跳转,这样分页链接会自动携带所有查询参数,翻页时直接用GET参数执行查询。
修改后的PHP核心代码
// 直接从GET读取查询参数(表单提交后会重定向到带GET参数的页面) $sub_id = $_GET['sub-id'] ?? ''; $submitter = $_GET['submitter'] ?? ''; $sub_start_date = $_GET['sub-start-date'] ?? ''; $sub_end_date = $_GET['sub-end-date'] ?? ''; $sub_policy = $_GET['sub-policy'] ?? ''; $total_results = array(); $paginated_results = array(); $total_rows = 0; $results = false; // 处理表单提交:转为GET请求重定向 if (isset($_POST['submit'])) { unset($_POST['submit']); $errors = error_check(); $filtered_data = array_filter($_POST, function ($value) { return $value !== ''; }); // 如果有有效参数,重定向到带GET参数的页面 if (!empty($filtered_data)) { $query_string = http_build_query($filtered_data); header("Location: " . $_SERVER['PHP_SELF'] . "?" . $query_string); exit; } } // 只要存在GET查询参数,就执行查询 if (!empty(array_filter($_GET))) { $query_string = http_build_query(array_filter($_GET)); try { // 以下保留你原有的分页、查询、绑定、执行逻辑,无需修改 $per_page = 10; $page = isset($_GET['page']) ? $_GET['page'] : 1; $start_from = ($page - 1) * $per_page; $query = "SELECT * FROM submissions WHERE 1=1"; $inputs = array( 'submission_id' => $sub_id, 'submitter' => $submitter, 'policy' => $sub_policy, 'sub_start_date' => $sub_start_date, 'sub_end_date' => $sub_end_date ); // ... 此处省略你原有的WHERE子句拼接、计数查询、参数绑定、执行逻辑 $rows_found = $stmt->fetchAll(PDO::FETCH_ASSOC); $paginated_results = $rows_found; $results = true; } catch (Exception $e) { error_log("查询错误:" . $e->getMessage()); array_push($errors, "查询失败,请重试。"); } }
注意事项
- 两种方案都保留了你原有的SQL预编译和参数绑定逻辑,可有效防止SQL注入
- Session方案需确保页面最开头调用
session_start() - GET方案不适合携带敏感参数(如密码),但搜索类场景完全适用
- 你的Smarty分页代码无需修改,
$query_string会自动包含所有查询参数
内容的提问来源于stack exchange,提问作者lnickel
相关产品推荐
相关产品推荐

