1. ホーム
  2. php

[解決済み] "お知らせ 未定義変数"、"Notice: Notice: 未定義のインデックス", "Notice:未定義のインデックス", "Notice."。PHPを使用した「未定義のオフセット

2022-03-21 06:19:21

質問

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 は、デフォルトでは報告すらされないものですが、マニュアルの を許可するようアドバイスしています。 を開発中です。

問題への対処方法。

  1. おすすめです。 未定義の変数に文字列を追加しようとしたときなど、変数を宣言してください。あるいは 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'] ?? '';
    
    
  2. を設定します。 カスタムエラーハンドラ を E_NOTICE に設定し、標準出力からメッセージをリダイレクトします (おそらくログファイルに)。

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
    
  3. E_NOTICEをレポートから無効にします。だけを除外する手っ取り早い方法 E_NOTICE

    error_reporting( error_reporting() & ~E_NOTICE )
    
    
  4. でエラーを抑止する。 演算子 .

1.のみを実装することを強く推奨します。

お知らせ 未定義のインデックス / 未定義のオフセット

この通知は、あなた(またはPHP)が配列の未定義のインデックスにアクセスしようとしたときに表示されます。

問題への対処方法

  1. アクセスする前に、インデックスが存在するかどうかを確認する。このために 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'] : '';
    
    
  2. 言語構成 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つの変数がすべて スーパーグローバル であり、大文字である。

関連する