前提・実現したいこと
【ページネーション】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初心者です。
お力添えをしていただければ幸いです。
お手数をお掛けしますがよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー