DBのデータを15件ずつ表示するページング処理を実装したい

このQ&Aのポイント
  • DBの中身を全部表示することができるが、データが多くてスクロールするのが面倒なので、データを15件ずつに分けてページングする方法が知りたい。
  • Perlを使用して図書管理システムのデータを表示しているが、一度に全部表示されてしまうため、前後のデータを表示するページング処理を実装したい。
  • 図書管理システムのデータをページングする方法を教えてください。データ数が多くてスクロールするのが面倒なので、15件ずつ表示するようにしたい。
回答を見る
  • ベストアンサー

ページング処理ついて困っています

#!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html><head>"; print "<meta http-equiv=\"Content-Type\" content=\"text/javascript; charset=UTF-8\">\n"; print "<title>図書管理システム</title>\n</head>"; print "<body>"; use DBI; $dbname = "bookmanagement"; $host = "localhost"; $user = ""; $password = ""; $table = "booktable"; $conn = DBI-> connect("DBI:Pg:dbname=$dbname;host=$host", $user, $password )|| die "DBI connect failed: $DBI::errstr"; $sql = "select * from $table order by id"; $result = $conn->prepare($sql); $ref = $result->execute; print <<HEADER; <body> <div align="right"><a href="./rental.cgi">ログアウト</a></div> <center> <caption><h2>図書管理システム </h2></caption> <table border=2> <tr bgcolor="#dcdcdc"> <th>ID</th> <th nowrap>本名称</th> <th nowrap>著者</th> <th>説明</th> <th nowrap>登録日</th> <th nowrap>状態</th> <th nowrap>貸出日</th> <th nowrap>貸出人</th> </tr> HEADER while(my @ref = $result->fetchrow) { print <<ROW; <tr> <td>$ref[0]</td> <td>$ref[1]</td> <td nowrap>$ref[2]</td> <td>$ref[3]</td> <td nowrap>$ref[4]</td> <td nowrap>$ref[5]</td> <td nowrap>$ref[6]</td> <td> ROW if($ref[7] eq ""){ print "<br>"; } else{ print "$ref[7]"; } print <<ROW; </tr> ROW } print <<FOOTER; </table> </center> FOOTER $result->finish; $conn->disconnect; 上のコードで今DBの中身が見れるようになっているのですが、一度に全部表示するようになってしまっていて データ数(?)が多すぎてスクロールするのが面倒なので、データを15件ずつに分けて<前へ 次へ>みたいなのを 作りたいと思っているのですが、どのようにしたら分りません。おわかりになる方がいましたら実装する為の コードを教えて頂けないでしょうか?よろしくお願い致します。

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

いまさらながらの回答ですが、検索結果が 100件あり、1ページに10件ずつ 表示するのであれば、全部で10ページに分割することになります。 分割したページには他のページに移動するためにリンクを作ります。 例えば <a href="foo.cgi?page=1&key=検索キー>ページ 1</a> <a href="foo.cgi?page=2&key=検索キー>ページ 2</a> <a href="foo.cgi?page=3&key=検索キー>ページ 3</a> ... のようなリンクを作り、変数として渡された page の値から 計算すればよいです。

nardobrea
質問者

補足

返信遅くなり申し訳ありませんでした このヒントを元にもう少し頑張ってみようと思います ありがとうございました。

その他の回答 (2)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

データベースが PostgreSQL であれば OFFSET と LIMIT を使い、 検索結果の一部を取り出すことができます。 select * from $table order by id を select * from $table order by id limit $limit offset $offset とします。ここで、$limit は 1ページに表示する件数、$offset を (ページ番号 - 1) * $limit とすると、そのページに表示する データだけを抽出することができます。 検索結果ページにページ番号のリンクを作り、クリックされたとき $offset を計算して表示すればよいです。

参考URL:
http://www.postgresql.jp/document/pg732doc/user/queries-limit.html
nardobrea
質問者

補足

t-okura様、返信遅くなり申し訳ありません。 $offsetの(ページ番号 - 1) * $limitということなのですが、ページ番号というのは$page=1;とかって設定してしまってよいのでしょうか? それでよかったとしても >>検索結果ページにページ番号のリンクを作り、クリックされたとき $offset を計算して表示すればよいです。 の作り方が良く分からず困っております。よろしければ教えて頂けますでしょうか?

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

while(my @ref = $result->fetchrow) { の意味はわかってますよね。 ここを適当に変えて、次ページへのリンクで指定してやればよい。 ほかの部分がわからないので、これ以上は無理。

nardobrea
質問者

補足

ORUKA1951さんありがとうございます。 >>while(my @ref = $result->fetchrow) { の意味 booktableに登録された各行のそれぞれのデータを配列refに入れている ってことではないでしょうか? >>ほかの部分がわからない 何が必要なのかこちらも分からないです

関連するQ&A

  • DBの更新について困っています

    以前 http://oshiete1.goo.ne.jp/qa5494372.html で質問させていただいたものですが、3の『「貸し出し中ではない」本は、「借りる」といるリンクがつく。「借りる」をクリックすると、JavaScriptによるアラートで「本XXXXを借りますか?」と出す。』まで何とかサブルーチンを使って出来たのですが、それ以降の『データベースを更新して云々』が良く分からないのですが、どのようなコードを書けばDBを更新出来て、図書リストを更新表示出来るのでしょうか?よろしくお願いします。 #!/usr/bin/perl #メイン処理 &start; &analysis; if($pass2 eq ''){ &login; }else{ &msg; } #HTMLヘッダー表示サブルーチン sub start{ } #引数解析サブルーチン sub analysis{  #出来ています } #ログインサブルーチン sub login{ print "<center>"; print "<caption><h2>ユーザーログイン</h2></cption>"; print "<form method=\"post\" action=\"./login2.cgi\">"; print "ユーザー名:"; print "<select name=\"user_name\">"; print "<option value=\"1104\">A</option>"; print "<option value=\"1111\">B</option>"; print "</select><br>"; print "パスワード:"; print "<input type=\"password\" name=\"password\"><br>"; print "<input type=\"submit\" name=\"submit\" value=\"ログイン\">"; print "</form>"; print "</center>"; } #図書管理画面を見せるサブルーチン sub display{ use DBI; use strict; my $dbname = "bookmanagement"; my $host = "localhost"; my $user = ""; my $password = ""; my $table = "booktable"; my $conn = DBI->connect("DBI:Pg:dbname=$dbname;host=$host", $user, $password )|| die "DBI connect failed: $DBI::errstr"; my $sql = "select * from $table order by date desc"; my $result = $conn->prepare($sql); my $ref = $result->execute; print <<HEADER; <body> <center> <table border=2> <caption><h2>図書管理システム</h2></caption> <tr bgcolor="#dcdcdc"> <th>ID</th> <th nowrap>本名称</th> <th nowrap>著者</th> <th>説明</th> <th nowrap>登録日</th> <th nowrap>貸出中?</th> <th nowrap>最終貸出日</th> <th nowrap>最終貸出人</th> </tr> HEADER while(my @ref = $result->fetchrow) { print <<ROW; <script type="text/javascript"> <!-- function dialog(msg){ if(confirm(msg)==true){ } } // --> </script> <tr> <td>$ref[0]</td> <td>$ref[1]</td> <td nowrap>$ref[2]</td> <td>$ref[3]</td> <td nowrap>$ref[4]</td> <td nowrap> <a href="#" onClick="dialog('本「$ref[1]」を借りますか?')">$ref[5]</a> </td> <td nowrap>$ref[6]</td> <td><br>$ref[7]</td> </tr> ROW } print <<FOOTER; </table> </center> FOOTER $result->finish; $conn->disconnect; } #パスワード認証ルーチン sub auth{ use DBI; $db_name = "bookmanagement"; $db_host = "localhost"; $db_user = ""; $db_password = ""; $db_table = "usertable"; $ID = $pass1; $password = $pass2; print <<HEADER; <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title></title> </head> <body> HEADER $conn = DBI->connect("DBI:Pg:dbname=$db_name;host=$db_host",$db_user,$db_password)||die "DBI connect failed: &DBI::errstr"; $sql = "select userID,pass from usertable where pass='$password'"; $result = $conn->prepare($sql); $ref = $result->execute; ($db_userID,$db_password) = $result -> fetchrow_array(); $result -> finish; if(($db_password eq $password) and ($db_userID eq $ID)){ &display; #DBのパスと入力されたパスが同じなら図書管理画面の表示 } else{ print "ログインに失敗しました。ユーザー名・パスワードを確認してください。"; } $conn -> disconnect; } print <<FOOTER; </body> </html> FOOTER 1;

    • ベストアンサー
    • CGI
  • ODBCを使用したSQLの使い方を教えてほしいです

    タイトルの内容を調べているのですが、上手くヒットせず、 同じように記述してもエラーになってしまいます。 よくわかりませんので、教えてほしいです。 odbc_connectは通っているようなので、接続はできている と思います。 $rs=odbc_exec($conn,$sql);にてエラーになるようです。 Warning: odbc_exec():が出ます。 よろしくお願いします。 print ("<html>"); print ("<body>"); $conn=odbc_connect('m_db','',''); if (!$conn) { exit("Connection Failed: " . $conn); } $sql = "SELECT * FROM test_table"; $rs=odbc_exec($conn,$sql); if (!$rs) { exit("Error in SQL"); } echo "<table><tr>"; echo "<th>Companyname</th>"; echo "<th>Contactname</th></tr>"; while (odbc_fetch_row($rs)) { $compname=odbc_result($rs,"CompanyName"); $conname=odbc_result($rs,"ContactName"); echo "<tr><td>$compname</td>"; echo "<td>$conname</td></tr>"; } odbc_close($conn); echo "</table>"; print ("</body>"); print ("</html>");

    • ベストアンサー
    • PHP
  • 重複レコードをグループ化したいけど…。

    度々お世話になってます。 table1 【ID|フィールド1】 [1|AAA] [1|BBB] [2|CCC] [3|DDD] [3|EEE] [3|FFF] というようなテーブルがあるとして、クエリでは <table> <tr><td>1</td><td>AAA<br>BBB</td></tr> <tr><td>2</td><td>CCC</td></tr> <tr><td>3</td><td>DDD<br>EEE<br>FFF</td></tr> </table> …という形で表示したいのです。(理想です) 今までいろいろ試してみて、 $sql = " SELECT ID,フィールド FROM table1 GROUP BY ID "; に行き着きましたが、これだと <table> <tr><td>1</td><td>AAA</td></tr> <tr><td>2</td><td>CCC</td></tr> <tr><td>3</td><td>DDD</td></tr> </table> というように表示され、表示されないレコードが出来てしまいます。 GROUP BYが余計!と言われそうですが、同じIDが複数並ぶのを避けたいのです。 ソースコードは、 print "<table>\n"; print "<tr><th>ID</th><th>フィールド</th></tr>\n";  while( $row = mysql_fetch_array($result) ) {  print "<tr><td>$row[ID]</td><td>$row[フィールド]</td></tr>\n";  } print "</table>\n"; になっている状態です。 $row[フィールド]を書き換えればいいのかな?と思いますが、検索してもそれらしいものは見当たらなかったので質問させていただきました。 心当たりのある方、よろしくおねがいします。

    • ベストアンサー
    • PHP
  • Mysqlから取り出した名簿データの名前をクリックして詳細を表示したい。

    はじめまして。PHP・mysql共に初心者の者です。どなたかお知恵をお貸しください。以下に環境を記します。 Windows2000/sp5 Apache/2.0.55 PHP/5.0.5 MySQL 5.0 簡単な名簿のデータ(ID・名前・年齢・生年月日・住所・電話番号)をMysqlから取り出してブラウザで表示させるだけなんですが、全て表示させるまでは成功しました。 この表示をID・名前・年齢だけにして、名前をクリックすると、その人だけのID・名前・年齢・住所・電話番号が表示されるようにしたいのです。 まったく勉強不足で申し訳ないのですが、行き詰ってしまいました。 どなたか具体的なソースをご教授ください。よろしくお願いします。 以下に、全てのデータ表示のためのソースをさらします。 <?php $dbserver = "localhost"; $dbuser = "root"; $dbpassword = ""; $dbname = "meibo"; $con = mysql_connect($dbserver,$dbuser,$dbpassword); mysql_query("set names sjis"); $selectdb = mysql_select_db($dbname); $sql = "select id, name, age, bday, address, tel, curdate(), (year(curdate())-year(bday)) - (right(curdate(),5)<right(bday,5)) as age from meibo_1"; $rst = mysql_query($sql); $body = mysql_num_rows($rst) . "件のデータがあります。. <br><br>"; $body .= "<table border='1'> <tr> <th NOWRAP>ID</th> <th NOWRAP>氏名</th> <th NOWRAP>年齢</th> <th NOWRAP>生年月日</th> <th NOWRAP>住所</th> <th NOWRAP>電話番号</th>  </tr>"; while ($col = mysql_fetch_array($rst)) { $body .= "<nobr><tr>" . "<td NOWRAP>$col[id]</td>" . "<td NOWRAP>$col[name]</td>" . "<td NOWRAP>$col[age]</td>" . "<td NOWRAP>$col[bday]</td>" . "<td NOWRAP>$col[address]</td>" . "<td NOWRAP>$col[tel]</td>" . "</tr></nobr>"; } $body .= "</table>"; mysql_free_result($rst); $con = mysql_close($con); ?> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> </head> <body> <?=$body?> </body> </html>

    • ベストアンサー
    • PHP
  • ページングをつけたいんです。教えて下さい。

    今、友人同士の名簿をデータべスにしてます。 そこで、mySQLをつかってPHPで検索するシステムを作りたく、検索まではできるようになったのですが、ページングの仕方がわかりません。 PEARは使用できないので、どなたか下記にどのようにプログラムを追加すればページング機能がつけられるか教えて下さい。お願い致します。 (下記の検索プログラムは、http://php.dori-mu.net/で紹介されていたものを利用しました。) --------------------------------------------------------------- <html> <head> <title>PHP SEARCH RESULT</title> <meta http-equiv="Content-Type" content="text/html; charset=x-euc-jp"> </head> <body> <? $debug = false; //DB接続 mysql_connect("127.0.0.1","sample",""); mysql_select_db("sample"); if($debug) print_r($HTTP_POST_VARS); //エラーチェック //リクエストメソッドチェック if($REQUEST_METHOD != "POST") { print "Error: invalid method"; exit(); } //クエリ生成 $query = "SELECT * FROM search "; //検索条件生成 //名前 if(!empty($name)) { $name = addslashes($name); $where = "name = '$name' && "; } //住所 if(!empty($address)) { $address = addslashes($address); $where .= "address REGEXP '$address' && "; } //性別 if(!empty($gender)) { $gender = addslashes($gender); $where .= "gender = '$gender' && "; } //スキル if(!empty($skill)) { foreach($skill as $value) { $value = addslashes($value); $temp_where .= "skill REGEXP '$value' || "; } $temp_where = substr($temp_where, 0, -4); $where .= "(". $temp_where. ") && "; } if(!empty($where)) { $where = substr($where, 0, -4); $where = "WHERE " . $where; } $query .= $where; if($debug) { print "<BR><BR>"; print $query; } $result = mysql_query($query); $num_rows = mysql_num_rows($result); if($num_rows == 0) $message = "該当するデータはありませんでした"; else $message = $num_rows . "件ヒットしました"; ?> 検索結果<br> <?=$message?> <table border=1> <tr><td>名前</td><td>住所</td><td>性別</td><td>スキル</td></tr> <? while($row = mysql_fetch_assoc($result)): ?> <tr><td><?=$row[name]?></td><td><?=$row[address]?></td><td><?=$row[gender]?></td><td><?=$row[skill]?></td></tr> <? endwhile; ?> </table> <a href="input.html">再検索</a> </body> </html> ----------------------------------------------------------------

    • 締切済み
    • PHP
  • mysqlから取り出した検索結果にチェックボックスを付けたい。

    こんばんは。PHP・mysql共に初心者の者です。どなたかお知恵をお貸しください。以下に環境を記します。 Windows2000/sp5 Apache/2.0.55 PHP/5.0.5 MySQL 5.0 簡単な名簿のデータ(ID・名前・年齢・生年月日・住所・電話番号)をMysqlから取り出してブラウザで表示させるだけなんですが、全て表示させるまでは成功しました。 この表示をID・名前・年齢だけにして、各レコードの左端にチェックボックスを配置し、1件または複数件チェックを入れて「詳細を表示」ボタンをおすと、チェックを入れた人のID・名前・年齢・生年月日・住所・電話番号が表示されるようにしたいのです。 while文の中にチェックボックスを組み込んだり、色々と試行錯誤しましたがダメでした。 まったく勉強不足で申し訳ないのですが、どなたか具体的なソースをご教授ください。よろしくお願いします。 以下に、全てのデータ表示のためのソースをさらします。 <?php $dbserver = "localhost"; $dbuser = "root"; $dbpassword = ""; $dbname = "meibo"; $con = mysql_connect($dbserver,$dbuser,$dbpassword); mysql_query("set names sjis"); $selectdb = mysql_select_db($dbname); $sql = "select id, name, age, bday, address, tel, curdate(), (year(curdate())-year(bday)) - (right(curdate(),5)<right(bday,5)) as age from meibo_1"; $rst = mysql_query($sql); $body = mysql_num_rows($rst) . "件のデータがあります。. <br><br>"; $body .= "<table border='1'> <tr> <th NOWRAP>ID</th> <th NOWRAP>氏名</th> <th NOWRAP>年齢</th> <th NOWRAP>生年月日</th> <th NOWRAP>住所</th> <th NOWRAP>電話番号</th>  </tr>"; while ($col = mysql_fetch_array($rst)) { $body .= "<nobr><tr>" . "<td NOWRAP>$col[id]</td>" . "<td NOWRAP>$col[name]</td>" . "<td NOWRAP>$col[age]</td>" . "<td NOWRAP>$col[bday]</td>" . "<td NOWRAP>$col[address]</td>" . "<td NOWRAP>$col[tel]</td>" . "</tr></nobr>"; } $body .= "</table>"; mysql_free_result($rst); $con = mysql_close($con); ?> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> </head> <body> <?=$body?> </body> </html>

    • 締切済み
    • PHP
  • PHPとMysqlによる正規表現について

    データベースに登録した情報から検索するコードを書いたのですが、どう入力してもデータベースに登録した情報がすべて出てきてしまいます。 入力フォームに検索した条件だけ表示させたいです。 htmlの入力フォームを作り、そこから$_POSTでPHPに渡しました。 コードは以下のとおりです。 PHPの本を読んで見よう見まねで書いたのですが、さっぱりです。 ご教授よろしくお願いします。 <html> <head><title>検索php</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php $host="localhost"; if(!$conn=mysql_connect($host,"usr","passwrd")){ die("データベース認証エラー.<br />"); } mysql_select_db("usr",$conn); $condition=""; if(isset($_POST["name"])&&($_POST["name"]!="")){ $name=mysql_real_escape_string($_POST["name"]); $name=str_replace("%","\%",$name); $condition="WHERE table_a LIKE \"%".$name."%\""; } if(isset($_POST["phone"])&&($_POST['phone']!="")){ $phone=mysql_real_escape_string($_POST["phone"]); $phone=str_replace("%","\%",$phone); if($condition==""){ $condition="WHERE table_b LIKE \"%".$phone."%\""; }else{ $condition.="AND tabe_b LIKE \"%".$phone."%\""; } } $sql="SELECT * FROM table ".$condigition."ORDER BY table_id LIMIT 0,30"; $res=mysql_query($sql,$conn); print("<table border=\"1\">"); print("<tr><td>会社名</td><td>電話番号</td></tr>"); while($row=mysql_fetch_array($res)){ print("<tr>"); print("<td>".$row['table_a']."</td>"); print("<td>".$row['table_b']."</td>"); print("</tr>\n"); } print("</table>"); mysql_free_result($res); ?> </body> </html>

    • ベストアンサー
    • PHP
  • php + mysql でフォーム作成時のエラー

    データベースから取り出したデータをラジオボタンで選択し、それをデータベース(別のテーブル)に追加させる機能を作りたいです。 非常に初歩的なことだとは思うのですがご教授ください。 MySQL 4.0.27 PHP 5.2.11 <FORM ACTION="cone3.php" METHOD="post"> <?php $srv = ""; // サーバー名 $id = ""; // ユーザーID $passwd = "; // パスワード $dbn = ""; // データベース名 $sql = "SELECT code, lname, lecturer, kind, gradetype FROM Lecture"; // SQL文 // データベースに接続する $db = mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs = mysql_query($sql,$db); //--- テーブルのレイアウト --- 開始 -----------------------> print("<TABLE><TR>"); print("<TR><th> </th><th>講義名</th><th>教員</th><th>科目区分</th><th>配当学年</th></tr>"); while($row = mysql_fetch_array($rs)) { print '<tr><td><input type="radio" name="regist" value="$row['code']"></td>'; print '<td>' . $row['lname'] . '</td>'; print '<td>' . $row['lecturer'] . '</td>'; print '<td>' . $row['kind'] . '</td>'; print '<td>' . $row['gradetype'] . '</td>'; print '</tr>'; print ("</TR>"); } print("</TABLE>"); print_r($_POST); echo "<br />\n"; mysql_free_result($rs); mysql_close($db); //--- 終了 ---> ?> <input type="submit" name="submit" value="送信"> </form> 以上のようなソースでラジオボタンで配列の$row[code]の値を送りたいんですがうまくいきません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MySQLでの検索結果の横並び表示について

    PHP+MySQLでデータベース作成をはじめた初心者です。 検索結果を横並びにしたかったので他ページを参考にやってみました。 横に並べられるようにはなったのですが、検索結果を横並びで、かつ、4こならべると次の行にうつる方法はどうすればいいのでしょうか? データひとつを■とすると ■■■<改行> ■■■<改行> ■■■<改行> といった感じです。 よろしくお願いいたします。 <?php $host = "localhost"; if (!$conn = mysql_connect($host, "ユーザー", "パス")){ die("MySQL接続エラー.<br />"); } mysql_select_db("データベース名", $conn); $sql = "SELECT * FROM 01_table WHERE on ='1'"; $res = mysql_query($sql,$conn); print("<tr>"); while($row = mysql_fetch_array($res)) { print("<td>".$row["■"]); print("</td>"); } mysql_free_result($res); ?> print("</tr>");

    • ベストアンサー
    • PHP
  • PHPとMySQLの文字化けの対応法は?

    OSはWinXPで、MySQL+PHPのアプリを作成しているところです。 <html> <head><title>配列データの取得</title></head> <body> <table border="1"> <tr><td>題名</td><td>著者</td><td>出版社</td></tr> <?php $host = "localhost"; if (!$conn = mysql_connect($host, "user", "pass")){ die("MySQL接続エラー.<br />"); } mysql_select_db("kisop", $conn); $sql = "SELECT * FROM book_table LIMIT 10"; $res = mysql_query($sql,$conn); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["btitle"]."</td>"); print("<td>".$row["bauth"]."</td>"); print("<td>".$row["bpub"]."</td>"); print("</tr>\n"); } mysql_free_result($res); ?> </table> </body> </html> と、こんな演習をしているのですが、ブラウザに表示させると文字化けしました。 HTML文はEUC、MySQLのデータは、シフトJISで入っていたようです。 そのため、「題名」「著者」などの見出しと、取り出したデータを同時に文字化けさせずに、表示できない 状態です(泣)。 MySQLからデータを取り出すときに、mb_convert_encodingで文字コードを変換してやれば 化けないでしょうが、出力しようとするデータのすべてを変換しなければなりません。 プログラマーさんたちは、文字化けの現象について、どう対応されているのでしょうか? いちいち、mb_convert_encodingで、変換しているものなのでしょうか? 定石のようなものを知りたいところです。 たとえば、HTML文は文字コード○○を使うものだ、設定ファイルを書き換えておく、などなど。 よろしくおねがいします。

    • ベストアンサー
    • PHP

専門家に質問してみよう