1363 Stimmen

"Notice: Undefinierte Variable", "Notice: Undefinierter Index", "Warnung: Undefinierter Array-Schlüssel" und "Notice: Undefinierter Offset"

Ich führe ein PHP-Skript aus und erhalte weiterhin Fehlermeldungen wie:

Hinweis: Undefinierte Variable: my_variable_name in C:\wamp\www\mypath\index.php in Zeile 10

Hinweis: Undefinierter Index: my_index in 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 sehen so aus:

echo "Der Wert meiner Variablen ist: " . $my_variable_name;
echo "Der Wert meines Index ist: " . $my_array["my_index"];

Was bedeuten diese Fehlermeldungen?

Warum tauchen sie plötzlich auf? Ich benutze dieses Skript seit Jahren und hatte nie Probleme damit.

Wie kann ich sie beheben?


<strong>Dies ist eine allgemeine Referenzfrage</strong> für Leute, die auf Duplikate verlinken möchten, anstatt das Problem immer wieder erklären zu müssen. Ich halte dies für notwendig, da die meisten Antworten zu diesem Thema sehr spezifisch sind.

Verwandte Meta-Diskussion:

1217voto

Alin Purcaru Punkte 41895

Hinweis / Warnung: Undefinierte Variable

Aus der umfangreichen Weisheit des PHP-Handbuchs:

Sich auf den Standardwert einer nicht initialisierten Variablen zu verlassen, ist problematisch, wenn eine Datei in eine andere inkludiert wird, die denselben Variablennamen verwendet. Es ist auch ein wesentliches Sicherheitsrisiko bei aktiviertem register_globals. Ein E_NOTICE-Fehler wird im Falle von nicht initialisierten Variablen ausgegeben, jedoch nicht im Falle des Anfügens von Elementen an das nicht initialisierte Array. Die Sprachkonstruktion isset() kann verwendet werden, um festzustellen, ob eine Variable bereits initialisiert wurde. Zusätzlich und idealer ist die Lösung von empty(), da sie keine Warn- oder Fehlermeldungen generiert, wenn die Variable nicht initialisiert ist.

Aus PHP-Dokumentation:

Es wird keine Warnung generiert, wenn die Variable nicht existiert. Das bedeutet, dass empty() im Wesentlichen das knappe Äquivalent zu !isset($var) || $var == false ist.

Dies bedeutet, dass Sie nur empty() verwenden könnten, um festzustellen, ob die Variable gesetzt ist, und zusätzlich prüft sie die Variable gegen die folgenden Werte: 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 den obigen Codeausschnitt im 3v4l.org Online-PHP-Editor

Obwohl PHP keine Variablendeklaration erfordert, empfiehlt es diese, um bestimmte Sicherheitslücken oder Fehler zu vermeiden, bei denen vergessen wird, einer Variablen, die später im Skript verwendet wird, einen Wert zuzuweisen. Was PHP im Fall von nicht deklarierten Variablen macht, ist das Ausgeben eines sehr niederstufigen Fehlers, E_NOTICE, der standardmäßig nicht einmal gemeldet wird, jedoch rät das Handbuch dazu, dies während der Entwicklung zuzulassen.

Möglichkeiten, mit dem Problem umzugehen:

  1. Empfohlen: Deklarieren Sie Ihre Variablen, zum Beispiel wenn Sie versuchen, einen String an eine nicht definierte Variable anzuhängen. Oder verwenden Sie isset() / !empty() um zu überprüfen, ob sie deklariert sind, bevor Sie auf sie verweisen, wie hier:

    //Initialisierung der Variablen
    $value = ""; //Initialisierungswert; Beispiele
                 //"" Wenn Sie später noch Dinge anhängen möchten
                 //0  Wenn Sie später Zahlen hinzufügen möchten
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';

Dies ist seit PHP 7.0 viel sauberer geworden, jetzt können Sie den null-coalesce-Operator verwenden:

    // Null-coalesce-Operator - Keine explizite Initialisierung der Variablen erforderlich.
    $value = $_POST['value'] ?? '';
  1. Richten Sie einen benutzerdefinierten Fehlerhandler für E_NOTICE ein und leiten Sie die Meldungen weg von der Standardausgabe (vielleicht in eine Protokolldatei):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  2. Deaktivieren Sie die Berichterstattung über E_NOTICE. Eine schnelle Möglichkeit, nur E_NOTICE auszuschließen, lautet:

    error_reporting( error_reporting() & ~E_NOTICE )
  3. Unterdrücken Sie den Fehler mit dem @-Operator.

Hinweis: Es wird dringend empfohlen, nur Punkt 1 zu implementieren.

Hinweis: Undefinierter Index / Undefinierter Offset / Warnung: Undefinierter Array-Key

Dieser Hinweis/diese Warnung erscheint, wenn Sie (oder PHP) versuchen, auf einen undefinierten Index eines Arrays zuzugreifen.

Möglichkeiten, mit dem Problem umzugehen:

  1. Überprüfen Sie, ob der Index existiert, bevor Sie darauf zugreifen. Hierfür können Sie isset() oder array_key_exists() verwenden:

    //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 generieren, wenn es versucht, auf einen Array-Index zuzugreifen, der nicht existiert:

    list($a, $b) = array(0 => 'a');
    //oder
    list($one, $two) = explode(',', 'Test-String');

Zwei Variablen werden verwendet, um auf zwei Array-Elemente zuzugreifen, jedoch gibt es nur ein Array-Element, Index 0, daher wird Folgendes generiert:

Hinweis: Undefinierter Offset: 1

$_POST / $_GET / $_SESSION-Variable

Die obigen Hinweise erscheinen häufig beim Arbeiten mit $_POST, $_GET oder $_SESSION. Für $_POST und $_GET müssen Sie einfach überprüfen, ob der Index existiert, bevor Sie ihn verwenden. Für $_SESSION müssen Sie sicherstellen, dass die Sitzung mit session_start() gestartet wurde und dass der Index ebenfalls existiert.

Beachten Sie auch, dass alle 3 Variablen superglobal sind und großgeschrieben werden.

Verwandte:

172voto

Ish Punkte 26338

Versuchen Sie diese

Frage 1: Diese Meldung besagt, dass $varname im aktuellen Bereich des Skripts nicht definiert ist.

Frage 2: Die Verwendung von isset(), empty() Bedingungen vor der Verwendung einer verdächtigen Variablen funktioniert gut.

// empfohlene Lösung für aktuelle PHP-Versionen
$user_name = $_SESSION['user_name'] ?? '';

// Vor PHP 7
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

Oder, als schnelle und schmutzige Lösung:

// nicht die beste Lösung, funktioniert aber
// in Ihren PHP-Einstellungen hilft es, globale Hinweise zu verbergen
error_reporting(E_ALL ^ E_NOTICE);

Hinweis zu Sitzungen:

81voto

mario Punkte 141130

Fehleranzeige @ Operator

Für unerwünschte und überflüssige Hinweise könnte man den dedizierten @ Operator verwenden, um undefinierte Variablen-/Index-Meldungen zu »verbergen«.

$var = @($_GET["optional_param"]);
  • Dies wird normalerweise nicht empfohlen. Neulinge neigen dazu, ihn übermäßig zu verwenden.

  • Es ist für den Code tief innerhalb der Anwendungslogik sehr unangemessen (undefinierte Variablen zu ignorieren, wo man es nicht sollte), z.B. für Funktionsparameter oder in Schleifen.

  • Es gibt jedoch einen Vorteil gegenüber der isset?: oder ?? Superunterdrückung. Hinweismeldungen werden immer noch protokolliert. Und man kann mit set_error_handler("var_dump"); »versteckte« @-Hinweise wiederherstellen.

  • Zusätzlich sollten Sie in Ihrem ursprünglichen Code nicht habituell if (isset($_POST["shubmit"])) verwenden.

  • Neulinge werden solche Tippfehler nicht bemerken. Es beraubt Sie nur der PHP-Hinweise für genau diese Fälle. Fügen Sie @ oder isset nur nach Überprüfung der Funktionalität hinzu.

  • 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 den Großteil solcher Fragen abdeckt, wollen wir die häufigsten Ursachen näher erläutern:

$_GET / $_POST / $_REQUEST undefinierte Eingabe

  • Das Erste, was Sie tun, wenn Sie auf einen undefinierten Index/Offset stoßen, ist auf Tippfehler zu überprüfen:
    $count = $_GET["whatnow?"];

    • Ist dies ein erwarteter Schlüsselname und auf jeder Seitenanfrage vorhanden?
    • Variablennamen und Array-Indizes sind in PHP Groß-/Kleinbuchstaben-sensitiv.
  • Zweitens, wenn der Hinweis keine offensichtliche Ursache hat, verwenden Sie var_dump oder print_r, um alle Eingabe-Arrays auf ihren aktuellen Inhalt zu überprüfen:

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

    Beides wird zeigen, ob Ihr Skript mit den richtigen oder überhaupt mit Parametern aufgerufen wurde.

  • Alternativ oder zusätzlich nutzen Sie Ihre Browser Entwicklertools (F12) und inspizieren Sie den Netzwerk-Tab nach Anfragen und Parametern:

    Browser-Entwicklertools / Netzwerk-Tab

    POST-Parameter und GET-Eingaben werden getrennt angezeigt.

  • Für $_GET Parameter können Sie auch einen Blick auf die QUERY_STRING werfen

    print_r($_SERVER);

    PHP hat bestimmte Regeln, um nicht standardmäßige Parameter-Namen in die Superglobals zu integrieren. Auch Apache könnte einige Umformungen vornehmen. Sie können auch die übermittelten rohen $_COOKIES und andere HTTP-Anforderungsheader auf diese Weise betrachten.

  • Schauen Sie offensichtlicher in die Adressleiste Ihres Browsers nach GET-Parametern:

    <code>http://example.org/script.php?id=5&amp;sort=desc</code>

    Die name=value Paare nach dem ? Fragezeichen sind Ihre Abfrage(GET)-Parameter. Somit könnte diese URL nur $_GET["id"] und $_GET["sort"] zurückgeben.

  • Überprüfen Sie abschließend Ihre

    und Deklarationen, wenn Sie einen Parameter erwarten, aber keinen erhalten.

    • Stellen Sie sicher, dass jedes erforderliche Eingabefeld ein hat.
    • Das id= oder title= Attribut reicht nicht aus.
    • Ein method=POST Formular sollte $_POST füllen.
    • Während ein method=GET (oder das Weglassen) zu $_GET Variablen führen würde.
    • Es ist auch möglich, dass ein Formular action=script.php?get=param via $_GET übermittelt und die übrigen method=POST Felder in $_POST nebenbei enthält.
    • Bei modernen PHP-Konfigurationen (5.6) ist es möglich (nicht lesenswert), $_REQUEST['vars'] wieder zu verwenden, was GET- und POST-Parameter zusammenführt.
  • Wenn Sie mod_rewrite verwenden, sollten Sie sowohl das access.log überprüfen als auch das RewriteLog aktivieren, um fehlende Parameter zu identifizieren.

$_FILES

  • Die gleichen Überprüfungen gelten auch für Dateiuploads und $_FILES["formname"].
  • Überprüfen Sie außerdem auf enctype=multipart/form-data
  • Sowie auf method=POST in Ihrer Deklaration.
  • Siehe auch: PHP Undefined index error $_FILES?

$_COOKIE

  • Das $_COOKIE Array wird nicht direkt nach setcookie() befüllt, sondern nur bei jeder nachfolgenden HTTP-Anfrage.
  • Zusätzlich laufen sie ab, können auf Subdomains oder individuelle Pfade beschränkt sein, und Benutzer und Browser können sie einfach ablehnen oder löschen.

55voto

Erik Punkte 3980

Im Allgemeinen aufgrund von "schlechter Programmierung" und der Möglichkeit von Fehlern jetzt oder später.

  1. Wenn es ein Fehler ist, weise der Variable zunächst einen korrekten Wert zu: $varname=0;
  2. Wenn sie wirklich nur manchmal definiert ist, überprüfen Sie dies: if (isset($varname)), bevor Sie sie verwenden
  3. Wenn es daran liegt, dass Sie es falsch geschrieben haben, korrigieren Sie das einfach
  4. Vielleicht sogar die Warnungen in Ihren PHP-Einstellungen ausschalten

48voto

DGM Punkte 26106

Dies bedeutet, dass Sie eine Variable testen, bewerten oder drucken, der Sie noch nichts zugewiesen haben. Das bedeutet, dass Sie entweder einen Tippfehler haben oder überprüfen müssen, ob die Variable zuerst initialisiert wurde. Überprüfen Sie Ihre Logikpfade, es kann in einem Pfad festgelegt sein, aber nicht in einem anderen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X