開発しているとNotice undefined indexというエラーによく出くわします。
一見動きに問題なさそうだけどよくよく調べたらデータが空で処理されていた・・とか、あんまりよくないことも起きやすいです。
このページではPHPの notice undefined indexについて起こりやすいポイントと修正方法を解説していきます。
ぜひこのページを見てエラーを解消してください!
PHP notice undefined index って 意味は? なんのエラー?
notice undefined indexは簡単にいうとその配列のキー(インデックス)知らないよっていうエラーです。
お宅、キーの名前間違ってませんか!?って問いかけです。
PHP notice undefined index 起こりやすい2つの箇所
8割くらいのエラーはこの2つが原因なのではないでしょうか
- スペルミス
- フォームでPOSTやGETなどURLを使った処理
PHP notice undefined indexの原因 スペルミス
配列のインデックス名を指定する時にインデックス(キー)の名前を間違えることで起こります。
意外と多いのがスペルミスです。
サンプルです
<?php
$test_array = array("fruit" => "apple","vegetable" => "tomato");
echo $test_array['fruits'];
?>
エラー内容です。
PHP Notice: Undefined index: fruits in /Users/XXXXXX/Documents/php_study/index_error.php on line 4
test_arrayの配列にはfruitとvegetableのキーがあるのですが、
間違ってfruitsというキーを指定してしまいました。
スペルミスや単複間違えてうまくいかない!ということはよくあります。
キー名が正しいかどうか確認してください。
フォームからデータを受け取る処理
formからデータを受け取る処理で、パラメータ名違いや不足により起こります。
※本来であればフォームからの入力値はセキュリティ都合でもっと厳密にチェックする必要がありますが今回は省いています。
サンプルです
form.html 見た目
コード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8"/>
</head>
<body>
<form action="complete.php" method="get">
<label>ユーザー名:</label>
<input type="text" name="username" value=""><br>
<label>年齢:</label>
<input type="number" name="age" value=""><br>
<button type="submit">submit</button>
</form>
</body>
</html>
完了画面 complete.php 見た目
コード
<?php
ini_set( 'display_errors', 1 );
echo $_GET['username'] . "さん";
echo $_GET['age'] . "才";
?>
GETなのでURLにパラメータが見えます。
POSTはパラメータは見れませんが、同じように考えていただいてOKです。
※POSTの場合は$_POST[‘変数名’] 例)$_POST[‘username’]
完了画面では入力画面で入力したユーザー名と年齢を表示させています。
しかし何かしらの理由でこのようなhttp://localhost/php_study/complete.php パラメータがないアクセスが来たとします。
その場合、$_GET[‘username’]のusernameと$_GET[‘age’]のageのキーがないので下記のようなエラーが出ます。
Notice: Undefined index: username in /Library/WebServer/Documents/php_study/complete.php on line 4
さん
Notice: Undefined index: age in /Library/WebServer/Documents/php_study/complete.php on line 5
才
これを回避するためには、isset関数を用いて変数が定義されていてかつ値が入っているときのみ、$_GET[‘username’]や$_GET[‘age’]の値を見ることとします。
<?php
ini_set( 'display_errors', 1 );
if(isset($_GET['username'])){
echo $_GET['username'] . "さん";
}
if(isset($_GET['age'])){
echo $_GET['age'] . "才";
}
?>
Noticeが画面表示されないようにする設定
とりあえずNoticeレベルのエラーを全て表示しないようにする方法です。
- php.iniを修正
- Apacheを再起動
php.iniの修正、
Notice以外のエラーは全て表示するという意味です。
error_reporting = E_ALL & ~E_NOTICE
上記の方法で取り急ぎNoticeは消えますが、なるべく標準的な設定にした方が無難です。
おすすめはphp.iniの設定ファイルにあるerror_reportingの設定から環境にあったものを選ぶ方法です。
デフォルト、開発環境、本番環境と用意されているので環境にあったものを選びましょう。
; error_reporting
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
おわりに
NoticeはPHPのエラーとしては一番低いレベルで一見システムに影響なさそうですが、システムが思わぬ動きをしている可能性も十分あります。
Noticeエラーも出ないシステムを作成すればきっと品質もそれなりに高いものが仕上がってくると思います。
細かい作業になり大変なこともあるかと思いますが今回ご紹介したisset関数等を用い、Noticeが出ないようなプログラムを作っていってもらえればと思います!