- ベストアンサー
ページング機能について
- オブジェクト指向でページング機能と件数表示をする方法を教えてください。
- ドットインストールのページング機能と件数表示のサンプルソースを使って学んでいますが、うまく実装できません。
- 他のサイトでも調べてみましたが、うまくいかず困っています。どのようにすれば実装できるでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
何か所か修正を行ったので、最新版をDLしてください。catchブロックの中が以前より簡単になっていると思います。 https://github.com/Certainist/sns_php 動画見ましたが、これページング処理としては典型的にダメな方法なんですよね。SQL_CALC_FOUND_ROWSオプションと、FOUND_ROWS関数を利用するのが正解です。 http://blog.goo.ne.jp/shinx1265/e/7e173ab99d4fe541c75a9ea4bfbbdf5e こんな感じでクラスにメソッドを実装してみてはどうでしょうか。 http://pastebin.com/89pjMn62 (OKWave内では全角スペースインデントしているので注意) public function getComments($page) { // 必ず1以上の整数になるようにする $page = max(1, (int)$page); // 開始オフセット $offset = COMMENTS_PER_PAGE * ($page - 1); // SQL実行 $stmt = $this->pdo->query(sprintf( implode(' ', array( 'SELECT CALC_FOUND_ROWS *', 'FROM `comments`', 'LIMIT %d, %d', )), $offset, COMMENTS_PER_PAGE )); // コメントを取得 $comments = $stmt->fetchAll(); // 現在件数を取得 // (PDOのコンストラクタでMYSQL_ATTR_USE_BUFFERED_QUERYを // 有効化しているときだけSELECTに対してrowCountメソッドが使える) $current_count = $stmt->rowCount(); // 総件数を取得 $whole_count = (int)$this->pdo->query('SELECT FOUND_ROWS()')->fetchColumn(); // メッセージ作成 $message = sprintf('全%d件中、%d件から%d件まで表示しています', $whole_count, $offset + 1, $offset + $current_count ); // 情報を連想配列で返す return array( 'comments' => $comments, 'message' => $message, ); } ちなみに私がスクリプト内で使用しているfilter_struct_utf8関数を使ってページパラメータをGETで受け取るならば extract(filter_struct_utf8(INPUT_GET, array( 'page' => '', ))); でいいと思います。どうせメソッド側でどんな値が来ても無理やり1以上の整数に変換するのでこの程度で構いません。むしろこの関数に頼らなくても、「配列を整数にキャスト」するのは「配列を文字列にキャスト」するのと違ってNOTICEエラーが発生しないので、このような場合においては最低限未定義かどうかのチェックを行うように $page = isset($_GET['page']) ? $_GET['page'] : ''; としても十分です。
お礼
まさかまたご回答頂けるとは光栄です。しかも最新版にしていただいて申し訳ないです>< 初心者で学ぶのにドットインストールをおすすめされたので参考にしていたのですがページングのところは別の方法がいいなど、一人では中々気づけないので非常に嬉しいアドバイスです。 回答も説明込みでしていただき、早く一人で解決できるようになり、回答者側へなりたいと思います。 しばらくは助けてくださいばかりになりますが、お時間がありましたらお付き合いいただければ光栄です。 最新版をダウンロードさせて頂き勉強させて頂きます。 ありがとうございましたm(_ _)m