gpt4 book ai didi

php - 分页 : storing result in $_SESSION or querying every page separately 时明显更好的是什么

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:33 25 4
gpt4 key购买 nike

假设我有一个包含大量数据的数据库,用户可以从中搜索。
典型搜索的结果通常约为 20-100 行,然后对其进行分页(每页 20 行)。

我想到了两种方法来处理这些页面的导航,想知道这些方法是否有任何优点和/或缺点,以及是否有更好的选择。

  1. 查询一次,将结果存储在$_SESSION 变量中,并根据当前页面过滤行。我想出这个的原因是为了使数据检索一次,而不必为用户导航的每个页面连接到数据库。我不知道它比我提出的其他替代方案更好还是更差。

    session_start();

    $search = rawurldecode($_GET['search']); //search word
    $interval = rawurldecode($_GET['interval']); //rows per page
    $page = rawurldecode($_GET['page']); //page

    $min_row = $interval * ($page-1)+1;
    $max_row = $interval * $page;

    //query if (no results stored or first page) && the current search is not the previous search
    if((empty($_SESSION['SEARCH_RESULTS']) || $page == 1) && $_SESSION['SEARCH_RESULTS']['TERM'] != $search){
    $_SESSION['SEARCH_RESULTS'] = array();
    $_SESSION['SEARCH_RESULTS']['TERM'] = $search;

    $query = "exec usp_Search '$search'";

    $dbh = new DBH;
    $dbh->Connect()->Query($query);

    while($row = $dbh->Fetch_Array()){
    $_SESSION['SEARCH_RESULTS']['ROWS'][] = $row;
    }
    }

    for($j = 0; $j < count($_SESSION['SEARCH_RESULTS']['ROWS']); $j++){
    $row = $_SESSION['SEARCH_RESULTS']['ROWS'][$j];

    //ignore all other rows not on the page
    if($j < ($min_row-1) || $j > $max_row) continue;

    //print stuff
    }
  2. 逐页查询。查询和分页非常简单。

    //Query
    $search = rawurldecode($_GET['search']);
    $interval = rawurldecode($_GET['interval']);
    $page = rawurldecode($_GET['page']);

    $min_row = $interval * ($page-1)+1;
    $max_row = $interval * $page;

    $query = "exec usp_Search '$search', $min_row, $max_row";

    $dbh = new DBH;
    $dbh->Connect()->Query($query);

    while($row = $dbh->Fetch_Array()){
    //print stuff
    }

来自备选方案的 SQL 过程

  1. 只是一个带有 SELECT 查询的过程

    SELECT 
    COL1,
    COL2,
    COL...
    FROM TABLE1
    WHERE (
    COL1 LIKE '%'+@search+'%' OR
    COL2 LIKE '%'+@search+'%' OR
    COL... LIKE '%'+@search+'%'
    )
  2. 是一个创建临时表然后从变量开始到结束选择行的过程。

    SELECT 
    COL1,
    COL2,
    COL...,
    ROW_NUMBER() OVER (ORDER BY COL1) AS [ROW_NUMBER]
    INTO #result
    FROM TABLE1
    WHERE (
    COL1 LIKE '%'+@search+'%' OR
    COL2 LIKE '%'+@search+'%' OR
    COL... LIKE '%'+@search+'%'
    )

    SELECT
    COL1,
    COL2,
    COL...
    FROM #result
    WHERE ROW_NUMBER BETWEEN @row_start AND @row_end

最佳答案

您确实不能将所有结果存储在 _SESSION 中,原因至少有几个:

  • 用户可以同时进行多项搜索
  • 搜索结果可能会在用户的页面加载之间发生变化。

第二点取决于您更新数据库的频率,但需要考虑。第一个是主要的,但如果您以巧妙的方式存储 session (但您也不希望 _SESSION 变得太大),您也可以绕过它。这与性能无关。

关于一次获取所有结果并存储到 _SESSION 的另一个考虑因素是,您的大多数用户每次访问可能只发出一个搜索请求。我知道您想认为他们将始终查看所有 100 个结果,但如果这些结果中的很大一部分甚至没有被使用,那么您只是为了保存一两个查询而浪费了很多。由您决定用户如何导航。


在了解到这只会被 20-30 人使用并且每天只有 70 行后,我很满意地说您此时正在浪费时间尝试提高性能。寻找在发生重大变化时更容易更新的代码。

关于php - 分页 : storing result in $_SESSION or querying every page separately 时明显更好的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com