PHP ページネーションを実装したい
PHP勉強のため、生き物の写真、種名、説明を投稿できる図鑑アプリをローカル環境で作成しています。
現在、生き物の種名を検索し、検索ワードに引っかかった投稿内容を一覧表示する機能を実装しています。
検索結果を表示するところまでは成功したのですが、ページネーションを付け加えようとした所で手詰まりになってしまっています。解決策をご教授いただきたいです。よろしくお願いします。
<開発環境>
-php7.3.11
-XAMPP 7.3.12-0
-macOS 10.15.3
<実現したいこと>
・index.tpl.phpにて検索ワードを入力しsearch.phpにPOST
・search.phpで入力値を取得し、入力値に一致する投稿内容をDBから取得
・search.tpl.phpにて取得した投稿内容を表示。その際、「1ページに5つの投稿内容」を表示するページネーションを実装したい。
<発生している問題>
POSTされた入力値が「あ」だった場合
SELECT COUNT(*) as 'cnt' FROM picture WHERE sp_name LIKE '%あ%'
phpmyadminで直接上記のSQLを実行した結果は一致する投稿内容が「12件」取得できる
同じくアプリ上で検索をすると、結果が12件取得でき、投稿内容が5つ表示される (1)
しかし「2ページへ」というリンクを押すと、別の結果が取得されてしまう。 (2)
ログを見ると、2ページ目に移動する際$keywordがnullになってしまう所が怪しいとは思ったのですがそれ以上進めておりません。
(1)のログ
15:22:28.399[D]function.php(155):SQL=SELECT picture.id, sp_name, picture.team, picture, description, user_id, user.nickname FROM picture LEFT JOIN user ON picture.user_id = user.id WHERE sp_name LIKE ? ORDER BY picture.id DESC LIMIT ?, 5 15:22:28.400[D]function.php(161):keyword=あ 15:22:28.401[D]function.php(166):total=12 15:22:28.401[D]function.php(169):count page=3.0
(2)のログ
15:23:07.186[D]function.php(155):SQL=SELECT picture.id, sp_name, picture.team, picture, description, user_id, user.nickname FROM picture LEFT JOIN user ON picture.user_id = user.id WHERE sp_name LIKE ? ORDER BY picture.id DESC LIMIT ?, 5 15:23:07.187[D]function.php(161):keyword=NULL 15:23:07.187[D]function.php(166):total=38 15:23:07.188[D]function.php(169):count page=8.0
<該当コード>
index.tpl.php
php
1<!DOCTYPE html> 2<html> 3<?php include('header_inc.php') ?> 4<body> 5<label>種名検索</label> 6<p></p> 7<form action="search.php?page=1" method="post"> 8<input type="hidden" name="page" value=1> 9<input type="text" name="keyword"> 10<input type="submit" name="submit" value="検索する"> 11<form>
search.php
php
1<?php 2session_start(); 3require_once __DIR__ . '/vendor/autoload.php'; 4require_once('init.php'); 5$login = checkLoginStatus(); 6displayLink($login); 7 8//index.phpからpostされてきた値を受け取る 9$keyword = assignmentKeyword(); 10 11//検索ワードを含む種名の投稿をDBから探し出す 12$pdo = connectDB(); 13list($pbooks, $pages, $total) = searchPbook($pdo, $keyword, $_POST['page']); 14require_once('search.tpl.php');
search.tpl.php
php
1<!DOCTYPE html> 2<html> 3<?php include('header_inc.php') ?> 4<body> 5<h3><?php echoSearchResult($total) ?></h3> 6 7<?php foreach($pbooks as $pbook): ?> 8 9 <p><?php h($pbook['nickname']) ;?>さんの投稿</p> 10 <p>[種名]:<?php h($pbook['sp_name']); ?><br></p> 11 <p>[写真]:<img src="files/<?php h($pbook['picture']); ?>" 12 width="300" height="300" alt="" /> 13 <br></p> 14 <p>[説明]:<br><?php hbr($pbook['description']); ?><br></p> 15 16<?php endforeach; ?> 17 18<?php for($i=1; $i < $pages; $i++) : ?> 19 20 <?php if($_GET['page'] == $i): ?> 21 <?=$_GET['page'] .'ページ'; ?> 22 <?php else: ?> 23 <form action=""> 24 <?php printf("<a href='?page=%d'>%dページへ</a><br />\n", $i, $i); ?> 25 <?php endif; ?> 26 27<?php endfor; ?> 28
function.php
php
1function assignmentKeyword(){ 2 if(isset($_POST['submit'])){ 3 $keyword = $_POST['keyword']; 4 return $keyword; 5 } 6} 7 8function searchPbook($pdo, $keyword, $start){ 9 $csql = "SELECT COUNT(*) as 'cnt' FROM picture WHERE sp_name LIKE ?"; 10 $ssql = "SELECT picture.id, sp_name, picture.team, picture, description, user_id, user.nickname 11 FROM picture LEFT JOIN user ON picture.user_id = user.id 12 WHERE sp_name LIKE ? ORDER BY picture.id DESC LIMIT ?, 5 "; 13 logD($ssql, 'SQL'); 14 $sstmt = $pdo->prepare($ssql); 15 $sstmt->bindValue(1, '%' . addcslashes($keyword, '\_%') . '%', PDO::PARAM_STR); 16 $sstmt->bindValue(2, $start * 5, PDO::PARAM_INT); 17 $sstmt->execute(); 18 $pbooks = $sstmt->fetchAll(PDO::FETCH_ASSOC); 19 logD($keyword, 'keyword'); 20 $cstmt = $pdo->prepare($csql); 21 $cstmt->bindValue(1, '%' . addcslashes($keyword, '\_%') . '%', PDO::PARAM_STR); 22 $cstmt->execute(); 23 $total = $cstmt->fetchColumn(); 24 logD($total, 'total'); 25 26 $pages = ceil($total / 5); 27 logD($pages, 'count page'); 28 29 return [$pbooks, $pages, $total]; 30} 31 32function echoSearchResult($total){ 33 if($total == 0){ 34 echo "検索結果は0件でした。"; 35 }elseif($total == 1){ 36 echo "検索結果は1件でした。"; 37 }else{ 38 echo "検索結果は". $total."件でした。"; 39 } 40} 41 42function connectDB() { 43 return new PDO(DSN, DBUSER, DBPASS, [ 44 PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 45 PDO::ATTR_EMULATE_PREPARES=>false, 46 PDO::MYSQL_ATTR_INIT_COMMAND=>"SET time_zone='Asia/ToKyo'", 47 ]); 48}
どこを修正したら良いでしょうか。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー