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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

4回答

1596閲覧

エラーの意味をを理解し、エラーを修正したい

ariiiiiga

総合スコア66

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2019/04/17 03:00

編集2019/04/17 10:03

前提・実現したいこと

ユーザーが飲食店からの入店可否情報をを見て予約できる会員制のシステムを作っています。
ユーザーがログイン後に飲食店一覧から飲食店の情報ページ(user_shopinfo.php)へ飛んだあと、下記のようなエラーが出ました。

この状態のエラーが初めてだったので、意味がわからず修正できなくなってしまいました。

発生している問題・エラーメッセージ

Notice: Undefined index: in C:\xampp\htdocs\user_shopinfo.php on line 86 Notice: Undefined index: in C:\xampp\htdocs\user_shopinfo.php on line 87
user_shopinfo.php <?php error_reporting(E_ALL); ini_set("display_errors",1); session_start(); try { $pdo = new PDO('mysql:host=localhost;dbname=reserve;charset=utf8','root','', array(PDO::ATTR_EMULATE_PREPARES => false)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(!isset($_SESSION['user'])) { header("Location: user_index.php"); } // 渡されたidを受け取る $shop_id = filter_input(INPUT_GET, 'shop_id', FILTER_SANITIZE_SPECIAL_CHARS); // 受け取ったidからレコード取得sqlを生成 $shop_query = "select * from shop where shop_id = ".$shop_id; // ①ユーザーIDからユーザー名を取り出す $query = "SELECT * FROM users WHERE user_id=".$_SESSION['user'].""; $result = $pdo->query($query); if (!$result) { print('ユーザー側クエリーが失敗しました。' . $pdo->error); $pdo->close(); exit(); } // ユーザー情報の取り出し while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $user_name = $row['user_name']; } // ②shopIDからshop名を取り出す $shop_query = "SELECT * FROM shop where yesno in(1,2)"; $shop_result = $pdo->query($shop_query); if (!$shop_result) { print('店側クエリーが失敗しました。' . $pdo->error); $pdo->close(); exit(); } // ユーザー情報の取り出し while ($row = $shop_result->fetch(PDO::FETCH_ASSOC)) { $shop_id = $row['shop_id']; $shop_name = $row['shop_name']; $yesno = $row['yesno']; $shop_comment = $row['shop_comment'];  $rows[]=$shop_row;  ←追加 } } catch (PDOException $e) { var_dump($e); die(); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>PHPの店舗情報</title> <link rel="stylesheet" href="style.css"> <!-- Bootstrap読み込み(スタイリングのため) --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css"> </head> <body> <div class="col-xs-8 col-xs-offset-2" style="text-align:center;"> <div class="header-right"> <p><?php echo $user_name; ?>ログイン中</p> <a href="user_logout.php?user_logout">ログアウト</a> </div> <div class="main"> <p><?= $rows['shop_name'];?></p> ←$rowsに変更 <h4>入店の可否</h4> <p><?php $pt = $rows[0]['yesno'];  ←変更 $col = [1 => "black", 2 => "red"]; $tx = [1 => "〇", 2 => "✖"]; echo "<font color='".$col[$pt]."'>"; ←ここのエラー echo $tx[$pt]; ←ここのエラー echo "</font>"; ?></p> <p>コメント:<?= $rows['shop_comment'];?></p> ←$rowsに変更 <a href="user_reserve_form.php?shop_id=<?= $rows['shop_id'];?>">予約する</a> ←$rowsに変更 </div> </div> </body> </html>

試したこと

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

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

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

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

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

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

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

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

guest

回答4

0

Notice: Undefined index: in C:\xampp\htdocs\user_shopinfo.php on line 86

Noticeは重要なエラーではないです
「ほんとにそれでいいの?」という注意ですね

「on line 86」というように問題の発生した行が表示されるので
その前後を確認してください

「Undefined index」は、基本的に配列内で設定されていないキーにアクセスしようと
したときにでるエラーです。

PHP

1error_reporting(E_ALL); 2ini_set("display_errors",1); 3$row=[]; 4print $row[""];

例示のものだと
$col[$pt]がNoticeを吐いているので$ptがおそらく""なのでしょう
つまり$pt = $row['shop_name']となっているので$row['shop_name']が""ということです

投稿2019/04/17 03:12

yambejp

総合スコア114784

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

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

ariiiiiga

2019/04/17 03:37

前のページからデータを引き継げていないということでしょうか?
yambejp

2019/04/17 03:42

$ptがほんと$row['shop_name']であるなら、$rowが代入されると思われる箇所の直後に print_r($row)としてキー:shop_nameが設定されているか確認してください
ariiiiiga

2019/04/17 04:39

コードを編集しましたが追加する場所は合っていますか? なにも表示されませんでした。
yambejp

2019/04/17 05:49 編集

見た感じ $row = $shop_result->fetch(PDO::FETCH_ASSOC)をwhileで回していますが これで$rowに残るのはselectされた最終データだけですが大丈夫ですか? 複数データがあるならwhileの中でprint_rしてみるとか・・・ よくよくみるとATTR_ERRMODEの指定がないのでtry-catchが有効になっていませんね new PDOしたあとに $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); してください
ariiiiiga

2019/04/17 06:24

Array ( [shop_id] => 2 [shop_name] => 和民 [shop_email] => a@gmail.com [shop_password] => $2y$10$TlwKtAd8zeNlN0ubZ70NGeD0ROonDDlJjoMIc44DrHgmN7ooh3P4a [yesno] => 1 [shop_comment] => [time] => 2019-04-12 17:24:33 ) Array ( [shop_id] => 11 [shop_name] =>笑笑 [shop_email] => y@gmail.com [shop_password] => $2y$10$.z8czd1YghfT1jYCqxbh1ePzJwZc9C953u6EeA.C1tTZwvekoovv2 [yesno] => 1 [shop_comment] => 2人 [time] => 2019-04-14 23:04:49 ) データベースのデータはきちんと入っているように見えるのですがどうしたらいいのでしょうか?
yambejp

2019/04/17 06:35

$col = [1 => "black", 2 => "red"]; だとして、$ptが「和民」だとすると $col[$pt]はおかしいですよね?
ariiiiiga

2019/04/17 07:06

$ptがyesnoが正解なのにshop_nameになっていました。 yesnoに変えたのですがエラーが変わりませんでした。。
yambejp

2019/04/17 07:11

yesnoには間違いなく1か2がはいっているのですか? (sampleを見る限りあっているようには見えますが) var_dump($pt)で中身を確認してみてください
ariiiiiga

2019/04/17 07:16

yesnoには1か2が入っていますが、おっしゃる通りvar_dump($pt)でstring(0) ""になりました。
yambejp

2019/04/17 07:19

var_dump($row['yesno'])でも同じstring(0) ""でしょうか?
ariiiiiga

2019/04/17 07:41

NULLになりました!
yambejp

2019/04/17 07:57

とりあえず $shop_query = "SELECT * FROM shop"; を $shop_query = "SELECT * FROM shop where yesno in(1,2)"; にしてみてください なにか根本的なところがおかしい気がします
ariiiiiga

2019/04/17 08:03

変更しましたが変化がありませんでした¡
yambejp

2019/04/17 08:07

では while ($row = $shop_result->fetch(PDO::FETCH_ASSOC)) { $shop_id = $row['shop_id']; $shop_name = $row['shop_name']; $yesno = $row['yesno']; $shop_comment = $row['shop_comment']; $rows[]=$row; } として、 $pt = $rows[0]['shop_name']; としてみてはどうでしょう?
ariiiiiga

2019/04/17 08:18

Notice: Undefined index: 和民 in C:\xampp\htdocs\user_shopinfo.php on line 91 Notice: Undefined index: 和民 in C:\xampp\htdocs\user_shopinfo.php on line 92 Undefined index: 和民になりました!
yambejp

2019/04/17 08:22 編集

おお、ごめんなさい $pt = $rows[0]['yesno']; です それで通るなら $shop_query = "SELECT * FROM shop LIMIT 1"; ならいけるのでしょうかねぇ・・・
ariiiiiga

2019/04/17 10:05 編集

コードを変更したのですが合っていますか? 〇はでたのですが、✖でも〇になってしまうのと他のshop_nameとshop_commentのエラーがでました。 Notice: Undefined index: shop_name in C:\xampp\htdocs\user_shopinfo.php on line 86 Notice: Undefined index: shop_comment in C:\xampp\htdocs\user_shopinfo.php on line 96
ariiiiiga

2019/04/18 01:22

// 受け取ったidからレコード取得sqlを生成 $shop_query = "select * from shop where shop_id = ".$shop_id; 上の方で前頁ページからshop_idの受け渡し用に$shop_queryがもう一つあったのですがこれが原因でしょうか?
guest

0

良いタイトルですね。デバッグ依頼のようなモノが多い中、目をひきました

タイトルに敬意を示し、「エラーの意味をを理解し、エラーを修正する」方法を記述します。
*本文はタイトルと矛盾していたためタイトルへの回答をを優先しました。

エラー文を理解する第一歩は「エラー文を正しく読み取る」ことです。
エラー文は問題箇所の重要なヒントが書かれており、php で標準で用意されているエラー文はかなり優秀に問題点を示唆してくれます。

php

1Notice: Undefined index: in C:\xampp\htdocs\user_shopinfo.php on line 86

本件であれば、変数のインデックスが定義されていないと書いてあります。
エラー文が分かれば、再現条件もおおよそ推測できるので、簡単に最小構成で検証してみても良いです。

php

1<?php 2$test[] = 0; 3echo $test['hoge']; 4 5//PHP Notice: Undefined index: hoge in /workspace/Main.php on line 3

hoge 部分を変えることで、同じエラー文を再現できます。
条件が特定できれば、問題点の切り分けは完了です。

実は上記の回答は、タイトルとはズレています^^;
エラーの意味を理解するということの回答ではなく、エラー文の理解に対しての回答です。エラーは文脈によって定義が変わるので注意が必要です。

以下は、エラーを不具合と読み替えて記述します。

#エラーを解消する方法
エラーの原因は多岐に渡りますが、多くの場合「設計的な内容」と「構文的な内容」、「変数的な内容(例外を含む)」に分類できます。

「設計的な内容」に関しては、設計書が正しくコーディングできているか、そもそも設計は正しいか、地道に検証するしかありません。

「構文的な内容」の場合は、昨今エディタが賢くなっているので、エディタを賢く使うことで、エラー文よりさらに踏み込んだ提案を受けることが可能になります。

「変数的な内容」は変数の推移を確認することで対応します。この場合、ステップ実行できる環境があるとはかどります。php であれば xdebug 一択(のはずw)なので、xdebug を導入し、使用できる環境を整えてください。

#エラーに対して構える
エラー文が表示されるような状況はさっさと解消すべきですが、エラーの根治はなかなか難しいので、設計時やコーディング時にいろいろ仕掛けを行います。

以下の資料が良いです。
PHP7 で堅牢なコードを書く

すげぇ余談

ざっとコードを見ましたが、このコードの延長線上にまともに運用できる会員制サイトはありません。

きちんと体系的な基礎学習を行うことをオススメします。

投稿2019/04/18 02:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

エラーの意味をを理解し、エラーを修正したい

エラーメッセージの読み方と対処, 検索や質問の原則

まず表示されたエラーを調べるところからどうぞ。

この状態のエラーが初めてだったので

PHP初心者でもこのエラー(Notice)に出会わないのは奇跡ですね。
(コピペ学習の弊害と思います)
ちなみになんでもかんでも「エラー」と言っていると単に混乱するだけになります。
エラーレベルというのがあるので、表示されたメッセージから「どういう段階の問題なのか」というのを理解するようにしてください。

また、この際、調べ方、デバッグをきちんと覚えて自己解決できるようになってください。

投稿2019/04/17 03:58

編集2019/04/17 04:04
m.ts10806

総合スコア80850

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

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

0

自己解決

<?php error_reporting(E_ALL); ini_set("display_errors",1); session_start(); try { $pdo = new PDO('mysql:host=localhost;dbname=reserve;charset=utf8','root','', array(PDO::ATTR_EMULATE_PREPARES => false)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(!isset($_SESSION['user'])) { header("Location: user_index.php"); } // ①ユーザーIDからユーザー名を取り出す $query = "SELECT * FROM users WHERE user_id=".$_SESSION['user'].""; $result = $pdo->query($query); if (!$result) { print('ユーザー側クエリーが失敗しました。' . $pdo->error); $pdo->close(); exit(); } // ユーザー情報の取り出し while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $user_name = $row['user_name']; } // 渡されたidを受け取る $shop_id = filter_input(INPUT_GET, 'shop_id', FILTER_SANITIZE_SPECIAL_CHARS); // 受け取ったidからレコード取得sqlを生成 $shop_query = "select * from shop where shop_id = ".$shop_id; // //SQL文を実行する $PostData = $pdo->query($shop_query); // //実行結果を配列で受け取る $result = $PostData->fetch( PDO::FETCH_ASSOC ); } catch (PDOException $e) { var_dump($e); die(); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>PHPのマイページ機能</title> <link rel="stylesheet" href="style.css"> <!-- Bootstrap読み込み(スタイリングのため) --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css"> </head> <body> <div class="col-xs-8 col-xs-offset-2" style="text-align:center;"> <div class="header-right"> <p><?php echo $user_name; ?>ログイン中</p> <a href="user_logout.php?user_logout">ログアウト</a> </div>
<div class="main"> <p></p> <h4><?= $result['shop_name'];?> の入店可否</h4> <p><?php $pt = $result['yesno']; $col = [1 => "black",2=> "red"]; $tx = [1 => "〇",2=> "✖"]; echo "<font color='" .$col[$pt]."'>"; echo $tx[$pt]; echo "</font>"; ?></p> <p>コメント:<?= $result['shop_comment'];?></p> <a href="user_reserve_form.php?shop_id=<?= $result['shop_id'];?>">予約する</a> </div> </div>
</body> </html>

投稿2019/04/18 09:45

ariiiiiga

総合スコア66

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

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

m.ts10806

2019/04/18 09:57

ちょっとこれだと意味がわかりません。 解決済みの回答としたいのでしたらきちんと解決までの経緯を書いてください。 回答も質問と同様編集できますし、マークダウンも使えます。 それにこの質問タイトルの回答になってるかどうかは一考の必要がありますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問