PHPでなにか作ってる時、たまにこんなエラーが出ることがあります。
Notice: Undefined index: msg in /Users/foo/Sites/test.php on line 3
このエラー(というか警告)が出た時の対処法をメモっておきます。
これはなに?
これは、定義されていない配列を使用した時に発生します。(ただし、Noticeはサーバーの設定によっては表示されない場合もあります。)
因みに定義されていない変数を使用した場合は、Undefined variable という警告になります。
合言葉を知らない人に「合言葉をいえ!」って言っても「えっ?」てなりますよね?要はそういうことです(えっ)
スクリプトに合言葉 ($msg) をいえ(echo)!と言われても、PHPさんはは合言葉を教えてもらっていません($msgを定義していない)ので、「俺の知らない合言葉 $msg を言えっていわれた」と言ってるわけです。たぶん。
試してみる
とりあえず、どんな時出てくるのか見てみましょう。
1 2 3 4 |
<?php error_reporting(E_ALL); $msg = $_GET['msg']; echo $msg; |
このコードを test.php として保存し、
test.php?msg=hoge
というふうにアクセスすると、ページに hoge と表示します。もちろんhogeを書き換えればその文字になります。 ((エラーチェックをしてませんのであんま変な文字は入れないほうがいいです。))
ですが、なにもパラメータを渡さずに、ただ単に test.php にアクセスしたらどうなるでしょうか?
答えは、
「Undefined index」がでる
です。
$_GETはURLにくっついてるパラメータをまとめた配列です。そこから msg というキーがないか探してるのですが、そんなパラメータはありませんので、結果「えっ?」となるわけです。
因みに2行目の「error_reporting(E_ALL);」はこのファイルではエラーをすべて表示するようにするための設定です。環境によっては「Notice」くらいのエラーは表示しなかったりするのですが、そんな環境でも表示されるようにするために書いてあります。
なんとかする
通常ユーザーが直接URLにパラメータをつけてアクセスするということはほとんどなくて、ファイルからファイルにデータを受け渡しするときに使うのが基本だと思いますので、かならずパラメータを付けて渡してあげればそれでOK…って気もしますが、なにかの弾みにうまくパラメータが渡せないと警告が出てしまいます。
$_GET に msg があるかをチェックして、あれば msg の中身を、なければ null をセットするように変更してあげればOKです。
1 |
$msg = isset($_GET['msg']) ? htmlspecialchars($_GET['msg']) : null; |
つまり、URLにパラメータが入ってない状態では null が代入されるようになるので、「Undefined」ではなくなるということですね。
因みにNoticeは動作には支障がないレベルの警告(本当はこうして欲しいけど、まぁ今のままでも動くよ的な)なので、そこまで神経質にならないでも良いのかもしれませんが、こういうところをしっかり詰めておくとあとで謎の動作不具合とかを減らせますので「宣言しなくてもいいから宣言しない」よりは、「宣言しなくてもいいけど宣言しておく」くらいの気持ちで開発を行ったほうがいいのかもしれませんね。
にわかの自分が言うのもアレですけど。
コメントする