• ベストアンサー

各ページ、値の大きい順に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値が飛び飛びとなり、 その結果、スクリプトが思わぬ動きをするようになってしまったので、 このような質問をさせて頂きました。 -------------------------------------------------

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • 順番号をつけたhtmlファイルのページ推移

    順番号をつけたhtmlファイルへページ推移させたいんですが、現在のファイルの番号を取得して次ページ(++)と前ページ(--)へ数値を代入する方法がわかりません。また、最小値と最大数に達したときにindex.htmlに移動するようにしたいです。 未熟な上、書いてみましたが、動きやしません… [次ページへ] <SCRIPT LANGUAGE="JavaScript"> function.next;{ document.links[sample(i).html]; for (i=0; i<最大値; i++); } </SCRIPT> <a href="javascript:next">次へ</a> [前ページへ] <SCRIPT LANGUAGE="JavaScript"> function.next;{ document.links[sample(i).html]; for (i=0; i>0; i--); } <a href="javascript:back">戻る</a> </SCRIPT> 「もし、最大値と最小値に達したとき、index.htmlに移動する」 はわかりませんでした。 ご教授いただければ幸いです。

  • 検索結果を指定件数ずつ抽出表示したい。

    データベース(以下、DB)は、SQLite2です。 PHPスクリプトの中で利用しています。 なお、本質問はMySQLとして説明して頂いても結構です。 (恐らく、同じような方法で解決できると思いますので。) 考え方が分かりましたら、あとは自分で調べられますので、 その方向性だけを示して下さるというのでも結構です。 さて、質問に移らせて頂きますが、 DBに検索をかけ、ヒットしたレコードを、 ある特定のカラムをもとにソートし、その中の上から指定件数分抽出する ということをしたいと考えています。 例をあげます。 テーブル名(tbl_siritori) id word cate 1 りんご 食べ物 2 ごりら 動物 3 らくだ 動物 4 ダック 動物 5 くり 食べ物 6 リス 動物 7 スイカ 食べ物 8 カメ 動物 9 メロン 食べ物 というDBがあったとして、 このDBに、[cate]に「食」という文字が入っているようなデータを、 [id]順に見て、大きな数字のものを上から3件抽出したい場合、 どのような方法(SQL文)が考えられますか。 3件のデータを表示した後、 さらにそれに続く3件のデータを次ページに表示、 さらにそれに続く3件も同様にさらに次ページに表示…(略) ということをしようと思っています。 1ページに3件、で、何ページにも渡ってデータを3件ずつ出力していく、ということです。 以上のことを実現可能であるSQL文の中でも、 最も一般的なものを教えて下さい。 $query = "SELECT * FROM tbl_siritori WHERE (cate LIKE '%食%') ~~ごにゃごにゃ~~ ORDER BY id DESC"; というような書き方で、1文で解決できるものと思っていますが、 複数の文で絞り込むような形になるのでしょうか。 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • JSON形式のデータを古い順に30件表示させたい

    PHPからJSON形式のデータを受け取り、データの古い順に30件、htmlで表示させたいです。 いろいろ調べて1件目のデータを表示させることができたのですが 30件分のデータを古い順に表示させることができません。 わかりやすく教えていただけないでしょうか? ※やりたいこと html内に <div class="area_report" id="area_100000"></div> <div class="area_report" id="area_200000"></div> <div class="area_report" id="area_300000"></div>      ・      ・      ・ 最高10件のエリアIDが書かれています。 "area_"をreplaceしてエリアIDを取得します。 売上報告.phpにアクセスし、エリアIDごとにJSON形式のデータを受け取ります。 1つのエリアIDに店舗は1~複数あります。 店舗ごとの古いデータから30件、htmlで表示させたいです。 店舗がいくつあるかは"Tenpo"でわかります。 データの登録日は"UpDate"でわかります。 店舗が100件あると、表示完了までに時間がかかり過ぎるのであれば 何か良いアドバイスをいただきたいです。 javascript勉強中で不適切な記述をしているかもしれません。 「こちらの記述の方が簡単だよ」というのがありましたら、ぜひ教えてください。 どうぞよろしくお願いします。 ※JSON形式のデータ {"AreaReport":{ "AreaId":"100000", "Tenpo":4, "Sales":[ {"Name":"岡崎", "TenpoId":100004, "Direct":0, "Amount":48000, "Report":"売り上げ報告あいうえお", "UpDate":"2011-04-30 10:32:40"}, {"Name":"一宮", "TenpoId":100001, "Direct":0, "Amount":30000, "Report":"売り上げ報告かきくけこ", "UpDate":"2011-04-12 10:32:40"}, {"Name":"春日井", "TenpoId":100002, "Direct":0, "Amount":10000, "Report":"売り上げ報告さしすせそ", "UpDate":"2011-04-01 10:32:40"}, {"Name":"名古屋", "TenpoId":100003, "Direct":1, "Amount":50000, "Report":"売り上げ報告たちつてと", "UpDate":"2011-04-21 10:32:40"}, ]}} ※javascriptコード <script type="text/javascript"> if( window.attachEvent ) { window.attachEvent( 'onload', reportWrite ); } else { window.addEventListener( 'DOMContentLoaded', reportWrite, false ); } function reportWrite() { var area_array = new Array(); t = document.getElementsByTagName( 'div' ); for( var i = 0, n = t.length; i < n; i ++ ) { if( t[ i ].className.match( 'area_report' ) ) { var area_id = t[ i ].id.replace( 'area_', '' ); area_array.push( area_id ); } } for( var i = 0; i < area_array.length; i ++ ) { areaReport_id = area_array[ i ]; ReportGet( areaReport_id); } } function include_javascript( js_file ) { //window.alert(js_file); var script = document.createElement( 'script' ); script.src = js_file; script.type = 'text/javascript'; script.defer = true; document.getElementsByTagName( "head" )[ 0 ].appendChild( script ); } function ReportGet( areaReport_id) { include_javascript( 'http://売上報告.php?id=' + areaReport_id + '&callback=printReport' ); } function printReport(Repo) { var htmlStr = ""; htmlStr = htmlStr + Repo["AreaReport"]["Sales"][0]["UpDate"] + '<br />'; htmlStr = htmlStr + Repo["AreaReport"]["Sales"][0]["Name"] + '<br />'; htmlStr = htmlStr + Repo["AreaReport"]["Sales"][0]["Direct"] + '<br />'; htmlStr = htmlStr + Repo["AreaReport"]["Sales"][0]["Amount"] + '<br />'; replace_val = Repo["AreaReport"]["Sales"][0]["Report"]; htmlStr = htmlStr + replace_val.replace(/\n/g, '<br />'); htmlStr = htmlStr + '<hr />'; document.getElementById("Report").innerHTML = htmlStr; // window.alert(htmlStr); } </script>

  • 日付が近い順に表示

    現在下記スクリプトでデータベースから日付を取り出し、 あるWebページにて表示させています。 しかしこの方法だとデータベースのレコードID順に表示されてしまうため、日付順になりません。 ======== <? function getDayList() { global $NBCLIENT; $daylist = array(); $datalist = $NBCLIENT->search(FORMID_DAYLIST); if (is_array($datalist)) { $daylist = $datalist; } return $daylist; } $daylist = getDayList(); foreach ($daylist as $day) { ?> <?=hs($day["日付"]) ?> <? } ?> ======== ~.htmlページのweb表示内容~ 2007-09-14 2007-09-18 2007-09-15 ・ ・ ・ ~~~~~~~~~~~~~~ データベースからの呼び出し順は他のページの表示形式が理由で変えられません。 そこで表示するWebページ側で "今日以降の日付が近い順に表示される"ように処理したいと考えております。 関数定義の段階で処理した方が良いような気がするのですがどのようにしたらよろしいでしょうか?

    • ベストアンサー
    • PHP
  • JavaScriptで画像を1つずつ増やして表示させたいのですが可能でしょうか?

    JavaScriptを使って、同じページ内に(1段目は1つ、2段目は2つ、という形で)画像を1つずつ増やして表示させたいのですが可能でしょうか? もし可能であればその方法を教えてください。 その際、画像の横に(その段にいくつ画像があるかの)文章も入れたいので(そのやり方はわかりました)併記の仕方を教えていただけると助かります。 例えば、 【1段目】りんごが1個● 【2段目】りんごが2個●● 【3段目】りんごが3個●●● 【4段目】りんごが4個●●●● ・   ・   ・ ・   ・   ・(略) ・   ・   ・ 【100段目】りんごが100個●●●●●●●●●●●●●~(略) というページを作成したいと思っています。 ●は画像です。実際には【】内の表示はありません。 現在、文章の方はできているので参考までに以下にペーストしておきます。 知っている方がいましたらどうかご返答ください。よろしくお願いします。 <html> <head> </head> <body> <script type="text/javascript"> <!-- maxNum = 100; for (i=1; i<=maxNum; i++) { document.write("りんごが<font color='red'>" + i + "</font>個<br>"); } //--> </script> </body> </html>

  • ランダムにページを表示するスクリプト

    最近社内のホームページを作ることになった初心者です。 トップページの中に3箇所、インラインフレームを使い別のページを 表示させるというものを考えております。 その際に、インラインフレーム内に表示させるページがランダムで選ばれるようにscriptを用いてやってみましたが、3箇所あるインラインフレームのうちの1箇所にしか表示されません・・・。 <script type="text/javascript"> window.onload = function(){ var c = 3; // var ifm = document.getElementById('aaa'); var ifm = document.getElementById('bbb'); var ifm = document.getElementById('ccc'); var r = Math.floor( Math.random() * c ); var urls = new Array(); urls[0] = 'http://www.co.jp'; urls[1] = 'http://www.co.jp'; urls[2] = 'http://www.co.jp'; ifm.src = urls[r]; } </script> あとは3箇所のフレーム内にIDを設定すれば上手く良くと思ったのですが、1箇所にしか表示されません;; 改善点などございましたらご教授いただけないでしょうか?

  • 単純ですが、意外と穴?なデータベースリソースの鮮度

    よろしくお願い致します。 環境PHP5.2.5 / SQLite3 /*---------------------------------------- * インサート -----------------------------------------*/ $sql_1 = 'INSERTなんたら~(id = 25 を作成)'; $db_pass = 'db_hoge.sqlite'; $db_res = sqlite_open($db_pass); //★タイム(1) $result = sqlite_query($db_res,$sql_1);      :   ~ INSERT処理($sql_1)をしてます ~      : //sqlite_close($db_res) ここではクローズせず      :      : /*---------------------------------------- * デリート -----------------------------------------*/ $sql_2 = 'DELETEなんたら~(id = 25 を削除)'; //省略しちゃうわけです。$db_pass = 'db_hoge.sqlite'; //省略しちゃうわけです。$db_res = sqlite_open($db_pass); //★タイム(2) $result = sqlite_query($db_res,$sql_2);      :   ~ DELETE処理($sql_2)をしてます ~      : /*---------------------------------------- * /処理完了 -----------------------------------------*/ //ここで、ようやく、クローズ sqlite_close($db_res); //============================================== 何が疑問かと言いますと、 ★タイム(1)と、★タイム(2)の時点では、 $db_res の中身の鮮度が違うのでは?と思うわけです。 つまり、 ★タイム(1)の時点では、id=25のデータは作成されていません。 ★タイム(2)の時点では、id=25のデータは作成済みです。 id=25が作成されていない状態のDBリソースを、 ★タイム(2)の所で、使用しています。 言い換えると、 id=25が存在していないDBのリソースを、 タイム(2)の時点で使用し、 そのリソースをもとに、 id=25のデータを消そう(DELETEしよう)としているわけです。 「//省略しちゃうわけです。」 という所で、省略する場合と、しない場合とでは、 結果はやはり異なるのでしょうか? 検査対象がリソースだけに、調べにくいなと思い、 質問させて頂きました。 どなたか、この辺りの正式な作法も含めて、 教えて頂けてませんでしょうか。 上記の「//省略しちゃうんです。」の方法で、 問題ないですよ、 ということであれば、今後も、省略しちゃう方向で、 コーディングしていこうと思います。笑

    • ベストアンサー
    • PHP
  • sqlite_query()に関する質問

    ブラウザからポストでSQL文を受け取り、それをもとにDBを作成するスクリプトを考えています。 スクリプトの実行権限は、ページにログインできたユーザ(サイト管理者)のみ与えられています。 では、質問に移ります。 スクリプトに渡される$_POST['sql']の値が、クエリ文の言語仕様的に正しい書式ではなかった場合、 $sql = sqlite_escape_string($_POST['sql']); sqlite_query('hoge',$sql); の結果は、 Warning: sqlite_query() [function.sqlite-query]: near "なんたら~": syntax error in /なんたら~ といったエラーを吐き、 さらに、ファイルサイズ0の余計なクズファイルが作成されてしまうのですが、、 このクズファイルが結果的に作成されないように設計するには、どのようにしたら良いでしょうか。 私なりに2つの方法を考えてみましたので、アドバイスを頂けると嬉しいです。 (1) $_POST['sql']の時点で正規表現をもとに、SQL文の書式が正しいかチェックをし、 誤った書式のSQL文をsqlite_query()に渡すことを回避する方法。 ※私の能力的に、希望とする正規表現を正確に考え出すことができるか、はなはだ怪しいため、 できれば、避けたい方法です。 (2) 正規表現を使った方法だと、やや繁雑になりそうなので、それはやめにし、 ひとまず、SQL文の正誤を問わず、sqlite_query()を実行させ、 その結果、クズファイルが出来てしまうようなら削除する、といった方法。 ※クズファイルが生成されたかどうかのチェックは、 生成されたファイルのファイルサイズ == 0? をもとに行います。 ※ただし、私の利用するサーバの仕様上、 クズファイルは 所有者=「apache」 として作成されてしまうため、 もしかしたら、スクリプトからは削除できないかもしれません。 その場合には、こちらの方法は廃案となります。汗 (3) その他の方法(オススメの方法がありましたら、是非教えて下さい!) 以上、どなたか、ご助言よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 同一ページで複数のformを扱う場合

    同一のページ内にhiddenでIDを振った削除ボタンを用意しクリックされたIDを取得するにはどのようにすれば良いでしょうか? <form action="/test.php" name="1" method="post"> <input type="hidden" name="id" value="1" /> <input type="submit" name="delete" value="削除"> </form> -- 省略 <form action="/test.php" name="10" method="post"> <input type="hidden" name="id" value="10" /> <input type="submit" name="delete" value="削除"> </form> formにnameを振ってみても最後のIDがPOSTされてしまいます。

    • 締切済み
    • PHP
  • jQueryでフォーム追加・削除

    jQuery初心者です。 タイトルの通り、jQueryにてフォームの追加と削除ができるボタンを制作しているのですが、どうも削除ボタンがうまく働いてくれません。お手上げ状態ですのでご教授いただければと思います。 仕様としては追加ボタンを押すとフォームが一つ追加され、削除ボタンを押すと一番最後のフォーム一つだけが消える、というものを目指しています。 <script type="text/javascript"> var $i = 1; $(function(){ $('#addbtn').click(function(){ var $id = $('#mo_' + $i); ++$i; $('#wan').text($i); if($i > 14){ $('#addbtn').css('display', 'none'); }else if($i > 1){ $('#delete').css('display', 'block'); } //clone()でフォームを複製 $($id).clone().insertAfter($id) .attr('id', 'mo_' + $i) .end() .find('input').each(function(idx, obj) { //alert(idx); $(obj).attr({ 'id' : $(obj).attr('id').replace(/_[0-9]+$/, $i), 'name' : $(obj).attr('name').replace(/_[0-9]+$/, $i) }).val('').end(); }); $('#delete').click(function(){ $('#wan').text($i); $('div').find('#mo_' + $i).remove(); if($i < 15){ $('#addbtn').css('display', 'block'); }else if($i < 2){ $('#delete').css('display', 'none'); } }); }); }); </script> <style type="text/css"> #delete { display:none; } #addbtn { display:block; } </style> <body> <form action="" method="post"> <input type="button" id="addbtn" value="追加"> <input type="button" id="delete" value="一つ削除"> <div id="mo_1" style="margin:5px"> <input type="text" name="sasa_1" value="" id="mom_1"> </div> <br><br> <input type="submit" value="確定"> <div id="wan"></div> </form> 宜しくお願いします。

専門家に質問してみよう