„Hinweis: Undefinierte Variable“, „Hinweis: Undefinierter Index“, „Warnung: Undefinierter Array-Schlüssel“ und „Hinweis: Undefinierter Offset“ unter Verwendung von PHP

Lesezeit: 12 Minuten

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:

  • 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. Oder PHP: “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 Sein Notice: Undefined.

    – Funk Forty-Niner

    20. Januar 2017 um 15:35 Uhr


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_NOTICEeine, die nicht einmal standardmäßig gemeldet wird, sondern das Handbuch rät zuzulassen während der Entwicklung.

Möglichkeiten, mit dem Problem umzugehen:

  1. 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'] ?? '';
  1. 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)
    
  2. Deaktivieren Sie E_NOTICE von der Berichterstattung. Eine schnelle Möglichkeit, einfach auszuschließen E_NOTICE ist:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. 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:

  1. 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'] : '';
    
  2. 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 0also 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

  • @dieselpower44 Ein paar Gedanken: Der “Shut-up-Operator” (@) hat einige Leistungsprobleme. Auch da unterdrückt es alle Fehler innerhalb eines bestimmten Bereichs, kann eine unvorsichtige Verwendung Nachrichten maskieren, die Sie gerne gesehen hätten.

    – IMSoP

    24. Oktober 2013 um 20:00 Uhr

  • Das Ausblenden der Probleme ist NICHT der richtige Weg, um mit Problemen umzugehen. Die Punkte #2…#4 können nur auf Produktionsservern verwendet werden, nicht im Allgemeinen.

    – Salmann A

    13. September 2014 um 8:09 Uhr


  • Ist es möglich, die Nachricht inline (nicht im Handler) zu schließen, wenn auch ein benutzerdefinierter Fehlerhandler verwendet wird? $var = @$_GET['nonexisting']; erregt immer noch Aufsehen..

    – Slava

    11. Oktober 2014 um 14:14 Uhr


  • Warum wird empfohlen, 1. $value = isset($_POST['value']) ? $_POST['value'] : ''; anstatt 4 zu verwenden. $value = @$_POST['value'];?

    – forsvunnet

    9. Februar 2015 um 13:38 Uhr

  • Ich empfehle nicht, isset() für Arrays zu verwenden, z $str = '111';(Ich weiß, es sollte ein Array sein) isset($str[0]) wird wahr zurückgeben. Es ist besser, array_key_exist() anstelle von isset() zu verwenden

    – M Rostami

    17. November 2016 um 20:01 Uhr

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:

  • Bei Verwendung E_NOTICE von dem php.ini Konfigurationsdatei, tun error_reporting = (E_ALL & ~E_NOTICE)

    – ahmd0

    4. Oktober 2014 um 5:39 Uhr

  • Diese Antwort wird auf Meta diskutiert.

    – Skript47

    25. Juni 2018 um 10:43 Uhr

  • Aus der obigen Antwort habe ich isset, array_key_exists ausprobiert, aber diese haben nicht funktioniert. Ich habe Ihre Antwort versucht, .empty(), und es funktioniert. Danke sehr!

    Benutzer13137957

    24. April 2020 um 20:53 Uhr

Fehleranzeige @ Operator

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:

    Browser-Entwicklertools / Netzwerk-Tab

    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.

  • Wenn Sie neugierig sind, was die Auswirkungen auf die Leistung sind, fasst dieser Artikel es gut zusammen, derickrethans.nl/….

    – Gajus

    11. Februar 2014 um 12:24 Uhr

  • @GajusKuizinas Insbesondere seit 2009 gab es einige Änderungen php.net/ChangeLog-5.php#5.4.0 ändert das Ergebnis drastisch (siehe “Zend Engine, Performance” und “(Silence) Operator”).

    – mario

    11. Februar 2014 um 12:37 Uhr

  • Danke @mario, interessant. Nun, wenn jemand gut genug wäre, die beiden zu vergleichen… 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs Scheinen gemäß diesem Test identisch zu sein (beachten Sie, dass sich der Maßstab ändert).

    – Gajus

    11. Februar 2014 um 16:30 Uhr


Im Allgemeinen wegen “schlechter Programmierung” und einer Möglichkeit für Fehler jetzt oder später.

  1. Wenn es sich um einen Fehler handelt, nehmen Sie zuerst eine korrekte Zuweisung an die Variable vor: $varname=0;
  2. Wenn es wirklich nur manchmal definiert ist, testen Sie es: if (isset($varname))bevor Sie es verwenden
  3. Wenn es daran liegt, dass Sie es falsch geschrieben haben, korrigieren Sie das einfach
  4. 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');

994970cookie-check„Hinweis: Undefinierte Variable“, „Hinweis: Undefinierter Index“, „Warnung: Undefinierter Array-Schlüssel“ und „Hinweis: Undefinierter Offset“ unter Verwendung von PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy