• 締切済み

PEAR PAGERでの大量データ処理についての質問

PEAR PAGERでの大量データ処理についての質問 お世話になっております。 <実行環境> PHP=Ver5.3.1 , db=db2 , smarty使用 例)50万レコードの名称データからある文字列のデータを抽出して画面表示させるPHPですが、   1画面に表示するデータ件数=20件とした場合、抽出されたデータが1万件あった場合、   ページ数=10000/20=500ページになります。 現在、上記例の場合はデータ抽出とページ作成に長時間掛かり、使用に耐えません。 そこで時短策についてご存知の方、よろしくお願いいたします。 <基本的な質問> PEAR PAGERは対象データとして抽出された結果データ(配列)に対してのページング機能と 理解してよろしいですか? <問題解決策の質問> 小生が解決策として考えたのは下記2点なのですが、 1)抽出データのSELECT時にFETCH FIRST 500 の様に、表示対象データ件数を固定してしまい、   それ以上は新たに検索キーワードを入力し直す方法・・・これだとページは25ページで終了。 2)抽出データのSELECT時にBETWEEN m AND n の様にm件目からn件分と定義して置き、   PHPで”次頁”、”前頁”を押した時にPEAR PAGERを抜出してSELECT文を設定し直して   PEAR PAGERを再実行させる方法・・・これだとPAGERはいらない? ---------------------------------- もっと簡単でスマートな方法ご存知ありませんか? PEAR PAGERの有効な使用方法をご教授頂けると幸いです。 *質問文が解り辛かったらお詫びいたします。

みんなの回答

noname#243182
noname#243182
回答No.1

ライブラリのドキュメントに問題解決の方法が記載されております。 導入 > Pager と巨大な DB 結果セット http://pear.php.net/manual/ja/package.html.pager.intro.php サンプルコードの入ったディレクトリはご自身の環境に読み替えてください。 更に参考サイトとして外部リンクが提供されており、おそらくこれがズバリの方法です。 データベースの結果を効率よくページ化する方法 http://www.alberton.info/pear_pager_tutorial_database_results.html Pager は、データの配列にページを付けるクラスであると紹介されているので、ついその方法しかないように考えがちですが、データの配列そのものをパラメタとして与える以外にもページを付ける方法があるということです。 Pager::getOffsetByPageId(非推奨) http://pear.php.net/manual/ja/package.html.pager.getoffsetbypageid.php Pager::getPageRangeByPageId http://pear.php.net/manual/ja/package.html.pager.getpagerangebypageid.php オフセットを利用してデータベースに問い合わせをすることで結果セットも小さくなり、レスポンスは格段に良くなるでしょう。

参考URL:
http://pear.php.net/manual/ja/package.html.pager.intro.php
syosin-oyaji
質問者

補足

samchay様、早々のご教授ありがとうございました。 ご案内のサイトを拝見させて頂きましたが、私は英語が苦手なので全然理解出来ませんでした。 とりあえず、ソースをコピーして実行してみます。(自信ない・・・) *とにかく手掛かりになりそうです。後日結果を報告したいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • pearのpagerでDB表示

    phpでpearのpagerでDB(mysql)表示できますか? ひとりずつの情報を表示したいのですが。

    • 締切済み
    • PHP
  • データの表示の仕方について教えてください(PEAR PAGERの使い方)

    PHP5.2.4 MYSQL14.12DISTRIB5.0.4 WINXP IE=6.0 PEAR PAGERを使って、1ページに10件ずつ表示されるようにしたくて、下のようなコードを書きました。不具合として、1ページ目の10件表示はされるのですが、2ページ目、3ページ目といどうさせても表示が1から10件目とおなじになります。結果セットからのデーターの表示の仕方がおかしいと思ってるんですが、どういうふうにしていいのか 全く判りません。どなたか、素人にも判るようにご教授いただけたらと思います。宜しくお願いいたします。 <?php require_once 'Pager/Pager.php'; $totalItems = 47; $perPage=10; /*ページャーのパラメーター設定 モード:スライディング ページごとの表示数(perpage)カレントページの前後の表示ページ数(dalta)アイテムの数(totalitem)  */ $params = array( 'mode' => 'sliding', 'perPage' => $perPage, 'delta' => 5, 'totalItems' => $totalItems ); /*ページャーインスタンスの生成*/ $pager =& Pager::factory($params); /*ページのデータの取得*/ $links = $pager->getLinks(); print($links["all"]); /*現在のページ番号を取得して配列に入れる*/ $currentPageID = $pager->getCurrentPageID();  /*ページIDのオフセット値を返す*/ $index=($currentPageID-1)*$perPage+1;          if($rows==0){ /* 取り出すデーターがないとき、エラーメッセージを表示 */    print "該当するデータが見つかりませんでした。\n";  }else{ for($i=$index;$i<$index+$perPage;$i++){   if($i<=$totalItems){ $row=mysql_fetch_array($result) ?> <div align="center"> <TABLE border="1"> <TR> <TD colspan="2" width="500" align="center"><?=$row["e"] ?></TD> </TR> <TR> <TD height="45"><?=$row["setumei"] ?></TD> </TR> </TABLE><br><br> <div> <?php } } } ?>

    • 締切済み
    • PHP
  • PEAR Pagerについて

    PHP Pagerのスクリプトを作成したのですが、うまく動きません。 DBに接続、検索、表示、までは動作確認できたのですが、Pagerを作成してからエラーが出るようになってしまいました。検索データ格納らへんがうまくいってないような気がするのですが・・・・。 DB Error: syntax error が出てしまいます。 どなたかアドバイスの程宜しくお願いします。 $result=$conn->query($sql); if(DB::isError($result)){ die($result->getMessage()); } $count=$result->numRows(); print"店舗数は".$count."件です"; while($rs=$result->fetchRow(DB_FETCHMODE_ASSOC)) { require_once('Pager/Pager.php'); $options = array( "totalItems" => $count, "perPage" => 3, "delta" => 5, "urlVar" => "pageNo" ); $pager =& Pager::factory($options); $navi = $pager -> getLinks(); $tenpo_name = $rs['tenpo_name']; print("{$tenpo_name}"); } ?>

    • ベストアンサー
    • PHP
  • PEAR::Pagerでチェックボックスデータを保持したいです。

    PEAR::Pagerでチェックボックスデータを保持したいです。 CentOS 5.0 PHP 5.1.6 携帯サイトを作っています。 画像を一覧で表示しているページで、各画像に チェックボックスを付けチェックの入った画像を 次のページで表示しています。 登録されている画像が10枚以上ある場合は、 PEAR::Pagerを使ってページングしているのですが、 2ページ目、3ページ目と遷移した場合にチェックボックスの データを保持する方法をご教授願いたいのです。 ページングはaタグでリンクしていますので、POSTの値を 保持する方法はどうしたもんかと・・・。 携帯なのでjavascriptも使えないので大変困っております。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • Pager::factory()の使い方がわかりません

    PHP5&MySQL5&XP,pear::DB接続 Pager::factory()を使用し、1ページに1件ずつMySQLからのデータを 表示させようとしています。 下記プログラムから、DBのフィールドidとquestuionを表示させたいのですが、 うまくいきません。 ご教授いただけると幸いです。 <? session_start(); ?> //--セッション開始しログイン中の方の名前を表示させています <?php require_once 'Pager/Pager.php'; //DBに接続 include_once('connection.php'); $sql="select * from examin ORDER BY RAND() LIMIT 20"; $res = mysql_query($sql); $i=1; while($row = mysql_fetch_assoc($res)) { $data_list[] = array( "id"=>$row["id"], "question"=>$row["question"] ); } //Pagerへのデータ割り当て処理 $perPage=1; $params=array("perPage"=>$perPage, "itemData"=>$data_list); $o_page=Pager::factory($params); foreach($o_page->getPageData() as $item){ $data_list_for_page[]=$item; } //--ここから先がわかりません。 ?>

    • ベストアンサー
    • PHP
  • PEAR Pagerを利用してデータの管理をしたいのですが・・・

    Pagerを使ってページ送り機能を自分のホームページに用いたいと思っています。 いろんなサイトを参考にして調べているのですが、理解できなくて困っています。何を勉強して、何を用いるのかという時点です。 どういう知識を身につければいいのかわかる方いらっしゃいましたら教えてください。よろしくお願いします。 ちなみに私がしたいことは、テーブルにのせたデータを100個作って、1ページにつきそのデータを5件ずつ表示させることです。 これはPagerでも可能でしょうか。 またページのデザインはメニューはPHP、デザインはCSSによって行っています。このファイルにpagerを組み込むことはできるでしょうか? 初心者的な内容かもしれませんがよろしくお願いいたします。

    • 締切済み
    • PHP
  • PEARのPagerによるページ番号について

    PEARのPagerを利用して、ページ番号を表示させているのですが、通常1 2 3・・のようにページ番号が表示されますが、これを「2」から表示させることは可能でしょうか? Pagerによって割り振られた2ページ目からということでなく、単に数字の始まりを「2」からにしたいのです。 2 3 4 ・・・と1を表示させずに2から表示させることは可能でしょうか? ご回答宜しくお願い致します。 例) ●通常 1 2 3 4 5 6 NEXT>> ●2から始めたい 2 3 4 5 6 NEXT>>

    • ベストアンサー
    • PHP
  • PHP PEARのPagerをSmartyで使う

    初めまして、PEARのPagerを勉強していたのですが、Smartyで実装したいと思い試行錯誤していたらうまく表示されなくて困っています。 【PHP】 //PEARの読み込み、Smartyクラスの読み込み、MySQLクラスの読み込みは省略 //上記は正常に動作しています。 // テーブルの行数を数えます $sql = "SELECT COUNT(*) AS cnt FROM table_name;"; //レコード開始位置指定 $start = 0; //最大レコード数を指定 $limit = 10; // データを取り出すSQLを実行します。 $sql = "select * from table_name ORDER BY no DESC LIMIT $start, $limit"; $result = mysql_query($sql); while($rows = mysql_fetch_array($result)){ $res_data[]=array("title"=>$row['title'],"name"=>$row["name"],"no"=>$row["no"]); } //Pagerのパラメータを指定 $params = array( "itemData" => $res_data, "totalItems" => $limit, "perPage" => 6, "delta" =>5, "mode" =>"Jumping" ); //パラメータの連想配列を受け取る $pager =& Pager::factory($params); // ページデータの割り当て処理 foreach($pager->getPageData() as $item){ $res_data_page[] = $item; } //戻る/次/最初/最後のリンクとページリンクを返す $link = $pager -> getLinks(); //現在のページ番号を返す $currentPageID = $pager -> getCurrentPageID(); // テンプレート用に変数を設定 $smarty->assign('data', $res_data_page); $smarty->assign('pageNavi', $link['all']); $smarty->assign('currentPage', $currentPageID); ■tpl <table border="1"> <tr> <th>名前</th> <th>NO</th> <th>タイトル</th> </tr> {foreach from=$data item=i} <tr> <td>{$i.name}</td> <td>{$i.no}</td> <td>{$i.title}</td> </tr> {/foreach} </table> <p>{$pageNavi}</p> <p>{$currentPage}ページを表示</p> 参考URL http://meerweb.blog7.fc2.com/blog-entry-101.html データベースへの接続は出来ていて、ページャー機能は動いています。 取得しているデータ数もあっているのですが、全部1行目のデータだけ表示されます。 どなたか原因が分かる方いらっしゃいましたら、是非ともご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP Pagerで行き詰っています。

    PHP Pagerの使用で、下記2点で行き詰っています。 (1)1ページ内に10件までしか表示させたくないのに、全件表示される (2)DBからの取得データ数をtotalItemsに格納し、それをもとにナビを作成したい ソースは以下です。 どうかご助力いただけますと幸いです。 よろしくお願いいたします。 ------------------------------------------------------------ hogehoge.php ------------------------------------------------------------ <?php require_once("Smarty.class.php"); require_once("../PHP/PEAR/Pager/Pager.php"); $objSmarty=& new Smarty(); $s=mysql_connect("hoge","hoge","hoge") or die("失敗しました"); mysql_select_db("hoge",$s); $sql = "SET NAMES utf8"; $result = mysql_query($sql); $ra=mysql_query("select * from stylenavi_1 where url4 LIKE '/01.php'and url3 like '/syokuji'"); $rb=mysql_query("select * from stylenavi_1 where url3 LIKE '/syokuji'");//この行で取得したデータ数をitemDataに格納したい。 $rc=mysql_query("select * from stylenavi_1 where url1 LIKE '/diethow'"); while ($ra2 = mysql_fetch_array($ra)) { $objSmarty->append('data1',$ra2); } while ($rb2 = mysql_fetch_array($rb)) { $objSmarty->append('data2',$rb2); } while ($rc2 = mysql_fetch_array($rc)) { $objSmarty->append('data3',$rc2); } $itemData = $hogehoge;//どうやって反映させよう・・ $perPage = 10; $params = array( "itemData" => $itemData, "perPage" => $perPage, "delta" =>5, "mode" =>"Jumping" ); $pager =& Pager::factory($params); $link = $pager -> getLinks(); $currentPageID = $pager -> getCurrentPageID(); $objSmarty->template_dir="../templates/"; $objSmarty->compile_dir="../templates_c/"; $objSmarty->assign('pageNavi', $link['all']); $objSmarty->assign('currentPage', $currentPageID); mysql_close($s); $objSmarty->display("itiran_page.tpl"); ?> ------------------------------------------------------------ hoge.tpl ------------------------------------------------------------ {section name=diet loop=$data2} //ここでPerPageで指定した数だけ繰り返したいのに全件表示される ◇<a href="{$data2[diet].url}">{$data2[diet].title}</a><br /> ダイエットの手軽さ:{$data2[diet].tegarusa}<br /> 危険性:{$data2[diet].kikensei} <br /><br /> {/section}

    • 締切済み
    • PHP
  • PEARのPagerの設定の仕方

    初心者です。 ホームページでDBを利用しているのですが、データ量が多くなるのでページ送り機能をつけたいのでどうすればいいか探していたところ、PEARのPagerを使えばできるとわかりました。 しかしどうもうまくいきません。 Pagerのフォルダもきちんとアップロードしてやってみたのですがうまくいきません。 やりたいのは登録数300件のデータベースの検索結果で、10件ごとにページ送りします。ページ送りは検索結果の最下部におきたいです。 以下のソースのどこに加えればいいか教えていただけないでしょうか。 何度も試してみたんですが、ページ送りしてくれないのです。 よろしくお願いいたします。 <?php extract($_POST); 検索項目のフォーム×3 if($sig=="kb"){ mysql_connect('ほにゃらら','データベース名','パスワード'); mysql_select_db('データベース名'); 検索区分 //クエリの作成 $sql = "select * from データベースの項目 where "; if($wxxx<>""){ 省略 } //本検索 $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ print "検索結果なし"; exit; } else { echo "<b>", $rows, "</b>件HITしました<br />\n"; while($row = mysql_fetch_array($result)){ print("<table>"); print("<tr><td scope='row' rowspan='3'>".$row[""]."</font></td><td>タイトル</td>"); print("<td>".$row["title"]."</td></tr>"); print("<tr><td>項目A<td><td>".$row["koumokua"]."</td></tr>"); print("<tr><td>項目B</td><td>".$row["koumokub"]."</td></tr>"); print("</table>");} } } ?>

    • 締切済み
    • PHP
スキャナー IX1600について
このQ&Aのポイント
  • スキャナー IX1600の利用方法、接続方法、OS対応についてご質問があります。
  • 購入予定のスキャナー IX1600で、無線接続と有線接続を両方利用することは可能ですか?
  • スキャナー IX1600の製品名はScanSnap iX1600であり、ソフトウェアはScanSnap Cloudを利用しています。
回答を見る