2017-10-31 10 views
1

私はいくつかの古いコードを見ていて、いくつかの援助をしたいと思います。ページング方程式の基本的な問題

私の質問のすべてはページネーションに関連しています。

まず、次のクエリでは、合計ページ数を計算しています。 $itemsperpage=40 here

$rs0=mysqli_fetch_array(mysqli_query($dbh,"select floor(count(1)/$itemsperpage)+1 as pages from scx_media where scx_media.mediaid in (select mediaid from animated_gifs where status>0)")); 

なぜこれを床に置き、1を追加するのですか?第二に

、我々はスタートの変数を作成し、コードのこの部分で

(SQLクエリで使用されます)。

$page=(int)$_GET['page']; 
$pages=$rs0[pages]; 
if($page>$pages)$page=$pages; 
$start=($page-1)*$itemsperpage; 

なぜ私たちはページから1を引いたのですか? 0から始めるので、マイナス1にする必要がありますか?

そして最後に、

は、我々は40 itemsperpage item count is 40 as wellを持っているとしましょう。この構成ではwe'd have a second page with no dataが最初のページに40項目を表示し、ページごとの要件を満たしているためページ計算に応じて2ページ目が表示されますが、レコードはありません。 どうすればその問題を解決できますか?

+1

などのアプリケーション層(PHP)で$pagesNumberを計算することができます_ _あなたの推測では、合理的なようだが、のどれも「私たちマイナスページから1をなぜ?」私たちはあなたのレガシーコードがどのように動作するかを知っています。 –

+0

一般的に私は他の伝統的なコードで見たことがあります... "なぜ私たちはページから1を引いたのですか?" SQLのLIMITが最初の一致の場合は0から始まる必要があるためです。 - 編集 - ...実際それは間違って聞こえる。確かにLOLを知るためには、SQLとコードをもっと必要とします。 – IncredibleHat

+2

_ "どうすればその問題を解決できますか?" _ MySQLを使用している場合は、 'SQL_CALC_FOUND_ROWS'を参照してください。 –

答えて

1

40の結果があり、1ページに40のアイテムが表示されているとします。 結果が40ページの1ページが必要になります。

コードを「再生」します。あなたのユーザーがpage.phtmlを尋ねるページ= 1:?結果で0ショー40 を開始し、あなたが提供するべきではありません:

$page=(int)$_GET['page'];   # $page = 1 
$pages=$rs0[pages];     # $pages = 1 
if($page>$pages)$page=$pages;  # 1 > 1, no so no change 
$start=($page-1)*$itemsperpage;  # $start = (1 - 1) * 10 = 0 

だから、1ページに表示する最初の項目は0 1ページになりますユーザーに "次のページ"!

あなたのユーザーがpage.phtmlを尋ねる?ページ= 2

$page=(int)$_GET['page'];   # $page = 2 
$pages=$rs0[pages];     # $pages = 1 
if($page>$pages)$page=$pages;  # 2 > 1, yes so $page = 1 
$start=($page-1)*$itemsperpage;  # $start = (1 - 1) * 40 = 0 

だから、$ページは$ページより大きい場合、あなたが戻ってユーザーを強制?ページ= 1、$再び結果0番から開始。

select floor(count(1)/$itemsperpage)+1 as pages ... 

はそれがあるべき:

select ceil(count(1)/$itemsperpage) as pages ... 
+0

しかし、私の問題は、$ページ床(40/40)+1が2なのでページ1をリクエストすると2になります空白のページがあるので – jkushner

+0

私の答えが確定しました – Nic3500

0

私は2つのURL変数で私のページネーションをやってる$_GET['page']$_GET['pageSize']

SQLについては

...実際にはよさそうです例えば、/users?page=5&pageSize=30

$query =" 
SELECT SQL_CALC_FOUND_ROWS * 
FROM 
    user 
LIMIT ? 
OFFSET ? 
"; 
$variables = [$_GET['pageSize'],$_GET['page']]; 
// don't forget to sanitize the pageSize , for example allow only (15,30,50) 
//then get the total found rows right after 
$query = "SELECT FOUND_ROWS()"; 

これは、MySQLがページサイズを計算し、アプリケーション層で行われるべき多くのものを行う作るよりも、改ページがはるかに容易になります。しかし、項目数がページあたりの項目数に等しいときに余分な空のページを取得する問題を解決するには、SQL文に余分な条件を追加して、除算に余裕がある場合のみ1を加算します。

この

select (CASE WHEN floor(count(1)%$itemsperpage) THEN floor(count(1)/$itemsperpage)+1 ELSE floor(count(1)/$itemsperpage) END) 

にこの

select floor(count(1)/$itemsperpage)+1 

Modulo "%" operation

を参照してください変更しかし、私が言ったように私はDATABを使用することはありません必要なページ番号を計算するためのこのような作業を行うサーバ。これはアプリケーション層の作業です。私もクライアント側でそれを行う。


EDIT: あなたはこの

$result = $mysqli->query("SELECT FOUND_ROWS() found_rows"); 
$foundRows = $result->fetch_array(MYSQLI_ASSOC)['found_rows']; 
$pagesNumber = ceil($foundRows/$itemsperpage); //thanks to Nic3500 answer 
+0

データベースの代わりにアプリケーション層でこれを行う方法の詳細を教えてください – jkushner

+0

@jkushnerは答えは –

+0

です。どうもありがとう – jkushner