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

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

ただいまの
回答率

88.80%

Notice: Undefined index エラーの解決方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,962

shutamo

score 18

前提・実現したいこと

Notice:  Undefined index エラーを無くしたいです。
よくわかるPHPの教科書のchapter3-17のところがよくわかりません。
htmlファイルとphpファイルは同じフォルダ内にあります。

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

Notice:  Undefined index: my_name in /Applications/XAMPP/xamppfiles/htdocs/test.php on line 93

該当のソースコード

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form action="test.php" method="GET">
      <label for="my_name">お名前:</label>
      <input type="text" name="my_name" maxlength="255" value="">
      <input type="submit" value="送信する">
    </form>
  </body>
</html>
<!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="css/style.css">

<title>よくわかるPHPの教科書</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">よくわかるPHPの教科書</h1>
</header>

<main>
<h2>Practice</h2>
<pre>
<?php
お名前: <?php print(htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES)); ?>
</pre>
</main>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

回答が更新されるか分からないので別途残しておきます。
Undefined index はそこまで珍しくはないエラーです。
「打ち間違いだった」だけで済ませてしまうと今後も同じ状況に陥ってまた同様の質問を繰り返すことになって中々進まないのでしっかり理解するようにしましょう。

Undefined indexだけで検索してもわんさか出てきます。
Google検索でもいいし、質問者向けの回答を得たいならteratailの検索機能を使うと良いでしょう。

下記のような記事は読んでおいて今後の対策に役立ててください。


一応、ここでも書いておきますが、
配列の変数を何かしらで参照するときに、存在しないキーを指定した場合に起きます。

現象が再現する簡単なコード

<?php
$hoge = []; //array()と同。PHP5.4以降ならこの書き方がベター
$hoge['a'] = 'test1';
$hoge['b'] = 'test2';
$hoge['c'] = 'test3';
echo $hoge['d'];
// PHP Notice:  Undefined index: d

ただ、こういう風に「自分で明示して代入した」情報であれば現象は中々起きないと思います。
よく起きるのは自動で設定される場合、特に入力フォームからの送信ですね。
nameが配列のキーとなりvalueが対応する値となるというのはおそらくどの書籍にも同等の表現で
書かれているとは思いますが、初めのうちはイメージできなかったりスペルをミスったりするものです。

プログラムは書いた通りにしか動きません。
また「~~が必ず来る前提」で書かれたプログラムは非常に危険です。
自動で設定される、またはどこから呼び出されるか特定されていない(できない、どこからでもできる)ようなものであれば、必ずそのキーや値が存在するかチェックしましょう。

if(isset($hoge) && array_key_exists('d',$hoge)){
 echo $hoge['d'];
}else{
 echo 'なし';
}


PHP7以降ならこんな書き方もできます。

echo $hoge['d'] ?? 'なし';

ただし

「入力フォームから送信された情報をチェックする」のであれば「指定したキーがあるかないか」をチェックしてくれるfilter_input()を使うのが望ましいです。

返り値 
成功した場合は要求された変数の値、フィルタリングに失敗した場合に FALSE、 あるいは変数 variable_name が設定されていない場合に NULL を返します。フラグ FILTER_NULL_ON_FAILURE が指定されている場合は、変数が設定されていなければ FALSE、 フィルタリングに失敗したら NULL を返します。

フィルタ掛けてないのでしたら実行結果がnullかどうかできちんと送信されたかどうかをチェックすることができます。

あとは提示したPHPマニュアルを読んでいろいろ試してください。

※なお、余程きちんとPHP7のことを取り上げている書籍でない限りNull 合体演算子は出てきませんし、filter_input()で入力値を取得している書籍もあまり見ないです。
PHPマニュアルにて最新の情報を確認したり、Qiitaにあがっている評価の高い記事を読んだりしてより安全なプログラムを組むように心がけてみてください。
書籍だけの勉強法というのはプログラムにはあまり向かないやり方です。(執筆時点では最新でも出版時点では既に古くなっていたりベターなやり方は出ているものなので)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/26 23:32

    ご丁寧にありがとうございます!

    キャンセル

  • 2019/05/27 08:56

    えっと?回答削除されたんですね
    まあ、いいですけど…
    私の回答をどのように理解されましたか?
    ここをきちんと理解しておかないと同じような問題に苦しむことになりますけど…

    キャンセル

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

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

関連した質問

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