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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

3回答

1638閲覧

PHP MySQL で投稿一覧、絞り込み検索、ページャー機能 ページャー機能が正しく動作しません

v700

総合スコア5

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/06/20 17:58

編集2020/06/21 05:40

初めまして。
phpを独学で勉強中です。

phpの投稿フォームからMySQLへ保存し、一覧で書き出したり絞り込み検索ができるシステムを構築しています。
(Wordpressのブログのイメージです。ページャー機能も付けています)

絞り込み検索の部分が上手くいっておらず、下記で記述しましたが
条件を指定していなければ、テーブル「shop」内のすべてのフィールドを表示できますが、
検索フォームで条件を指定すると何も取得されない状態になってしまいます。
→※訂正 こちら自己解決しました

※訂正
下記修正し、絞り込み検索は機能しました。
ただ、今度はページャーが上手くいっておらず、
絞り込みしていようがいまいが、データベース内のデータがすべて入っている状態のページ数になってしまいます。
こちら修正方法等おわかりになりますでしょうか。

▼MySQL
テーブル名: shop
カラム1: ID(連番)
カラム2: s_name(テキスト)

▼検索フォーム

HTML

1 <form action="search.php" method="post"> 2 <dl><dt>キーワード検索</dt> 3 <dd><input type="text" name="sea_name"></dd></dl> 4 <dl><dd><input id="send" type="submit" value="送信する"></dd></dl> 5 </form>

▼一覧表示(search.php)

php

1<?php 2$sea_name = $_POST['sea_name']; 3 4$user = 'user'; 5$pass = 'pass'; 6$dsn = 'mysql:host=localhost;dbname=db'; 7$shop = new PDO($dsn, $user, $pass); 8 9if (isset($_GET['page'])) { 10 $page = (int)$_GET['page']; 11} else { 12 $page = 1; 13} 14 15if ($page > 1) { 16 // 例:2ページ目の場合は、『(2 × 10) - 10 = 10』 17 $start = ($page * 3) - 3; 18} else { 19 $start = 0; 20} 21 22 if(!empty($sea_name)) { 23 $sea_name = addslashes($sea_name); 24 $where = "s_name REGEXP '$sea_name' &"; 25 } 26 27 if(!empty($where)) { 28 $where = substr($where, 0, -1); 29 $where = "WHERE " . $where; 30 } 31 32$posts = $shop->prepare(" 33 SELECT * 34 FROM shop 35 {$where} 36 ORDER BY id DESC 37 LIMIT {$start}, 3 38"); 39 40$posts->execute(); 41$posts = $posts->fetchAll(PDO::FETCH_ASSOC); 42?> 43 44 <p>検索条件</p> 45 <p>フリーワード:<?php echo $sea_name; ?></p> 46 <p>検索結果</p> 47 <?php 48 foreach ($posts as $post) { 49 echo " 50 <li> 51 <h3>{$post['s_name']}</h3> 52 </li> 53 " 54 ;} 55 ?> 56 </ul> 57 <?php 58 $page_num = $shop->prepare(" 59 SELECT COUNT(*) id 60 FROM shop 61 "); 62 $page_num->execute(); 63 $page_num = $page_num->fetchColumn(); 64 65 $pagination = ceil($page_num / 3); 66 67 for ($x=1; $x <= $pagination ; $x++) { ?> 68 <a href="?page=<?php echo $x ?>"><?php echo $x; ?></a> 69 <?php } // End of for ?>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/21 00:35

コードを markdown の記法で記述してください。読む気になりません。 あと、想定される SQL を MySQL で直接実行した際に、求める結果が得られているかどうかも追記があると、回答しやすいです。
v700

2020/06/21 04:48

markdown方式で記載しました。 MySQLで直接実行の方法がまだわかっておりません。こちら調べてみます。
m.ts10806

2020/07/04 04:54

MySQLにログインできればなんでも良いです(ただしPHP以外から) phpMyAdminとかコマンドラインとかワークベンチとか 幾らでも手段はあります。 直接実行して想定の結果を得られるSQLができてない状態でPHPから実行してはいけません。
guest

回答3

0

mysqlにおけるLIMITの値渡しはちょっと注意が必要で
prepareではPARAM_INT指定が必須になります

limit ?
を指定して
bindValue(番号,値,PDO::PARAM_INT)

とする必要があります。
またwhere句もどうようにprepareで疑問符やラベルでパラメータを指定してください
そとから持ってたデータを変数で埋め込むのは問題外です

投稿2020/06/21 04:08

yambejp

総合スコア116724

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

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

0

下記のコードでページ数を表示しているのが原因では?

php

1 $page_num = $shop->prepare(" 2 SELECT COUNT(*) id 3 FROM shop 4 "); 5 $page_num->execute(); 6 $page_num = $page_num->fetchColumn(); 7 8 $pagination = ceil($page_num / 3);

投稿2020/07/04 04:49

herobo

総合スコア153

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

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

0

SELECT * FROM shop ORDER BY id DESC LIMIT {$start}, 3 {$where}

これをそのままprintしたら、どんなSQL文が表示されますか?
そもそも$startが定義されていないような気がします。
また、特に理由がなければwhere句部分は s_name REGEXP $sea_name ではなく
s_name = $sea_name の形でいいかと思います。

また、プリペアドステートメントも早めに理解しておくと、後々便利です。
PDOでのやり方は覚えていませんが、メソッドが用意されているはずです。

投稿2020/06/21 00:44

ktrsw

総合スコア21

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

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

v700

2020/06/21 04:50

startの部分はページャー機能用に記載していたものです。 こちら省略してしまっていたので、追記しました。 =だと全文一致になってしまうかと思い、部分一致にしたいためREGEXPにしていました (このあたりもネットの知識ですが、、) プリペアドステートメント、調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問