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

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

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

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

Q&A

解決済

4回答

4733閲覧

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

reliableGR

総合スコア16

PHP

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

0グッド

0クリップ

投稿2019/07/29 15:32

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'];

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

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

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

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

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

m.ts10806

2019/07/30 00:28

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

回答4

0

ベストアンサー

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

isset

##返り値

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

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

PHP 型の比較表

##注意:

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

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

投稿2019/07/29 22:22

編集2019/07/29 22:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

reliableGR

2019/07/31 13:17

御回答ありがとうございます。 端的で分かりやすかったです。3つの表も非常に参考になりました。 変数が存在するのか、存在して値はNULLか否かという点を考えて行こうと思います。
guest

0

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

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/29 17:27

編集2019/07/29 17:29
takepan1973

総合スコア821

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

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

reliableGR

2019/07/31 13:13

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

0

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

PHP

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

投稿2019/07/30 01:26

yambejp

総合スコア114572

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

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

reliableGR

2019/07/31 13:08

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

0

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

投稿2019/07/29 15:41

mikkame

総合スコア5036

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問