前回ページャーを作りましたが、あれには致命的な欠点がひとつあります。
Pear::Pagerのインスタンスに、ページングする配列をそのまま突っ込んでいる部分です。
前回は1000件だったので余裕で検索できましたが、たとえばこれが数百万件あるデータベースだったりした場合、全部読み込んだりしようものならメモリが死にます。
そのような場合のため、件数の数値だけでページャーを作成できます。
pager_int.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
//件数
$total_item=500000;
//Pear::Pager
require_once('Pager.php');
//ページャーのインスタンス
$params = array(
//SlidingまたはJumpingを指定
'mode' => 'Sliding'
//1ページあたりの件数
,'perPage' => 100
//前後に表示する件数
,'delta' => 5
//件数
,'totalItems' => $total_item
//Aタグのclass名を指定する、CSS等で利用
,'linkClass' => 'linkClass'
);
$pager = Pager::factory($params);
//ページャーの状態について調べられる
//現在のページ
print($pager->getCurrentPageID().'<br />');
//全ページ数
print($pager->numPages().'<br />');
//現在のページのデータは当然取得できない
//var_dump($pager->getPageData());
//リンクを作成
$links = $pager->getLinks();
//表示
//一個前に
print($links['back'].'<br />');
//一個後に
print($links['next'].'<br />');
//ページャを表示
print($links['pages'].'<br />');
//一番前に
print($links['first'].'<br />');
//一番後に
print($links['last'].'<br />');
//上記全部
print($links['all'].'<br />');
//データそのものは、別途取得する
$limit_from=$_REQUEST['PageID']*100-100;
$ret=$PDO->query('select * from table limit '.$limit_from.' , 100'));
|
itemDataに配列そのものを渡すかわりに、totalItemsに件数を渡します。
この場合Pager::getPageData()でデータを取得することができないのでデータそのものは別途自力で取得する必要がありますが、全件を取得しないので動作は軽くなります。
実際に使用する場合は、まずSELECT COUNT(*)で件数を取得、SELECT * で実際の内容を取得、totalItemsに取得した件数を突っ込んでページャーを作る、という順番になるでしょう。
PR
トラックバック
トラックバックURL:
$pagerのどこかから開始件数終了件数が取得できたはずなので
そっちを使うといいです。