忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/22 22:51 |
PHP1-76:PHPでページャーつづき

前回ページャーを作りましたが、あれには致命的な欠点がひとつあります。
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
<?php
    
    //件数
        $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


2009/05/19 13:50 | Comments(1) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

$limit_fromを$_REQUEST['PageID']から作ってるのはあまりよくないな。
$pagerのどこかから開始件数終了件数が取得できたはずなので
そっちを使うといいです。
posted by NurseAngel at 2011/03/31 02:36 [ コメントを修正する ]

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-77:出力バッファリング | HOME | PHP1-75:PHPで可変変数>>
忍者ブログ[PR]