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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1343閲覧

【ページネーション】PHPとMysqlで簡易掲示板の作成をしています。

kg6218

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1グッド

1クリップ

投稿2018/09/15 17:14

前提・実現したいこと

【ページネーション】PHPとMysqlで簡易掲示板の作成をしています。

キーワードを検索で、ページネーションの実装を行いたいです。
※全件表示はなんとなくできました。

「キーワード」検索
でヒットした検索数の表示とその件数に伴ってページネーションを自動で生成。

【1,2,3】のように
各ページ表示件数を10件程表示

発生している問題・エラーメッセージ

問題1 検索結果を10件ずつ表示したいのですが、sql文でLIMITで10件だけ表示を設定していると、データベース内の中からキーワードに合った条件を最初の10件から表示されます。 解決方法 データベースより、キーワードに伴って該当するデータを各10件ずつ表示したい。 問題2 ページネーションの数は表示できたのですが、2,3ページをクリックすると、 先に「キーワード検索」で検索した情報がリセットされてしまいます。 解決方法 ページネーションの2,3をクリックすると、条件にあったキーワード 例えば 18件だとすると、 1ページ目は 10件 2ページ目は 残りの8件というふうに表示したい。

該当のソースコード

PHP

1<script> 2 3 4 function limit() { 5 alert('aaaaaaa'); 6 } 7</script> 8<link rel="stylesheet" href="style.css"> 9<div id="container"> 10 11<h1>簡易掲示板一覧</h1> 12<!---------------------------------------------------------------------- 13 検索フォーム 14 -------------------------------------------------------------------------> 15<input type="button" onclick="location.href='add.php'"value="投稿画面へ"><br> 16 17<form action="" method="post"> 18 <input type="text" name="naiyou"> 19 <select name="limit" onhange="limit()"> 20 <option value="5">5件</option> 21 <option value="10">10件</option> 22 <option value="10">10件</option> 23 <option value="10">10件</option> 24 </select> 25 <input type="submit" name="submit" value="検索"> 26</form> 27 28 29<?php 30// データベースへの接続 31$pdo = new PDO( "mysql:host=localhost;dbname=keiziban" , "root" , "" ) ; 32 33// 文字コードの指定 34$pdo->query ( "set character set utf8" ) ; 35 36 37/* ---------------------------------------------------------------------- 38 全件表示 39 -------------------------------------------------------------------------*/ 40// SQL文の実行 41 42if ( !isset( $_POST["submit"] ) ) { 43 44 // GETで現在のページ数を取得する(未入力の場合は1を挿入) 45 if (isset($_GET['page'])) { 46 $page = (int)$_GET['page']; 47 } else { 48 $page = 1; 49 } 50 51 // スタートのポジションを計算する 52 if ($page > 1) { 53 // 例:2ページ目の場合は、『(2 × 10) - 10 = 10』 54 $start = ($page * 10) - 10; 55 } else { 56 $start = 0; 57 } 58 59 echo "<h1>{$page}ページ目です</h1>"; 60 61 // レコード数を調べる 62 $sth = $pdo->query("SELECT count(*) FROM keiziban"); 63 $count = $sth->fetchColumn(); 64 echo "{$count}件のデータが登録されています。<br>"; 65 66 echo "submitにデータ入力なし(全件表示)<br>"; 67 68 // SQLの実行 69 $query = "SELECT * FROM keiziban" ; 70 $query .= " LIMIT {$start}, 10 "; 71 72 $stmt = $pdo->query ( $query ) ; 73 74 75 while($row = $stmt->fetch( PDO::FETCH_ASSOC)) { 76 echo $row['ID'] ." "; 77 echo $row['hiduke'] ." "; 78 echo $row['naiyou']."<br>"; 79 } 80 81 // postsテーブルのデータ件数を取得する 82 $page_num = $pdo->query("SELECT COUNT(*) ID FROM keiziban"); 83 84 $page_num->execute(); 85 $page_num = $page_num->fetchColumn(); 86 87 // ページネーションの数を取得する 88 $pagination = ceil($page_num / 10); 89 90 for ($x=1; $x <= $pagination ; $x++) { 91 //echo $ 92 echo "<a href='?page={$x}'> {$x} </a>"; 93 } 94 exit( ) ; 95} 96 97?> 98 99<!---------------------------------------------------------------------- 100 キーワード検索 101 -------------------------------------------------------------------------> 102<?php 103 104// GETで現在のページ数を取得する(未入力の場合は1を挿入) 105 if (isset($_GET['page'])) { 106 $page = (int)$_GET['page']; 107 } else { 108 $page = 1; 109 } 110 111 // スタートのポジションを計算する 112 if ($page > 1) { 113 // 例:2ページ目の場合は、『(2 × 10) - 10 = 10』 114 $start = ($page * 10) - 10; 115 } else { 116 $start = 0; 117 } 118 119echo "submitにデータ入力あり<br>"; 120 121// 値の取得 122 $naiyou = htmlspecialchars ( $_POST["naiyou"], ENT_QUOTES ) ; 123 124// SQL文の実行 125 $query = "SELECT * FROM keiziban" ; 126 $query .= " WHERE naiyou like '{$naiyou}%' " ; 127 $query .= " ORDER BY ID LIMIT 10 "; 128 $stmt = $pdo->query ( $query ) ; 129 echo $query; 130 131if ( $stmt == false ) { 132 exit ( "データの取得に失敗しました" ) ; 133} 134echo "{$stmt->rowCount()}件のデータがみつかりました。<br>"; 135echo "<h1>{$page}ページ目です</h1>"; 136while($row = $stmt->fetch( PDO::FETCH_ASSOC)) { 137 echo $row['ID'] ." "; 138 echo $row['hiduke'] ." "; 139 echo $row['naiyou']."<br>"; 140} 141 142// postsテーブルのデータ件数を取得する 143 $page_num = $pdo->query("SELECT COUNT(*) ID FROM keiziban WHERE naiyou like '{$naiyou}%'"); 144 //$page_num = $pdo->query("SELECT COUNT(*) ID FROM keiziban"); 145 //$page_num = $pdo->query("SELECT count(*) FROM keiziban"); 146 147 $page_num->execute(); 148 $page_num = $page_num->fetchColumn(); 149 150 // ページネーションの数を取得する 151 $pagination = ceil($page_num / 10); 152 echo "<h1>{$pagination}回繰り返す</h1>"; 153 echo "<h1>{ceil($page_num)}回繰り返す</h1>"; 154 155 for ($y=1; $y <= $pagination ; $y++) { 156 echo "<a href='?page={$y}'> {$y} </a>"; 157 } 158?> 159</div> 160

PHP初心者です。
お力添えをしていただければ幸いです。
お手数をお掛けしますがよろしくお願いいたします。

Yaiba184👍を押しています

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

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

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

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

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

tanat

2018/09/15 17:33

質問文に記載のコードは自作のコードでしょうか?参考にしているサイトや書籍などがあれば記載すると適切な回答が鰓得ると思います。
kg6218

2018/09/15 18:01

ご返答ありがとうございます。すみません。ネットや参考書の一部をもじって自作したコードです。ですので記載できるものがないんですよ。
m.ts10806

2018/09/17 04:05

解決済みとなっているようですが、回答者さんにどのように解決したのか、理解はできたのかコメントしてあげてください。回答に何も反応がないと次も回答してみようという気も削がれてしまいます。 https://teratail.com/help/question-tips#questionTips4-2
guest

回答1

0

ベストアンサー

Method について

HTTP通信において、GET, POST, PUT, DELETE があるということの認識はありますか?
PUT, DELETEは知らなくても、GETPOST があるということは理解している前提で話を進めます。

検索の機能はPOSTに設定していますね。

php

1<form action="" method="post"> 2 <input type="text" name="naiyou"> 3 <select name="limit" onhange="limit()"> 4 <option value="5">5</option> 5 <option value="10">10</option> 6 <option value="10">10</option> 7 <option value="10">10</option> 8 </select> 9 <input type="submit" name="submit" value="検索"> 10</form>

form要素のmethod属性にpostを設定しています。

このとき、通信はPOSTとなります。

php

1<form action="" method="get">

一方、GETのとき、アドレスバーに表示されるURIは example.php?naiyou=xxx&limit=10 のようになることは理解していますね?

php

1echo "<a href='?page={$y}'> {$y} </a>";

a要素に↑と設定していることと同じ動きになります。
a要素がクリックされたとき、GET 通信となり、POSTで送られていたはずのパラメータは消えてしまっていることが原因です。

つまり、2ページ目以降にページが遷移したとき、POSTで送っていたはずのnaiyouの値が送られていないのです。

Teratail の検索はどうなっているのか。

Google Chrome のデベロッパーツールを使って調べてみます。

イメージ説明

検索に含めたキーワード「PHP」がURL(https://teratail.com/questions/search?q=PHP&conditions=and)に含まれていることがわかります。右側のRequest Method にも GET と表示されています。

ページネーションで2ページ目をクリックしたとき、どうなるかを調べます。

イメージ説明

このときURLは https://teratail.com/questions/search?tab=active&page=2&q=PHP&conditions=and

となり、ページ番号の2や「PHP」という検索キーワードも含まれていることがわかりますね。

提示されたソースコードについて

セキュリティ的にやってはいけないコードが多数見受けられます。
こちらの記事を熟読し、コードを直してみてください。

投稿2018/09/15 18:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Yaiba184

2018/09/15 19:00

tetatailを例に出して説明すんの秀逸
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問