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

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, "查询失败,请重试。");
    }
}

注意事项

  1. 两种方案都保留了你原有的SQL预编译和参数绑定逻辑,可有效防止SQL注入
  2. Session方案需确保页面最开头调用session_start()
  3. GET方案不适合携带敏感参数(如密码),但搜索类场景完全适用
  4. 你的Smarty分页代码无需修改,$query_string会自动包含所有查询参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:10:39