PHPを使用した「通知:未定義の変数」、「通知:未定義のインデックス」、および「通知:未定義のオフセット」

Nov 24 2010

PHPスクリプトを実行していますが、次のようなエラーが引き続き発生します。

注意:未定義の変数:10行目のC:\ wamp \ www \ mypath \ index.phpのmy_variable_name

注意:未定義のインデックス:11行目のmy_index C:\ wamp \ www \ mypath \ index.php

10行目と11行目は次のようになります。

echo "My variable value is: " . $my_variable_name; echo "My index value is: " . $my_array["my_index"];

これらのエラーメッセージの意味は何ですか?

なぜ突然現れるのですか?私はこのスクリプトを何年も使用していましたが、問題はありませんでした。

どうすれば修正できますか?


これは、問題を何度も説明するのではなく、重複してリンクするための一般的な参照の質問です。この問題に関する実際の回答のほとんどは非常に具体的であるため、これが必要だと思います。

関連するメタディスカッション:

  • 繰り返しの質問について何ができるでしょうか?
  • 「参照質問」は意味がありますか?

回答

1113 Rizier123 Nov 24 2010 at 04:36

注意:未定義の変数

PHPマニュアルの広大な知恵から:

初期化されていない変数のデフォルト値に依存することは、同じ変数名を使用する別のファイルに1つのファイルを含める場合に問題があります。また、register_globalsがオンになっている場合の主要なセキュリティリスクでもあります。E_NOTICEレベルのエラーは、初期化されていない変数を操作する場合に発行されますが、初期化されていない配列に要素を追加する場合は発行されません。isset()言語構造を使用して、変数がすでに初期化されているかどうかを検出できます。さらに、より理想的なのは、変数が初期化されていない場合に警告またはエラーメッセージを生成しないため、empty()のソリューションです。

PHPドキュメントから:

変数が存在しない場合、警告は生成されません。つまり、empty()は本質的に!isset(と同等の簡潔なものです$var) || $var == false

これは、あなただけ使用できることを意味しempty()、変数が設定され、しかもそれは、次のに対して変数をチェックしているかどうかを判断するために、00.0"""0"nullfalseまたは[]

例:

$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で宣言することをお勧めします。宣言されていない変数の場合に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'] : '';
    

    これはPHP7.0の時点ではるかにクリーンになり、null合体演算子を使用できるようになりました。

    // 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つの変数が使用されますが、配列要素はindexのみ0であるため、次のように生成されます。

注意:未定義のオフセット:1

$_POST/ $_GET/$_SESSION変数

通知は、上記で作業する場合、多くの場合、表示され$_POST$_GETまたは$_SESSION。用$_POSTして$_GET、あなたはちょうどあなたがそれらを使用する前にインデックスが存在するかどうかをチェックする必要があります。以下のために$_SESSIONあなたが作るために持っていることを確認あなたが開始されたセッション持ちsession_start()、インデックスも存在していることを。

また、3つの変数はすべてスーパーグローバルであり、大文字であることに注意してください。

関連:

  • 注意:未定義の変数
  • 注意:未定義のインデックス
149 Ish Nov 24 2010 at 04:31

これらを試してください

Q1:この通知は、$ varnameがスクリプトの現在のスコープで定義されていないことを意味します。

Q2:疑わしい変数を使用する前にisset()、empty()条件を使用するとうまくいきます。

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? ''; // pre-7 PHP versions $user_name = '';
if (!empty($_SESSION['user_name'])) { $user_name = $_SESSION['user_name'];
}

または、迅速で汚い解決策として:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

セッションに関する注意:

  • セッションを使用する場合は、セッションを使用するsession_start();すべてのファイル内に配置する必要があります。

  • http://php.net/manual/en/features.sessions.php

66 mario Nov 24 2010 at 04:40

エラー表示@演算子

望ましくない冗長な通知の場合は、専用の@演算子を使用して、未定義の変数/インデックスメッセージを»非表示にすることができます。

$var = @($_GET["optional_param"]);
  • 通常、これはお勧めしません。新規参入者はそれを使いすぎる傾向があります。
  • アプリケーションロジックの奥深くにあるコード(宣言されていない変数を無視する)、たとえば関数パラメーターやループ内では非常に不適切です。
  • ただし、isset?:または??超抑制には1つの利点があります。通知は引き続きログに記録されます。そして、@隠された通知を次のように復活させることができます。set_error_handler("var_dump");
    • if (isset($_POST["shubmit"]))さらに、最初のコードで習慣的に使用/推奨するべきではありません。
    • 新規参入者はそのようなタイプミスを見つけることはありません。まさにそのような場合のPHP通知を奪うだけです。追加する@機能確認した後でissetのみ。
    • 最初に原因を修正してください。通知ではありません。

  • @特にオプションの場合は、主に$_GET/$_POST入力パラメータに使用できます

そして、これはそのような質問の大部分をカバーしているので、最も一般的な原因について詳しく見ていきましょう。

$_GET/ $_POST/$_REQUEST未定義入力

  • 未定義のインデックス/オフセットに遭遇したときに最初に行うことは、タイプミスをチェックすることです。
    $count = $_GET["whatnow?"];

    • これは予想されるキー名であり、ページリクエストに存在しますか?
    • PHPでは変数名配列インデックスでは大文字と小文字が区別されます。
  • 第二に、通知は明らかな原因、使用を持っていない場合、var_dumpまたはprint_r確認するために、すべての彼らの海流のコンテンツの入力配列を:

    var_dump($_GET); var_dump($_POST);
    //print_r($_REQUEST);
    

    どちらも、スクリプトが正しいパラメータで呼び出されたか、パラメータで呼び出されたかを明らかにします。

  • 別の方法として、または追加でブラウザのdevtools(F12)を使用し、ネットワークタブでリクエストとパラメータを調べます。

    POSTパラメータとGET入力は別々に表示されます。

  • $_GETパラメータについては、QUERY_STRINGを覗くこともできます

    print_r($_SERVER);
    

    PHPはするいくつかのルールがある合体スーパーグローバルへの非標準のパラメータ名を。Apacheもいくつかの書き換えを行う可能性があります。提供されたraw$_COOKIESおよびその他のHTTPリクエストヘッダーをそのように確認することもできます。

  • より明確に、GETパラメータについてブラウザのアドレスバーを見てください:

    http://example.org/script.php?id=5&sort=desc

    疑問符のname=value後のペア?は、クエリ(GET)パラメーターです。したがって、このURLはとを生成する可能性が$_GET["id"]あり$_GET["sort"]ます。

  • 最後に、パラメータを期待しているのに何も受け取らない場合は<form><input>宣言宣言を確認してください。

    • 必要な各入力に <input name=FOO>
    • id=またはtitle=属性が十分ではありません。
    • method=POSTフォームが移入するべきです$_POST
    • 一方、method=GET(またはそれを除外すると)$_GET変数が生成されます。
    • フォームがaction=script.php?get=param$ _GETとmethod=POST$ _POSTの残りのフィールドを介して提供することも可能です。
    • 最新のPHP構成(≥5.6)では、GETパラメーターとPOSTパラメーターをマッシュアップする再使用が可能になりました(ファッショナブルではありません)$_REQUEST['vars']。
  • mod_rewriteを使用している場合は、両方をチェックするaccess.logだけでなく、RewriteLogが存在しないパラメーターを把握できるようにする必要があります。

$_FILES

  • 同じ健全性チェックがファイルのアップロードとに適用されます$_FILES["formname"]
  • さらに、 enctype=multipart/form-data
  • だけでなくmethod=POST、あなたの<form>宣言。
  • 参照:PHP未定義のインデックスエラー$ _FILES?

$_COOKIE

  • $_COOKIE配列は、右の後に読み込まれることはありませんsetcookie()が、唯一の任意のフォローHTTPリクエストに応じて、。
  • さらに、それらの有効性はタイムアウトし、サブドメインまたは個々のパスへの制約となる可能性があり、ユーザーとブラウザーはそれらを拒否または削除することができます。
49 Erik Nov 24 2010 at 04:31

一般的には「悪いプログラミング」と、現在または後で間違いが発生する可能性があるためです。

  1. 間違いの場合は、最初に変数に適切な割り当てを行います。$ varname = 0;
  2. 本当にたまにしか定義されていない場合はif (isset($varname))、使用する前に次のことをテストしてください。
  3. スペルが間違っていることが原因である場合は、それを修正してください
  4. たぶん、PHP設定の警告をオフにすることさえできます
43 DGM Nov 24 2010 at 04:35

これは、まだ何も割り当てていない変数をテスト、評価、または印刷していることを意味します。これは、タイプミスがあるか、変数が最初に何かに初期化されたことを確認する必要があることを意味します。ロジックパスを確認してください。あるパスに設定されている場合と、別のパスに設定されていない場合があります。

36 FerenciZoltánLászló Dec 30 2011 at 21:14

通知は役立つので無効にしたくありませんでしたが、入力しすぎないようにしたかったのです。

私の解決策はこの関数でした:

function ifexists($varname) { return(isset($$varname)?$varname:null);
}

したがって、$ nameを参照し、存在する場合はエコーする場合は、次のように記述します。

<?=ifexists('name')?>

配列要素の場合:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

$ _REQUEST ['name']を参照したい場合は、ページで:

<?=ifexistsidx($_REQUEST,'name')?>
28 mpyw Aug 27 2014 at 05:15

入力文字列を取得するための最良の方法は次のとおりです。

$value = filter_input(INPUT_POST, 'value');

このワンライナーは、次のものとほぼ同等です。

if (!isset($_POST['value'])) {
    $value = null; } elseif (is_array($_POST['value'])) {
    $value = false; } else { $value = $_POST['value'];
}

どうしても文字列値が必要な場合は、次のようにします。

$value = (string)filter_input(INPUT_POST, 'value');
26 Roger Dec 29 2012 at 18:46

その理由は変数 '$user_location' is not getting defined. If you are using any if loop inside which you are declaring the '$user_location '変数の場合は、elseループもあり、同じものを定義する必要があります。例えば:

$a=10; if($a==5) { $user_location='Paris';} else { } echo $user_location;

上記のコードは、ifループが満たされておらず、elseループで '$ user_location'が定義されていないため、エラーが発生します。それでもPHPは変数をエコーアウトするように求められました。したがって、コードを変更するには、次のことを行う必要があります。

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; } echo $user_location;
26 Robbie Nov 23 2016 at 08:44

「なぜ突然現れるのか?私はこのスクリプトを何年も使用していましたが、問題はありませんでした。」

ほとんどのサイトでは、「すべてのエラーを表示しますが、「通知」および「非推奨」ではない」という「デフォルト」のエラーレポートの下で動作するのが非常に一般的です。これはphp.iniで設定され、サーバー上のすべてのサイトに適用されます。これは、例で使用されている「通知」が抑制(非表示)され、より重大と見なされる他のエラーが表示/記録されることを意味します。

もう1つの重要な設定は、エラーを非表示にできることです(つまりdisplay_errors、「オフ」または「syslog」に設定します)。

この場合に発生するのは、error_reporting通知も表示するように変更されたか(例のように)、または設定がdisplay_errors画面上に変更された(抑制/ログ記録ではなく)ことです。

なぜ彼らは変わったのですか?

明白で最も簡単な答えは、誰かがphp.iniでこれらの設定のいずれかを調整したか、PHPのアップグレードバージョンが以前とは異なるphp.iniを使用しているということです。それが最初に見る場所です。

ただし、これらの設定をでオーバーライドすることもできます。

  • .htconf(vhostsとサブ構成を含むWebサーバー構成)*
  • .htaccess
  • PHPコード自体で

これらのいずれも変更されている可能性があります。

また、Webサーバーの構成で.htaccessディレクティブを有効/無効にできるという複雑な問題もあります。そのため、.htaccessに突然動作を開始/停止するディレクティブがある場合は、それを確認する必要があります。

(.htconf / .htaccessは、Apacheとして実行していることを前提としています。コマンドラインを実行している場合、これは適用されません。IISまたは他のWebサーバーを実行している場合は、それに応じてこれらの構成を確認する必要があります)

概要

  • php.iniのチェックerror_reportingおよびdisplay_errorsphpディレクティブが変更されていないか、以前とは異なるphp.iniを使用していないことを確認してください。
  • .htconf(またはvhostsなど)のcheckerror_reportingおよびdisplay_errorsphpディレクティブは変更されていません
  • .htaccessのcheckerror_reportingおよびdisplay_errorsphpディレクティブは変更されていません
  • .htaccessにディレクティブがある場合は、それらが.htconfファイルでまだ許可されているかどうかを確認してください
  • 最後にコードを確認してください。おそらく無関係のライブラリ。見ている場合error_reportingdisplay_errors、PHPディレクティブが設定されています。
21 ShahinMammadzada May 13 2014 at 02:02

簡単な修正は、コードの先頭で変数をnullに割り当てることです。

$user_location = null;
17 rybo111 Jul 29 2015 at 02:12

以前はこのエラーを呪っていましたが、ユーザー入力をエスケープするように通知すると役立つ場合があります。

たとえば、これが賢いと思った場合は、次の略記コードを使用します。

// Echo whatever the hell this is
<?=$_POST['something']?>

...もう一度考えてみて!より良い解決策は次のとおりです。

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(私はカスタムhtml()関数を使用して文字をエスケープします。マイレージは異なる場合があります)

16 user2253362 Apr 09 2013 at 20:43

私は、変数を自動的に宣言する独自の便利な関数exst()常に使用しています。

あなたのコードは-

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location); /** * Function exst() - Checks if the variable has been set * (copy/paste it in any place of your code) * * If the variable is set and not empty returns the variable (no transformation) * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var * @param mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = ""; if ( !isset($var)  || !$var ) { if (isset($default) && $default != "") $t = $default; } else { $t = $var; } if (is_string($t)) $t = trim($t);
    return $t;
}
16 elpiel Dec 13 2016 at 20:34

PHP 7.0では、Null合体演算子を使用できるようになりました。

echo "My index value is: " . ($my_array["my_index"] ?? '');

等しい:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHPマニュアルPHP7.0

15 RishabhSeth Dec 18 2015 at 18:06

非常に単純な言語で
間違いは、$user_location以前に定義されていない変数を使用していて、値がないことです。したがって、使用する前にこの変数を宣言することをお勧めします。例:


$user_location = '';
または
$user_location = 'Los Angles';
これは、直面する可能性のある非常に一般的なエラーです。したがって、変数を宣言してコーディング楽しむだけで心配する必要はありません 。

15 smcjones Nov 29 2016 at 06:01

なぜこうなった?

時間の経過とともに、PHPはよりセキュリティに重点を置いた言語になりました。デフォルトでオフになっていた設定が、デフォルトでオンになりました。これの完璧な例はE_STRICT、PHP5.4.0の時点でデフォルトでオンになっているです。

さらに、PHPのドキュメントによるとE_NOTICE、php.iniではデフォルトで無効になっています。PHPのドキュメントでは、デバッグのためにオンにすることをお勧めします。ただし、UbuntuリポジトリおよびBitNamiのWindowsスタックからPHPをダウンロードすると、別のものが表示されます。

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

これerror_reportingは、デフォルトの「デフォルト」値ではなく、実際にはデフォルトで本番値に設定されていることに注意してください。これはやや紛らわしく、php.iniの外部で文書化されていないため、他のディストリビューションでこれを検証していません

ただし、質問に答えるために、このエラーは、以前はポップアップしなかったときにポップアップします。理由は次のとおりです。

  1. PHPをインストールしましたが、新しいデフォルト設定の文書化はやや不十分ですが、除外していませんE_NOTICE

  2. E_NOTICE未定義の変数や未定義のインデックスなどの警告は、実際にはコードをよりクリーンで安全にするのに役立ちます。何年も前に、E_NOTICE有効にしたままにしておくと、変数を宣言する必要がありました。それはCを学ぶのをとても簡単にしました、変数がはるかに厄介であると宣言していませんでした。

私はそれについて何ができますか?

  1. E_NOTICE「デフォルト値」E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATEDをコピーし、等号の後に現在コメントされていないものに置き換えることでオフにしerror_reporting =ます。Apache、またはCGIまたはFPMを使用している場合はPHPを再起動します。「正しい」php.iniを編集していることを確認してください。正しい方法は、ApacheでPHPを実行している場合はApache、PHP-FPMを実行している場合はfpmまたはphp-fpm、PHP-CGIを実行している場合はcgiなどです。これは推奨される方法ではありませんが、レガシーコードがある場合は編集が非常に難しい場合は、それが最善の策かもしれません。

  2. E_NOTICEファイルまたはフォルダレベルをオフにします。これは、レガシーコードがあるが、それ以外の場合は「正しい」方法で処理したい場合に適しています。これを行うには、Apache2、Nginx、または選択したサーバーを参照する必要があります。Apacheでは、のphp_value内部を使用します<Directory>

  3. よりクリーンになるようにコードを書き直してください。本番環境に移動させながら、これを実行する必要があるか、誰かがあなたのエラーを表示したくない場合は、必ずエラーのいずれかの表示を無効にしている、とだけ作るのロギング(参照あなたのエラーをdisplay_errorsし、log_errorsphp.iniの中で、サーバーの設定) 。

オプション3を拡張するには:これが理想的です。あなたがこのルートに行くことができるなら、あなたはそうすべきです。最初にこのルートを使用しない場合は、開発環境でコードをテストして、最終的にこのルートを移動することを検討してください。あなたはそれに取り組んでいる一方で、取り除く~E_STRICTと、~E_DEPRECATED将来的にはうまくいかないかもしれないかを確認します。なじみのないエラーがたくさん表示されますが、将来PHPをアップグレードする必要があるときに、不快な問題が発生するのを防ぐことができます。

エラーはどういう意味ですか?

Undefined variable: my_variable_name-これは、使用前に変数が定義されていない場合に発生します。PHPスクリプトが実行されると、内部的にはnull値を想定します。ただし、どのシナリオで、変数を定義する前に変数をチェックする必要がありますか?結局のところ、これは「ずさんなコード」の主張です。開発者として、変数が定義できる範囲の上位に定義されているオープンソースプロジェクトを見ると、私はそれが大好きだと言えます。これにより、将来どの変数がポップアップするかがわかりやすくなり、コードの読み取り/学習が容易になります。

function foo()
{
    $my_variable_name = ''; //.... if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index-これは、配列内の値にアクセスしようとしたときに、その値が存在しない場合に発生します。このエラーを防ぐには、条件付きチェックを実行します。

// verbose way - generally better
if (isset($my_array['my_index'])) { echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)'; echo "My index value is: " . $my_index_val;   

もう1つのオプションは、関数の先頭で空の配列を宣言することです。これは常に可能であるとは限りません。

$my_array = array( 'my_index' => '' ); //... $my_array['my_index'] = 'new string';

(追加のヒント)

  • これらの問題やその他の問題が発生したとき、NetBeans IDE(無料)を使用しましたが、多くの警告と通知が表示されました。それらのいくつかは非常に役立つヒントを提供します。これは必須ではなく、大規模なプロジェクトを除いてIDEを使用しなくなりました。私はvim最近もっと人です:)。
9 gts Jun 07 2013 at 03:37

物事をシンプルにしてみませんか?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']); // returns null without any notice echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>
7 SintayehuAbaynhe Jan 27 2017 at 15:00

未定義のインデックスとは、たとえば、使用できない配列インデックスを要求した配列を意味します

<?php 

$newArray[] = {1,2,3,4,5}; print_r($newArray[5]);

?>

未定義の変数は、完全に存在しない変数を使用したか、たとえばその名前で定義または初期化されていないことを意味します

<?php print_r($myvar); ?>

未定義のオフセットとは、配列内で存在しないキーを要求したことを意味します。そしてこれに対する解決策は使用前にチェックすることです

php> echo array_key_exists(1, $myarray);
5 WouterdeWinter Nov 29 2016 at 02:31

質問のこの部分について:

なぜ突然現れるのですか?私はこのスクリプトを何年も使用していましたが、問題はありませんでした。

明確な答えはありませんが、設定が「突然」変更される理由について考えられる説明を次に示します。

  1. PHPを新しいバージョンにアップグレードしました。このバージョンでは、error_reporting、display_errors、またはその他の関連する設定に他のデフォルトを設定できます。

  2. あなたは、削除または実行時に設定し、関連する設定を使用していること(依存関係でおそらく)いくつかのコードを導入しているini_set()error_reporting()(コードでこれらを検索します)

  3. Webサーバーの構成を変更しました(ここではapacheを想定しています)。.htaccessファイルと仮想ホストの構成でphp設定を操作することもできます。

  4. 通常、通知は表示/報告されないため(PHPマニュアルを参照)、サーバーのセットアップ時に、何らかの理由(ファイルのアクセス許可??)でphp.iniファイルを読み込めず、デフォルト設定になっている可能性があります。 。後で、「バグ」は(偶然に)解決され、通知を表示するように設定されたerror_reportingを使用して正しいphp.iniファイルをロードできるようになりました。

4 James Jul 07 2018 at 01:56

三元化合物の使用は、シンプルで読みやすく、クリーンです。

PHP 7より前の
変数が設定されている場合は別の変数の値に変数を割り当て、それ以外の場合は割り当てnull(または必要なデフォルト値):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+ Null合体演算子
を使用することを除いて同じです。これは組み込まれているため、呼び出す必要はありません。また、チェック対象の変数の値を返すと想定されているため、返す変数を指定する必要もありません。isset()

$newVariable = $thePotentialData ?? null;

どちらも、 OPの質問から通知を停止し、両方のは、正確な等価です。

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
新しい変数を設定する必要がない場合はecho、関数の引数などを使用して、3値の戻り値を直接使用できます。

エコー:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

関数:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId) { if ($userId === null) {
        // Etc
    }
}

上記は、セッションなどを含む配列でもまったく同じように機能し、チェック対象の変数を次のように置き換え
$_SESSION['checkMe']
ます。
$clients['personal']['address']['postcode']


 

抑制:

@エラー報告レベルを使用してPHP通知を抑制または削減することは可能ですが、問題は修正されず、エラーログでの報告が停止されるだけです。これは、コードがまだ設定されていない変数を使用しようとしたことを意味します。これは、欠落している値の重要度に応じて、何かが意図したとおりに機能しないことを意味する場合としない場合があります。

正確な状態を識別するために、この問題を実際にチェックして適切に処理する必要があります。別のメッセージを配信するか、他のすべてにnull値を返すだけです。

通知がエラーログにないことだけを気にする場合は、オプションとしてエラーログを無視することができます。

3 JohnConde May 19 2017 at 00:15

クラスを操作する場合は、次を使用してメンバー変数を参照する必要があります$this

class Person
{
    protected $firstName;
    protected $lastName; public function setFullName($first, $last) { // Correct $this->firstName = $first; // Incorrect $lastName = $last; // Incorrect $this->$lastName = $last;
    }
}
2 Fred-ii- Jul 24 2017 at 23:11

未定義のインデックス通知がスローされるもう1つの理由は、データベースクエリから列が省略されたことです。

すなわち:

$query = "SELECT col1 FROM table WHERE col_x = ?";

次に、ループ内のより多くの列/行にアクセスしようとします。

すなわち:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

またはwhileループ内:

while( $row = fetching_function($query) ) { echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown echo "<br>"; echo $row['col3']; // undefined index thrown

}

注意が必要な他の点は、* NIXOSおよびMacOS Xでは、大文字と小文字が区別されることです。

Stackに関する次のQ&Aを参照してください。

  • MySQLのテーブル名では大文字と小文字が区別されますか?

  • クエリでのmysqlの大文字と小文字を区別するテーブル名

  • MySql-異なるサーバーのテーブルで大文字と小文字を区別する問題

1 Pupil Apr 23 2019 at 18:30

これらのエラーは、設定されていない変数を使用しているときに発生します。

これらに対処する最善の方法は、開発中にエラーを報告することです。

エラーレポートを設定するには:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

本番サーバーでは、エラーレポートがオフになっているため、これらのエラーは発生しません。

ただし、開発サーバーでは、エラーレポートをに設定できます。

このエラーを取り除くために、次の例を参照してください。

if ($my == 9) { $test = 'yes';  // Will produce error as $my is not 9. } echo $test;

変数を初期化してからNULL、値を割り当てたり使用したりできます。

したがって、コードを次のように変更できます。

$test = NULL; if ($my == 9) {
 $test = 'yes'; // Will produce error as $my is not 9.
}
echo $test;

これにより、プログラムロジックが妨げられること$testはなく、値がなくても通知は生成されません。

したがって、基本的には、開発のためにエラーレポートをオンに設定することをお勧めします。

そして、すべてのエラーを修正します。

また、本番環境では、エラーレポートをオフに設定する必要があります。

1 JohnConde Jul 06 2018 at 03:46

HTMLフォームが送信された後に変数が存在しない一般的な原因の1つは、フォーム要素が<form>タグ内に含まれていないことです。

Example: Element not contained within the <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

Example: Element now contained within the <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>
phvish Aug 30 2017 at 16:08

Probably you were using old PHP version until and now upgraded PHP thats the reason it was working without any error till now from years. until PHP4 there was no error if you are using variable without defining it but as of PHP5 onwards it throws errors for codes like mentioned in question.

JaimeMontoya Sep 02 2018 at 01:31

I asked a question about this and I was referred to this post with the message:

This question already has an answer here:

“Notice: Undefined variable”, “Notice: Undefined index”, and “Notice: Undefined offset” using PHP

I am sharing my question and solution here:

This is the error:

Line 154 is the problem. This is what I have in line 154:

153    foreach($cities as $key => $city){ 154 if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

I think the problem is that I am writing if conditions for the variable $city, which is not the key but the value in $key => $city. First, could you confirm if that is the cause of the warning? Second, if that is the problem, why is it that I cannot write a condition based on the value? Does it have to be with the key that I need to write the condition?

UPDATE 1: The problem is that when executing $citiesCounterArray[$key], sometimes the $key corresponds to a key that does not exist in the $citiesCounterArray array, but that is not always the case based on the data of my loop. What I need is to set a condition so that if $key exists in the array, then run the code, otherwise, skip it.

UPDATE 2: This is how I fixed it by using array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){