Ich führe ein PHP-Skript aus und erhalte weiterhin Fehler wie:
Hinweis: Undefinierte Variable: my_variable_name in C:\wamp\www\mypath\index.php in Zeile 10
Hinweis: Undefinierter Index: my_index C:\wamp\www\mypath\index.php in Zeile 11
Warnung: Undefinierter Array-Schlüssel “my_index” in C:\wamp\www\mypath\index.php in Zeile 11
Zeile 10 und 11 sieht so aus:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
Was bedeuten diese Fehlermeldungen?
Warum tauchen sie plötzlich auf? Ich habe dieses Skript jahrelang verwendet und hatte nie Probleme.
Wie repariere ich sie?
Dies ist eine allgemeine Referenzfrage die Leute als Duplikat verlinken können, anstatt das Problem immer wieder erklären zu müssen. Ich halte dies für notwendig, da die meisten Antworten aus der Praxis zu diesem Thema sehr spezifisch sind.
Verwandte Meta-Diskussion:
Hinweis / Warnung: Undefinierte Variable
Aus der großen Weisheit der PHP-Handbuch:
Sich auf den Standardwert einer nicht initialisierten Variablen zu verlassen, ist problematisch, wenn eine Datei in eine andere eingefügt wird, die denselben Variablennamen verwendet. Es ist auch ein Hauptfach Sicherheitsrisiko mit register_globals eingeschaltet. E_HINWEIS Beim Arbeiten mit nicht initialisierten Variablen wird ein Ebenenfehler ausgegeben, nicht jedoch beim Anhängen von Elementen an das nicht initialisierte Array. isset() Sprachkonstrukt kann verwendet werden, um zu erkennen, ob eine Variable bereits initialisiert wurde. Zusätzlich und idealer ist die Lösung von leer() da es keine Warnung oder Fehlermeldung generiert, wenn die Variable nicht initialisiert ist.
Von PHP-Dokumentation:
Wenn die Variable nicht existiert, wird keine Warnung generiert. Das bedeutet
leer() ist im Wesentlichen das prägnante Äquivalent zu !isset($var) || $var == falsch.
Dies bedeutet, dass Sie nur verwenden könnten empty()
um festzustellen, ob die Variable gesetzt ist, und prüft die Variable zusätzlich auf Folgendes: 0
, 0.0
, ""
, "0"
, null
, false
oder []
.
Beispiel:
$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";
});
Testen Sie das obige Snippet in der 3v4l.org Online-PHP-Editor
Obwohl PHP keine Variablendeklaration erfordert, empfiehlt es dies, um einige Sicherheitslücken oder Fehler zu vermeiden, bei denen man vergessen würde, einer Variablen einen Wert zuzuweisen, der später im Skript verwendet wird. Was PHP im Fall von nicht deklarierten Variablen macht, ist einen sehr niedrigen Fehler auszugeben, E_NOTICE
eine, die nicht einmal standardmäßig gemeldet wird, sondern das Handbuch rät zuzulassen während der Entwicklung.
Möglichkeiten, mit dem Problem umzugehen:
-
Empfohlen: Deklarieren Sie Ihre Variablen, wenn Sie beispielsweise versuchen, eine Zeichenfolge an eine nicht definierte Variable anzuhängen. Oder verwenden isset()
/ !empty()
um zu prüfen, ob sie deklariert sind, bevor auf sie verwiesen wird, wie in:
//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'] : '';
Dies ist ab PHP 7.0 viel sauberer geworden, jetzt können Sie die verwenden Null-Koaleszenz-Operator:
// Null coalesce operator - No need to explicitly initialize the variable.
$value = $_POST['value'] ?? '';
-
Stellen Sie ein benutzerdefinierte Fehlerbehandlung für E_NOTICE und leiten Sie die Meldungen von der Standardausgabe weg (vielleicht in eine Protokolldatei):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
-
Deaktivieren Sie E_NOTICE von der Berichterstattung. Eine schnelle Möglichkeit, einfach auszuschließen E_NOTICE
ist:
error_reporting( error_reporting() & ~E_NOTICE )
-
Unterdrücken Sie den Fehler mit der @ Operator.
Notiz: Es wird dringend empfohlen, nur Punkt 1 zu implementieren.
Hinweis: Undefinierter Index / Undefinierter Offset / Warnung: Undefinierter Array-Schlüssel
Dieser Hinweis/Warnung erscheint, wenn Sie (oder PHP) versuchen, auf einen undefinierten Index eines Arrays zuzugreifen.
Möglichkeiten, mit dem Problem umzugehen:
-
Prüfen Sie, ob der Index existiert, bevor Sie darauf zugreifen. Dafür können Sie verwenden isset()
oder 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'] : '';
-
Das Sprachkonstrukt list()
kann dies erzeugen, wenn versucht wird, auf einen nicht vorhandenen Array-Index zuzugreifen:
list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');
Zwei Variablen werden verwendet, um auf zwei Array-Elemente zuzugreifen, es gibt jedoch nur ein Array-Element, index 0
also wird Folgendes generiert:
Hinweis: Undefinierter Offset: 1
#$_POST
/ $_GET
/ $_SESSION
Variable
Die obigen Hinweise erscheinen häufig beim Arbeiten mit $_POST
, $_GET
oder $_SESSION
. Zum $_POST
und $_GET
Sie müssen nur prüfen, ob der Index existiert oder nicht, bevor Sie sie verwenden. Zum $_SESSION
Sie müssen sicherstellen, dass Sie die Sitzung mit gestartet haben session_start()
und dass der Index auch existiert.
Beachten Sie auch, dass alle 3 Variablen sind Superglobale und sind in Großbuchstaben.
Verwandt:
- Hinweis: Undefinierte Variable
- Hinweis: Undefinierter Index
Probiere diese
F1: Dieser Hinweis bedeutet, dass $varname im aktuellen Bereich des Skripts nicht definiert ist.
F2: Die Verwendung von isset(), empty() Bedingungen vor der Verwendung einer verdächtigen Variablen funktioniert gut.
// 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'];
}
Oder als schnelle und schmutzige Lösung:
// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);
Hinweis zu Sitzungen:
Für unerwünschte und überflüssige Benachrichtigungen könnte man die dedizierte verwenden @
Operator zu “verstecken« undefinierte Variablen-/Indexmeldungen.
$var = @($_GET["optional_param"]);
- Davon wird normalerweise abgeraten. Neuankömmlinge neigen dazu, es zu übernutzen.
- Es ist sehr ungeeignet für Code tief in der Anwendungslogik (wobei nicht deklarierte Variablen ignoriert werden sollten), zB für Funktionsparameter oder in Schleifen.
- Es gibt einen Vorteil über dem
isset?:
oder ??
Superunterdrückung jedoch. Benachrichtigungen können weiterhin protokolliert werden. Und man kann auferstehen @
-versteckte Hinweise mit: set_error_handler("var_dump");
- Darüber hinaus sollten Sie nicht gewohnheitsmäßig verwenden / empfehlen
if (isset($_POST["shubmit"]))
in Ihrem Anfangscode.
- Neulinge werden solche Tippfehler nicht bemerken. Es entzieht Ihnen nur PHPs Notices für genau diese Fälle. Addieren
@
oder isset
nur nach dem Überprüfung der Funktionalität.
-
Beheben Sie zuerst die Ursache. Nicht die Hinweise.
@
ist hauptsächlich akzeptabel für $_GET
/$_POST
Eingabeparameter, insbesondere wenn sie optional sind.
Und da dies die Mehrheit solcher Fragen abdeckt, gehen wir auf die häufigsten Ursachen ein:
$_GET
/ $_POST
/ $_REQUEST
undefinierte Eingabe
-
Das erste, was Sie tun, wenn Sie auf einen undefinierten Index/Offset stoßen, ist auf Tippfehler zu prüfen:
$count = $_GET["whatnow?"];
- Ist dies ein erwarteter Schlüsselname und vorhanden auf jede einzelne Seitenaufruf?
- Variablennamen und Bei Array-Indizes wird in PHP zwischen Groß- und Kleinschreibung unterschieden.
-
Zweitens, wenn die Benachrichtigung keinen offensichtlichen Grund hat, verwenden Sie var_dump
oder print_r
verifizieren alle Eingabearrays für ihren aktuellen Inhalt:
var_dump($_GET);
var_dump($_POST);
//print_r($_REQUEST);
Beide zeigen an, ob Ihr Skript mit den richtigen oder überhaupt irgendwelchen Parametern aufgerufen wurde.
-
Alternativ oder zusätzlich nutzen Sie Ihre Browser-Entwicklungstools (F12) und überprüfen Sie die Netzwerkregisterkarte auf Anforderungen und Parameter:

POST-Parameter und GET-Eingaben werden separat angezeigt.
-
Zum $_GET
Parameter, die Sie auch einsehen können QUERY_STRING
in
print_r($_SERVER);
PHP hat einige Regeln dazu verschmelzen nicht standardmäßige Parameternamen in die Superglobals. Apache könnte auch etwas umschreiben. Sie können sich auch die Lieferung roh ansehen $_COOKIES
und andere HTTP-Anforderungsheader auf diese Weise.
-
Schauen Sie offensichtlicher in die Adressleiste Ihres Browsers GET-Parameter:
http://example.org/script.php?id=5&sort=desc
Die name=value
Paare nach dem ?
Fragezeichen sind Ihre Abfrageparameter (GET). Somit könnte diese URL nur eventuell nachgeben $_GET["id"]
und $_GET["sort"]
.
-
Überprüfen Sie abschließend Ihre <form>
und <input>
Deklarationen, wenn Sie einen Parameter erwarten, aber keinen erhalten.
- Stellen Sie sicher, dass jede erforderliche Eingabe eine hat
<input name=FOO>
- Die
id=
oder title=
Attribut reicht nicht aus.
- EIN
method=POST
Formular sollte ausgefüllt werden $_POST
.
- Während a
method=GET
(oder weglassen) würde nachgeben $_GET
Variablen.
- Es ist auch möglich, ein Formular zu liefern
action=script.php?get=param
über $_GET und den Rest method=POST
Felder in $_POST daneben.
- Mit modernen PHP-Konfigurationen (≥ 5.6) ist es machbar (nicht modisch) geworden, es zu verwenden
$_REQUEST['vars']
wieder, die GET- und POST-Parameter zerdrückt.
-
Wenn Sie mod_rewrite verwenden, sollten Sie beide überprüfen access.log
sowie aktivieren die RewriteLog
um fehlende Parameter herauszufinden.
$_FILES
- Die gleichen Plausibilitätsprüfungen gelten für Datei-Uploads und
$_FILES["formname"]
.
- Außerdem prüfen
enctype=multipart/form-data
- Ebenso gut wie
method=POST
in deiner <form>
Erklärung.
- Siehe auch: PHP Undefinierter Indexfehler $_FILES?
$_COOKIE
- Die
$_COOKIE
Array wird nie direkt danach aufgefüllt setcookie()
aber nur bei jeder nachfolgenden HTTP-Anforderung.
- Außerdem läuft ihre Gültigkeit ab, sie können auf Subdomains oder einzelne Pfade beschränkt sein, und Benutzer und Browser können sie einfach ablehnen oder löschen.
Im Allgemeinen wegen “schlechter Programmierung” und einer Möglichkeit für Fehler jetzt oder später.
- Wenn es sich um einen Fehler handelt, nehmen Sie zuerst eine korrekte Zuweisung an die Variable vor: $varname=0;
- Wenn es wirklich nur manchmal definiert ist, testen Sie es:
if (isset($varname))
bevor Sie es verwenden
- Wenn es daran liegt, dass Sie es falsch geschrieben haben, korrigieren Sie das einfach
- Vielleicht schalten Sie sogar die Warnungen in Ihnen aus PHP-Einstellungen
Das bedeutet, dass Sie eine Variable testen, auswerten oder drucken, der Sie noch nichts zugewiesen haben. Es bedeutet, dass Sie entweder einen Tippfehler haben oder zuerst überprüfen müssen, ob die Variable mit etwas initialisiert wurde. Überprüfen Sie Ihre Logikpfade, sie sind möglicherweise in einem Pfad festgelegt, in einem anderen jedoch nicht.
Ich wollte die Benachrichtigung nicht deaktivieren, weil sie hilfreich ist, aber ich wollte vermeiden, zu viel zu tippen.
Meine Lösung war diese Funktion:
function ifexists($varname)
{
return(isset($$varname) ? $varname : null);
}
Wenn ich also auf $name verweisen und falls vorhanden echoen möchte, schreibe ich einfach:
<?= ifexists('name') ?>
Für Array-Elemente:
function ifexistsidx($var,$index)
{
return(isset($var[$index]) ? $var[$index] : null);
}
Auf einer Seite, wenn ich auf $_REQUEST verweisen möchte[‘name’]:
<?= ifexistsidx($_REQUEST, 'name') ?>
Der beste Weg, um den Input zu erhalten Schnur ist:
$value = filter_input(INPUT_POST, 'value');
Dieser Einzeiler ist fast äquivalent zu:
if (!isset($_POST['value'])) {
$value = null;
} elseif (is_array($_POST['value'])) {
$value = false;
} else {
$value = $_POST['value'];
}
Wenn Sie unbedingt eine Schnur Wert, genau wie:
$value = (string)filter_input(INPUT_POST, 'value');
mögliches Duplikat von Reference – Was bedeutet dieser Fehler in PHP?
– mager
♦
8. Oktober 2013 um 15:25 Uhr
Die Variable wurde möglicherweise nicht initialisiert. Initialisieren Sie die Variable von einem Post oder Get oder einem Array? Wenn das der Fall ist, haben Sie möglicherweise kein Feld in diesem Array. Dass Ihr Zugriff.
– Anish Silwal
15. Dezember 2015 um 13:12 Uhr
@Pekka웃 – Ich habe bemerkt, dass die Bearbeitung “und “Notice: Undefined offset”” hinzugefügt hat – Wäre es nicht sinnvoller, “PHP: “Undefined variable”, “Undefined index”, “Undefined offset” Notices” zu verwenden (sogar take das PHP aus, da es als “php” getaggt ist. Außerdem wird die URL bei abgeschnitten
and-notice-undef
, nur ein Vorschlag, damit die URL nicht abgeschnitten wird. Vielleicht sogar die (zu vielen) Anführungszeichen entfernen. OderPHP: “Undefined variable/index/offset” notices
– Funk Forty-Niner
20. Januar 2017 um 15:24 Uhr
@Fred Ich denke, für beide Varianten kann ein Argument angeführt werden. Es besteht die Möglichkeit, dass Neulinge die gesamte Zeile einschließlich des “Hinweises:” in ihre Suchanfrage eingeben, was meiner Meinung nach der Hauptverkehrsgenerator für diese Frage ist. Wenn die Nachrichten vollständig vorhanden sind, verbessert das wahrscheinlich die Sichtbarkeit in Suchmaschinen
– Pekka
20. Januar 2017 um 15:34 Uhr
@Pekka웃 Ich verstehe. Ich habe das nur gesagt, weil die URL vorher nicht abgeschnitten wurde und jetzt bei
and-notice-undef
. Es waren nur (ein paar) Vorschläge. Es wiederholt sich einfach auch SeinNotice: Undefined
.– Funk Forty-Niner
20. Januar 2017 um 15:35 Uhr