[解決済み] "お知らせ 未定義変数"、"Notice: Notice: 未定義のインデックス", "Notice:未定義のインデックス", "Notice."。PHPを使用した「未定義のオフセット
質問
PHPスクリプトを実行しているのですが、以下のようなエラーが出続けています。
お知らせです。Undefined variable: my_variable_name in C:\wampwwwmypathindex.php on line 10
お知らせ Undefined index: my_index C:\wampwwwttpd.php on line 11
10行目、11行目はこのようになります。
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
これらのエラーメッセージはどのような意味ですか?
なぜ突然表示されるのですか?このスクリプトを何年も使っていて、何の問題もなかったのに。
どうすれば直せますか?
<サブ これは一般的な質問です 何度も説明しなくても、重複してリンクしてもらえるように。この問題に関する実際の回答は非常に具体的なものが多いので、これは必要なことだと感じています。
<サブ 関連するMetaの議論。
- <サブ 繰り返しの質問についてどうしたらよいですか?
- <サブ 参考質問」は意味があるのか?
解決方法は?
お知らせ 未定義変数
の膨大な叡智から PHPマニュアル :
初期化されていない変数のデフォルト値に依存することは、あるファイルを同じ変数名を使用する別のファイルにインクルードする場合に問題があります。また セキュリティリスク と レジスタグローバルズ をオンにします。 E_NOTICE 初期化されていない変数を操作した場合は、レベルエラーが発生しますが、初期化されていない配列に要素を追加した場合は発生しません。 isset() という言語構成は、変数がすでに初期化されているかどうかを検出するために使用することができます。さらに、より理想的な解決策は empty() 変数が初期化されていなくても、警告やエラーメッセージを生成しないためです。
から PHPドキュメント :
変数が存在しない場合、警告は発生しません。それはつまり empty() とは本質的に同等である。 !isset($var) || $var == 偽 .
のみを使用することができたということです。
empty()
を使用して変数が設定されているかどうかを判断し、さらにその変数を以下のようにチェックします。
0
,
0.0
,
""
,
"0"
,
null
,
false
または
[]
.
例
$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
echo (!isset($v) || $v == false) ? 'true ' : 'false';
echo ' ' . (empty($v) ? 'true' : 'false');
echo "\n";
});
上記のスニペットを 3v4l.org オンラインPHPエディタ
PHP は変数の宣言を必須としていませんが、セキュリティ上の脆弱性や、 スクリプトの後半で使用される変数に値を与え忘れるバグを回避するために、 宣言を推奨しています。宣言されていない変数がある場合、PHPは非常に低レベルなエラーを発生させます。
E_NOTICE
は、デフォルトでは報告すらされないものですが、マニュアルの
を許可するようアドバイスしています。
を開発中です。
問題への対処方法。
-
おすすめです。 未定義の変数に文字列を追加しようとしたときなど、変数を宣言してください。あるいは
isset()
/!empty()
のように、それらが宣言されているかどうかを確認してから参照します。//Initializing variable $value = ""; //Initialization value; Examples //"" When you want to append stuff later //0 When you want to add numbers later //isset() $value = isset($_POST['value']) ? $_POST['value'] : ''; //empty() $value = !empty($_POST['value']) ? $_POST['value'] : '';
PHP 7.0から、これはよりすっきりしたものになりました。 null coalesce演算子 :
// Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';
-
を設定します。 カスタムエラーハンドラ を E_NOTICE に設定し、標準出力からメッセージをリダイレクトします (おそらくログファイルに)。
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
-
E_NOTICEをレポートから無効にします。だけを除外する手っ取り早い方法
E_NOTICE
はerror_reporting( error_reporting() & ~E_NOTICE )
-
でエラーを抑止する。 演算子 .
注 1.のみを実装することを強く推奨します。
お知らせ 未定義のインデックス / 未定義のオフセット
この通知は、あなた(またはPHP)が配列の未定義のインデックスにアクセスしようとしたときに表示されます。
問題への対処方法
-
アクセスする前に、インデックスが存在するかどうかを確認する。このために
isset()
またはarray_key_exists()
://isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
-
言語構成
list()
は、存在しない配列のインデックスにアクセスしようとしたときに、これを生成する可能性があります。list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');
2つの変数を使って2つの配列要素にアクセスしていますが、配列要素は1つだけで、インデックス
0
が生成されます。
お知らせです。未定義のオフセット: 1
$_POST
/
$_GET
/
$_SESSION
変数
を使用すると、上記のような通知がよく表示されます。
$_POST
,
$_GET
または
$_SESSION
. の場合
$_POST
と
$_GET
を使用する場合は、インデックスが存在するかどうかを確認する必要があります。例えば
$_SESSION
でセッションが開始されていることを確認する必要があります。
session_start()
とインデックスが存在することを確認します。
また、3つの変数がすべて スーパーグローバル であり、大文字である。
関連する
関連
-
[解決済み] コマンドの同期がとれていない。
-
[解決済み】PHP定数「PHP_EOL」はいつ使うの?
-
[解決済み】++と*+の意味は何ですか?
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] PHPのstartWith()関数とendsWith()関数
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】PHPのクラスが見つからないが、インクルードされている
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み】mysqli::query(): mysqli をフェッチできない
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。