web-dev-qa-db-ja.com

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

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

Notice:未定義の変数:C:\ wamp\www\mypath\index.php内の10行目にあるmy_variable_name

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

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

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

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

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

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

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

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

1069
Pekka 웃

Notice:未定義の変数

PHP Manual の広大な知恵から:

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

PHP documentation より:

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

これは、変数が設定されているかどうかを判断するためにempty()だけを使用でき、さらに、次の0,"",nullに対して変数がチェックされることを意味します。

例:

$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を発行することです。これはデフォルトでは報告されませんが、Manual は開発中に を許可します。

問題に対処する方法:

  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合体演算子 を使用できます。

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. E_NOTICEに customエラーハンドラ を設定し、メッセージを標準出力から(おそらくログファイルに)リダイレクトします。

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. E_NOTICEによる報告を無効にします。 E_NOTICEだけを除外する簡単な方法は次のとおりです。

    error_reporting( error_reporting() & ~E_NOTICE )
    
  4. @演算子 でエラーを抑制してください。

注: ポイント1だけを実装することを強くお勧めします。

Notice:未定義のインデックス/未定義のオフセット

この通知は、あなた(あるいは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つの変数が使用されていますが、インデックス0という1つの配列要素しかないため、次のようになります。

Notice:未定義のオフセット:1

$_POST$_GET/$_SESSION変数

$_POST$_GETまたは$_SESSIONを扱うとき、上記の注意はしばしば現れます。 $_POST$_GETの場合は、それらを使用する前にインデックスが存在するかどうかを確認するだけです。 $_SESSIONでは、セッションが_/session_start() で開始されていることと、インデックスも存在することを確認する必要があります。

また、3つの変数はすべて superglobals であり、大文字です。

関連する

981
Alin Purcaru

試してみる

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);

セッションについての注意:

123
Ish

エラー表示 @ operator

望ましくない冗長な通知については、専用の @ operator to"hide"未定義の変数/インデックスメッセージを使用できます。

$var = @($_GET["optional_param"]);
  • 通常、これは推奨されません。新規参入者はそれを使いすぎる傾向があります。
  • アプリケーションロジックの奥深くにあるコード(宣言すべきでない変数を無視するべきではない)には非常に不適切です。 for関数パラメーター、またはループ内。
  • ただし、isset?:または??のスーパーサプレッションには逆さまのものが1つあります。通知は引き続き記録されます。そして、set_error_handler("var_dump");@- hidden通知を復活させることができます。
    • さらに、初期コードでif (isset($_POST["shubmit"]))を習慣的に使用/推奨すべきではありません。
    • 新参者はそのようなタイプミスを見つけません。これらのまさにそのケースのために、PHPs Noticesからあなたを奪います。 @またはissetのみを追加しますafter検証機能。
    • 最初に原因を修正してください。通知ではありません。

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

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

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

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

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

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

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

  • 代わりに、または追加で browser devtoolsF12 リクエストとパラメータのネットワークタブを調べます:

    browser developer tools / network tab

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

  • $_GETパラメーターについては、 QUERY_STRING

    print_r($_SERVER);
    

    PHPには、 coalesce 非グローバルパラメータ名をスーパーグローバルに入れるためのルールがあります。 Apacheはいくつかの書き直しも行うかもしれません。提供された生の$_COOKIESやその他のHTTPリクエストヘッダーをそのまま見ることもできます。

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

    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変数を生成します。
    • また、フォームが$ _GETを介してaction=script.php?get=paramと$ _POSTの残りのmethod=POSTフィールドを提供することも可能です。
    • 最新のPHP構成(≥5.6)では、 実行可能 (ファッショナブルではない) $_REQUEST['vars'] を再び使用するようになり、GETとPOSTパラメータ。
  • Mod_rewriteを使用している場合は、access.logの両方を確認し、 RewriteLog を有効にして、存在しないパラメーターを見つけてください。

$_FILES

  • 同じ健全性チェックがファイルのアップロードと$_FILES["formname"]に適用されます。
  • さらに、enctype=multipart/form-dataを確認してください
  • method=POST宣言の<form>と同様。
  • 参照: PHP Undefined index error $ _FILES?

$_COOKIE

  • $_COOKIE配列は、setcookie()の直後には設定されませんが、フォローアップHTTPリクエストでのみ設定されます。
  • さらに、有効性がタイムアウトするため、サブドメインまたは個々のパスに対する制約になる可能性があり、ユーザーとブラウザはそれらを拒否または削除することができます。
60
mario

一般的に "悪いプログラミング"、そして今または後で間違いが起こる可能性があります。

  1. それが間違いであれば、最初に変数に適切な代入をしてください。
  2. それが本当に時々定義されるだけなら、それをテストする:それを使う前にif (isset($varname))
  3. それが間違ったスペルだからであれば、それを修正してください。
  4. 多分あなたの警告を回す PHPの設定
41
Erik

まだ割り当てていない変数をテスト、評価、または印刷しているということです。それはあなたがタイプミスをしているか、変数が最初に何かに初期化されたことを確認する必要があることを意味します。論理パスを確認してください。あるパスに設定されているが別のパスには設定されていない可能性があります。

38
DGM

通知を無効にしたくありませんでしたが、あまりにもタイピングを避けたいと思いました。

私の解決策はこの機能でした:

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')?>

入力を取得するための最良の方法 文字列

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

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

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

あなたが絶対に string valueが欲しいなら、ちょうど同じように:

$value = (string)filter_input(INPUT_POST, 'value');
25
mpyw

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

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

他の重要な設定は、エラーを隠すことができるということです(すなわち、display_errorsは "off"または "syslog"に設定されます)。

この場合には、error_reportingが通知を表示するように変更された(例のように)こと、および/または設定が画面上でdisplay_errorsに変更されたこと(それらを抑制/ログするのではなく)です。

どうして変わったの?

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

ただし、でこれらの設定を上書きすることも可能です。

  • .htconf(仮想ホストおよびサブ設定を含むWebサーバ設定)*
  • .htaccess
  • pHPコード自体に

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

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

(.htconf/.htaccessはApacheとして実行していると仮定します。コマンドラインを実行している場合はこれは適用されません。IISまたは他のWebサーバーを実行している場合

まとめ

  • Php.iniのerror_reportingおよびdisplay_errors phpディレクティブが変更されていないか、または以前とは異なるphp.iniを使用していないことを確認してください。
  • .htconf(またはvhostsなど)のerror_reportingおよびdisplay_errors phpディレクティブが変更されていないことを確認してください。
  • .htaccessのerror_reportingおよびdisplay_errors phpディレクティブが変更されていないことを確認してください。
  • .htaccessにディレクティブがある場合は、それらが.htconfファイルでまだ許可されているかどうかを確認してください。
  • 最後にコードを確認してください。おそらく無関係のライブラリ。 error_reportingおよびdisplay_errors phpディレクティブがそこに設定されているかどうかを確認するため。
24
Robbie

それは、変数 '$ user_location'が定義されていないからです。内部で '$ user_location'変数を宣言しているifループを使用している場合は、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;
24
Roger

簡単な解決策は、コードの先頭で変数にnullを代入することです。

$user_location = null;
19

私はこのエラーを呪いましたが、ユーザー入力をエスケープするようにあなたに思い出させるのは役に立ちます。

例えば、あなたがこれが賢いと思ったならば、速記コード:

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

...もう一度考えてみて!より良い解決策は:

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

(私は文字をエスケープするためにカスタムhtml()関数を使います、あなたの走行距離は異なるかもしれません)

15
rybo111

私はいつも変数を自動的に宣言する便利な関数 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;
}
13
user2253362

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マニュアルPHP 7.0

13
Lachezar Lechev

なぜISこれが起こるのですか?

時間が経つにつれて、PHPはよりセキュリティ重視の言語になりました。以前はデフォルトでオフになっていた設定が、デフォルトでオンになりました。これの完璧な例はE_STRICTで、これは PHP 5.4. の時点でデフォルトで有効になりました。

さらに、PHPのドキュメントによると、デフォルトでは、E_NOTICEはphp.iniで無効になっています。 PHP docs推奨 デバッグ目的で有効にする 。ただし、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の外部には文書化されていないため、not検証済みです他のディストリビューション。

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

  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. コードを書き直してきれいにしましょう。実稼働環境への移行中にこれを行う必要がある場合、または誰かにエラーを表示させたくない場合は、エラーの表示を無効にして、loggingエラー(php.iniのdisplay_errorsおよびlog_errorsおよびサーバー設定を参照)。

オプション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;   

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

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(追加のヒント)

  • これらの問題やその他の問題に遭遇したとき、 NetBeans IDE (無料)を使用し、多くの警告と通知を受け取りました。それらのいくつかは非常に役立つヒントを提供します。これは要件ではなく、大規模なプロジェクトを除き、IDEを使用しなくなりました。私は最近vim人になりました:)。
8
smcjones

シンプルにしないのはなぜですか。

<?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
gts

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

<?php 

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

?>

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

<?php print_r($myvar); ?>

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

php> echo array_key_exists(1, $myarray);
5
Sinte

質問のこの部分に関して:

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

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

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

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

  3. Webサーバの設定を変更しました(ここではApacheを想定しています):.htaccessファイルとvhostの設定もphp設定を操作することができます。

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

3

クラスを扱う場合は、$thisを使用してメンバー変数を参照するようにする必要があります。

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
2
John Conde

未定義のインデックス通知がスローされるもう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

}

他に注意する必要があることは、* NIX OSとMac OS Xでは、大文字と小文字が区別されることです。

スタックに関する次のQ&Aを参照してください。

2

三項 を使うのは簡単で、読みやすく、そしてきれいです:

PHP 7
変数が設定されていればその変数にその変数の値を代入し、そうでなければnullあるいは必要なデフォルト value)を代入します。

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

_(PHP 7+
Null Coalescing演算子 を使用する以外は同じ。これが組み込まれているのでisset()を呼び出す必要はもうありません。また、チェックされる変数の値を返すと想定されているので、返す変数を提供する必要はありません。

$newVariable = $thePotentialData ?? null;

BothはOP質問からの通知を停止し、bothは次のものとまったく同じです。

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


新しい変数を設定する必要がなければ、echoや関数の引数などで三項の戻り値を直接使うことができます。

エコー:

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値を返すだけでよいのです。

通知がエラーログに表示されないようにしたい場合は、オプションとしてエラーログを無視してください。

1
James

私はこれについて質問をしました、そして私はメッセージでこの記事を参照されました:

この質問にはすでに答えがあります。

PHPを使用した「Notice:Undefined variable」、「Notice:Undefined index」、および「notice:Undefined offset」

私はここで私の質問と解決策を共有しています:

これはエラーです:

enter image description here

154行目が問題です。これは私が行154に持っているものです:

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

問題は私が変数$cityのための条件を書いていることだと思います。それはキーではなく$key => $cityの値です。まず、それが警告の原因であるかどうかを確認できますか?第二に、それが問題である場合、なぜ私は値に基づいて条件を書くことができないのですか?それは私が条件を書く必要があるという鍵と一緒になければなりませんか?

UPDATE 1:問題は$citiesCounterArray[$key]を実行するとき、時には$key$citiesCounterArray配列に存在しないキーに対応することがありますが、それは私のループのデータに基づくケースではないことがあります。 $keyが配列内に存在する場合はコードを実行し、それ以外の場合はスキップするように条件を設定する必要があります。

アップデート2:これは私がarray_key_exists()を使用して修正した方法です。

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

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

例:<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>

例:<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>
0
John Conde

ファイルを扱うときは、適切なenctypeとPOSTメソッドが必要です。どちらかがフォームに含まれていない場合、未定義のインデックス通知がトリガされます。

マニュアルには、次の基本的な構文が記載されています。

_ html _

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

_ php _

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

参照:

0

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

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

エラー報告をに設定するには:

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が値を持っていなくても、これはプログラムロジックを邪魔せず、Noticeを生成しません。

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

そして、すべてのエラーを修正してください。

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

0
Pupil

おそらく以前はPHPバージョンを使用していましたが、今はPHPをアップグレードしたため、何年もの間エラーなく動作していた理由です。あなたがそれを定義せずに変数を使用していてもPHP4まではエラーが発生しませんでしたが、PHP5以降では問題となっているようなコードに対してエラーをスローします。

0
phvish