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

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

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

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

PHP

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

Q&A

解決済

2回答

209閲覧

パラメーターがNULLになってページングが機能しない

ariiiiiga

総合スコア66

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/06/26 16:27

前提・実現したいこと

会員機能付きの予約サイトを作っています。
ページング機能をつけたいのですが、ページング用のリクエストパラメーターがNULLになってしまいます。
原因がわからず現状、登録店舗がすべて1ページに表示されています。
これを10ページずつ表示させたいです。

宜しくお願い致します。

userレコード ユーザーの登録情報
shopレコード 登録店舗情報

該当のソースコード

php <?php error_reporting(E_ALL); ini_set("display_errors",1); define('PAGE_LIMIT', 10); session_start(); session_regenerate_id(true); if(!isset($_SESSION["user"])) { header("Location: login.php"); } try { //db接続済み // ①ユーザーIDからユーザー名を取り出す $query = "SELECT * FROM users WHERE user_id=:user_id"; $user_stmt = $pdo->prepare($query); $user_stmt->bindValue(':user_id', $_SESSION['user'], PDO::PARAM_INT); $user_stmt->execute();   var_dump($_SESSION['user']);//int(1) $user_stmt->fetch(PDO::FETCH_ASSOC); $user_id = $_SESSION['user']; // ②ショップ情報取り出し $shop_query = "SELECT * FROM shop"; $shop_stmt = $pdo->query($shop_query); $row = []; $arr_shop = []; while ($row = $shop_stmt->fetch(PDO::FETCH_ASSOC)) { $arr_shop[] = [ 'shop_id' => $row['shop_id'], 'shop_name' => $row['shop_name'], ]; } // リクエストパラメータの取得 $search = filter_input(INPUT_GET, 'search'); $p = !is_numeric(filter_input(INPUT_GET, 'p')) ? 0 : filter_input(INPUT_GET, 'p'); $name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS); $shop_id = filter_input(INPUT_GET, 'shop_id', FILTER_SANITIZE_SPECIAL_CHARS); var_dump($name);//NULLになってしまう // 取得開始位置 $offset = $p * PAGE_LIMIT; $sql = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from shop limit :limit offset :offset'); $sql->bindValue(":offset", $offset, PDO::PARAM_INT); $sql->bindValue(":limit", PAGE_LIMIT, PDO::PARAM_INT); $sql->execute(); // Total件数 $totalRow = $pdo->query("SELECT FOUND_ROWS() as total"); $all = $totalRow->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { var_dump($e); die(); } ?>
html <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>ユーザートップ</title> </head> <body> <main> <div class="reserve" > <?php if ( $all['total'] > 0 ) : ?> <p class="alert alert-success" style="text-align:center;">登録店舗数<?=htmlspecialchars($all['total']); ?>件</p> <thead> <tr> <th>店舗名</th> </tr> </thead> <tbody> <?php foreach($arr_shop as $key => $value) : ?> <tr> <th><?php echo htmlspecialchars($value['shop_name']);?></th> <?php endforeach; ?> </tbody> </table> <!-- ページネーション --> <div class="paging_left" > <?php if ( $p > 0 ) : ?> <a href="home.php?shop_id=<?= $value['shop_id'] ?>search=1&name=<?= $name ?>&shop_id=<?= $shop_id ?>&p=<?= $p-1 ?>" class="pull-left">戻る</a> <?php else : ?> <span class="pull-left" >最新</span> <?php endif; ?> </div> <div class="paging_right" > <?php if ( $all['total'] - (PAGE_LIMIT * $p ) > PAGE_LIMIT ) : ?> <a href="home.php?shop_id=<?= $value['shop_id'] ?>search=1&name=<?= $name ?>&shop_id=<?= $shop_id ?>&p=<?= $p+1 ?>" class="pull-right">次へ</a> <?php else : ?> <span class="pull-right" >末尾</span> <?php endif; ?> </div> <?php else : ?> <p class="alert alert-danger">予約はまだありません</p> <?php endif; ?> </div> </main> </body> </html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下で全件取得し、そのままforeachで出力しているから全件出てしまうのでは?

PHP

1 // ②ショップ情報取り出し 2 $shop_query = "SELECT * FROM shop"; 3 $shop_stmt = $pdo->query($shop_query); 4 5 $row = []; 6 $arr_shop = []; 7 while ($row = $shop_stmt->fetch(PDO::FETCH_ASSOC)) { 8 $arr_shop[] = [ 9 'shop_id' => $row['shop_id'], 10 'shop_name' => $row['shop_name'], 11 ]; 12 }

上記は削除して、以下に移動すると上手くいくのでは?

PHP

1 // 取得開始位置 2 $offset = $p * PAGE_LIMIT; 3 4 $sql = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from shop limit :limit offset :offset'); 5 $sql->bindValue(":offset", $offset, PDO::PARAM_INT); 6 $sql->bindValue(":limit", PAGE_LIMIT, PDO::PARAM_INT); 7 $sql->execute(); 8 9 // 追記部分 10 $row = []; 11 $arr_shop = []; 12 while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { 13 $arr_shop[] = [ 14 'shop_id' => $row['shop_id'], 15 'shop_name' => $row['shop_name'], 16 ]; 17 } 18 19 20 // Total件数 21 $totalRow = $pdo->query("SELECT FOUND_ROWS() as total"); 22 $all = $totalRow->fetch(PDO::FETCH_ASSOC);

尚、mts10806さんも指摘していますが、条件指定されてないので絞り込みは行えません。
条件指定をするのであれば以下部分に条件を追記しましょう。

PHP

1$sql = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from shop limit :limit offset :offset');

投稿2019/06/27 01:57

mayoi_maimai

総合スコア1583

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

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

0

パラメータnameの$nameがどこにも設定されてないからでは。
設定されてないパラメータを取ろうとするからフィルターにも引っ掛かってnullの無限ループになってますね。
GETで取得しても何の検索にも使ってないので絞り込みは何も行われていません。
何かしら検索条件を入力するフォームがあるのでは?少なくとも提示のコード内にはないようです。

提示されているコードと質問内容の文章だけではどういうデータに対してページングを作りたいのか汲み取りは困難ですし「原因が分からず」とのことなので原因のみの回答です。

投稿2019/06/26 23:27

編集2019/06/27 00:14
m.ts10806

総合スコア80765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問