ユーザーが検索できる大量のデータを含むデータベースがあると想像してみてください。
通常の検索の結果は、通常、約20〜100行で、その後ページ分割されます(1ページあたり20行)。
私はこれらのページのナビゲーションを処理するための2つのアプローチを考えました。これらに賛否両論があるかどうか、そしてより良い代替案があるかどうかを知りたいと思います。
一度クエリを実行し、結果を変数に保存し、
$_SESSION
現在のページに従って行をフィルタリングします。私がこれを思いついた理由は、ユーザーがナビゲートするすべてのページでデータベースに接続することなく、データを1回取得するためでした。私が思いついた他の選択肢よりも良いか悪いかはわかりません。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 }
ページごとにクエリします。クエリとページネーションは非常に簡単です。
//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プロシージャ
SELECTクエリを使用した単なるプロシージャです
SELECT COL1, COL2, COL... FROM TABLE1 WHERE ( COL1 LIKE '%'+@search+'%' OR COL2 LIKE '%'+@search+'%' OR COL... LIKE '%'+@search+'%' )
一時テーブルを作成し、変数の最初から最後まで行を選択するプロシージャです。
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