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

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

ただいまの
回答率

88.91%

フォームのInput内にUnidentified indexのエラーが表示される。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 189
退会済みユーザー

退会済みユーザー

実現したい事

お問合せフォームで、各項目を入力して『内容確認』ボタンを押した際に入力ミスの項目があった場合に、他の項目で入力された値がそのまま保持されるようにしたいです。

たにぐち まことさんのYouTube動画(URL:https://youtu.be/tHLnMiRXzNw)を見ながら作成しましたが、なぜか以下のようなエラーが表示されてしまいます。

この原因は何なのでしょうか?

ちなみに、項目に入力した後には、入力された値が保持されるようにはなっています。
なので、実装したい機能は実現できているのですが、画面にアクセス時にエラーが表示されているのを解消したいです。

表示されるエラー

以下の内容が、フォーム入力画面にアクセス時に、Inputの中にすでに入力されている状態になってしまっています。

<br /><b>Notice</b>:  Undefined index: email in <b>C:\xampp\htdocs\contactform2\index.php</b> on line <b>51</b><br />

コード

<?php
$error = ['name'=> '', 'email'=> '', 'comments'=> ''];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

    // フォームの送信時にエラーをチェックする
    if ($post['name'] === '') {
        $error['name'] = 'blank';
    }
    if ($post['email'] === '') {
        $error['email'] = 'blank';
    }
    if ($post['comments'] === '') {
        $error['comments'] = 'blank';
    }
}
?>

<!doctype html>
<html lang="ja">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">

    <link rel="stylesheet" href="style.css">

    <title>お問合せフォーム</title>
  </head>
  <body class="bg-light">
    <div class="container">
      <div class="row">
        <div class="card my-5 col-md-6 offset-3">
          <h2 class="mx-auto mt-3">お問合せフォーム</h2>
          <form action="" method="POST" novalidate>
            <div class="formfroup mt-3">
              <label for="name"><span class="hissu">必須</span>名前</label>
              <input type="text" name="name" class="form-control" required autofocus>
              <?php if (isset($_POST['name'])) {
                if ($error['name'] === 'blank'){
                echo "<p class='error-msg'>※お名前をご記入ください。</p>";
                }; } 
              ?>
            </div>
            <div class="formfroup mt-3">
              <label for="email"><span class="hissu">必須</span>メールアドレス</label>
              <input name="email" type="text" class="email form-control" id="email" value="<?php echo htmlspecialchars($_POST['email']); ?>" required>
              <?php if (isset($_POST['email'])) {
                if ($error['email'] === 'blank'){
                echo "<p class='error-msg'>※メールアドレスをご記入ください。</p>";
                }; } ?>
            </div>
            <div class="formfroup mt-3">
              <label for="age"><span class="hissu">必須</span>年齢</label>
              <select name="age" name="age" class="form-control" id="age" value="<?php echo htmlspecialchars($post['age']); ?>" required>
                <option>年齢を選んでください</option>
                <?php 
                  for ($i = 18; $i <=60; $i++){
                    echo "<option value=".$i.">".$i."</option>"; 
                  }
                ?>
              </select>
            </div>
            <div class="formfroup mt-3">
              <label for="comments"><span class="hissu">必須</span>コメント</label>
              <textarea name="comments" class="form-control" name="comments" id="comments" cols="40" rows="7" value="<?php echo htmlspecialchars($post['comments']); ?>" required></textarea>
              <?php if (isset($_POST['comments'])) {
                if ($error['comments'] === 'blank'){
                echo "<p class='error-msg'>※コメントをご記入ください。</p>";
                }; } ?>
            </div>
            <div class="formfroup mt-3">
              <input type="submit" class="submit_button my-3" value="内容確認へ">
            </div>
          </form>
        </div>
      </div>
    </div>



    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
  </body>
</html>

エラーの対象コード

Line51は以下のコードです。

value="<?php echo htmlspecialchars($_POST['email']); ?>"

試したこと

現在、$_POSTとなっている箇所はもともと$postとしていてエラーに「Unidentified index: post」となっていたので$_POSTに変更しましたが、上記のエラーが表示されるようになりました。

利用環境

XAMPPのMySQLを利用しています。

まだPHPの勉強を始めて数日でわからないことが多いですが、このエラーを解消するための方法をご教授いただけると幸いです。

よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

POST送信されてなければ$_POSTは空です。
なので、当然、配列も参照できません。
初期値を設定するか$_POST内容により分岐させるかいずれかですが、
そもそもfilter_input_array()をなんのために使うのか?というところは考えた方が良いかと思います。

$errorという配列もエラーのためだけに使うのは勿体ないかなと思います。
キーだけを定義した変数をもっておき、filter_input(arrayではない)と組み合わせて
うまく使えばエラーもinputの初期値も同時に制御可能になると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/17 10:06

    ご回答いただきありがとうございます!

    初期値の設定は「$_POST['email']=null;」で良いのでしょうか?
    このコードを頭のPHPに入れると、エラー表示が消えましたが、値を入力して送信ボタンを押すと値が残らなかったり、空で送信ボタンを押してもエラーメッセージが出てこなくなってしまいました。

    他に教えていただいた方法も試してみます。ありがとうございました!

    キャンセル

  • 2020/07/17 10:08

    $_POSTなどグローバル変数の値を上書きしてはいけません。
    そもそも、filter_inputの機能を使うのであれば$_POSTは使いません。実装にブレが出ます。

    キャンセル

  • 2020/07/17 10:13

    そうだったのですね。ありがとうございます!

    filter_inputの機能を調べて試してみます。
    ありがとうございました!

    キャンセル

+1

$_POSTが空だからではないでしょうか

<?php echo htmlspecialchars($_POST['email']); ?

この処理だとアクセスしたとき必ず$_POST['email']が入ってきます。
$_POST['email']に値が入るときは、確認ボタンを押下したときにミスがあって同じ画面に戻したときですよね。

なので最初のアクセス時は$_POSTが入っていないです。

PHP側でvar_dumpしてみましょう

var_dump($_POST);exit; // $_POSTの中身だけ出力されます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/17 10:12

    maxmmさん、ご回答いただきありがとうございます!
    var_dumpのコードはどこに挿入すれば良いのでしょうか?
    頭のPHPもしくは、該当している箇所のPHP(emailの箇所)でしょうか?

    よろしくお願い致します。

    キャンセル

  • 2020/07/17 10:18

    エラーが発生する前であればどこでもいいです!
    今回は<?phpのすぐ下で書いてみましょう。

    キャンセル

  • 2020/07/18 09:05

    ありがとうございます。
    試してみましたが、表示がすべて消えてしまい、うまくいきませんでした。

    キャンセル

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

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

関連した質問

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