it-swarm.com.de

"Notice: Undefined variable", "Notice: Undefined index" und "Notice: Undefined offset" mit PHP

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

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

Hinweis: Undefinierter Index: mein_index C:\wamp\www\mein_index\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 benutzt und hatte nie ein Problem.

Wie behebe ich sie?


Dies ist eine allgemeine Referenzfrage , mit der Personen einen Link als Duplikat erstellen können, anstatt das Problem immer wieder erklären zu müssen. Ich halte dies für notwendig, da die meisten realen Antworten zu diesem Thema sehr spezifisch sind.

Verwandte Metadiskussion:

1101
Pekka 웃

Hinweis: Undefinierte Variable

Aus der großen Weisheit des PHP Manual :

Das Verlassen auf den Standardwert einer nicht initialisierten Variablen ist problematisch, wenn eine Datei in eine andere eingeschlossen wird, die denselben Variablennamen verwendet. Es ist auch ein großes Sicherheitsrisiko mit register_globals eingeschaltet. E_NOTICE level error wird ausgegeben, wenn mit nicht initialisierten Variablen gearbeitet wird, jedoch nicht, wenn Elemente an das nicht initialisierte Array angehängt werden. isset () Das Sprachkonstrukt kann verwendet werden, um festzustellen, ob eine Variable bereits initialisiert wurde. Darüber hinaus ist die Lösung von empty () idealer, da keine Warnung oder Fehlermeldung generiert wird, wenn die Variable nicht initialisiert wird.

From PHP-Dokumentation :

Es wird keine Warnung generiert, wenn die Variable nicht vorhanden ist. Das heißt empty () ist im Wesentlichen das prägnante Äquivalent zu ! Isset ($ var) || $ var == false .

Dies bedeutet, dass Sie nur empty() verwenden können, um festzustellen, ob die Variable festgelegt ist. Außerdem wird die Variable mit den folgenden Werten verglichen: 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 im v4l.org online PHP Editor

Obwohl PHP keine Variablendeklaration erfordert, wird dies empfohlen, um 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 tut, ist ein Fehler auf sehr niedriger Ebene, E_NOTICE, der nicht einmal standardmäßig gemeldet wird, sondern im Handbuch empfiehlt 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 undefinierte Variable anzuhängen. Oder verwenden Sie isset() / !empty() , um zu überprüfen, ob sie deklariert sind, bevor Sie auf sie verweisen, 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'] : '';
    

    Ab PHP 7.0 wurde dies deutlich übersichtlicher. Jetzt können Sie den Operator null coalesce verwenden:

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. Setzen Sie einen benutzerdefinierten Fehlerbehandler für E_NOTICE und leiten Sie die Nachrichten von der Standardausgabe weg (möglicherweise in eine Protokolldatei):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. Deaktivieren Sie E_NOTICE für die Berichterstellung. Ein schneller Weg, um nur E_NOTICE auszuschließen, ist:

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

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

Hinweis: Undefinierter Index/Undefinierter Offset

Dieser Hinweis wird angezeigt, 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 vorhanden ist, 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 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, den Index 0. Dadurch wird Folgendes generiert:

Hinweis: Undefinierter Offset: 1

$_POST/$_GET/$_SESSION Variable

Die obigen Hinweise werden häufig angezeigt, wenn Sie mit $_POST, $_GET oder $_SESSION arbeiten. Für $_POST und $_GET müssen Sie nur überprüfen, ob der Index vorhanden ist oder nicht, bevor Sie sie verwenden. Für $_SESSION müssen Sie sicherstellen, dass Sie die Sitzung mit session_start() gestartet haben und dass der Index ebenfalls vorhanden ist.

Beachten Sie auch, dass alle 3 Variablen superglobal und in Großbuchstaben sind.

Verbunden:

1008
Alin Purcaru

Probiere diese

F1: Dieser Hinweis bedeutet, dass $ varname im aktuellen Gültigkeitsbereich des Skripts nicht definiert ist.

F2: Die Verwendung der Bedingungen isset () und empty () vor der Verwendung verdächtiger Variablen funktioniert einwandfrei.

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

Anmerkung zu den Sitzungen:

131
Ish

Fehleranzeige _@_ Operator

Für unerwünschte und redundante Hinweise kann der dedizierte Operator @ verwendet werden, um "" undefinierte Variablen/Indizes auszublenden Mitteilungen.

_$var = @($_GET["optional_param"]);
_
  • Dies wird normalerweise nicht empfohlen. Neulinge neigen dazu, es viel zu überbeanspruchen.
  • Es ist sehr ungeeignet für Code tief in der Anwendungslogik (ignorieren Sie nicht deklarierte Variablen, wo Sie nicht sollten), z. für Funktionsparameter oder in Schleifen.
  • Es gibt jedoch einen Vorteil gegenüber der Superunterdrückung _isset?:_ oder _??_. Benachrichtigungen können weiterhin protokolliert werden. Und man kann _@_- versteckte Notizen wiederbeleben mit: set_error_handler("var_dump");
    • Darüber hinaus sollten Sie if (isset($_POST["shubmit"])) in Ihrem ursprünglichen Code normalerweise nicht verwenden/empfehlen.
    • Neulinge werden solche Tippfehler nicht entdecken. Es entzieht Ihnen nur PHPs Notices für genau diese Fälle. Fügen Sie _@_ oder isset nur hinzu, nachdem Sie die Funktionalität überprüft haben.
    • Beheben Sie zuerst die Ursache. Nicht die Notizen.

  • @ ist hauptsächlich für _$_GET_/_$_POST_ -Eingabeparameter zulässig, insbesondere , wenn sie optional sind .

Und da dies die Mehrzahl dieser Fragen abdeckt, gehen wir auf die häufigsten Ursachen ein:

_$_GET_/_$_POST_/_$_REQUEST_ undefinierte Eingabe

  • Wenn Sie auf einen undefinierten Index/Offset stoßen, suchen Sie zunächst nach Tippfehlern:
    _$count = $_GET["whatnow?"];_

    • Ist dies ein erwarteter Schlüsselname und auf jeder Seitenanfrage vorhanden?
    • Bei Variablennamen und Array-Angaben wird in PHP zwischen Groß- und Kleinschreibung unterschieden.
  • Zweitens, wenn der Hinweis keine offensichtliche Ursache hat, verwenden Sie var_dump oder print_r , um zu überprüfen Alle Eingabearrays für ihren aktuellen Inhalt:

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

    Beide zeigen an, ob Ihr Skript mit dem richtigen oder einem beliebigen Parameter aufgerufen wurde.

  • Alternativ oder zusätzlich verwenden Sie Ihren Browser devtools (F12) und überprüfen Sie die Registerkarte "Netzwerk" auf Anforderungen und Parameter:

    browser developer tools / network tab

    POST-Parameter und GET-Eingabe werden separat angezeigt.

  • Für _$_GET_ -Parameter können Sie auch das QUERY_STRING in einsehen

    _print_r($_SERVER);
    _

    PHP hat einige Regeln, um coalesce nicht standardmäßige Parameternamen in die Superglobalen einzufügen. Möglicherweise schreibt Apache auch etwas um. Auf diese Weise können Sie auch die bereitgestellten unformatierten _$_COOKIES_- und anderen HTTP-Anforderungsheader anzeigen.

  • Weitere Informationen finden Sie in der Adressleiste Ihres Browsers unter GET parameters :

    _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 möglicherweise nur _$_GET["id"]_ und _$_GET["sort"]_ ergeben.

  • Überprüfen Sie abschließend Ihre <form>_ UND _<input> -Deklarationen, wenn Sie einen Parameter erwarten, aber keinen erhalten.

    • Stellen Sie sicher, dass jeder erforderliche Eingang einen _<input name=FOO>_ hat.
    • Das Attribut _id=_ oder _title=_ reicht nicht aus.
    • Ein _method=POST_ Formular sollte _$_POST_ ausfüllen.
    • Während ein _method=GET_ (oder weggelassen) _$_GET_ Variablen ergeben würde.
    • Es ist auch möglich, dass ein Formular _action=script.php?get=param_ über $ _GET und die restlichen _method=POST_ Felder in $ _POST daneben liefert.
    • Mit modernen PHP Konfigurationen (≥ 5.6) ist es machbar (nicht in Mode) geworden, $_REQUEST['vars'] zu verwenden, das GET und _ mischtPOST params.
  • Wenn Sie mod_rewrite verwenden, sollten Sie sowohl den _access.log_ als auch den RewriteLog aktivieren, um fehlende Parameter herauszufinden.

_$_FILES_

  • Die gleichen Sicherheitsüberprüfungen gelten für Datei-Uploads und _$_FILES["formname"]_.
  • Außerdem nach _enctype=multipart/form-data_ suchen
  • Ebenso wie _method=POST_ in Ihrer _<form>_ -Deklaration.
  • Siehe auch: PHP Undefined index error $ _FILES?

_$_COOKIE_

  • Das Array _$_COOKIE_ wird niemals direkt nach setcookie() gefüllt, sondern nur bei einer nachfolgenden HTTP-Anforderung.
  • Zusätzlich läuft ihre Gültigkeitsdauer ab, sie können auf Unterdomänen oder einzelne Pfade beschränkt sein, und Benutzer und Browser können sie einfach ablehnen oder löschen.
60
mario

Generell wegen "schlechter Programmierung" und der Möglichkeit, jetzt oder später Fehler zu machen.

  1. Wenn es sich um einen Fehler handelt, weisen Sie zuerst die Variable richtig zu: $ varname = 0;
  2. Wenn es wirklich nur manchmal definiert wird, 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 sogar die Warnungen in dir ausschalten PHP-Einstellungen
44
Erik

Dies bedeutet, dass Sie eine Variable testen, auswerten oder drucken, der Sie noch nichts zugewiesen haben. Es bedeutet, dass Sie entweder einen Tippfehler haben oder dass Sie zuerst überprüfen müssen, ob die Variable mit etwas initialisiert wurde. Überprüfen Sie Ihre logischen Pfade, es kann in einem Pfad aber nicht in einem anderen Pfad festgelegt werden.

40
DGM

Ich wollte die Benachrichtigung nicht deaktivieren, weil sie hilfreich ist, wollte aber zu viel Tipparbeit vermeiden.

Meine Lösung war diese Funktion:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

Wenn ich also auf $ name verweisen möchte und echo, falls vorhanden, schreibe ich einfach:

<?=ifexists('name')?>

Für Array-Elemente:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

Auf Seite, wenn ich auf $ _REQUEST ['name'] verweisen möchte:

<?=ifexistsidx($_REQUEST,'name')?>

Der beste Weg, um eine Eingabe zu erhalten string ist:

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

Dieser Einzeiler entspricht fast:

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

Wenn Sie unbedingt String Wert wollen, so wie:

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

Als Antwort auf "" Warum tauchen sie plötzlich auf? Ich habe dieses Skript jahrelang verwendet und hatte nie ein Problem. "

Die meisten Websites verwenden häufig die "Standard" -Fehlerberichterstattung "Alle Fehler anzeigen, jedoch keine" Hinweise "und" Veraltet ". Dies wird in der php.ini eingestellt und gilt für alle Sites auf dem Server. Dies bedeutet, dass die in den Beispielen verwendeten "Hinweise" unterdrückt (ausgeblendet) werden, während andere als kritisch erachtete Fehler angezeigt/aufgezeichnet werden.

Die andere kritische Einstellung ist, dass die Fehler ausgeblendet werden können (d. H. display_errors auf "off" oder "syslog" gesetzt).

In diesem Fall wurde entweder der error_reporting geändert, um auch Hinweise anzuzeigen (wie in den Beispielen angegeben), und/oder die Einstellungen wurden auf dem Bildschirm in display_errors geändert (anstatt sie zu unterdrücken). Protokollierung).

Warum haben sie sich geändert?

Die naheliegende/einfachste Antwort ist, dass jemand eine dieser Einstellungen in der php.ini angepasst hat oder eine aktualisierte Version von PHP jetzt eine andere php.ini als zuvor verwendet. Das ist der erste Ort, an dem man suchen muss.

Es ist jedoch auch möglich, diese Einstellungen in zu überschreiben

  • .htconf (Webserverkonfiguration, einschließlich vhosts und Unterkonfigurationen) *
  • .zugang
  • in PHP-Code selbst

und jedes von diesen könnte auch geändert worden sein.

Es gibt auch die zusätzliche Komplikation, dass die Webserverkonfiguration .htaccess-Anweisungen aktivieren/deaktivieren kann. Wenn Sie also Anweisungen in .htaccess haben, die plötzlich starten/aufhören zu funktionieren, müssen Sie dies überprüfen.

(.htconf/.htaccess setzen voraus, dass Sie als Apache ausgeführt werden. Wenn die Befehlszeile ausgeführt wird, gilt dies nicht. Wenn IIS oder ein anderer Webserver ausgeführt wird, müssen Sie diese Konfigurationen entsprechend überprüfen.)

Zusammenfassung

  • Überprüfen Sie, ob die PHP-Direktiven error_reporting und display_errors in der php.ini nicht geändert wurden oder ob Sie keine andere php.ini als zuvor verwenden.
  • Überprüfen Sie, ob die PHP-Direktiven error_reporting und display_errors in .htconf (oder vhosts usw.) nicht geändert wurden
  • Überprüfen Sie, ob die PHP-Direktiven error_reporting und display_errors in .htaccess nicht geändert wurden
  • Wenn Sie Direktiven in .htaccess haben, prüfen Sie, ob diese in der .htconf-Datei noch zulässig sind
  • Überprüfen Sie schließlich Ihren Code. möglicherweise eine nicht verwandte Bibliothek; um zu sehen, ob dort die PHP-Direktiven error_reporting und display_errors gesetzt wurden.
25
Robbie

Das liegt daran, dass die Variable '$ user_location' nicht definiert wird. Wenn Sie eine if-Schleife verwenden, in der Sie die Variable '$ user_location' deklarieren, müssen Sie auch eine else-Schleife haben und diese definieren. Zum Beispiel:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

Der obige Code erzeugt einen Fehler, da die if-Schleife nicht erfüllt ist und in der else-Schleife '$ user_location' nicht definiert wurde. Trotzdem wurde PHP gebeten, die Variable auszugeben. Um den Code zu ändern, müssen Sie folgende Schritte ausführen:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;
25
Roger

die schnelle Lösung besteht darin, Ihre Variable oben im Code auf null zu setzen

$user_location = null;
20

Früher habe ich diesen Fehler verflucht, aber es kann hilfreich sein, Sie daran zu erinnern, Benutzereingaben zu umgehen.

Wenn Sie zum Beispiel dachten, dass dies ein cleverer Kurzcode ist:

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

...Denk nochmal! Eine bessere Lösung ist:

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

(Ich verwende eine benutzerdefinierte html() -Funktion, um Zeichen zu entkommen. Ihr Kilometerstand kann variieren.)

16
rybo111

Ich benutze immer eine eigene nützliche Funktion exst (), die automatisch Variablen deklariert.

Ihr Code wird sein -

$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;
}
14
user2253362

In PHP 7.0 ist es jetzt möglich, den Null-Koaleszenzoperator zu verwenden:

echo "My index value is: " . ($my_array["my_index"] ?? '');

Ist gleich:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP manual PHP 7.

14
elpiel

WARUM IS GESCHIEHT?

Im Laufe der Zeit ist PHP eine sicherheitsorientiertere Sprache geworden. Einstellungen, die früher standardmäßig deaktiviert waren, sind jetzt standardmäßig aktiviert. Ein perfektes Beispiel hierfür ist E_STRICT, das ab PHP 5.4. standardmäßig aktiviert ist.

Außerdem ist laut PHP Dokumentation E_NOTICE in der php.ini standardmäßig deaktiviert. PHP docs recommend Zum Debuggen aktivieren . Wenn ich jedoch PHP aus dem Ubuntu-Repository und von BitNamis Windows-Stack herunterlade, sehe ich etwas anderes.

; 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

Beachten Sie, dass error_reporting standardmäßig auf den Produktionswert und nicht auf den "Standard" -Wert eingestellt ist. Dies ist etwas verwirrend und wird nicht außerhalb von php.ini dokumentiert, daher habe ich not für andere Distributionen validiert.

Zur Beantwortung Ihrer Frage wird dieser Fehler jedoch jetzt angezeigt, wenn er zuvor nicht angezeigt wurde, weil:

  1. Sie haben PHP installiert und die neuen Standardeinstellungen sind etwas schlecht dokumentiert, schließen jedoch E_NOTICE nicht aus.

  2. E_NOTICE Warnungen wie undefinierte Variablen und undefinierte Indizes tragen tatsächlich dazu bei, Ihren Code sauberer und sicherer zu machen. Ich kann Ihnen sagen, dass ich vor Jahren durch die Aktivierung von E_NOTICE gezwungen war, meine Variablen zu deklarieren. Es machte es viel einfacher, C zu lernen, wenn Variablen nicht deklariert werden, ist dies viel lästiger.

WAS KANN ICH TUN?

  1. Deaktivieren Sie E_NOTICE, indem Sie den "Standardwert" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED kopieren und durch das ersetzen, was derzeit nach dem Gleichheitszeichen in error_reporting = unkommentiert ist. Starten Sie Apache oder PHP neu, wenn Sie CGI oder FPM verwenden. Stellen Sie sicher, dass Sie die "richtige" php.ini bearbeiten. Der richtige ist Apache, wenn Sie PHP mit Apache ausführen, fpm oder php-fpm, wenn Sie PHP-FPM ausführen, cgi, wenn Sie PHP-CGI ausführen usw. Dies ist nicht die empfohlene Methode, aber wenn Sie Wenn Sie älteren Code haben, der sich nur sehr schwer bearbeiten lässt, ist er möglicherweise die beste Wahl.

  2. Deaktivieren Sie E_NOTICE auf Datei- oder Ordnerebene. Dies ist möglicherweise vorzuziehen, wenn Sie über einen älteren Code verfügen, die Dinge aber ansonsten "richtig" ausführen möchten. Wenden Sie sich hierzu an Apache2, Nginx oder einen beliebigen Server Ihrer Wahl. In Apache würden Sie php_value innerhalb von <Directory> verwenden.

  3. Schreiben Sie Ihren Code neu, um sauberer zu sein. Wenn Sie dies tun müssen, während Sie in eine Produktionsumgebung wechseln oder nicht möchten, dass jemand Ihre Fehler sieht, stellen Sie sicher, dass Sie die Anzeige von Fehlern deaktivieren und nur Protokollierung Ihre Fehler (siehe display_errors und log_errors in der php.ini und Ihren Servereinstellungen).

Option 3 erweitern: Dies ist das Ideal. Wenn Sie diesen Weg gehen können, sollten Sie. Wenn Sie diese Route ursprünglich nicht verwenden, können Sie sie eventuell verschieben, indem Sie Ihren Code in einer Entwicklungsumgebung testen. Wenn Sie schon dabei sind, sollten Sie ~E_STRICT und ~E_DEPRECATED loswerden, um zu sehen, was in Zukunft möglicherweise schief gehen wird. Es werden VIELE unbekannte Fehler auftreten, aber Sie haben keine unangenehmen Probleme, wenn Sie in Zukunft ein Upgrade von PHP durchführen müssen.

WAS BEDEUTEN DIE FEHLER?

Undefined variable: my_variable_name - Dies tritt auf, wenn vor der Verwendung keine Variable definiert wurde. Wenn das Skript PHP ausgeführt wird, nimmt es intern nur einen Nullwert an. In welchem ​​Szenario müssten Sie jedoch eine Variable überprüfen, bevor sie definiert wurde? Letztendlich ist dies ein Argument für "schlampigen Code". Als Entwickler kann ich Ihnen sagen, dass ich es liebe, wenn ich ein Open Source-Projekt sehe, in dem Variablen so weit oben definiert sind, wie sie definiert werden können. Es macht es einfacher zu sagen, welche Variablen in Zukunft auftauchen werden, und es macht es einfacher, den Code zu lesen/zu lernen.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index - Dies tritt auf, wenn Sie versuchen, auf einen Wert in einem Array zuzugreifen, der nicht vorhanden ist. Um diesen Fehler zu vermeiden, führen Sie eine bedingte Prüfung durch.

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

Eine andere Möglichkeit besteht darin, ein leeres Array oben in Ihrer Funktion zu deklarieren. Das ist nicht immer möglich.

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

//...

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

(zusätzlicher Tipp)

  • Als ich auf diese und andere Probleme stieß, verwendete ich NetBeans IDE (kostenlos) und es gab mir eine Vielzahl von Warnungen und Hinweisen. Einige von ihnen bieten sehr hilfreiche Tipps. Dies ist keine Voraussetzung und ich verwende keine IDEs mehr, außer für große Projekte. Ich bin heutzutage eher eine vim Person :).
8
smcjones

warum nicht die Dinge einfach halten?

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

?>
8
gts

undefinierter Index bedeutet in einem Array, das Sie zum Beispiel für einen nicht verfügbaren Array-Index angefordert haben

<?php 

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

?>

undefinierte Variable bedeutet, dass Sie eine vollständig nicht vorhandene Variable verwendet haben oder die beispielsweise nicht mit diesem Namen definiert oder initialisiert ist

<?php print_r($myvar); ?>

undefinierter Offset bedeutet, dass Sie in einem Array nach einem nicht vorhandenen Schlüssel gefragt haben. Und die Lösung dafür ist, vor dem Gebrauch zu überprüfen

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

Zu diesem Teil der Frage:

Warum tauchen sie plötzlich auf? Ich habe dieses Skript jahrelang benutzt und hatte nie ein Problem.

Keine konkreten Antworten, aber hier einige mögliche Erklärungen, warum sich Einstellungen plötzlich ändern können:

  1. Sie haben PHP auf eine neuere Version aktualisiert, die andere Standardeinstellungen für Fehlerberichte, Anzeigefehler oder andere relevante Einstellungen haben kann.

  2. Sie haben Code entfernt oder eingefügt (möglicherweise in Abhängigkeit), der zur Laufzeit die relevanten Einstellungen mit ini_set() oder error_reporting() festlegt (suchen Sie diese im Code).

  3. Sie haben die Webserverkonfiguration geändert (hier Apache vorausgesetzt): .htaccess Dateien und vhost-Konfigurationen können auch die PHP-Einstellungen manipulieren.

  4. In der Regel werden Benachrichtigungen nicht angezeigt/gemeldet (siehe PHP manual ), daher ist es möglich, dass beim Einrichten des Servers die Datei php.ini aus irgendeinem Grund nicht geladen werden konnte (Dateiberechtigungen ??). und Sie waren auf den Standardeinstellungen. Später wurde der Fehler (aus Versehen) behoben und jetzt KANN die richtige php.ini-Datei geladen werden, wobei error_reporting so eingestellt ist, dass Benachrichtigungen angezeigt werden.

4

Wenn Sie mit Klassen arbeiten, müssen Sie sicherstellen, dass Sie mit $this auf Membervariablen verweisen:

class Person
{
    protected $firstName;
    protected $lastName;

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

        // Incorrect
        $lastName = $last;

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

Ein weiterer Grund, warum ein undefinierter Indexhinweis ausgegeben wird, besteht darin, dass eine Spalte in einer Datenbankabfrage weggelassen wurde.

Dh:

$query = "SELECT col1 FROM table WHERE col_x = ?";

Versuchen Sie dann, innerhalb einer Schleife auf weitere Spalten/Zeilen zuzugreifen.

Dh:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

oder in einer while Schleife:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

Zu beachten ist außerdem, dass unter * NIX OS und Mac OS X zwischen Groß- und Kleinschreibung unterschieden wird.

Konsultieren Sie die folgenden Fragen und Antworten auf dem Stack:

3

Die Verwendung eines ternären ist einfach, lesbar und sauber:

Pre PHP 7
Weisen Sie eine Variable dem Wert einer anderen Variablen zu, wenn diese gesetzt ist, oder weisen Sie null zu (oder welchen Standardwert Sie benötigen):

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

PHP 7 +
Dasselbe mit Ausnahme von Null Coalescing Operator . Es besteht keine Notwendigkeit mehr, isset() aufzurufen, da dies eingebaut ist, und es ist nicht erforderlich, die zurückzugebende Variable bereitzustellen, da angenommen wird, dass der Wert der geprüften Variablen zurückgegeben wird:

$newVariable = $thePotentialData ?? null;

Both stoppt die Notices von der OP-Frage, und both sind das genaue Äquivalent von:

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


Wenn Sie keine neue Variable festlegen müssen, können Sie den zurückgegebenen Wert des Ternären direkt verwenden, z. B. mit echo, Funktionsargumenten usw.:

Echo:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

Funktion:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

Das oben Genannte funktioniert genauso mit Arrays, einschließlich Sitzungen usw., und ersetzt die zu überprüfende Variable durch z.
$_SESSION['checkMe']
oder wie viele Ebenen Sie auch benötigen, z.
$clients['personal']['address']['postcode']


Suppression:

Es ist möglich, die PHP -Nachrichten mit @ zu unterdrücken oder die Fehlerberichterstattungsstufe zu verringern, aber es behebt das Problem nicht , es stoppt einfach es wird im Fehlerprotokoll gemeldet. Dies bedeutet, dass Ihr Code immer noch versucht hat, eine Variable zu verwenden, die nicht festgelegt wurde. Dies kann bedeuten, dass etwas nicht wie beabsichtigt funktioniert, je nachdem, wie wichtig der fehlende Wert ist.

Sie sollten wirklich nach diesem Problem suchen und es entsprechend behandeln, indem Sie entweder eine andere Nachricht ausliefern oder einfach einen Nullwert für alles andere zurückgeben, um den genauen Status zu ermitteln.

Wenn Sie sich nur darum kümmern, dass der Hinweis nicht im Fehlerprotokoll enthalten ist, können Sie das Fehlerprotokoll optional einfach ignorieren.

2
James

Ich habe eine Frage dazu gestellt und wurde auf diesen Beitrag mit der Nachricht verwiesen:

Diese Frage hat hier bereits eine Antwort:

"Notice: Undefined variable", "Notice: Undefined index" und "Notice: Undefined offset" mit PHP

Ich teile meine Frage und Lösung hier:

Das ist der Fehler:

enter image description here

Zeile 154 ist das Problem. Das habe ich in Zeile 154:

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

Ich denke, das Problem ist, dass ich schreibe, wenn Bedingungen für die Variable $city, die nicht der Schlüssel, sondern der Wert in $key => $city ist. Könnten Sie zunächst bestätigen, ob dies die Ursache der Warnung ist? Zweitens, wenn das das Problem ist, warum kann ich dann keine Bedingung schreiben, die auf dem Wert basiert? Muss es mit dem Schlüssel sein, den ich brauche, um die Bedingung zu schreiben?

UPDATE 1: Das Problem besteht darin, dass bei der Ausführung von $citiesCounterArray[$key] manchmal der $key einem Schlüssel entspricht, der im Array $citiesCounterArray nicht vorhanden ist, dies jedoch auf der Grundlage der Daten nicht immer der Fall ist meiner Schleife. Ich muss eine Bedingung festlegen, damit der Code übersprungen wird, wenn $key im Array vorhanden ist.

UPDATE 2: So habe ich es mit array_key_exists() behoben:

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

Eine häufige Ursache für eine Variable, die nach dem Senden eines HTML-Formulars nicht vorhanden ist, ist, dass das Formularelement nicht in einem <form> -Tag enthalten ist:

Beispiel: Element nicht im <form> enthalten

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

Beispiel: Element jetzt im <form> enthalten

<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

Für den Umgang mit Dateien sind ein korrekter Enctype und eine POST -Methode erforderlich, die einen undefinierten Index-Hinweis auslösen, wenn keine der beiden im Formular enthalten sind.

Das Handbuch enthält die folgende grundlegende Syntax:

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

?>

Referenz:

0

Diese Fehler treten immer dann auf, wenn eine Variable verwendet wird, die nicht festgelegt ist.

Der beste Weg, um damit umzugehen, ist die Fehlerberichterstattung während der Entwicklung.

So legen Sie die Fehlerberichterstattung fest für:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

Auf Produktionsservern ist die Fehlerberichterstattung deaktiviert, daher werden diese Fehler nicht angezeigt.

Auf dem Entwicklungsserver können wir jedoch die Fehlerberichterstattung aktivieren.

Um diesen Fehler zu beheben, sehen wir das folgende Beispiel:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

Wir können die Variablen mit NULL initialisieren, bevor wir ihre Werte zuweisen oder verwenden.

So können wir den Code wie folgt ändern:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

Dies stört keine Programmlogik und erzeugt auch dann keinen Hinweis, wenn $test keinen Wert hat.

Im Grunde ist es immer besser, die Fehlerberichterstattung für die Entwicklung auf EIN zu setzen.

Und beheben Sie alle Fehler.

In der Produktion sollte die Fehlerberichterstattung deaktiviert sein.

0
Pupil

Wahrscheinlich haben Sie bisher die alte PHP -Version verwendet und jetzt die aktualisierte PHP -Version verwendet. Dies ist der Grund, warum sie seit Jahren fehlerfrei funktioniert hat. Bis PHP4 gab es keinen Fehler, wenn Sie eine Variable verwenden, ohne sie zu definieren. Ab PHP5 werden jedoch Fehler für die in Frage kommenden Codes ausgegeben.

0
phvish