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

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

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

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

PHP

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Q&A

解決済

3回答

2580閲覧

【PHP+MySQL】inputボックスで検索した値の2ページ目以降を表示したい

nasulrj

総合スコア38

MySQL

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

PHP

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

0グッド

0クリップ

投稿2018/04/11 15:52

編集2018/04/12 05:25

ただいま、アイテム一覧を表示させるサイトを稼働中です。
この度は、ページング機能を追加しようと思いましたが、inputボックスのテキストで入力したものを1件ずつ検索条件に合った分全てを表示させるシステムを組み込んでいますが、2ページ目以降がどうしても全件表示になってしまい、できそうにありません。

どのようにすれば、inputボックスのテキストで入力したものを1件ずつ2ページ目以降も正常に表示されるのでしょうか?
お知恵を貸してください。

php

1//データベースの接続処理のPHPファイルを読み込む 2require('test/connecttest.php'); 3 4//5件ずつブラウザに表示させる 5define('COMMENTS_PER_PAGE', 5); 6 7 8 9try { 10 $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); 11 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 13} catch (PDOException $e) { 14 echo $e->getMessage(); 15 exit; 16} 17 18//ページ 19if (filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) > 0) { 20 $page=filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT,["options"=>["default"=>1,"min_range"=>1]]); 21 //var_dump($page); 22} else { 23 $page = 1; 24} 25var_dump($page); 26 27$offset=(int)COMMENTS_PER_PAGE *($page-1); 28//var_dump($offset); 29 30 31$arrParams = []; 32$sql = "select * from items "; 33 34if (filter_input(INPUT_POST, 'itemName') != '') { 35 $sql .= "WHERE item LIKE :item "; 36 $arrParams[':item'] = "%" . addcslashes(filter_input(INPUT_POST, 'itemName') , '\_%') . "%"; 37} 38 39 40// 検索条件で行を返す 41$limit = sprintf("limit %d, %d", $offset, COMMENTS_PER_PAGE); 42$stmt = $dbh->prepare($sql . $limit); 43$stmt->execute($arrParams); 44var_dump($arrParams); 45// 同じ検索条件で全件数を返す 46//var_dump($sql); 47$total_sql = "select count(*) as total from items"; 48$row_total = $dbh->query($total_sql)->fetch(); 49$total = $row_total['total']; 50var_dump($total_sql); 51 52$totalPages = ceil($total / COMMENTS_PER_PAGE); 53var_dump($totalPages); 54 55?>

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>コメント一覧</title> 6</head> 7<body> 8<h1>コメント一覧</h1> 9<form method="post"> 10<input type="text" name="itemName"> 11<input type="submit" name="search" value="検索"> 12</form> 13<ul> 14 15 <?php while($result = $stmt->fetch(PDO::FETCH_ASSOC)) : ?> 16 <li><?php echo htmlspecialchars($result['item'],ENT_QUOTES,'UTF-8'); ?></li> 17 <?php endwhile; ?> 18 19</ul> 20<!--何故かここから先がブラウザに表示されなくなりました --> 21<?php if($page >1): ?> 22<a href="?page=<?php echo $page-1; ?>">前へ</a> 23<?php endif; ?> 24<?php for ($i = 1; $i <= $totalPages; $i++) :?> 25 <a href="?page=<?php echo $i; ?>"><?php echo[リンク内容](https://i.gyazo.com/885ea7a761f12306bea8ddf392e56d44.gif) $i ?></a> 26<?php endfor; ?> 27<?php if($page < $totalPages): ?> 28<a href="?page=<?php echo $page+1; ?>">次へ</a> 29<?php endif; ?> 30</body> 31

$total_sql文にas totalを追加しました。
追加したことにより、全体表示のページリンクが回復できました。

実行結果
こちらからお願いします

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

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

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

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

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

guest

回答3

0

残念ながら、原型がなくなってしまいました。

php

1<?php 2 3// これを書かずにPHP書くな。 4ini_set('display_errors', true); 5error_reporting(E_ALL); 6 7// require('test/connecttest.php'); // 中に何書いているかわからんのでコメントアウト。 8//5件ずつ表示 9define('COMMENTS_PER_PAGE', 1); // <- なんで1。コメントが嘘ついてるのか、コードが嘘なのか? 10 11try { 12 13 define('DB_HOST', 'localhost'); 14 define('DB_NAME', 'sample'); 15 define('DB_USER', 'root'); 16 define('DB_PASSWORD', 'password'); 17 18 $dsn = sprinf('mysql:host=%s;dbname=%s;charset=utf8', DB_HOST, DB_NAME); 19 20 $dbh = new PDO($dsn, DB_USER, DB_PASSWORD); 21 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 22 // $dbh->query("set names utf8"); // 無駄なコードなのでコメントアウト 23//ページ 24 // if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { 25 if (filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) > 0) { 26 $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT); 27// var_dump($page); 28 } else { 29 $page = 1; 30 } 31 32 $offset = (int) COMMENTS_PER_PAGE * ($page - 1); 33 34 $arrParams = []; 35 $sql = "select * from items "; 36 37 if (filter_input(INPUT_POST, 'itemName') != '') { 38 $sql .= "WHERE item LIKE :item "; 39 $arrParams[':item'] = "%" . filter_input(INPUT_POST, 'itemName') . "%"; 40 } 41 42 // 検索条件で行を返す 43 $limit = sprintf("limit %d, %d", $offset, COMMENTS_PER_PAGE); 44 $stmt = $dbh->prepare($sql . $limit); 45 $stmt->execute($arrParams); 46 $rows = $stmt->fetchAll(); 47 48 // 同じ検索条件で全件数を返す 49 $total_sql = str_replace('*', 'count(*) as total', $sql); 50 $row_total = $dbh->query($total_sql)->fetch(); 51 $total = $row_total['total']; 52} catch (PDOException $e) { 53 $err = $e->getMessage(); 54} 55//$comments = array(); 56$totalPages = ceil($total / COMMENTS_PER_PAGE); 57

投稿2018/04/11 16:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/04/11 16:38

サンプルデータがないので動作確認はしていません。悪しからず。
退会済みユーザー

退会済みユーザー

2018/04/11 16:41

$arrParams[':item'] = "%" . filter_input(INPUT_POST, 'itemName') . "%"; は、 addcslashes() 等がいると思う。
退会済みユーザー

退会済みユーザー

2018/04/11 16:43 編集

あ、手を抜いたのバレた…笑 ワイルドカード許可する仕様です!
nasulrj

2018/04/12 00:19

回答有り難うございます。 filter_inputの命令があるとは大変参考になりました。 回答のソースコードを動かしたところ、全件表示もされなくなってしまったので、一部ソースコードを修正しました。
nasulrj

2018/04/12 00:38

>te2jiさん ありがとうございます。 頻繁によく見ていましたが、まさかプレースホルダーの説明まであるとは気づきませんでした。 修正して考え直してみます。
yambejp

2018/04/12 00:51

pageについてはこうするとわかりやすかも $page=filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT,["options"=>["default"=>1,"min_range"=>1]]);
nasulrj

2018/04/12 01:56

>Kosuke_Shibuyaさん ありがとうございます。 回答のソースコードで動作するように致しました。 そのままだと$total_sqlでシンタックスエラーが出たので、$total_sql=select count(*) from items where item='.$arrParams.'に書き換え再度実行しましたが、ページのリンク部分が消えてしまいました。
nasulrj

2018/04/12 02:09

>yambejpさん ありがとうございました。 使わせていただきます。 >all ページのリンク部分が消えてしまうと困るので、質問のソースコードを全面的に修正します。
nasulrj

2018/04/12 11:51

すいません、どれもこれも試しましたが、うまくいきませんでした。 理解力が不足して折り申し訳ございません。 もう一度、ドットインストールのソースコードに戻して一つずつやったら、原因がボタンを押してしまうと$_POST['itemName']が切れることでした。 ボタンを押してもこの値を有効にし続けるためにはどのように引き継いだらよろしいでしょうか?
nasulrj

2018/04/13 00:01

プラグインを入れることで解決しました ありがとうございます。
guest

0

自己解決

PHPでは本番データの処理を変更せず、JavaScriptのページングのプラグインを入れることで解決しました。

今後も意見を参考しつつスキルアップを目指していきたいと思います。

ご回答くださった皆様ありがとうございました。

投稿2018/04/13 00:05

nasulrj

総合スコア38

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

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

0

基本的に検索処理をpostでしていてページャーがgetで渡すのであれば
まずpostしたデータをセッションにツッコミ、getで処理された時に
それを参照するのが妥当でしょう。
とはいえセッションデータがのこってしまって別途検索時に
不要なセッションを参照してしまう可能性もあるので
getのパラメータにセッションを利用するかどうかの情報を埋め込むと
よいかもしれません

投稿2018/04/12 02:25

yambejp

総合スコア114572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問