• ベストアンサー

各ページ、値の大きい順に3件ずつ、表示できるようにし、ページ分けしたい。

PHP5、SQLite2.8の環境で作業をしています。 ■データ R:大きい順(1,2,3...) I:ID(1987~等) N:名前(りんご~等) R  I  N --------- 1 1987 りんご 2 1789 ごりら 3 1323 らっぱ --------- 4 1045 パイナップル 5 956 ルビー 6 448 ビー玉 --------- 7 311 マントヒヒ 8 259 ヒトデ 9 177 電池 --------- 10 123 ちくわ 11 101 わんこ 12 97 こども --------- 13 64 モモンガ 上記データを、3項目ずつ区切り(※「--------」が区切り線です)、 IDの大きなグループ順に、1ページ目、2ページ目、、、と、 ページ分けしたいのですが、この場合、 SQL文(特に、お分かりになるのであれば、SQLite)では、 どのようなロジックで書き表すことができますでしょうか。 以上、どなたか、よろしくお願い致します。 --------ここから下は、読んで頂かなくても結構です。---------- ちなみに、ID値が「飛び飛び」になっているのは、 ID値の途中の値を適宜削除(DELETE文)していたりするからです。 ID値が飛び飛びではない場合の方法であれば私にも作ることができ、 また、その方法で実際に作って動かしていたのですが、 その後、スクリプトに削除処理機能(DELETE文使用)を加えたところ、 前述の通り、ID値が飛び飛びとなり、 その結果、スクリプトが思わぬ動きをするようになってしまったので、 このような質問をさせて頂きました。 -------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • level2012
  • ベストアンサー率63% (12/19)
回答No.1

雰囲気だけですけど $get = 1; if(isset($_GET['get'])){$get = specialcharset($_GET['get']);} if($get != 1 || $get != null){ $offset = ($get-1)*3; $limit = $offset+3; } select * from table OFFSET=$offset LIMIT=$limit order by I desc; print <a href="index.php?get=1"><a href="index.php?get=2"><a href="index.php?get=3"> こんな感じです。動きませんよ。

march4
質問者

お礼

ありがとうございます。 頂いたアドバイスを参考に、 こんなコードを考えてみました。 上記の例では、3要素ずつ区切ってますが、 以下の例では、50要素ずつで区切っています。 ----------------- //各ページ、50件ずつ表示させる場合(定数 VIEW_NUMを作っても良さそう) $view_num = 50; //定数とする場合、define('VIEW_NUM',50); if(isset($_GET['page'])){ $page = htmlspecialchar($_GET['page']); } //1ページ目の処理 if($page ==1){ $top_id = 0; } //2ページ目以降の処理 elseif($page != 1 || $page != null){ //(例)$page ==2の場合、$top_id==49になる。 //この時、(49+1)番目、つまり、50番目のデータがページトップに表示される。 $top_id = ($page-1)*$view_num-1; } //以上より、クエリはこうなるのかな? $query = "SELECT FROM tbl_auc ORDER BY id desc LIMIT $top_id,$view_num"; //クエリに定数を入れることはできるのだろうか。 //例えば、$view_numの所に、VIEW_NUMを入れる等。 ---------------------- これ、どんなでしょうね?

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

>クエリに定数 というより、文字列の変数展開部に定数を置くという意味なら、そのまま置き換えても、定数は展開しません(展開の目安となる$がないので)。文字列連結してください。 $query = "SELECT FROM tbl_auc ORDER BY id desc LIMIT $top_id," .VIEW_NUM; それから「2ページ目以降の処理」のところ、エラーではないですが、既に$page ==1ではないからelseif に分岐しているので、$page !=1 を再度調べる必要はありません。 条件分岐の全体像を、見渡すようにしてください。

march4
質問者

お礼

>文字列連結してください。 そうでした! 初歩的なことをすっかり忘れていました…。 でも、とても助かりました。ありがとうございます。 >既に$page ==1ではないからelseif に分岐しているので、$page !=1 を再度調べる必要はありません。 こちらも、おっしゃる通り、無駄な分岐条件「$page !=1」を書いていました。 全く、お恥ずかしい。^^; 実際、本問で質問している内容のスクリプトを 力業で作ってみたのですが、なかなか大変でした。。汗 私の作り方がヒドイのか、長く、ごちゃごちゃなコードになってしまいました。 実際、このようなスクリプトは、それほど簡単には作れないものなのでしょうか。 私の技量不足なのか、扱っているテーマが結構複雑なのか、 私1人では判断できずにいます。^^; ちなみに、私の作ったものですと、コード行数が、 150行弱(コメント行も含め)くらいになりました。 ただ、なんとなく不完全な出来なので、この方針で完成させるとなると、 実際には、さらに多くの行数を必要とするのかもしれません。

  • level2012
  • ベストアンサー率63% (12/19)
回答No.2

変数を定数にするのは、試してないですが動くのでは?その環境があるのなら試されては、そしてレスして下さい。 話は戻りますが、その他に例えばページ数がたくさんあるとすると、 すぺてのページのリンクをはるの現実的ではないですね。

march4
質問者

お礼

>ページ数がたくさんあるとすると、 すぺてのページのリンクをはるの現実的ではないですね。 はい、ある程度ページが増えてきたら、 1・2・3・4・5 … というようにページリンクに「…」を設け、 この「…」の部分をクリックすることで、さらに次のページリンク群である、 … 6・7・8・9・10 … が表示されるように、コードを組むつもりです。 この点については、これで問題ないかなと思っています。

関連するQ&A

専門家に質問してみよう