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

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

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

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

Q&A

解決済

1回答

2147閲覧

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

shutamo

総合スコア26

PHP

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

0グッド

0クリップ

投稿2019/05/23 14:56

前提・実現したいこと

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

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

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

該当のソースコード

html

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <form action="test.php" method="GET"> 9 <label for="my_name">お名前:</label> 10 <input type="text" name="my_name" maxlength="255" value=""> 11 <input type="submit" value="送信する"> 12 </form> 13 </body> 14</html>

PHP

1<!doctype html> 2<html lang="ja"> 3<head> 4<!-- Required meta tags --> 5<meta charset="utf-8"> 6<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 8<!-- Bootstrap CSS --> 9<link rel="stylesheet" href="css/style.css"> 10 11<title>よくわかるPHPの教科書</title> 12</head> 13<body> 14<header> 15<h1 class="font-weight-normal">よくわかるPHPの教科書</h1> 16</header> 17 18<main> 19<h2>Practice</h2> 20<pre> 21<?php 22お名前: <?php print(htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES)); ?> 23</pre> 24</main> 25</body> 26</html> 27

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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


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

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

php

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

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

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

php

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

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

php

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

ただし

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

返り値

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

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

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

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

投稿2019/05/24 00:45

編集2019/05/24 00:50
m.ts10806

総合スコア80765

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

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

shutamo

2019/05/26 14:32

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

2019/05/26 23:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問