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

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

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

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

PHP

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

Q&A

3回答

1375閲覧

ログイン情報からログインしたアカウントのデータのみ出力させたい

ariiiiiga

総合スコア66

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/05/31 09:54

編集2022/01/12 10:55

前提・実現したいこと

簡易的な予約サイトを作っています。
ログインしたshopユーザーがreserveテーブルのreserve_shop_idとshopテーブルのshop_idで結びついた自分のshopの予約のみ見れるようにしたいのですが、ほかのshop_idの予約データも一緒にすべて表示されてしまいます。

教えて頂けると助かります。
よろしくお願いいたします。

shopテーブル:ショップ情報
userテーブル:ユーザー情報
reserveテーブル:予約が入る

エラー Notice: Undefined index: reserve_shop_id in C:\xampp\htdocs\reserve\shop\shop_home.php on line 20 Notice: Undefined index: count in C:\xampp\htdocs\reserve\shop\shop_home.php on line 21 Notice: Undefined index: time in C:\xampp\htdocs\reserve\shop\shop_home.php on line 22 Notice: Undefined index: reserve_comment in C:\xampp\htdocs\reserve\shop\shop_home.php on line 23 Notice: Undefined index: reserve_time in C:\xampp\htdocs\reserve\shop\shop_home.php on line 24 Notice: Undefined index: reserve_tel in C:\xampp\htdocs\reserve\shop\shop_home.php on line 25

該当のソースコード

<?php error_reporting(E_ALL); ini_set("display_errors",1); define('PAGE_LIMIT', 2); try { session_start(); $pdo = new PDO('mysql:host=localhost;dbname=reserve;charset=utf8','root','',); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(!isset($_SESSION['user'])) { header("Location: shop_index.php"); } // sshop_idからshop名を取り出す $query = "SELECT * FROM shop WHERE shop_id=:shop_id"; $stmt = $pdo->prepare($query); $stmt->bindValue(':shop_id', $_SESSION['user'], PDO::PARAM_INT); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $shop_name = $row['shop_name']; $shop_id = $row['shop_id']; } // reserve_shop_idと結びついたshop_idからログインしたアカウントのshop名を取り出す $reserve_query = "SELECT * FROM reserve WHERE reserve_shop_id=:shop_id"; $reserve_stmt = $pdo->prepare($reserve_query); $reserve_stmt->bindValue(':shop_id', $shop_id, PDO::PARAM_INT); $reserve_stmt->execute(); //var_dump($shop_id); ->int(4) // 予約情報の取り出し $arr_reserve = []; while ($rows = $reserve_stmt->fetchAll(PDO::FETCH_ASSOC)) { $arr_reserve[] = [ 'reserve_shop_id' => $rows['reserve_shop_id'], 'count' => $rows['count'], 'time' => $rows['time'], ]; } // リクエストパラメータの取得(ページング用) $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); $reserve_comment = filter_input(INPUT_GET, 'reserve_comment', FILTER_SANITIZE_SPECIAL_CHARS); $reserve_time = filter_input(INPUT_GET, 'reserve_time', FILTER_SANITIZE_SPECIAL_CHARS); $reserve_tel = filter_input(INPUT_GET, 'reserve_tel', FILTER_SANITIZE_SPECIAL_CHARS); // 取得開始位置 $offset = $p * PAGE_LIMIT; $sql = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from reserve '.$whereSql.' order by reserve_time desc 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(); } ?> <!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> <div class="main"> <div class="container" style=""> <div class="row"> <div class="col-xl-8" style="margin-bottom:200px;"> <div class="main-left"> <?php if ( $all['total'] > 0 ) : ?> <p class="alert alert-success" style="text-align:center;">予約数<?= number_format($all['total']) ?>件</p> <table class="table table-striped"> <thead> <tr> <th>人数</th> <th>時間</th> </tr> </thead> <tbody> <?php foreach($result as $key => $value): ?> <tr> <td><?= htmlspecialchars($value['count'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?= htmlspecialchars($value['time'], ENT_QUOTES, 'UTF-8'); ?></td> <tr> <?php endforeach; ?> </tbody> </table> <!-- ページネーション --> <div class="paging_left" style="float:left;"> <?php if ( $p > 0 ) : ?> <a href="shop_home.php?reserve_shop_id=<?= $value['reserve_shop_id'] ?>search=1&count=<?= $count ?>&time=<?= $time ?>&p=<?= $p-1 ?>" class="pull-left">戻る</a> <?php else : ?> <span class="pull-left" >最新</span> <?php endif; ?> </div> <div class="paging_right" style="float:right;"> <?php if ( $all['total'] - (PAGE_LIMIT * $p ) > PAGE_LIMIT ) : ?> <a href="shop_home.php?reserve_shop_id=<?= $value['reserve_shop_id'] ?>search=1&count=<?= $count ?>&time=<?= $time ?>&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> </div> <div class="col-xl-4" style=""> <div class="main-right"> <div class="container" > <div class="yesno" style="background-color:;border-radius:10px;border:1px solid black;padding:20px 0;text-align:center;"> <p style=""><?php echo htmlspecialchars($shop_name, ENT_QUOTES, 'UTF-8'); ?> ログイン中</p> <a href="shop_logout.php?logout" style="">ログアウト</a> </div> </div> </div> </div> </div> </div> </div> </body> </html>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2019/05/31 10:22

関連するすべてのテーブルのテーブル定義をご提示ください。コードだけ提示されても的確な回答は不可能です。$_SESSIONの値もどこでどう設定されるのか提示されないことには他人には何が入ってるか確かめることはできませんので。
m.ts10806

2019/05/31 10:35

最低でも、$_SESSIONがきちんと来ているか確認した結果を追記してください。 エスパーすら難しそうな内容です。
guest

回答3

0

ごちゃっとしているので作り直した方がいいです。
不要な処理、使ってない変数の整理は必要。
※再現可能な情報をご提示いただけてないため、的確な回答ではなくコードレビューの結果です


  • shop_idで絞り込むなら1件しか出力されないはずなので回す必要はないのでは
  • $_SESSION['user']という名称でshop_idに当てているのは謎。ショップIDでログインするの?intならログイン時に数字を打っていることになるけど、

ここは全体仕様とログイン処理含めて提示されないと確かめようがない

  • というよりも「ログインしたショップの」という前提なら毎回全部とるのはそれだけ何度もDBにアクセスしまくることになるので無駄。

ログイン時にセッションに保存しておいてセッションから引き出した方がいい
ショップ情報をショップが編集したらそのセッションを上書きする(管理者が編集できる仕様ならまた別だけど)

php

1 // sshop_idからshop名を取り出す 2 $query = "SELECT * FROM shop WHERE shop_id=:shop_id"; 3 $stmt = $pdo->prepare($query); 4 $stmt->bindValue(':shop_id', $_SESSION['user'], PDO::PARAM_INT); 5 $stmt->execute(); 6 7 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 8 $shop_name = $row['shop_name']; 9 $shop_id = $row['shop_id']; 10 } 11

  • $shop_idがちゃんときているか見ている方に分からないので何とも言えないところ、というかここはfetchAllでいい

php

1 // reserve_shop_idと結びついたshop_idからログインしたアカウントのshop名を取り出す 2 $reserve_query = "SELECT * FROM reserve WHERE reserve_shop_id=:shop_id"; 3 $reserve_stmt = $pdo->prepare($reserve_query); 4 $reserve_stmt->bindValue(':shop_id', $shop_id, PDO::PARAM_INT); 5 $reserve_stmt->execute(); 6 7 // 予約情報の取り出し 8 $arr_reserve = []; 9 while ($rows = $reserve_stmt->fetch(PDO::FETCH_ASSOC)) { 10 $arr_reserve[] = [ 11 'reserve_shop_id' => $rows['reserve_shop_id'], 12 'count' => $rows['count'], 13 'time' => $rows['time'], 14 ]; 15 }

  • 今回の無駄と思われる処理。$whereSqlをnullで定義して終わっている。

$where[] = "name like :name";としているけど使われていない。reserveテーブルにnameというカラムがある?あったとしても先の処理で一緒にできるのでは
SELECT * FROM reserve WHERE reserve_shop_id=:shop_id and name =:name

  • というか「ログインしたショップ」で既にデータは「指定のショップの持つ情報のみ」で絞ろうとしているはずなのに何を絞ろうとしているのかが分からない
  • 「予約のページングを作りたい」なら先のSELECT * FROM reserve WHERE reserve_shop_id=:shop_idでは。
  • つまり下記の一連の処理はほとんど不要と思われる。filter_input()で取得してもほとんど使ってない(というか使う必要がないのでは)

php

1 // リクエストパラメータの取得(ページング用) 2 $search = filter_input(INPUT_GET, 'search'); 3 $p = !is_numeric(filter_input(INPUT_GET, 'p')) ? 0 : filter_input(INPUT_GET, 'p'); 4 $name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS); 5 $shop = filter_input(INPUT_GET, 'shop', FILTER_SANITIZE_SPECIAL_CHARS); 6 $user_id = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_SPECIAL_CHARS); 7 $time = filter_input(INPUT_GET, 'time', FILTER_SANITIZE_SPECIAL_CHARS); 8 $count = filter_input(INPUT_GET, 'count', FILTER_SANITIZE_SPECIAL_CHARS); 9 $reserve_comment = filter_input(INPUT_GET, 'reserve_comment', FILTER_SANITIZE_SPECIAL_CHARS); 10 $reserve_time = filter_input(INPUT_GET, 'reserve_time', FILTER_SANITIZE_SPECIAL_CHARS); 11 $reserve_tel = filter_input(INPUT_GET, 'reserve_tel', FILTER_SANITIZE_SPECIAL_CHARS); 12 13 // 取得開始位置 14 $offset = $p * PAGE_LIMIT; 15 // SQL生成 16 $where = []; 17 $whereSql = null; 18 if ( $name ) { 19 $where[] = "name like :name"; 20 } 21 22 $sql = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from reserve '.$whereSql.' order by reserve_time desc limit :limit offset :offset'); 23 $sql->bindValue(":offset", $offset, PDO::PARAM_INT); 24 $sql->bindValue(":limit", PAGE_LIMIT, PDO::PARAM_INT);

  • ということで、$resultに入っているのはselect SQL_CALC_FOUND_ROWS * from reserve order by reserve_time desc limit :limit offset :offsetの結果。

php

1 2 <?php foreach($result as $key => $value): ?> 3 <tr> 4 <td><?= htmlspecialchars($value['count'], ENT_QUOTES, 'UTF-8'); ?></td> 5 <td><?= htmlspecialchars($value['time'], ENT_QUOTES, 'UTF-8'); ?></td> 6 <tr> 7 <?php endforeach; ?>

もし同じプロジェクトのメンバーがこのコード持って来たら全部書き直させます。
それか全部引き取って自分で組みます。

投稿2019/05/31 11:31

編集2019/06/02 13:14
m.ts10806

総合スコア80765

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

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

0

$arr_reserveはwhereで絞られてますが、表示に使っている$resultは$nameがgetパラメータで指定されてないと絞られないですよね。
最新とかのリンクをみてもnameに相当するパラメータないですし。まあ、セッションつかってユーザ指定してるってことはログイン前提とかだと思いますし、やはり$arr_reserveつかってないのは変なのでどっかで思い違いがおきたのでは?

投稿2019/05/31 10:56

papinianus

総合スコア12705

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

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

m.ts10806

2019/05/31 11:52 編集

コードレビューしかできない内容なのでだいぶ困りました(結局しましたけど)
guest

0

php

1while ($rows = $reserve_stmt->fetchAll(PDO::FETCH_ASSOC)) {

この部分が

php

1while ($rows = $reserve_stmt->fetch(PDO::FETCH_ASSOC)) {

ですね。

投稿2019/06/10 07:16

hide0128

総合スコア245

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問