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

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

ただいまの
回答率

87.34%

【PHP】Notice: Undefined indexのissetメソッドでの対処法

解決済

回答 4

投稿

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

score 16

Notice: Undefined indexのissetメソッドでの回避

標記について、issetにてnoticeを回避できることは分かりましたが、その理由・理屈が分かりませんのでご教授頂けませんでしょうか。お願い致します。

ググると以下の理由が記載されていました

初回アクセス時と2回目以降のアクセスで処理を切り分けていないことが考えられます。たとえば、「送信する」ボタンをクリックした後にフォーム入力値を受け取るスクリプトの場合、そのスクリプトに最初にアクセスしたときは$_GET['sign']には何も入っていないので、このエラーメッセージが表示されます。

不明点

1、issetで回避できる原理・理屈が不明です。
初回アクセス時に、$_GET['sign']には何も入っていない場合は、falseで終了して何も表示されないはずではないでしょうか。

2、初回アクセス、2回目以降のアクセスというのが分かりません。
form.phpでsubmitし、display.phpに移行して終了のため初回アクセスのみではないでしょうか。

form.php

 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>aaa</title>
 </head>
 <body>
 <p>1-4</p>
 <form action='display.php' method='GET'>
 <select name='sign'>
 <option value='1'>1</option>
 <option value='2'>2</option>
 <option value='3'>3</option>
 <option value='4'>4</option>
 </select>
<input type='submit' value='send'>
</form>
</body>
</html>


display.php(issetあり版)

<?php
if (isset($_GET['sign'])) {
echo $_GET['sign'];
}


display.php(issetなし版)

<?php
echo $_GET['sign'];
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/07/30 09:28

    >ググると
    その検索ワードと引用してきたページのURLを提示されたほうが良いと思います。
    探し方や理解が間違っていればその方向からアドバイスをえたほうが今後の理解につながります。

    キャンセル

回答 4

checkベストアンサー

+5

学習中は、使用する関数をいちいちマニュアルで確認してから使用すると良いですよ。

isset

返り値

var が存在して NULL 以外の値をとれば TRUE、 そうでなければ FALSE を返します。

ただ、今回の isset() に関しては、別の場所も参照したほうがわかりやすいです。

PHP 型の比較表

注意:

$xが定義されていない状態で単に if ($x)としてしまうとE_NOTICE レベルのエラーが発行てしまいます。代わりに、empty()や isset()を使うかあるいは変数を初期化するように してください。 

余談)
ここにある3つの表は非常に重要で、初学者の陥る罠のいくつかを表現しています。何度か見直し、理解のためにコードを色々変更して試してみると良いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/31 22:17

    御回答ありがとうございます。
    端的で分かりやすかったです。3つの表も非常に参考になりました。

    変数が存在するのか、存在して値はNULLか否かという点を考えて行こうと思います。

    キャンセル

+3

ググったサイトに間違いが書いてある、というだけですね。
(ネット上には正しい情報しかない訳ではないので注意が必要です)

1回目とか2回目とかは関係がありません。
ご質問の内容に沿って示します。

(ビルトインサーバの動作が可能ならば、 php -S localhost:8000 とかできると簡単に確認ができます。)

display.php(issetなし版) に対し、
display.phpでアクセスすると、エラーが表示されます。(Notice: Undefined index: sign in ~)
display.php?sign= ならば、エラーは表示されません。

$_GET['sign']には何も入っていない場合は、falseで終了して何も表示されないはず
というのは、issetがあって初めて false が判定されるのであって、 display.php だけでアクセスした場合には、そもそも $_GET['sign'] 自体が存在しないので、「何も入っていない」ですらないので notice が表示されます。(「Undefined」(未定義な)とはそういう意味です) 

display.php?sign=でアクセスすることで、初めて$_GET['sign']が用意され、エラーなく$_GET['sign']にアクセスすることが可能になります。

配列の要素にエラーなくアクセスできるのは、その要素が存在する場合のみ、と覚えておくと良いでしょう。

(あ、エラーというのはNoticeレベルも含めて書いてます)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/31 22:13

    御回答ありがとうございます。
    「配列の要素にエラーなくアクセスできるのは、その要素が存在する場合のみ」というのは勉強になりました。変数が存在するのか意識して今後作成していきます。

    キャンセル

+2

GET/POSTをissetするのは効率的ではありません
filter_inputするほうが良いと思います

$sign=filter_input(INPUT_GET,'sign');
var_dump($sign);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/31 22:08

    御回答ありがとうございます。
    スーパーグローバル関数には直接アクセスしない方が良いことからfilter_inputが推奨されているということも知れました。何故、推奨されているのかは自分でじっくり考えていきたいと思います。

    キャンセル

+1

初回アクセスじゃなくて
display.phpを直接みられた場合、と読み替えれば納得できる気がします

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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