🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

1回答

699閲覧

ページネーション;上限超えて表示される&リンクが飛ばない

hariziro

総合スコア1

PHP

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

0グッド

0クリップ

投稿2021/03/16 03:26

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
タイトルの通りです。phpは初めて触っています。
ページネーションが上手くできません。

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

1ページの最大表示を5にしているが、全件表示されてしまう ページ遷移ができない

該当のソースコード

PHP

1<?php 2 // フォームデータ送受信確認用コード(本番では削除) 3 print '<div style="background-color: skyblue;">'; 4 print '<p>動作確認用:</p>'; 5 print_r($_POST); 6 print '</div>'; 7 8 // MySQLサーバ接続に必要な値を変数に代入 9 $username = 'dbuser'; 10 $password = 'dbpass'; 11 12 // PDO のインスタンスを生成して、MySQLサーバに接続 13 $database = new PDO('mysql:host=localhost;dbname=message_board;charset=UTF8;', $username, $password); 14 15 //一ページに表示する記事の数をmax_viewに定数として定義 16 define('max_view',3); 17 18 //必要なページ数を求める 19 $count = $database->prepare('SELECT COUNT(*) AS count FROM mybbs'); 20 $count->execute(); 21 //実行したSQLの結果を一行ずつ取り出す、PDO::FETCH_ASSOCはカラム名を連想配列的にして結果を取り出す 22 $total_count = $count->fetch(PDO::FETCH_ASSOC); 23 //総投稿数+1ページに表示する投稿数。ceilは切り上げを行う関数 24 $pages = ceil($total_count['count'] / max_view); 25 26 //現在いるページのページ番号を取得,issetは値が存在するかを確認する関数(あればTrue),今回は!で否定していることに注意 27 if(!isset($_GET['page_id'])){ 28 $now = 1; 29 }else{ 30 $now = $_GET['page_id']; 31 } 32 33 //ページネーションを表示 34 for ( $n = 1; $n <= $pages; $n ++){ 35 if ( $n == $now ){ 36 echo "<span style='padding: 5px;'>$now</span>"; 37 }else{ 38 echo "<a href='./home.php?page_id=$n' style='padding: 5px;'>$n</a>"; 39 } 40 } 41 42 //表示する投稿を取得するSQLを準備 43 $select = $database->prepare("SELECT name,time,content FROM mybbs ORDER BY no DESC LIMIT :start,:max"); 44 if ($now == 1){ 45 $select->bindValue(":start", $now-1, PDO::PARAM_INT); 46 $select->bindValue(":max", $max_view, PDO::PARAM_INT); 47 } else { 48 $select->bindValue(":start", ($now-1)*max_view, PDO::PARAM_INT); 49 $select->bindValue(":max", max_view, PDO::PARAM_INT); 50 } 51 $select->execute(); 52 $data=$select->fetchAll(PDO::FETCH_ASSOC); 53 54 // フォームから書籍タイトルが送信されていればデータベースに保存する 55 if (array_key_exists('name', $_POST)) { 56 // 実行するSQLを作成 57 $sql = 'INSERT INTO mybbs (name,content) VALUES(:name,:content)'; 58 // ユーザ入力に依存するSQLを実行するので、セキュリティ対策をする 59 $statement = $database->prepare($sql); 60 // ユーザ入力データ($_POST['name'])をVALUES(?)の?の部分に代入する 61 $statement->bindParam(':name', $_POST['name']); 62 $statement->bindParam(':content', $_POST['content']); 63 // SQL文を実行する 64 $statement->execute(); 65 // ステートメントを破棄する 66 $statement = null; 67 } 68 69 if (array_key_exists('message_id', $_POST)) { 70 // 実行するSQLを作成 71 $sql = 'DELETE from mybbs where id = :message_id'; 72 // ユーザ入力に依存するSQLを実行するので、セキュリティ対策をする 73 $statement = $database->prepare($sql); 74 // ユーザ入力データ($_POST['book_title'])をVALUES(?)の?の部分に代入する 75 $statement->bindParam(':message_id', $_POST['message_id']); 76 // SQL文を実行する 77 $statement->execute(); 78 // ステートメントを破棄する 79 $statement = null; 80 } 81 82 // 実行するSQLを作成 83 $sql = 'SELECT * FROM mybbs ORDER BY id DESC'; 84 // SQLを実行する 85 $statement = $database->query($sql); 86 // 結果レコード(ステートメントオブジェクト)を配列に変換する 87 $records = $statement->fetchAll(); 88 // ステートメントを破棄する 89 $statement = null; 90 // MySQLを使った処理が終わると、接続は不要なので切断する 91 $database = null; 92?> 93 94<!DOCTYPE html> 95<html lang="ja"> 96 <head> 97 <meta charset="utf-8"> 98 <title>MYBBS</title> 99 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 100 <link rel="stylesheet" href="mybbs.css"> 101 </head> 102 <body> 103 <div> 104 <h1><a href="mybbs.php">MYBBS</a></h1> 105 106 <h2>一覧表示機能</h2><br> 107<?php 108 define('cnt',1); 109 // $recordsの存在を確認、なければループに入らない 110 if ($records) { 111 // $recordsのレコードを1つずつ取り出して$recordに代入する 112 foreach ($records as $record) { 113 // $recordからbook_titleのカラムを取得して$book_titleに代入する 114 $message_id = $record['id']; 115 $user_name = $record['name']; 116 $created_time = $record['time']; 117 $content = $record['content']; 118?> 119 <div> 120 <p> 121 投稿者:<?php print htmlspecialchars($user_name, ENT_QUOTES, "UTF-8"); ?> / 投稿日時:<?php print htmlspecialchars($created_time, ENT_QUOTES, "UTF-8"); ?> 122 123 </p> 124 <form action="MYBBS.php" method="POST"> 125 <input type='hidden' name='message_id' value='<?php print htmlspecialchars($message_id, ENT_QUOTES, "UTF-8"); ?>'> 126 <button>削除</button> 127 </form> 128 <p><?php print htmlspecialchars($content, ENT_QUOTES, "UTF-8"); ?></p> 129 </div> 130<?php 131 } 132 } 133 134 //現在いるページのページ番号を取得,issetは値が存在するかを確認する関数(あればTrue),今回は!で否定していることに注意 135 if(!isset($_GET['page_id'])){ 136 }else{ 137 $now = $_GET['page_id']; 138 } 139 140 //ページネーションを表示 141 for ( $n = 1; $n <= $pages; $n ++){ 142 if ( $n == $now ){ 143 echo "<span style='padding: 5px;'>$now</span>"; 144 }else{ 145 echo "<a href='./home.php?page_id=$n' style='padding: 5px;'>$n</a>"; 146 } 147 } 148?> 149 150<ul> 151 1111111 152 <?php 153 //各記事のタイトルにリンクを貼って表示 154 foreach ( $data as $row ) { 155 echo "<li><a href='$row [name]'>{$row [time]}</a></li>"; 156 } 157 ?> 158</ul> 159 160 <hr /> 161 162 <h2>投稿機能</h2> 163 <form action="MYBBS.php" method="POST"> 164 <label for="name">投稿者</label> 165 <input type="text" name="name"><br> 166 <label for="content">本文</label> 167 <input type="text" name="content" placeholder="投稿内容を入力" required><br> 168 <button type="submit">投稿</button> 169 </form> 170 </div> 171 </body> 172</html>

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2021/03/16 03:46

offset,limitはバインドできなかった気が。
guest

回答1

0

全件表示される理由

LIMIT句の使い方間違ってませんか?SQLのLIMIT句のルールはこうですよ

limit 取得した全行のうち表示開始の行, そこから取得したい行数;

です。おそらく下限値,上限値と勘違いされているので、max_viewの数分、つまり全件数分表示してしまっています。毎回5ページずつ表示したいなら limit :start, 5 のまま動きません。

### ページネーションがうまくいかない理由
上に絡んで、取得件数がオーバ-フローしてしまっているためです。毎回max_viewの個数分取得しようとしてしまいます。

あと、定数は極力、半角英大で書くようにしましょう。動かないことはないですが、混乱を招くおそれがあります。

投稿2021/03/16 04:45

編集2021/03/16 04:52
FKM

総合スコア3647

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問