配列-PHPを使用した「通知:未定義の変数」、「通知:未定義のインデックス」、および「通知:未定義のオフセット」
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"];
これらのエラーメッセージの意味は何ですか?
なぜ突然現れるのですか?私はこのスクリプトを何年も使用していましたが、問題はありませんでした。
どうすれば修正できますか?
これは、問題を何度も説明するのではなく、重複してリンクするための一般的な参照の質問です。この問題に関する実際の回答のほとんどは非常に具体的であるため、これが必要だと思います。
関連するメタディスカッション:
答え :
解決:
これらを試してください
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();
配置する必要があります。
答え :
解決:
一般的には「悪いプログラミング」と、現在または将来の間違いの可能性が原因です。
- 間違いの場合は、最初に変数に適切な割り当てを行います。$ varname = 0;
- 本当にたまにしか定義されていない場合は、使用する前に
if (isset($varname))
- スペルを間違えたことが原因の場合は、それを修正してください
- たぶん、PHP設定の警告をオフにすることさえできます
答え :
解決:
これは、まだ何も割り当てていない変数をテスト、評価、または印刷していることを意味します。これは、タイプミスがあるか、変数が最初に何かに初期化されたことを確認する必要があることを意味します。ロジックパスを確認してください。あるパスに設定されている場合と、別のパスに設定されていない場合があります。
答え :
解決:
通知は便利なので無効にしたくありませんでしたが、入力しすぎないようにしたかったのです。
私の解決策はこの関数でした:
function ifexists($varname)
{
return(isset($$varname) ? $varname : null);
}
したがって、$ nameを参照し、存在する場合はechoを参照する場合は、次のように記述します。
<?= 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'];
}
どうしても文字列値が必要な場合は、次のようになります。
$value = (string)filter_input(INPUT_POST, 'value');
答え :
解決:
これは、変数 '$ 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;
答え :
解決:
「なぜ突然現れるのか?私はこのスクリプトを何年も使用していましたが、問題はありませんでした。」
ほとんどのサイトでは、「すべてのエラーを表示しますが、「通知」および「非推奨」ではない」という「デフォルト」のエラー報告の下で動作するのが非常に一般的です。これはphp.iniで設定され、サーバー上のすべてのサイトに適用されます。これは、例で使用されている「通知」が抑制(非表示)され、より重大と見なされる他のエラーが表示/記録されることを意味します。
もう1つの重要な設定は、エラーを非表示にできることです(つまり、display_errors
を「off」または「syslog」に設定します)。
この場合に発生するのは、error_reporting
が(例のように)通知も表示するように変更されたか、(抑制ではなく)画面にdisplay_errors
それら/ログ)。
なぜ彼らは変わったのですか?
明白で最も簡単な答えは、誰かがphp.iniでこれらの設定のいずれかを調整したか、PHPのアップグレードバージョンが以前とは異なるphp.iniを使用しているということです。それが最初に見る場所です。
ただし、これらの設定を上書きすることもできます
- .htconf(vhostsとサブ構成を含むWebサーバー構成)*
- .htaccess
- PHPコード自体で
これらのいずれも変更されている可能性があります。
また、Webサーバー構成で.htaccessディレクティブを有効/無効にできるという複雑な問題もあります。そのため、.htaccessにディレクティブがあり、突然動作を開始/停止する場合は、それを確認する必要があります。
(.htconf / .htaccessは、Apacheとして実行していることを前提としています。コマンドラインを実行している場合、これは適用されません。IISまたは他のWebサーバーを実行している場合は、それに応じてこれらの構成を確認する必要があります)
概要
error_reporting
およびdisplay_errors
phpディレクティブが変更されていないこと、または以前とは異なるphp.iniを使用していないことを確認してください。error_reporting
およびdisplay_errors
phpディレクティブが変更されていないことを確認しますerror_reporting
およびdisplay_errors
phpディレクティブが変更されていないことを確認します- .htaccessにディレクティブがある場合は、それらが.htconfファイルでまだ許可されているかどうかを確認してください
- 最後にコードを確認してください。おそらく無関係のライブラリ。
error_reporting
およびdisplay_errors
phpディレクティブがそこに設定されているかどうかを確認します。
答え :
解決:
以前はこのエラーを呪っていましたが、ユーザー入力をエスケープするように通知すると役立つ場合があります。
たとえば、これが賢いと思った場合は、次の略記コードを使用します。
// Echo whatever the hell this is
<?=$_POST['something']?>
...もう一度考えてみて!より良い解決策は次のとおりです。
// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(私はカスタムhtml()
関数を使用して文字をエスケープします。マイレージは異なる場合があります)
答え :
解決:
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"] : '');
答え :
解決:
変数を自動的に宣言する独自の便利な関数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;
}
答え :
解決:
非常に単純な言語で:
間違いは$user_location
を使用していて、値がないことです。したがって、使用する前にこの変数を宣言することをお勧めします。例えば:
$user_location = '';
または
$user_location = 'Los Angles';
これは、直面する可能性のある非常に一般的なエラーです。だから心配しないでください。変数を宣言してコーディングを楽しんでください。
答え :
解決:
物事をシンプルに保つ:
<?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 the array index. Nice
?>
答え :
解決:
未定義のインデックスとは、使用できない配列インデックスを要求した配列を意味します。例えば、
<?php
$newArray[] = {1, 2, 3, 4, 5};
print_r($newArray[5]);
?>
未定義の変数は、既存の変数を完全に使用していないか、その名前で定義または初期化されていないことを意味します。例えば、
<?php print_r($myvar); ?>
未定義のオフセットとは、配列内に存在しないキーを要求したことを意味します。そして、これに対する解決策は、使用前に確認することです。
php> echo array_key_exists(1, $myarray);
答え :
解決:
質問のこの部分について:
なぜ突然現れるのですか?私はこのスクリプトを何年も使用していましたが、問題はありませんでした。
明確な答えはありませんが、設定が「突然」変更される理由について考えられる説明を次に示します。
PHPを新しいバージョンにアップグレードしました。このバージョンでは、error_reporting、display_errors、またはその他の関連する設定に他のデフォルトを設定できます。
ini_set()
またはerror_reporting()
を使用して実行時に関連する設定を設定するコード(おそらく依存関係にある)を削除または導入しました(コードでこれらを検索してください)Webサーバー構成を変更しました(ここではapacheを想定しています):
.htaccess
ファイルとvhost構成もphp設定を操作できます。通常、通知は表示/報告されないため( PHPマニュアルを参照)、サーバーのセットアップ時に、何らかの理由(ファイルのアクセス許可??)でphp.iniファイルを読み込めず、デフォルト設定になっている可能性があります。 。その後、「バグ」は(偶然に)解決され、通知を表示するように設定されたerror_reportingを使用して正しいphp.iniファイルをロードできるようになりました。
答え :
解決:
三項演算子の使用は、シンプルで読みやすく、クリーンです。
PHP7より前
変数が設定されている場合は別の変数の値に変数を割り当て、そうでない場合はnull
(または必要なデフォルト値)を割り当てます。
$newVariable = isset($thePotentialData) ? $thePotentialData : null;
PHP 7+
null合体演算子を使用することを除いて同じです。isset()
を呼び出す必要がなくなり、チェック対象の変数の値を返すと想定されるため、返す変数を指定する必要がなくなります。
$newVariable = $thePotentialData ?? null;
どちらも、OPの質問から通知を停止し、両方のは、正確な等価です。
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値を返すだけです。
通知がエラーログにないことだけを気にする場合は、オプションとして、エラーログを無視することができます。
答え :
解決:
$this
を使用してメンバー変数を参照する必要があります。
class Person { protected $firstName; protected $lastName; public function setFullName($first, $last) { // Correct $this->firstName = $first; // Incorrect $lastName = $last; // Incorrect $this->$lastName = $last; } }
答え :
解決:
未定義のインデックス通知がスローされるもう1つの理由は、データベースクエリから列が省略されたことです。
NS:
$query = "SELECT col1 FROM table WHERE col_x = ?";
次に、ループ内のより多くの列/行にアクセスしようとします。
NS:
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を参照してください。
答え :
解決:
HTMLフォームが送信された後に変数が存在しない一般的な原因の1つ<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>
答え :
解決:
これらのエラーは、設定されていない変数を使用しているときに発生します。
これらに対処する最善の方法は、開発中のエラーレポートを設定することです。
エラーレポートを設定するには:
ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);
本番サーバーでは、エラーレポートがオフになっているため、これらのエラーは発生しません。
ただし、開発サーバーでは、エラーレポートをに設定できます。
このエラーを取り除くために、次の例を参照してください。
if ($my == 9) {
$test = 'yes'; // Will produce an error as $my is not 9.
}
echo $test;
値を割り当てたり使用したりする前にNULL
に初期化できます。
したがって、コードを次のように変更できます。
$test = NULL; if ($my == 9) {
$test = 'yes'; // Will produce an error as $my is not 9.
}
echo $test;
これにより、プログラムロジックが妨げられることはなく、$test
値がない場合でも通知は生成されません。
したがって、基本的には、開発のためにエラーレポートをオンに設定することをお勧めします。
そして、すべてのエラーを修正します。
また、本番環境では、エラー報告をオフに設定する必要があります。
答え :
解決:
私はこれについて質問しました、そして私はメッセージでこの投稿を参照されました:
この質問にはすでに答えがあります:
PHPを使用した「通知:未定義の変数」、「通知:未定義のインデックス」、および「通知:未定義のオフセット」
私はここで私の質問と解決策を共有しています:
これはエラーです:
154行目が問題です。これは私が154行目に持っているものです:
153 foreach($cities as $key => $city){
154 if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
$city
条件を記述していることだと思います。これはキーではなく、$key => $city
です。まず、それが警告の原因であるかどうかを確認できますか?第二に、それが問題である場合、なぜ値に基づいて条件を記述できないのですか?条件を書き込むために必要なキーを使用する必要がありますか?
更新1:問題は、$citiesCounterArray[$key]
実行するときに、$key
$citiesCounterArray
配列に存在しないキーに対応する場合があることですが、常にケースベースであるとは限りません。私のループのデータについて。$key
が配列に存在する場合はコードを実行し、そうでない場合はスキップするように条件を設定することです。
array_key_exists()
を使用してそれを修正した方法です:
foreach($cities as $key => $city){ if(array_key_exists($key, $citiesCounterArray)){ if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
答え :
解決:
おそらく、以前は古いバージョンのPHPを使用していて、現在はアップグレードされたPHPを使用していたため、何年もの間、エラーなしで機能していました。
PHP 4までは、変数を定義せずに使用してもエラーは発生しませんでしたが、PHP 5以降では、問題のコードのエラーがスローされます。
答え :
解決:
APIにデータを送信する場合は、 isset()を使用するだけです。
if(isset($_POST['param'])){
$param = $_POST['param'];
} else {
# Do something else
}
セッションが原因でエラーが発生した場合は、セッションが正しく開始されていることを確認してください。
答え :
解決:
これらの通知は、使用されている変数<code> {-code -1}がないためです。および<code> {-code -2}キーが<code> {-code -3}に存在しませんでした変数。
<code> codeであるため、これらの通知は毎回トリガーされました。は正しくありませんが、通知の報告がなかった可能性があります。
バグを解決します:
<code> $ my_variable_name = "変数名"; //変数を定義する\necho "私の変数値は:"です。 $ my_variable_name;\n\nif(isset({-code -3} ["{-code -2}"])){\n echo "私のインデックス値は:"です。 {-code -3} ["{-code -2}"]; // {-code -2}が設定されているかどうかを確認します \n}\n
これを取り除く別の方法:
<code> ini_set("error_reporting", false)\n
答え :
解決:
ファイルを処理するときは、適切な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>";
?>
リファレンス:
答え :
解決:
PHPでは、最初に変数を定義する必要があります。その後、それを使用することができます。
変数が定義されているかどうかを非常に効率的な方法で確認できます。
// If you only want to check variable has value and value has true and false value.
// But variable must be defined first.
if($my_variable_name){
}
// If you want to check if the variable is defined or undefined
// Isset() does not check that variable has a true or false value
// But it checks the null value of a variable
if(isset($my_variable_name)){
}
簡単な説明
// It will work with: true, false, and NULL
$defineVariable = false;
if($defineVariable){
echo "true";
}else{
echo "false";
}
// It will check if the variable is defined or not and if the variable has a null value.
if(isset($unDefineVariable)){
echo "true";
}else{
echo "false";
}
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。