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

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

ただいまの
回答率

87.37%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 541

score 6

前提・実現したいこと

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

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

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

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

該当のソースコード

<!DOCTYPE html>
<?php require_once("phpsetting.php") ?>
<html>
<head>
  <meta charset="utf-8">
  <title>お寿司注文システム</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>
<body>
  <div class = "site-title">お寿司注文システム</div>
  <img src = "https://chigai-allguide.com/wp-content/uploads/14472.jpg">
  <form method="post" action = "kakunin.php">
    <div class="menu-items">
    <?php foreach ($sushi as $neta): ?>
      <img src="<?php echo $neta -> getImage(); ?>" height = "100px" width="140px"><br>
      <?php echo $neta -> getName(); ?><br>
      <?php echo $neta -> getPrice(); ?><br>
      <input type = "text" value = "0" name = "<?php echo $neta -> getName(); ?>"><br>
    <?php endforeach; ?>
  </div>
    <input type = "submit" value = "送信">
  </form>
</body>
</html>
<?php require_once("phpsetting.php") ?>
<html>
<head>
  <meta charset="utf-8">
  <title>お寿司注文システム</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body>
  <div class = "site-title">注文の確認</div>
  <?php foreach ($sushi as $neta): ?>
    <?php echo $neta -> getName(); ?><br>
    <?php echo $neta -> getPrice(); ?><br>
    <?php echo $_POST[$neta -> getName()]; ?><br>
  <?php endforeach; ?>

</body>
</html>
<?php class Menu{
private $name;
private $price;
private $image;

public function __construct($name,$price,$image){
  $this -> name = $name;
  $this -> price = $price;
  $this -> image = $image;
}
public function getName(){
  return $this -> name;
}

public function getPrice(){
  return $this -> price;
}

public function getImage(){
  return $this -> image;
}

}


$tsunaAkami = new Menu("まぐろ",200,"https://www.date-wasabi.com/wp-content/uploads/2014/10/Fresh-Tuna-Lean.jpg");
$tsunaToro = new Menu("大トロ",600,"https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_otoro.jpg");
$salmon = new Menu("サーモン",200,"https://www.date-wasabi.com/wp-content/uploads/2018/08/Nanasalmon201808-500x350.jpg");
$ebi = new Menu("えび",200,"https://cdn-ak.f.st-hatena.com/images/fotolife/m/michimasakong/20160507/20160507160221.jpg");
$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");
$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");
$ika = new Menu("いか",200,"https://www.date-wasabi.com/wp-content/uploads/2017/12/AoriIka201712-500x350.jpg");
$egg = new Menu("たまご",200,"https://www.eatsmart.jp/image/food/00/00/07/13839.jpg");
$negitoro = new Menu("ねぎとろ",200,"http://www.noge-sushi.com/sushi/images/onegitoro_image1.jpg");
$ikura = new Menu("いくら",600,"https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_ikura.jpg");
$uni = new Menu("うに",600,"https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_uni.jpg");

$sushi = array($tsunaAkami,$tsunaToro,$salmon,$ebi,$hamachi,$okutopass,$ika,$egg,$negitoro,$ikura,$uni);

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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['ねこ']だと上記のようなエラーが出ます。

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

echo "<pre>";
print_r( $_POST );
echo "</pre>";

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/07 10:20

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

    キャンセル

+2

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

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

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

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

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

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

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

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

蛇足

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

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

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

Menuクラス(Menu.php)

<?php

class Menu
{

    private $name;

    private $price;

    private $image;

    private $menu = [
        'tuna' => [
            'name' => 'まぐろ',
            'price' => 200,
            'image' => 'https://www.date-wasabi.com/wp-content/uploads/2014/10/Fresh-Tuna-Lean.jpg'
        ],
        'fatty_tuna' => [
            'name' => '大トロ',
            'price' => 600,
            'image' => 'https://www.tsukiji-sushiko.com/manage/wp-content/uploads/2018/03/sushi_otoro.jpg'
        ],
        'salmon' => [
            'name' => 'サーモン',
            'price' => 200,
            'image' => 'https://www.date-wasabi.com/wp-content/uploads/2018/08/Nanasalmon201808-500x350.jpg'
        ]
    ];

    public function getMenu(): array
    {
        return $this->menu;
    }

    public function getName(string $name): string
    {
        return array_key_exists($name, $this->menu) ? $this->menu[$name]['name'] : null;
    }

    public function getPrice(string $name): int
    {
        return array_key_exists($name, $this->menu) ? $this->menu[$name]['price'] : null;
    }

    public function getImage(string $name): string
    {
        return array_key_exists($name, $this->menu) ? $this->menu[$name]['image'] : null;
    }
}

入力画面(input.php)

<?php
require_once ('Menu.php');
$menu = new Menu();
$menu_list = $menu->getMenu();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>お寿司注文システム</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>
<body>
    <div class="site-title">お寿司注文システム</div>
    <img src="https://chigai-allguide.com/wp-content/uploads/14472.jpg">
    <form method="post" action="confirm.php">
        <div class="menu-items">
    <?php foreach ($menu_list as $neta=>$info): ?>
      <img
                src="<?= htmlspecialchars($menu->getImage($neta), ENT_QUOTES, 'UTF-8') ?>"
                height="100px" width="140px"><br>
      <?= htmlspecialchars($menu->getName($neta), ENT_QUOTES, 'UTF-8') ?><br>
      <?= htmlspecialchars($menu->getPrice($neta) , ENT_QUOTES, 'UTF-8')?><br>
            <input type="text" value="0"
                name="<?=htmlspecialchars($neta, ENT_QUOTES, 'UTF-8') ; ?>"><br>
    <?php endforeach; ?>
          </div>
        <input type="submit" value="送信">
    </form>
</body>
</html>


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

確認画面(confirm.php)

<?php
require_once('Menu.php');
$menu = new Menu();
$menu_list = $menu->getMenu();
?>
<html>
<head>
  <meta charset="utf-8">
  <title>お寿司注文システム</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body>
  <div class = "site-title">注文の確認</div>
  <?php foreach ($menu_list as $neta=>$info): ?>
      <?= htmlspecialchars($info['name'], ENT_QUOTES, 'UTF-8') ?><br>
      <?= htmlspecialchars($info['price'] , ENT_QUOTES, 'UTF-8')?><br>
      <?php 
      $number = filter_input(INPUT_POST,$neta,FILTER_VALIDATE_FLOAT) ?? 0;
      ?>
    <?=htmlspecialchars($number , ENT_QUOTES, 'UTF-8'); ?><br>
  <?php endforeach; ?>
</body>
</html>

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る