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

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

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

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

Q&A

2回答

679閲覧

テキストエリアに入力した値をPOSTで受信することができません。

Nomochan

総合スコア6

PHP

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

0グッド

0クリップ

投稿2019/08/06 14:54

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
初めて投稿させていただきますNomochanと申します。
超初心者(学び始めて一週間程度)な質問で申し訳ございませんが、
ご一読いただけますと幸いです。

プロゲートで学んだ知識でお寿司注文システムを作っております。
テキストエリアに入力した値をPOSTで受け取ろうとしているのですが、
以下エラーメッセージが表示され、値を受け取ることができません。

Notice: Undefined index: まぐろ in C:\xampp\htdocs\test\kakunin.php on line 14

お手数をおかけしますが、
解決方法について知見のある方がいらっしゃいましたら、ご教示いただけますと幸いです。

該当のソースコード

php

1<!DOCTYPE html> 2<?php require_once("phpsetting.php") ?> 3<html> 4<head> 5 <meta charset="utf-8"> 6 <title>お寿司注文システム</title> 7 <link rel="stylesheet" type="text/css" href="stylesheet.css"> 8</head> 9<body> 10 <div class = "site-title">お寿司注文システム</div> 11 <img src = "https://chigai-allguide.com/wp-content/uploads/14472.jpg"> 12 <form method="post" action = "kakunin.php"> 13 <div class="menu-items"> 14 <?php foreach ($sushi as $neta): ?> 15 <img src="<?php echo $neta -> getImage(); ?>" height = "100px" width="140px"><br> 16 <?php echo $neta -> getName(); ?><br> 17 <?php echo $neta -> getPrice(); ?><br> 18 <input type = "text" value = "0" name = "<?php echo $neta -> getName(); ?>"><br> 19 <?php endforeach; ?> 20 </div> 21 <input type = "submit" value = "送信"> 22 </form> 23</body> 24</html>

php

1<?php require_once("phpsetting.php") ?> 2<html> 3<head> 4 <meta charset="utf-8"> 5 <title>お寿司注文システム</title> 6 <link rel="stylesheet" type="text/css" href="stylesheet.css"> 7</head> 8 9<body> 10 <div class = "site-title">注文の確認</div> 11 <?php foreach ($sushi as $neta): ?> 12 <?php echo $neta -> getName(); ?><br> 13 <?php echo $neta -> getPrice(); ?><br> 14 <?php echo $_POST[$neta -> getName()]; ?><br> 15 <?php endforeach; ?> 16 17</body> 18</html>

php

1<?php class Menu{ 2private $name; 3private $price; 4private $image; 5 6public function __construct($name,$price,$image){ 7 $this -> name = $name; 8 $this -> price = $price; 9 $this -> image = $image; 10} 11public function getName(){ 12 return $this -> name; 13} 14 15public function getPrice(){ 16 return $this -> price; 17} 18 19public function getImage(){ 20 return $this -> image; 21} 22 23} 24 25 26$tsunaAkami = new Menu("まぐろ",200,"https://www.date-wasabi.com/wp-content/uploads/2014/10/Fresh-Tuna-Lean.jpg"); 27$tsunaToro = new Menu("大トロ",600,"https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_otoro.jpg"); 28$salmon = new Menu("サーモン",200,"https://www.date-wasabi.com/wp-content/uploads/2018/08/Nanasalmon201808-500x350.jpg"); 29$ebi = new Menu("えび",200,"https://cdn-ak.f.st-hatena.com/images/fotolife/m/michimasakong/20160507/20160507160221.jpg"); 30$hamachi = new Menu("はまち",300,"https://www.date-wasabi.com/wp-content/uploads/2013/12/%E3%81%B6%E3%82%8A%E3%81%AF%E3%81%BE%E3%81%A1S.jpg"); 31$okutopass = new Menu("たこ",200,"https://www.date-wasabi.com/wp-content/uploads/2015/02/%EF%BC%AF%EF%BD%83%EF%BD%94%EF%BD%8F%EF%BD%90%EF%BD%95%EF%BD%93-02.jpg"); 32$ika = new Menu("いか",200,"https://www.date-wasabi.com/wp-content/uploads/2017/12/AoriIka201712-500x350.jpg"); 33$egg = new Menu("たまご",200,"https://www.eatsmart.jp/image/food/00/00/07/13839.jpg"); 34$negitoro = new Menu("ねぎとろ",200,"http://www.noge-sushi.com/sushi/images/onegitoro_image1.jpg"); 35$ikura = new Menu("いくら",600,"https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_ikura.jpg"); 36$uni = new Menu("うに",600,"https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_uni.jpg"); 37 38$sushi = array($tsunaAkami,$tsunaToro,$salmon,$ebi,$hamachi,$okutopass,$ika,$egg,$negitoro,$ikura,$uni); 39

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

Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.7 Server
テキストエディタ ATOM ver 1.38.1

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

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

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

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

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

guest

回答2

0

起きている現象だけだと既に回答についた通りですが、
提示されたコードをそのまま実行すると、そのNoticeは出力されません。

実行結果(デフォルト値のまま送信)
イメージ説明

配列に存在しないキーが指定されたというNoticeですから、
そもそも「そのキーが設定されるようなhtmlが組めているか?」を確認する必要があります。

入力の画面で、ブラウザの「ソースを表示」を行ってください。

ご存知かもしれませんが、form送信ではinputやselect,textareaなどのnameに指定された属性値がキーとなります。
つまり、$_POSTや$_GETで取り出そうと思ったら、ちゃんとnameに想定の情報が入っている必要があるわけですね。

以下は私の環境で確認したもの。
イメージ説明

情報量が多いため1画面に全ておさまっているわけではないですが、
全て入っているように見受けられます。

質問者さんの方ではどうでしょうか?確認してみてください。

蛇足

ちょっとコアな話になるのですが、
メニューの数だけインスタンス化するのって結構コストがかかってくると思います。

でしたら、メニュー内に全て情報を持っておいたほうが1度のnewで済むので
コードもスッキリするように思います。
(本来はデータベースにデータを持つべきですが)

あと、できればnewは「使うときにする」ようにしたほうが良いですね。
今後検索など入ってきたときに利用しないのに全て持ってたらそれはそれで無駄ですから。

Menuクラス(Menu.php)

php

1<?php 2 3class Menu 4{ 5 6 private $name; 7 8 private $price; 9 10 private $image; 11 12 private $menu = [ 13 'tuna' => [ 14 'name' => 'まぐろ', 15 'price' => 200, 16 'image' => 'https://www.date-wasabi.com/wp-content/uploads/2014/10/Fresh-Tuna-Lean.jpg' 17 ], 18 'fatty_tuna' => [ 19 'name' => '大トロ', 20 'price' => 600, 21 'image' => 'https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_otoro.jpg' 22 ], 23 'salmon' => [ 24 'name' => 'サーモン', 25 'price' => 200, 26 'image' => 'https://www.date-wasabi.com/wp-content/uploads/2018/08/Nanasalmon201808-500x350.jpg' 27 ] 28 ]; 29 30 public function getMenu(): array 31 { 32 return $this->menu; 33 } 34 35 public function getName(string $name): string 36 { 37 return array_key_exists($name, $this->menu) ? $this->menu[$name]['name'] : null; 38 } 39 40 public function getPrice(string $name): int 41 { 42 return array_key_exists($name, $this->menu) ? $this->menu[$name]['price'] : null; 43 } 44 45 public function getImage(string $name): string 46 { 47 return array_key_exists($name, $this->menu) ? $this->menu[$name]['image'] : null; 48 } 49}

入力画面(input.php)

php

1<?php 2require_once ('Menu.php'); 3$menu = new Menu(); 4$menu_list = $menu->getMenu(); 5?> 6<!DOCTYPE html> 7<html> 8<head> 9<meta charset="utf-8"> 10<title>お寿司注文システム</title> 11<link rel="stylesheet" type="text/css" href="stylesheet.css"> 12</head> 13<body> 14 <div class="site-title">お寿司注文システム</div> 15 <img src="https://chigai-allguide.com/wp-content/uploads/14472.jpg"> 16 <form method="post" action="confirm.php"> 17 <div class="menu-items"> 18 <?php foreach ($menu_list as $neta=>$info): ?> 19 <img 20 src="<?= htmlspecialchars($menu->getImage($neta), ENT_QUOTES, 'UTF-8') ?>" 21 height="100px" width="140px"><br> 22 <?= htmlspecialchars($menu->getName($neta), ENT_QUOTES, 'UTF-8') ?><br> 23 <?= htmlspecialchars($menu->getPrice($neta) , ENT_QUOTES, 'UTF-8')?><br> 24 <input type="text" value="0" 25 name="<?=htmlspecialchars($neta, ENT_QUOTES, 'UTF-8') ; ?>"><br> 26 <?php endforeach; ?> 27 </div> 28 <input type="submit" value="送信"> 29 </form> 30</body> 31</html>

※あえてMenuクラスのゲッターでアクセスしているが、ここは別に取得した連想配列を利用しても良い
できればゲッターは個々の情報を扱いたいときに利用したほうが良さそう

確認画面(confirm.php)

php

1<?php 2require_once('Menu.php'); 3$menu = new Menu(); 4$menu_list = $menu->getMenu(); 5?> 6<html> 7<head> 8 <meta charset="utf-8"> 9 <title>お寿司注文システム</title> 10 <link rel="stylesheet" type="text/css" href="stylesheet.css"> 11</head> 12 13<body> 14 <div class = "site-title">注文の確認</div> 15 <?php foreach ($menu_list as $neta=>$info): ?> 16 <?= htmlspecialchars($info['name'], ENT_QUOTES, 'UTF-8') ?><br> 17 <?= htmlspecialchars($info['price'] , ENT_QUOTES, 'UTF-8')?><br> 18 <?php 19 $number = filter_input(INPUT_POST,$neta,FILTER_VALIDATE_FLOAT) ?? 0; 20 ?> 21 <?=htmlspecialchars($number , ENT_QUOTES, 'UTF-8'); ?><br> 22 <?php endforeach; ?> 23</body> 24</html>

PHPマニュアル参考先:
関数引数の型宣言
関数返り値の型宣言
三項演算子
htmlspecialchars()
filter_input()
検証フィルタ
Null 合体演算子

投稿2019/08/07 01:13

編集2019/08/07 01:14
m.ts10806

総合スコア80850

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

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

0

Notice: Undefined index: まぐろ in C:\xampp\htdocs\test\kakunin.php on line 14

これは、【kakunin.php ファイルの14行目で、「まぐろ」を連想配列のキーとしたデータを利用しようとしていますが、配列の中にそのようなキーを持ったデータはありません】という意味です。

例:
$arr01 = array( 'いか' => 5, 'たこ' => 3, 'ねこ' => '' );
$arr02 = array( 'いか' => 5, 'たこ' => 3 );

という配列があったときに、$arr01['ねこ']は問題ありませんが、$arr02['ねこ']だと上記のようなエラーが出ます。

※つまり上記エラーがあった場合、こんな風に配列の中を見れば一目瞭然です。

PHP

1echo "<pre>"; 2print_r( $_POST ); 3echo "</pre>"; 4

今回は、まぐろについて何もデータを入力しなかったので、
$_POSTの配列の中に、まぐろをキーとした要素が存在していなかったのではないでしょうか。

こういった問題も考慮し、(さらに意図しないタイプのデータが送信されたときの対応のため)$_POSTデータの受け取り方としては、filter_input関数を使う事が推奨されます。以下の様に書き直せばきっとうまく行くと思いますよ。

PHP

1<?php foreach ($sushi as $neta): ?> 2 <?php echo $neta -> getName(); ?><br> 3 <?php echo $neta -> getPrice(); ?><br> 4 <?php echo $num = filter_input( INPUT_POST, $neta -> getName(), FILTER_SANITIZE_NUMBER_INT ); ?><br> 5<?php endforeach; ?> 6

投稿2019/08/06 21:24

編集2019/08/07 00:32
yukikp

総合スコア797

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

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

m.ts10806

2019/08/07 01:20

>まぐろについて何もデータを入力しなかったので、 チェックボックスなどのノーチェック状態と違って空文字が送信されるので、質問に提示のNoticeは出ないはず・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問