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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

1223閲覧

PHP 投稿一覧ページ ページネーション 実装

1h_m

総合スコア19

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/04/04 06:33

編集2020/04/04 06:34

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}

どこを修正したら良いでしょうか。
よろしくお願い致します。

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

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

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

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

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

SanQ

2020/04/04 11:19

search.tpl.phpの下から四行目にある<form action="">はどのような意図で書きましたか?
guest

回答1

0

ベストアンサー

「2ページ目に移動する際$keywordがnullになってしまう」原因は、search.tpl.phpで他のページへ飛ぶとき、index.tpl.php<input type="text" name="keyword">にあたる部分がないからではないでしょうか。
なので、search.tpl.php内の

<form action=""> <?php printf("<a href='?page=%d'>%dページへ</a><br />\n", $i, $i); ?> <?php endif; ?>

index.tpl.php<input type="text" name="keyword">から受けた値を遷移先のページへ送るコードを書き込めば(あと</form>を入れること)解決できるのではないか、と思います。

投稿2020/04/04 11:11

SanQ

総合スコア92

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

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

1h_m

2020/04/05 05:52

すみません、formタグは消し忘れでした。formタグは使わずにgetメソッドでkeywordを渡すことで解決できました。ご回答有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問