質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Q&A

解決済

2回答

14409閲覧

PHP ページネーション 10件づつ表示

chocolat_0416

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

0グッド

1クリップ

投稿2018/04/20 00:17

編集2018/04/20 00:27

制作しているシステム

郵便番号や、地名検索から
データベースに管理している
地名を検査して表示させるというシステム。

イメージ説明

前提・実現したいこと

GETで受け取ったデータの件数を、
10件ずつ表示させるページング機能を実装させたいです。

行き詰っていること

〇現在ページをどのように定義したら良いかわかわからない
〇if文の条件分岐の書き方がわかりらない
➡・データ件数が10件を超えたときに、「次へ」を表示
➡・2ページ目以降
・「前へ」を表示
・10件を超えたとき、「次へ」を表示
・総ページ数になったら「前へ」だけ表示  
〇URL指定の仕方に自信がない

試したこと

データ件数、総ページ数、「前へ」のURL、「次へ」のURLを変数で定義しました。

該当のソースコード

PHP

1<?php 2function h($str){ 3 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 4} 5 6 7 8$post_number = ''; 9$post_number_1 = ''; 10$address = ''; 11$message = NULL; 12$error = NULL; 13$insertOk = true; 14$address_data = array(); 15$query = NULL; 16$pref = ''; 17 18 19//郵便番号から検索されたとき 20if (isset($_GET['search_1']) === TRUE) { 21 $insertOk = true; 22 //入力値を変数に代入 23 $post_number = $_GET['zipcode']; 24 $post_number_1 = str_replace(array(" ", " "), "", $post_number); 25 //空の場合のエラー 26 //形式チェック 27 if (mb_strlen($post_number_1) === 0) { 28 $message = '郵便番号を入力してください。'; 29 $insertOk = false; 30 } else if (preg_match('/^[0-9]{7}$/', $post_number_1) !== 1) { 31 $message = '郵便番号は7桁の半角数字を入力してください。'; 32 $insertOk = false; 33 } 34 35 36 if ($insertOk === true) { 37 //DBと接続 38 $host = // データベースのホスト名又はIPアドレス 39 $username = // MySQLのユーザ名 40 $passwd = // MySQLのパスワード 41 $dbname = // データベース名 42 $link = mysqli_connect($host, $username, $passwd, $dbname); 43 if ($link) { 44 mysqli_set_charset($link, 'utf8'); 45 46 if (isset($_GET['search_1']) === TRUE) { 47 $query = "SELECT * FROM address_table WHERE post_number = '$post_number_1'" ; 48 } 49 $result = mysqli_query($link, $query); 50 while ($row = mysqli_fetch_array($result)) { 51 $address_data[] = $row; 52 } 53 54 mysqli_free_result($result); 55 mysqli_close($link); 56 } else { 57 print 'DB接続失敗'; 58 } 59 60 } 61} 62//地名から検索されたとき 63if (isset($_GET["search_2"]) === TRUE) { 64 $pref = $_GET["pref"]; 65 $address = $_GET["address"]; 66 $insertOk = true; 67 if ($pref == NULL) { 68 $error = '都道府県を選択してください'; 69 $insertOk = false; 70 } else if ($pref !== NULL && mb_strlen($address) === 0) { 71 $error = '市区町村を入力してください。'; 72 $insertOk = false; 73 } 74 75 if ($insertOk === true) { 76 //DBと接続 77 $host = 'localhost'; // データベースのホスト名又はIPアドレス 78 $username = 'codecamp21605'; // MySQLのユーザ名 79 $passwd = 'MQSOCCZP'; // MySQLのパスワード 80 $dbname = 'codecamp21605'; // データベース名 81 $link = mysqli_connect($host, $username, $passwd, $dbname); 82 if ($link) { 83 mysqli_set_charset($link, 'utf8'); 84 85 if (isset($_GET['search_2']) === TRUE) { 86 $query = "SELECT * FROM address_table WHERE city_kanji LIKE '%$address%'" ; 87 } 88 $result = mysqli_query($link, $query); 89 while ($row = mysqli_fetch_array($result)) { 90 $address_data[] = $row; 91 } 92 93 mysqli_free_result($result); 94 mysqli_close($link); 95 } else { 96 print 'DB接続失敗'; 97 } 98 99 } 100} 101//検索結果が10件以上の時ページネーション 102 103//件数 104$address_data_count = count($address_data); 105//総ページ数 106$pagination = ceil($address_data_count / 10); 107//表示件数 108$view = 10; 109//現在ページ 110$page = 1; 111 112 113 114$url_back = '?pref=' . $pref . '&address=' . $address . '&search_method=' . 'address&search_2=' . ($page - 1); 115$url_next = '?pref=' . $pref . '&address=' . $address . '&search_method=' . 'address&search_2=' . ($page + 1); 116 117?> 118 119<!DOCTYPE html> 120<html lang="ja"> 121<head> 122 <meta charset="utf-8"> 123 <title>郵便番号検索</title> 124 <style type> 125 .search_reslut { 126 border-top: solid 1px; 127 margin-top: 10px; 128 } 129 130 table { 131 border-collapse: collapse; 132 } 133 table, tr, th, td { 134 border: solid 1px; 135 } 136 caption { 137 text-align: left; 138 } 139 140 </style> 141</head> 142<body> 143 <h1>郵便番号検索</h1> 144 <section> 145 <h2>郵便番号から検索</h2> 146 <form method="get"> 147 <input type="text" name="zipcode" placeholder="例)1010001" value=""> 148 <input type="hidden" name="search_method" value="zipcode"> 149 <input type="submit" name="search_1" value="検索"> 150 </form> 151 <h2>地名から検索</h2> 152 <form method="get"> 153 都道府県を選択 154 <select name="pref"> 155 <option value="" selected>都道府県を選択</option> 156 <option value="北海道" >北海道</option> 157 <option value="青森県" >青森県</option> 158 <option value="岩手県" >岩手県</option> 159 <option value="宮城県" >宮城県</option> 160 <option value="秋田県" >秋田県</option> 161 <option value="山形県" >山形県</option> 162 <option value="福島県" >福島県</option> 163 <option value="茨城県" >茨城県</option> 164 <option value="栃木県" >栃木県</option> 165 <option value="群馬県" >群馬県</option> 166 <option value="埼玉県" >埼玉県</option> 167 <option value="千葉県" >千葉県</option> 168 <option value="東京都" >東京都</option> 169 <option value="神奈川県" >神奈川県</option> 170 <option value="新潟県" >新潟県</option> 171 <option value="富山県" >富山県</option> 172 <option value="石川県" >石川県</option> 173 <option value="福井県" >福井県</option> 174 <option value="山梨県" >山梨県</option> 175 <option value="長野県" >長野県</option> 176 <option value="岐阜県" >岐阜県</option> 177 <option value="静岡県" >静岡県</option> 178 <option value="愛知県" >愛知県</option> 179 <option value="三重県" >三重県</option> 180 <option value="滋賀県" >滋賀県</option> 181 <option value="京都府" >京都府</option> 182 <option value="大阪府" >大阪府</option> 183 <option value="兵庫県" >兵庫県</option> 184 <option value="奈良県" >奈良県</option> 185 <option value="和歌山県" >和歌山県</option> 186 <option value="鳥取県" >鳥取県</option> 187 <option value="島根県" >島根県</option> 188 <option value="岡山県" >岡山県</option> 189 <option value="広島県" >広島県</option> 190 <option value="山口県" >山口県</option> 191 <option value="徳島県" >徳島県</option> 192 <option value="香川県" >香川県</option> 193 <option value="愛媛県" >愛媛県</option> 194 <option value="高知県" >高知県</option> 195 <option value="福岡県" >福岡県</option> 196 <option value="佐賀県" >佐賀県</option> 197 <option value="長崎県" >長崎県</option> 198 <option value="熊本県" >熊本県</option> 199 <option value="大分県" >大分県</option> 200 <option value="宮崎県" >宮崎県</option> 201 <option value="鹿児島県" >鹿児島県</option> 202 <option value="沖縄県" >沖縄県</option> 203 </select> 204 市区町村 205 <input type="text" name="address" value=""> 206 <input type="hidden" name="search_method" value="address"> 207 <input type="submit" name="search_2" value="検索"> 208 </form> 209 </section> 210 <section class="search_reslut"> 211 212 </section> 213<?php if (count($address_data) > 0) { ?> 214 <?php print '検索件数' . $address_data_count . '件' . '<br>' . '<br>' . '郵便番号検索結果'; ?> 215 216 <table> 217 218 <tr> 219 <th>郵便番号</th> 220 <th>都道府県</th> 221 <th>市区町村</th> 222 <th>町域</th> 223 </tr> 224 225 <?php 226 foreach ($address_data as $value) { 227 ?> 228 <tr> 229 <td><?php print h($value['post_number']); ?></td> 230 <td><?php print h($value['pref_kanji']); ?></td> 231 <td><?php print h($value['city_kanji']); ?></td> 232 <td><?php print h($value['town_kanji']); ?></td> 233 </tr> 234 <?php 235 } 236 ?> 237 238 </table> 239<?php } else { ?> 240 <p>ここに検索結果が表示されます</p> 241 <?php } ?> 242 243 <?php if ($post_number !== NULL) { ?> 244 <?php print $message . "<br>"; ?> 245 <?php } ?> 246 247 <?php if ($address !== NULL) { ?> 248 <?php print $error . "<br>"; ?> 249 <?php } ?> 250 251 <!--検索結果が10件以上の時、遷移できるurlを表示--> 252 <?php if ($address_data_count > 10) : ?> 253 <a href= '<?php print $url_back; ?>'> 前のページへ</a> 254 <?php endif; ?> 255 256 <?php if ($address_data_count > 10) : ?> 257 <a href='<?php print $url_next; ?>'>次のページへ</a> 258 <?php endif; ?> 259 260 261</body> 262</html>

最後に

ページング機能を実装できれば
一通り完成となるので、
分かる方がいらっしゃいましたら、
お力をお貸しください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/04/20 00:23

ローカル環境かもしれませんが、ユーザとパスワードはマスク掛けといた方が良いです。
chocolat_0416

2018/04/20 00:27

そうですね????ご指摘いただきありがとうございます!
guest

回答2

0

ベストアンサー

概念的な話です。ほぼ作り直しになるかもしれません。

検索を POSTに、ページングをGETにすると良いです。
POSTされた検索条件はセッションに入れておき、必ずセッションを参照する。

あとできれば郵便番号とそれ以外はform分けない方がいいかもしれませんね。
郵便番号もあいまい検索した方が検索の仕方としては幅広くなります。

ページングは「全体の総数」「1ページの表示件数」「今何ページ目か」があれば実現可能です。
それぞれを取得するように作ってください。

何ページになるかの計算

切り上げ(総件数 / 1ページ表示数)

1件目が何レコード目かの計算
※この計算結果はSQLで limitかけると良い

(何ページ目-1) * 1ページ表示件数 ※SQLの場合0が1レコード目です

あとは何ページになるかわかればその分forで回してhtmlを作成
?page={$i}
のような形でURLに埋め込み、SQLには$_GET["page"]を利用してlimit かける。

追記:
「総件数」をとってきたあとの変数のcount()でとってきていますが、これはよろしくないです。
というのは住所録となると何万件もの件数となるため、「全部とってきてそこからちょっと取り出す」のは
処理がかなり重たくなり、表示も遅くなります。
SQLでlimitをかけていない状態でcountして総件数とすべきかと思います。

余談:
SQLにユーザーからの入力値を含めるのであれば必ずエスケープをすべきです。

それかPDOでのDBアクセスをご検討ください。
とても参考になる記事:PHPでデータベースに接続するときのまとめ

投稿2018/04/20 00:37

編集2018/04/20 00:45
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chocolat_0416

2018/04/20 00:51

ご丁寧な説明をしていただきありがとうございます! この検索機能の使用は、とある課題のサンプルと一緒のものです。 また、検索するものは、 本来ならば日本全国ですが データベースの関係上ある一県だけのデータを 取得してもよいことになっておりました。 ご教授していただいたものを参考にページネーションを 実装させます!ありがとうございました!
m.ts10806

2018/04/20 01:04 編集

> データベースの関係上ある一県だけのデータ おそらくそうでしょうね。郵政省のデータベース上だと「約12万件ある」とされています。 何かしら条件がないと一気に取得するのは難しいですね。 例えば都道府県は入力必須にするとか。 「前へ」「次へ」だけで1ページ10件だと中々欲しいデータまで辿りつけないので、 指定のページ前後5件は出すようにしておくとか、「最初へ」「最後へ」を付け加えたり、 基本部分が理解できれば幾らでも対応可能となります。 ページネーション実装にはよく使われる課題だと思うので、 しっかり作りこんで身につけてください。
guest

0

現在のページを1ページ目から始めて$pageだとすれば次のページは$page+1

これをLIMIT句にあてはめ

SQL

1SELECT * FROM tbl WHRE ・・・ LIMIT ($page-1)*10,10

投稿2018/04/20 00:25

編集2018/04/20 00:26
yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問