[PHP-users 314] Re: 「次の50件」みたいにするためには?

Y.Watanabe php-users@php.gr.jp
Thu, 28 Jun 2001 11:09:11 +0900


渡辺です。

みなさんいろいろとヒントありがとうございます。

「マンモス本にサンプルが・・・ないぞ?」などと思いながら
僕がペラペラめくっていた本はシーラカンス本であることに
気づくのに20分ほどかかりました。(苦笑)
俺って疲れてんのかなあと思いつつ
本屋までテクテク歩いてマンモス本買ってきました。

そんなことはさておき、いくつか方針が立ってきました。

(1) offsetとlimitの値を計算しつつそれをsession変数か
    あるいは <input type=hidden...>にでも入れて「前へ」
    「次へ」のsubmitボタンをつくり、「前」or「次」ページに
    行くたびにそのoffset値やlimit値を使って
    新たなSQL文を生成してpg_execし、検索結果を
    テーブルタグ等で表示する

(2) offsetやlimitを指定せずにpg_execして、検索結果全てを
    ひとつのオブジェクトに入れてしまう。つまり
    $sqlresult = pg_exec($dbcon,"select * from test_tbl");
    のように。
    で、この$sqlresultをsession変数に入れておく。
    実際に画面表示するときは$sqlresultに保存されている
    オブジェクトのうちの特定の範囲の行だけを取り出すように
    for文を書いてテーブルタグ等で表示する

上記2つのうちどっちをとるかで、またまた相談なのですが・・・

一般的には(1)がよく採用されていそうですが、
(1)の方法だと画面を見るたびにpg_execが走り、DBに負荷が
かかるような気がします。

(2)の方法だと、pg_execが走るのは一度だけです。
しかし、検索結果データ数によっては、$sqlresult の中身はかなりの
大きさになるでしょう。ということはApacheの負荷(メモリを
食いつぶすとか)につながりそうです。
それにそもそも、SQLの実行結果のようなオブジェクトを
session変数に入れることができるのか?という疑問もあります。
(できるようなできないような・・・?ご教授モトムです^^;)

(1)と(2)とで、どっちを採用すべきか?
どなたか、いま少し御知恵とご意見をいただけませんか?

ちなみに、最初のメールでは「1500件程度のデータ」と
書きましたが、実際、上記(2)のように一度に全部検索したときの
データ数は、
1レコードあたり1〜2Kくらいx600件くらい
といった量だと思います。



"Y.Watanabe" wrote on Wed, 27 Jun 2001 15:03:12 +0900
with Subject: [PHP-users 288] 「次の50件」みたいにするためには?
> 
> 渡辺です。
> このMLにはいつもお世話になっております。
> 
> 問題解決というより、参考文献やヒントがあれば
> 参考にさせて欲しいと思って投稿してます。
> 
> linux + apache + php4.0.3 + postgreSQL7.0.3 という環境で
> Webアプリケーションをつくっております。
> 
> 1500件程度のデータ(1レコードあたり1〜2kbyteくらい)が
> DB上にあって、まともにselectで出力すると
> 当然ブラウザ上では1500件全部ばぁ〜っと並んでしまいます。
> 
> 50件くらいずつ表示して、「次の50件へ」「前の50件へ」みたいに
> リンクをはるのがスマートだと思うのですが、
> 
> はて?これをやるにはselectの実行結果を複数の画面で
> 共有しなければならないのか?
> 例えば
>   $sql = "select data1,dat2,data3,data4 from test_table"
>   $result = pg_exec($dbconnection,$sql);
> と書いて、この$resultを複数の画面で
> 共有する?(・・・できないと思うが?)