"Notice: Undefined variable", "Notice: Undefined index", und "Notice: Undefined offset" mit PHP
Bin ich mit einem PHP-Skript, und weiterhin Fehlermeldungen erhalten wie:
Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php in Zeile 10
Notice: Undefined index: my_index C:\wamp\www\mypath\index.php in Zeile 11
Linie 10 und 11 sieht wie folgt aus:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
Was bedeuten diese Fehlermeldungen?
Warum entstehen plötzlich? Ich verwendet, um dieses Skript verwenden, für Jahre und ich habe nie ein problem gehabt.
Wie kann ich Sie beheben?
Dies ist eine Allgemeine Referenz zu Frage für die Menschen zu verknüpfen, um so zu duplizieren, anstatt zu erklären, die Frage über und über wieder. Ich glaube, das ist notwendig, weil die meisten real-Welt-Antworten auf diese Frage sind sehr spezifisch.
Zugehörigen Meta-Diskussion:
die variable might not have been initialized. Sind Sie initialisieren der Variablen aus einem post-oder get-oder ein array? Wenn das der Fall ist, verfügen Sie möglicherweise nicht über ein Feld im array. Dass Ihr Zugriff auf.
Ich bemerkte das Bearbeiten-hinzufügen "und "Notice: Undefined offset"" - Wäre es nicht sinnvoller mit "PHP: "Undefined variable", "Undefined index", "Undefined offset" Hinweise" (sogar die PHP, da es markiert ist "php". Plus, die URL wird abgeschnitten
and-notice-undef
, nur ein Vorschlag, so dass die URL nicht cut-off. Vielleicht sogar das entfernen des (zu viele) Zitate. Oder PHP: “Undefined variable/index/offset” notices
Ich denke, ein argument kann gemacht werden für beide Varianten. Es gibt eine chance, dass Neulinge geben wird die gesamte Zeile, einschließlich des "Bemerkt:" in Ihre such-Abfrage, die ich bin sicher, dass ist der wichtigste traffic-generator für diese Frage. Wenn die Nachrichten sind, das ist wahrscheinlich zur Verbesserung der Sichtbarkeit in den Suchmaschinen
Ich verstehe. Ich meinte nur, weil die URL nicht abgeschnitten werden, bevor und jetzt ist es nicht an der
and-notice-undef
. Es war nur ein (paar) Anregung(en). Es wiederholt sich nur auch Notice: Undefined
.InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Notice: Undefined variable
Vom großen Weisheit der PHP-Handbuch:
Vom In der PHP-Dokumentation:
Dies bedeutet, dass Sie nur
empty()
um zu bestimmen, ob die variable gesetzt ist, und darüber hinaus überprüft die variable gegen die folgenden,0
,0.0
,""
,"0"
,null
,false
oder[]
.Beispiel:
Testen Sie das obige snippet in den 3v4l.org online-PHP-editor
Obwohl PHP nicht erforderlich, eine Variablendeklaration, es tut es empfehlen, um zu vermeiden, dass einige Sicherheitslücken oder bugs, wo man vergessen würde zu geben, einen Wert zu einer variable, die verwendet wird später im Skript. Was PHP tut, im Fall von nicht deklarierten Variablen ist die Ausgabe ein sehr low-level-Fehler,
E_NOTICE
, eine, die sich auch nicht gemeldet standardmäßig, aber das Handbuch berät zu ermöglichen während der Entwicklung.Möglichkeiten, sich mit dem Thema:
Empfohlen: Deklarieren Sie Ihre Variablen, zum Beispiel, wenn Sie versuchen, eine Zeichenfolge angefügt an eine Undefinierte variable. Oder verwenden Sie
isset()
/!empty()
um zu überprüfen, ob Sie deklariert sind, bevor referenzieren, wie in:Diese geworden, viel sauberer als PHP-7.0, jetzt können Sie die null coalesce operator:
Legen Sie eine custom error handler für die E_NOTICE-Warnung, und leiten Sie die Nachrichten, die sich von der standard-Ausgabe (vielleicht in einer log-Datei):
Deaktivieren E_NOTICE aus der Berichterstattung. Ein schneller Weg, um auszuschließen, nur
E_NOTICE
ist:Unterdrücken, den Fehler mit der @ operator.
Hinweis: Es wird dringend empfohlen, zu implementieren, nur Punkt 1.
Notice: Undefined index, Undefined offset
Dieser Hinweis erscheint, wenn Sie (oder PHP) versuchen, Zugriff auf ein undefined index in einem array.
Möglichkeiten, sich mit dem Thema:
Prüfen, ob der index vorhanden ist, bevor Sie darauf zugreifen. Für diese können Sie verwenden,
isset()
oderarray_key_exists()
:Dem sprachkonstrukt
Listen()
erzeugen kann, wenn es versucht, Zugriff auf ein array-index, der nicht existiert:Beiden Variablen werden verwendet, um Zugriff auf zwei array-Elemente, aber es ist nur ein array-element-index
0
, so generiert diese:$_POST
/$_GET
/$_SESSION
variableDie Hinweise oben erscheinen oft bei der Arbeit mit
$_POST
,$_GET
oder$_SESSION
. Für$_POST
und$_GET
Sie müssen nur zu prüfen, ob der index existiert oder nicht, bevor Sie Sie verwenden. Für$_SESSION
Sie haben zu stellen Sie sicher, Sie haben die Sitzung begann mitsession_start()
und dass der index auch existiert.Beachten Sie auch, dass alle 3 Variablen sind superglobals und sind groß.
Verwandte:
@
) hat einige performance-Probleme. Auch, da es unterdrückt alle - Fehler in einem bestimmten Bereich verwenden, ohne Pflege kann die Maske Nachrichten, die Sie wünschte, du würdest sehen.Ausblenden der Probleme ist NICHT der Weg, um sich mit Fragen. Artikel #2...#4 kann nur verwendet werden, auf die Produktion von Servern, die nicht im Allgemeinen.
Ist es möglich, shut-up-Nachricht inline (nicht handler), wenn auch in einem benutzerdefinierten error-handler verwendet?
$var = @$_GET['nonexisting'];
noch Ursachen feststellen..Warum ist es empfohlen, zu verwenden 1.
$value = isset($_POST['value']) ? $_POST['value'] : '';
statt mit 4.$value = @$_POST['value'];
?Diese 4 Wege sind unabhängig, das ist nicht ein 4-Schritt-Anleitung. Also, wenn Sie gewählt haben, zu verwenden, Weise 4, das bedeutet, dass Sie nicht umzusetzen ersten 3 Möglichkeiten, so dass Sie Sie nicht unterdrücken Fehler noch.
InformationsquelleAutor
Versuchen diese
Oder als quick-and-dirty-Lösung:
Hinweis zu den Sitzungen:
Wenn die Verwendung von Sitzungen,
session_start();
ist erforderlich, um platziert werden alle Dateien mit sessions.http://php.net/manual/en/features.sessions.php
E_NOTICE
von derphp.ini
Konfigurationsdatei, tunerror_reporting = (E_ALL & ~E_NOTICE)
Diese Antwort wird diskutiert, auf meta.
InformationsquelleAutor
Fehleranzeige
@
- operatorFür die unerwünschten und überflüssigen Mitteilungen, könnte man die engagierten
@
- operator zu »verstecken« undefined variable/index Nachrichten.isset?:
oder??
super-supression jedoch. Hinweise noch bekommen können, angemeldet. Und man kann sich wiederbeleben@
-versteckte Hinweise mit:set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
in deinem ersten code.@
oderisset
nur nach überprüfung der Funktionen.@
ist vor allem akzeptabel für$_GET
/$_POST
input-Parameter, die speziell , wenn Sie optional.Und da dies deckt die meisten solcher Fragen näher auf die häufigsten Ursachen:
$_GET
/$_POST
/$_REQUEST
undefined inputErste, was Sie tun, wenn er eine " undefined index/offset -, ist zu überprüfen, für die Tippfehler:
$count = $_GET["whatnow?"];
Zweitens, wenn die Mitteilung nicht über eine offensichtliche Ursache, verwenden Sie
var_dump
oderprint_r
, um zu überprüfen, alle Eingabe-arrays für Ihren aktiven Inhalt:Beide offenbaren wird, wenn das Skript aufgerufen wurde, mit der rechten oder alle Parameter.
Alternativey oder zusätzlich verwenden Sie Ihre browser-devtools (F12) und untersuchen Sie die Registerkarte "Netzwerk" für die Anforderungen und Parameter:
POST-Parameter und Eingaben werden GESONDERT ausgewiesen.
Für
$_GET
Parameter können Sie auch Blick auf dieQUERY_STRING
inPHP hat einige Regeln zu coalesce nicht-standard-parameter-Namen in die superglobals. Apache könnte einige umschreiben als gut.
Sie können auch sehen Sie in der beiliegenden raw -
$_COOKIES
und andere HTTP-request-Header, die Art und Weise.Mehr offensichtlich sehen Sie in Ihrem browser die Adresse bar für GET-Parameter:
http://example.org/script.php?id=5&sort=desc
Den
name=value
Paare nach der?
Fragezeichen sind deine Abfrage (GET -) Parameter. Damit diese URL konnte mit nur mäßiger Ausbeute$_GET["id"]
und$_GET["sort"]
.Schließlich überprüfen Sie Ihre
<form>
und<input>
Erklärungen, wenn Sie erwarten einen parameter, erhalten aber keine.<input name=FOO>
id=
odertitle=
Attribut nicht ausreichen.method=POST
form sollte zum Auffüllen$_POST
.method=GET
(oder verlassen Sie es aus) ergeben würde$_GET
Variablen.action=script.php?get=param
via $_GET und die restlichenmethod=POST
Felder in $_POST neben.$_REQUEST['vars']
wieder, die Maischen GET-und POST-params.Wenn Sie mod_rewrite beschäftigt, dann sollten Sie prüfen sowohl die
access.log
sowie aktivieren derRewriteLog
, um herauszufinden, abwesend Parameter.$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
in Ihrem<form>
Erklärung.$_COOKIE
$_COOKIE
array wird niemals aufgefüllt rechts nachsetcookie()
, sondern nur auf irgendwelche Nachfolge-HTTP-Anforderung.Es wurden quoite ein paar änderungen seit 2009, insbesondere php.net/ChangeLog-5.php#5.4.0 ändert sich das Ergebnis drastisch (siehe "Zend Engine, Leistung" und "(Stille) - operator").
Danke @mario, das ist interessant. Nun, wenn jemand gut genug, um die benchmark-die beiden... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs Nach diesem test scheinen identisch sein (beachten Sie, dass der Maßstab sich ändert).
Getestet habe ich mit PHP 5.4 und die performance immer noch schlecht.
InformationsquelleAutor
In der Regel wegen des "schlechten Programmierung", und die Möglichkeit für Fehler, die sich jetzt oder später.
if (isset($varname))
, bevor Sie esObwohl ich Stimme mit den ersten drei Punkte, #4 ist einfach falsch. Versteckt sich ein problem, wird es nicht Weg gehen, und es könnte sogar dazu führen, mehr Probleme die Straße hinunter.
absolut wahr, aber in einigen Szenarien (Gekauft Skript, null technische Kenntnisse, die es brauchen läuft bis morgen...) es ist die duct-tape-Lösung - ganz schlimm, das muss immer betont, aber eine option
Duct-tape ist gut ... manchmal. Historisch Warnungen wurden ausgeschaltet in der standard PHP-Einstellungen, aber defult Einstellungen müssen strenger werden. Schade, viele gehen zurück auf die alten Einstellungen, damit Sie nicht zu verärgern die Kunden.
InformationsquelleAutor
Es bedeutet, dass Sie testen, evaluieren, oder drucken Sie eine variable, die noch nicht zugewiesen sind nichts. Es heißt, Sie haben entweder ein Tippfehler, oder Sie müssen prüfen, ob die variable initialisiert wurde etwas ersten. Überprüfen Sie Ihre Logik-Pfade, es kann eingestellt werden in einem Pfad in einem anderen aber nicht.
InformationsquelleAutor
Wollte ich nicht deaktivieren, bemerken, weil es hilfreich ist, wollte aber vermeiden Sie zu viel Tipparbeit.
Meine Lösung war diese Funktion:
Also, wenn ich möchte Verweis auf $name und echo, wenn vorhanden, den ich einfach schreiben:
Array-Elemente:
In der Seite, wenn ich will, zu finden, $_REQUEST['name']:
$foo = "BABAR"; ifexists('foo');
wird im Allgemeinen null zurück. (Kursiv sind php.net Kapitel.)jetzt bekommen Sie "hello from"... was ist der Punkt? prüfen Sie einfach den Wert
if( !empty($user) and !empty($location) ) echo "hello $user ..."
InformationsquelleAutor
Den besten Weg für die erste Eingabe string ist:
Diese one-liner ist fast äquivalent zu:
Wenn Sie unbedingt wollen string Wert, genau wie:
InformationsquelleAutor
Sein, weil die variable "$user_location' ist nicht immer definiert. Wenn Sie mit einem wenn-Schleife, in der man erklärt die '$user_location' variable dann müssen Sie auch eine else-Schleife und definieren die gleichen. Zum Beispiel:
Den obigen code erstellen Fehler wie Die if-Schleife nicht erfüllt und der else-Schleife '$user_location' wurde nicht definiert. Noch PHP wurde gebeten, echo aus der variable. So ändern Sie den code, müssen Sie Folgendes tun:
InformationsquelleAutor
Antwort auf ""Warum erscheinen Sie plötzlich? Ich verwendet, um dieses Skript verwenden, für Jahre und ich habe nie ein problem gehabt."
Es ist sehr Häufig für die meisten Standorte für den Betrieb unter "default" error-reporting "Zeigt alle Fehler, aber nicht 'verstoßen' und 'veraltet'". Diese Einstellung in php.ini und gelten für alle Websites auf dem server. Dies bedeutet, dass diese "Hinweise" in den Beispielen benutzt wird ausgeblendet (versteckt) werden, während andere Fehler, die mehr als kritisch ist, wird angezeigt/aufgezeichnet.
Die andere wichtige Einstellung ist der Fehler versteckt werden können (d.h.
display_errors
auf "off" oder "syslog").Was passiert in diesem Fall, dass entweder die
error_reporting
wurde geändert, um auch zu zeigen, verstoßen (wie in den Beispielen) und/oder dass die Einstellungen geändert wurden, umdisplay_errors
auf dem Bildschirm (im Gegensatz zu unterdrücken/protokollieren).Warum haben Sie sich geändert?
Die offensichtliche/einfachste Antwort ist, dass jemand eingestellt die Einstellungen in php.ini, oder eine aktualisierte version von PHP ist jetzt mit einer anderen php.ini vorher ab. Das ist der erste Ort zu suchen.
Jedoch ist es auch möglich, diese Einstellungen zu überschreiben in
einem dieser könnte auch geändert worden.
Gibt es auch zusätzliche Komplikationen, die der web-server-Konfiguration aktivieren/deaktivieren .htaccess-Direktiven, also, wenn Sie Richtlinien .htaccess, die plötzlich anfangen/aufhören zu arbeiten, dann müssen Sie prüfen, dass für.
(.htconf /.htaccess übernehmen Sie ausführen als apache. Wenn mit Befehl Linie, das wird nicht gelten, wenn mit IIS oder andere webserver, dann müssen Sie überprüfen die configs entsprechend)
Zusammenfassung
error_reporting
unddisplay_errors
php-Direktiven in der php.ini hat sich nicht geändert, oder, dass Sie nicht mit einer anderen php.ini vorher ab.error_reporting
unddisplay_errors
php-Direktiven in .htconf (oder vhosts etc) haben sich nicht geänderterror_reporting
unddisplay_errors
php-Direktiven in .htaccess nicht geändert habenerror_reporting
unddisplay_errors
php-Direktiven wurden, eingestellt werden.InformationsquelleAutor
quick-fix zuweisen Ihre Variablen auf null an der Spitze Ihres Codes
InformationsquelleAutor
Ich verwendet, um den Fluch dieser Fehler, aber es kann hilfreich sein, um Sie daran zu erinnern, um zu entkommen Benutzereingaben.
Zum Beispiel, wenn Sie dachte, das war clever, Steno:
...Think again! Eine bessere Lösung ist:
(Ich benutze eine benutzerdefinierte
html()
Funktion escape-Zeichen, kann Ihre Laufleistung variieren)InformationsquelleAutor
Ich die ganze Zeit eine eigene nützliche Funktion exst (), die automatisch Variablen deklarieren.
Ihre code -
InformationsquelleAutor
In einem sehr Einfache Sprache.
Der Fehler ist, Sie verwenden eine variable
$user_location
ist nicht definiert, indem Sie früher und es hat keinen Wert, So empfehle ich Ihnen, bitte erklären diese variable vor mit es Zum Beispiel:$user_location = '';
Oder
$user_location = 'Los Angles';
Dies ist eine sehr häufige Fehlermeldung, die Sie kann Gesicht.Also keine Sorge, nur deklarieren Sie die variable und Genießen Kodierung.
InformationsquelleAutor
In PHP 7.0 ist es nun möglich, den Null-coalescing operator:
Gleich:
PHP-Handbuch PHP-7.0
Dies funktioniert auch in if-Anweisungen.
if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
Dein code ist eigentlich eine nette übersehen Fehler: ?? - nur Prüfungen für
isset()
, wenn Sie passis_array()
- das ist ein boolean, unerwartete Folgen.InformationsquelleAutor
warum nicht die Dinge einfach halten?
InformationsquelleAutor
WARUM IST DAS PASSIERT?
Laufe der Zeit, PHP hat sich zu einem mehr Sicherheit ausgerichtete Sprache. Einstellungen, die verwendet werden, die standardmäßig deaktiviert sind jetzt standardmäßig aktiviert. Ein perfektes Beispiel HIERFÜR ist
E_STRICT
wurde, standardmäßig aktiviert, da der PHP 5.4.0.Außerdem, laut der PHP-Dokumentation standardmäßig
E_NOTICE
ist disabled in php.ini. PHP-docs empfehlen drehen Sie es auf, für debugging-Zwecke. Allerdings, wenn ich download PHP aus dem Ubuntu-repository und von BitNami Windows-stack–sehe ich etwas anderes.Beachten Sie, dass
error_reporting
tatsächlich eingestellt, um die Produktion Wert standardmäßig nicht für die "default" - Wert standardmäßig. Dies ist etwas verwirrend und wird nicht dokumentiert, die außerhalb von php.ini, also ich habe nicht überprüft diese auf anderen Distributionen.Ihre Frage zu beantworten, aber diese Fehlermeldung erscheint nun, wenn es nicht pop-up, bevor Sie da:
Du PHP installiert und die neuen Standard-Einstellungen sind etwas schlecht dokumentiert, aber nicht auszuschließen
E_NOTICE
.E_NOTICE
Warnungen wie Undefinierte Variablen und undefinierten Indizes tatsächlich helfen, um Ihren code sauberer und sicherer zu machen. Ich kann Ihnen sagen, dass, vor Jahren, haltenE_NOTICE
aktiviert gezwungen mich zu erklären, meine Variablen. Es machte es VIEL leichter C zu lernen, waren nicht deklarieren von Variablen ist viel größer ein ärgernis.WAS KANN ICH DAGEGEN TUN?
Ausschalten
E_NOTICE
durch kopieren der "Default-Wert"E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
und ersetzen Sie es mit dem, was ist derzeit unkommentiert nach dem Gleichheitszeichen inerror_reporting =
. Starten Sie Apache, oder PHP, wenn per CGI oder FPM. Stellen Sie sicher, das Sie Bearbeiten die "richtige" php.ini. Die richtige Apache-wenn Sie PHP mit Apache, fpm oder php-fpm, wenn man PHP-FPM, cgi, wenn PHP-CGI, etc. Dies ist nicht die empfohlene Methode, aber wenn man legacy-code, die gehen, um extrem schwierig zu Bearbeiten, dann könnte es Ihre beste Wette.Ausschalten
E_NOTICE
auf die Datei oder den Ordner-Ebene. Dies könnte empfehlenswert sein, wenn Sie einige legacy-code, sondern wollen Dinge tun, die "richtige" Art und Weise anders. Um dies zu tun, sollten Sie Apache2, Nginx oder was auch immer Ihr server der Wahl ist. In Apache verwenden, würden Siephp_value
innerhalb von<Directory>
.Schreiben Sie Ihre code sauberer ist. Wenn Sie brauchen, um dies zu tun während der Bewegung in einer Produktionsumgebung oder nicht wollen, dass jemand zu sehen, Ihre Fehler, stellen Sie sicher, deaktivieren Sie alle anzeigen von Fehlern, und nur Protokollierung Ihre Fehler (siehe
display_errors
undlog_errors
in php.ini und server-Einstellungen).Erweitern option 3: Dies ist das ideal. Wenn Sie diesen Weg gehen, sollten Sie. Wenn Sie nicht diesen Weg gehen, zunächst in Erwägung ziehen diesen Weg schließlich durch testen Sie Ihren code in einer Entwicklungsumgebung. Während Sie gerade dabei sind, loswerden
~E_STRICT
und~E_DEPRECATED
um zu sehen, was könnte schief gehen in der Zukunft. Du wirst sehen, eine MENGE von fremden Fehlern, aber es geht um zu verhindern, dass unangenehme Probleme, wenn Sie benötigen, um ein upgrade von PHP in die Zukunft.WAS DIE FEHLER BEDEUTEN?
Undefined variable: my_variable_name
- Dies geschieht, wenn eine variable nicht definiert wurde, bevor Sie verwenden. Wenn das PHP-Skript ausgeführt wird, intern nimmt halt einen null-Wert. Aber in dem Szenario würden Sie eine variable, bevor es definiert wurde? Letztendlich ist dies ein argument für "sloppy code". Als Entwickler kann ich dir sagen, dass ich es Liebe, wenn ich sehe, eine open-source-Projekt, wo die Variablen definiert sind, wie hoch Ihre Spielräume, wie Sie definiert werden können. Es macht es einfacher zu sagen, was Variablen sind zu gehen, um pop-up in der Zukunft und macht es leichter zu Lesen/lernen der code.Undefined index: my_index
- Dies geschieht, wenn Sie versuchen, Zugriff auf einen Wert in ein array und es nicht vorhanden ist. Um diesen Fehler zu verhindern, führen Sie eine bedingte überprüfen.Weitere option ist zu erklären, ein leeres array an der Spitze Ihrer Funktion. Dies ist nicht immer möglich.
(weiterer Tipp)
vim
person in diesen Tagen :).InformationsquelleAutor
undefined index bedeutet, der in ein array von Ihnen angeforderte nicht verfügbar für array-index zum Beispiel
undefined variable bedeutet, dass Sie verwendet haben, völlig nicht vorhandenen oder variable, die nicht definiert oder initialisiert werden, indem Sie diesen Namen zum Beispiel
undefined offset bedeutet, dass in der Reihe, um die Sie gebeten haben, für nicht vorhandene Schlüssel. Und die
die Lösung für dieses ist, vor Gebrauch zu überprüfen
InformationsquelleAutor
Zu diesem Teil der Frage:
Keine definitiven Antworten, aber hier sind einige mögliche Erklärungen für warum-Einstellungen können 'plötzlich' ändern:
Upgrade von PHP auf eine neuere version, die anderen Standardeinstellungen für error_reporting, display_errors oder anderen relevanten Einstellungen.
Haben Sie entfernt oder eingeführt haben einige code, der (möglicherweise in einer Abhängigkeit) setzt, die relevanten Einstellungen, die zur Laufzeit mit
ini_set()
odererror_reporting()
(Suche nach diesen im code)Ändern Sie die webserver-Konfiguration (vorausgesetzt, dass apache hier):
.htaccess
Dateien und die vhost-Konfigurationen können auch manipulieren die php-Einstellungen.Regel verstoßen nicht angezeigt /gemeldet werden (siehe PHP-Handbuch)
so ist es möglich, dass bei der Konfiguration der server, die php.ini-Datei konnte nicht geladen werden für einige Grund (Datei-Berechtigungen??) und Sie wurden auf die Standard-Einstellungen. Später, der " bug " wurde behoben (durch einen Unfall) und jetzt KANN man es laden Sie die richtige php.ini-Datei mit dem error_reporting gesetzt, um zu zeigen, verstoßen.
InformationsquelleAutor
Wenn die Arbeit mit Klassen, die Sie brauchen, um stellen Sie sicher, Referenz-member-Variablen mit
$this
:InformationsquelleAutor
Ein weiterer Grund, warum ein undefined index notice geworfen wird, wäre das eine Spalte weggelassen wurde, aus einer Datenbank-Abfrage.
I. e.:
Dann versuchen, Zugriff auf mehrere Spalten/Zeilen innerhalb einer Schleife.
I. e.:
oder in einem
while
Schleife:Etwas anderes, das muss angemerkt werden, dass auf einem *NIX-OS und Mac-OS X, die Dinge sind case-sensitive.
Konsultieren Sie die followning Q&A auf Stack:
Sind die Tabellennamen in MySQL case-Sensitiv?
mysql case sensitive Tabellennamen in Abfragen
MySql - und Kleinschreibung Ausgabe der Tabellen in verschiedenen server
InformationsquelleAutor
Mit einem ternäre ist einfach, lesbar und sauber:
Pre PHP 7
Weisen Sie einer Variablen den Wert einer anderen Variablen, wenn es gesetzt ist, sonst weisen Sie
null
(oder was auch immer Standard Wert):PHP 7+
Das gleiche, außer mit Null Coalescing-Operator. Es gibt nicht mehr eine Notwendigkeit zu nennen
isset()
wie diese gebaut wird, und keine Notwendigkeit die variable zurückzugeben, wie es übernommen, um den Rückgabewert der variable, die überprüft wird:Beide wird stop-die Hinweise von der OP-Frage, und beide sind das genaue äquivalent:
Wenn Sie nicht benötigen, setzen einer neuen variable dann können Sie direkt verwenden, um die dreistellige zurückgegebenen Wert, wie mit
echo
, Funktion, Argumente, etc:Echo:
Funktion:
Den oben genannten arbeiten werden genau das gleiche mit den arrays, einschließlich der Sitzungen, etc, ersetzen Sie die variable, die überprüft wird z.B.:
$_SESSION['checkMe']
oder wie viele Ebenen, die Sie benötigen, z.B.:
$clients['personal']['address']['postcode']
Unterdrückung:
Ist es möglich zu unterdrücken, um die PHP-Notizen mit
@
oder reduzieren Sie Ihre error reporting level, aber es nicht das problem zu beheben, es hört einfach auf, es wird berichtet in der error-log. Dies bedeutet, dass Ihr code immer noch versucht, eine variable zu verwenden, die nicht gesetzt wurde, die kann oder kann nicht bedeuten, etwas nicht so funktionieren wie Sie sollen - je nachdem, wie entscheidend der fehlende Wert ist.Sollten Sie wirklich prüfen, für diese Ausgabe und Handhabung ist es angemessen, entweder dienen eine andere Nachricht, oder auch nur die Rückgabe eines null-Wert als alles andere um die genaue Staat.
Wenn Sie nur Sorge um den Hinweis, nicht in die Fehler-log, dann als eine option, die Sie könnte Sie einfach ignorieren Sie den Fehler melden.
InformationsquelleAutor
Wahrscheinlich, Sie wurden mit alten PHP-version, bis und jetzt aufgerüstet PHP das ist der Grund, es funktioniert ohne Fehler bis jetzt von Jahren.
bis PHP4 gab es keine Fehlermeldung, wenn Sie mithilfe von Variablen, ohne es zu definieren, sondern als von PHP5 weiter es wirft Fehler bei den codes, wie bereits erwähnt, in Frage stellen.
InformationsquelleAutor
Beim Umgang mit Dateien, einen richtigen enctype-und eine POST-Methode benötigt, die trigger eine undefined index notice, wenn Sie entweder nicht in das Formular aufgenommen.
In der Anleitung steht die folgende grundlegende syntax:
HTML
PHP
Referenz:
InformationsquelleAutor
Eine häufige Ursache für eine variable nicht nach einem HTML-Formular eingereicht wurde, ist das Formular-element ist nicht enthalten innerhalb einer
<form>
tag:Beispiel: Element nicht innerhalb der
<form>
Beispiel: Element nun innerhalb der
<form>
InformationsquelleAutor
Fragte ich eine Frage dazu und ich war nach diesem post mit der Nachricht:
Teile ich meine Frage und Lösung hier:
Dies ist der Fehler:
Linie 154 ist das problem. Dies ist, was ich in Zeile 154:
Ich denke, das problem ist, dass ich Schreibe, wenn die Bedingungen für die variable
$city
, das ist nicht das entscheidende, sondern der Wert in$key => $city
. Zuerst konnte Sie bestätigen, ob das ist die Ursache der Warnung? Zweitens, wenn das ist das problem, warum es ist, dass ich nicht schreiben kann, ein Zustand, basierend auf dem Wert? Muss es sein, mit dem Schlüssel, den ich brauche, um zu schreiben, das für eine Bedingung?UPDATE 1: Das problem ist, dass bei der Ausführung
$citiesCounterArray[$key]
manchmal die$key
entspricht einem Schlüssel, der nicht vorhanden ist in der$citiesCounterArray
array, aber das ist nicht immer der Fall auf der Grundlage der Daten von meinem loop. Was ich brauche ist eine Bedingung, so dass, wenn$key
im Feld vorhanden, dann wird der code ausgeführt, andernfalls übersprungen.UPDATE 2: Das ist, wie ich es behoben indem
array_key_exists()
:InformationsquelleAutor
Diese Fehler auftreten, wenn wir über eine variable, die nicht festgelegt ist.
Der beste Weg, um mit diesen umzugehen ist festgelegt Fehlermeldungen während der Entwicklung.
Einstellen Fehler-reporting über:
Auf Produktions-Server für die Fehlerberichterstattung deaktiviert ist, deshalb bekommen wir auch nicht diese Fehler.
Auf dem Entwicklungs-server, aber wir können die Fehlerberichterstattung auf.
Um loszuwerden, diese Fehler, sehen wir das folgende Beispiel:
Können wir initialisieren die Variablen
NULL
bevor Sie Ihre Werte oder Ihre Verwendung.So, wir können den code ändern, wie:
Wird dies nicht stören, alle der Programm-Logik und wird nicht zu Bemerken, auch wenn
$test
keinen Wert.Also, grundsätzlich ist es immer besser, Fehler-reporting AUF für die Entwicklung.
Und beheben Sie alle Fehler.
Ist und auf Produktions -, Fehler-reporting, sollten aus sein.
InformationsquelleAutor
Diese Mitteilungen sind, weil Sie nicht über die verwendeten Variablen
defined
undmy_index
Schlüssel war nicht in$my_array
variable.Dieser Mitteilungen waren jedes mal ausgelöst, wenn, weil Ihr
code
ist nicht richtig, aber wahrscheinlich haben Sie nicht haben, die Berichterstattung dar.Lösen des bugs:
Anderen Weg, um dies heraus:
InformationsquelleAutor
In PHP müssen Sie zur Faust und definieren Sie die variable nach, dass Sie es verwenden können.
Wir können prüfen, variable definiert ist oder nicht in einer sehr effizienten Art und Weise!.
Einfache Erklärung
InformationsquelleAutor
Notice: Undefined variable
Vom großen Weisheit der PHP-Handbuch:
Vom In der PHP-Dokumentation:
Dies bedeutet, dass Sie nur
empty()
um zu bestimmen, ob die variable gesetzt ist, und darüber hinaus überprüft die variable gegen die folgenden,0
,0.0
,""
,"0"
,null
,false
oder[]
.Beispiel:
Testen Sie das obige snippet in den 3v4l.org online-PHP-editor
Obwohl PHP nicht erforderlich, eine Variablendeklaration, es tut es empfehlen, um zu vermeiden, dass einige Sicherheitslücken oder bugs, wo man vergessen würde zu geben, einen Wert zu einer variable, die verwendet wird später im Skript. Was PHP tut, im Fall von nicht deklarierten Variablen ist die Ausgabe ein sehr low-level-Fehler,
E_NOTICE
, eine, die sich auch nicht gemeldet standardmäßig, aber das Handbuch berät zu ermöglichen während der Entwicklung.Möglichkeiten, sich mit dem Thema:
Empfohlen: Deklarieren Sie Ihre Variablen, zum Beispiel, wenn Sie versuchen, eine Zeichenfolge angefügt an eine Undefinierte variable. Oder verwenden Sie
isset()
/!empty()
um zu überprüfen, ob Sie deklariert sind, bevor referenzieren, wie in:Diese geworden, viel sauberer als PHP-7.0, jetzt können Sie die null coalesce operator:
Legen Sie eine custom error handler für die E_NOTICE-Warnung, und leiten Sie die Nachrichten, die sich von der standard-Ausgabe (vielleicht in einer log-Datei):
Deaktivieren E_NOTICE aus der Berichterstattung. Ein schneller Weg, um auszuschließen, nur
E_NOTICE
ist:Unterdrücken, den Fehler mit der @ operator.
Hinweis: Es wird dringend empfohlen, zu implementieren, nur Punkt 1.
Notice: Undefined index, Undefined offset
Dieser Hinweis erscheint, wenn Sie (oder PHP) versuchen, Zugriff auf ein undefined index in einem array.
Möglichkeiten, sich mit dem Thema:
Prüfen, ob der index vorhanden ist, bevor Sie darauf zugreifen. Für diese können Sie verwenden,
isset()
oderarray_key_exists()
:Dem sprachkonstrukt
Listen()
erzeugen kann, wenn es versucht, Zugriff auf ein array-index, der nicht existiert:Beiden Variablen werden verwendet, um Zugriff auf zwei array-Elemente, aber es ist nur ein array-element-index
0
, so generiert diese:$_POST
/$_GET
/$_SESSION
variableDie Hinweise oben erscheinen oft bei der Arbeit mit
$_POST
,$_GET
oder$_SESSION
. Für$_POST
und$_GET
Sie müssen nur zu prüfen, ob der index existiert oder nicht, bevor Sie Sie verwenden. Für$_SESSION
Sie haben zu stellen Sie sicher, Sie haben die Sitzung begann mitsession_start()
und dass der index auch existiert.Beachten Sie auch, dass alle 3 Variablen sind superglobals und sind groß.
Verwandte:
@
) hat einige performance-Probleme. Auch, da es unterdrückt alle - Fehler in einem bestimmten Bereich verwenden, ohne Pflege kann die Maske Nachrichten, die Sie wünschte, du würdest sehen.$var = @$_GET['nonexisting'];
noch Ursachen feststellen..$value = isset($_POST['value']) ? $_POST['value'] : '';
statt mit 4.$value = @$_POST['value'];
?$str = '111';
(ich weiss es sollten array)isset($str[0])
wird true zurückgegeben. Es ist besser mit array_key_exist() statt isset()$_REQUEST += ['my_index' => null, '...' => null];
zu erfüllen, fehlende Indizes, bevor Verwendungen. In Fall, dass Sie bereits wissen, der index-Schlüssel."0"
.??
Betreiber, die nicht (PHP Dokumentation): "Es gibt die erste operand, wenn es existiert und nicht NULL ist; andernfalls gibt die zweite operand ist.", das ist genau das, was Sie brauchen, in den meisten Fällen.Versuchen diese
Oder als quick-and-dirty-Lösung:
Hinweis zu den Sitzungen:
Wenn die Verwendung von Sitzungen,
session_start();
ist erforderlich, um platziert werden alle Dateien mit sessions.http://php.net/manual/en/features.sessions.php
E_NOTICE
von derphp.ini
Konfigurationsdatei, tunerror_reporting = (E_ALL & ~E_NOTICE)
Fehleranzeige
@
- operatorFür die unerwünschten und überflüssigen Mitteilungen, könnte man die engagierten
@
- operator zu »verstecken« undefined variable/index Nachrichten.isset?:
oder??
super-supression jedoch. Hinweise noch bekommen können, angemeldet. Und man kann sich wiederbeleben@
-versteckte Hinweise mit:set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
in deinem ersten code.@
oderisset
nur nach überprüfung der Funktionen.@
ist vor allem akzeptabel für$_GET
/$_POST
input-Parameter, die speziell , wenn Sie optional.Und da dies deckt die meisten solcher Fragen näher auf die häufigsten Ursachen:
$_GET
/$_POST
/$_REQUEST
undefined inputErste, was Sie tun, wenn er eine " undefined index/offset -, ist zu überprüfen, für die Tippfehler:
$count = $_GET["whatnow?"];
Zweitens, wenn die Mitteilung nicht über eine offensichtliche Ursache, verwenden Sie
var_dump
oderprint_r
, um zu überprüfen, alle Eingabe-arrays für Ihren aktiven Inhalt:Beide offenbaren wird, wenn das Skript aufgerufen wurde, mit der rechten oder alle Parameter.
Alternativey oder zusätzlich verwenden Sie Ihre browser-devtools (F12) und untersuchen Sie die Registerkarte "Netzwerk" für die Anforderungen und Parameter:
POST-Parameter und Eingaben werden GESONDERT ausgewiesen.
Für
$_GET
Parameter können Sie auch Blick auf dieQUERY_STRING
inPHP hat einige Regeln zu coalesce nicht-standard-parameter-Namen in die superglobals. Apache könnte einige umschreiben als gut.
Sie können auch sehen Sie in der beiliegenden raw -
$_COOKIES
und andere HTTP-request-Header, die Art und Weise.Mehr offensichtlich sehen Sie in Ihrem browser die Adresse bar für GET-Parameter:
http://example.org/script.php?id=5&sort=desc
Den
name=value
Paare nach der?
Fragezeichen sind deine Abfrage (GET -) Parameter. Damit diese URL konnte mit nur mäßiger Ausbeute$_GET["id"]
und$_GET["sort"]
.Schließlich überprüfen Sie Ihre
<form>
und<input>
Erklärungen, wenn Sie erwarten einen parameter, erhalten aber keine.<input name=FOO>
id=
odertitle=
Attribut nicht ausreichen.method=POST
form sollte zum Auffüllen$_POST
.method=GET
(oder verlassen Sie es aus) ergeben würde$_GET
Variablen.action=script.php?get=param
via $_GET und die restlichenmethod=POST
Felder in $_POST neben.$_REQUEST['vars']
wieder, die Maischen GET-und POST-params.Wenn Sie mod_rewrite beschäftigt, dann sollten Sie prüfen sowohl die
access.log
sowie aktivieren derRewriteLog
, um herauszufinden, abwesend Parameter.$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
in Ihrem<form>
Erklärung.$_COOKIE
$_COOKIE
array wird niemals aufgefüllt rechts nachsetcookie()
, sondern nur auf irgendwelche Nachfolge-HTTP-Anforderung.In der Regel wegen des "schlechten Programmierung", und die Möglichkeit für Fehler, die sich jetzt oder später.
if (isset($varname))
, bevor Sie esEs bedeutet, dass Sie testen, evaluieren, oder drucken Sie eine variable, die noch nicht zugewiesen sind nichts. Es heißt, Sie haben entweder ein Tippfehler, oder Sie müssen prüfen, ob die variable initialisiert wurde etwas ersten. Überprüfen Sie Ihre Logik-Pfade, es kann eingestellt werden in einem Pfad in einem anderen aber nicht.
Wollte ich nicht deaktivieren, bemerken, weil es hilfreich ist, wollte aber vermeiden Sie zu viel Tipparbeit.
Meine Lösung war diese Funktion:
Also, wenn ich möchte Verweis auf $name und echo, wenn vorhanden, den ich einfach schreiben:
Array-Elemente:
In der Seite, wenn ich reden will $_REQUEST['name']:
$foo = "BABAR"; ifexists('foo');
wird im Allgemeinen null zurück. (Kursiv sind php.net Kapitel.)if( !empty($user) and !empty($location) ) echo "hello $user ..."
Den besten Weg für die erste Eingabe string ist:
Diese one-liner ist fast äquivalent zu:
Wenn Sie unbedingt wollen string Wert, genau wie:
Sein, weil die variable "$user_location' ist nicht immer definiert. Wenn Sie mit einem wenn-Schleife, in der man erklärt die '$user_location' variable dann müssen Sie auch eine else-Schleife und definieren die gleichen. Zum Beispiel:
Den obigen code erstellen Fehler wie Die if-Schleife nicht erfüllt und der else-Schleife '$user_location' wurde nicht definiert. Noch PHP wurde gebeten, echo aus der variable. So ändern Sie den code, müssen Sie Folgendes tun:
Antwort auf ""Warum erscheinen Sie plötzlich? Ich verwendet, um dieses Skript verwenden, für Jahre und ich habe nie ein problem gehabt."
Es ist sehr Häufig für die meisten Standorte für den Betrieb unter "default" error-reporting "Zeigt alle Fehler, aber nicht 'verstoßen' und 'veraltet'". Diese Einstellung in php.ini und gelten für alle Websites auf dem server. Dies bedeutet, dass diese "Hinweise" in den Beispielen benutzt wird ausgeblendet (versteckt) werden, während andere Fehler, die mehr als kritisch ist, wird angezeigt/aufgezeichnet.
Die andere wichtige Einstellung ist der Fehler versteckt werden können (d.h.
display_errors
auf "off" oder "syslog").Was passiert in diesem Fall, dass entweder die
error_reporting
wurde geändert, um auch zu zeigen, verstoßen (wie in den Beispielen) und/oder dass die Einstellungen geändert wurden, umdisplay_errors
auf dem Bildschirm (im Gegensatz zu unterdrücken/protokollieren).Warum haben Sie sich geändert?
Die offensichtliche/einfachste Antwort ist, dass jemand eingestellt die Einstellungen in php.ini, oder eine aktualisierte version von PHP ist jetzt mit einer anderen php.ini vorher ab. Das ist der erste Ort zu suchen.
Jedoch ist es auch möglich, diese Einstellungen zu überschreiben in
einem dieser könnte auch geändert worden.
Gibt es auch zusätzliche Komplikationen, die der web-server-Konfiguration aktivieren/deaktivieren .htaccess-Direktiven, also, wenn Sie Richtlinien .htaccess, die plötzlich anfangen/aufhören zu arbeiten, dann müssen Sie prüfen, dass für.
(.htconf /.htaccess übernehmen Sie ausführen als apache. Wenn mit Befehl Linie, das wird nicht gelten, wenn mit IIS oder andere webserver, dann müssen Sie überprüfen die configs entsprechend)
Zusammenfassung
error_reporting
unddisplay_errors
php-Direktiven in der php.ini hat sich nicht geändert, oder, dass Sie nicht mit einer anderen php.ini vorher ab.error_reporting
unddisplay_errors
php-Direktiven in .htconf (oder vhosts etc) haben sich nicht geänderterror_reporting
unddisplay_errors
php-Direktiven in .htaccess nicht geändert habenerror_reporting
unddisplay_errors
php-Direktiven wurden, eingestellt werden.quick-fix zuweisen Ihre Variablen auf null an der Spitze Ihres Codes
Ich verwendet, um den Fluch dieser Fehler, aber es kann hilfreich sein, um Sie daran zu erinnern, um zu entkommen Benutzereingaben.
Zum Beispiel, wenn Sie dachte, das war clever, Steno:
...Think again! Eine bessere Lösung ist:
(Ich benutze eine benutzerdefinierte
html()
Funktion escape-Zeichen, kann Ihre Laufleistung variieren)Ich die ganze Zeit eine eigene nützliche Funktion exst (), die automatisch Variablen deklarieren.
Ihre code -
In einem sehr Einfache Sprache.
Der Fehler ist, Sie verwenden eine variable
$user_location
ist nicht definiert, indem Sie früher und es hat keinen Wert, So empfehle ich Ihnen, bitte erklären diese variable vor mit es Zum Beispiel:$user_location = '';
Oder
$user_location = 'Los Angles';
Dies ist eine sehr häufige Fehlermeldung, die Sie kann Gesicht.Also keine Sorge, nur deklarieren Sie die variable und Genießen Kodierung.
In PHP 7.0 ist es nun möglich, den Null-coalescing operator:
Gleich:
PHP-Handbuch PHP-7.0
if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
isset()
, wenn Sie passis_array()
- das ist ein boolean, unerwartete Folgen.warum nicht die Dinge einfach halten?
WARUM IST DAS PASSIERT?
Laufe der Zeit, PHP hat sich zu einem mehr Sicherheit ausgerichtete Sprache. Einstellungen, die verwendet werden, die standardmäßig deaktiviert sind jetzt standardmäßig aktiviert. Ein perfektes Beispiel HIERFÜR ist
E_STRICT
wurde, standardmäßig aktiviert, da der PHP 5.4.0.Außerdem, laut der PHP-Dokumentation standardmäßig
E_NOTICE
ist disabled in php.ini. PHP-docs empfehlen drehen Sie es auf, für debugging-Zwecke. Allerdings, wenn ich download PHP aus dem Ubuntu-repository und von BitNami Windows-stack–sehe ich etwas anderes.Beachten Sie, dass
error_reporting
tatsächlich eingestellt, um die Produktion Wert standardmäßig nicht für die "default" - Wert standardmäßig. Dies ist etwas verwirrend und wird nicht dokumentiert, die außerhalb von php.ini, also ich habe nicht überprüft diese auf anderen Distributionen.Ihre Frage zu beantworten, aber diese Fehlermeldung erscheint nun, wenn es nicht pop-up, bevor Sie da:
Du PHP installiert und die neuen Standard-Einstellungen sind etwas schlecht dokumentiert, aber nicht auszuschließen
E_NOTICE
.E_NOTICE
Warnungen wie Undefinierte Variablen und undefinierten Indizes tatsächlich helfen, um Ihren code sauberer und sicherer zu machen. Ich kann Ihnen sagen, dass, vor Jahren, haltenE_NOTICE
aktiviert gezwungen mich zu erklären, meine Variablen. Es machte es VIEL leichter C zu lernen, waren nicht deklarieren von Variablen ist viel größer ein ärgernis.WAS KANN ICH DAGEGEN TUN?
Ausschalten
E_NOTICE
durch kopieren der "Default-Wert"E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
und ersetzen Sie es mit dem, was ist derzeit unkommentiert nach dem Gleichheitszeichen inerror_reporting =
. Starten Sie Apache, oder PHP, wenn per CGI oder FPM. Stellen Sie sicher, das Sie Bearbeiten die "richtige" php.ini. Die richtige Apache-wenn Sie PHP mit Apache, fpm oder php-fpm, wenn man PHP-FPM, cgi, wenn PHP-CGI, etc. Dies ist nicht die empfohlene Methode, aber wenn man legacy-code, die gehen, um extrem schwierig zu Bearbeiten, dann könnte es Ihre beste Wette.Ausschalten
E_NOTICE
auf die Datei oder den Ordner-Ebene. Dies könnte empfehlenswert sein, wenn Sie einige legacy-code, sondern wollen Dinge tun, die "richtige" Art und Weise anders. Um dies zu tun, sollten Sie Apache2, Nginx oder was auch immer Ihr server der Wahl ist. In Apache verwenden, würden Siephp_value
innerhalb von<Directory>
.Schreiben Sie Ihre code sauberer ist. Wenn Sie brauchen, um dies zu tun während der Bewegung in einer Produktionsumgebung oder nicht wollen, dass jemand zu sehen, Ihre Fehler, stellen Sie sicher, deaktivieren Sie alle anzeigen von Fehlern, und nur Protokollierung Ihre Fehler (siehe
display_errors
undlog_errors
in php.ini und server-Einstellungen).Erweitern option 3: Dies ist das ideal. Wenn Sie diesen Weg gehen, sollten Sie. Wenn Sie nicht diesen Weg gehen, zunächst in Erwägung ziehen diesen Weg schließlich durch testen Sie Ihren code in einer Entwicklungsumgebung. Während Sie gerade dabei sind, loswerden
~E_STRICT
und~E_DEPRECATED
um zu sehen, was könnte schief gehen in der Zukunft. Du wirst sehen, eine MENGE von fremden Fehlern, aber es geht um zu verhindern, dass unangenehme Probleme, wenn Sie benötigen, um ein upgrade von PHP in die Zukunft.WAS DIE FEHLER BEDEUTEN?
Undefined variable: my_variable_name
- Dies geschieht, wenn eine variable nicht definiert wurde, bevor Sie verwenden. Wenn das PHP-Skript ausgeführt wird, intern nimmt halt einen null-Wert. Aber in dem Szenario würden Sie eine variable, bevor es definiert wurde? Letztendlich ist dies ein argument für "sloppy code". Als Entwickler kann ich dir sagen, dass ich es Liebe, wenn ich sehe, eine open-source-Projekt, wo die Variablen definiert sind, wie hoch Ihre Spielräume, wie Sie definiert werden können. Es macht es einfacher zu sagen, was Variablen sind zu gehen, um pop-up in der Zukunft und macht es leichter zu Lesen/lernen der code.Undefined index: my_index
- Dies geschieht, wenn Sie versuchen, Zugriff auf einen Wert in ein array und es nicht vorhanden ist. Um diesen Fehler zu verhindern, führen Sie eine bedingte überprüfen.Weitere option ist zu erklären, ein leeres array an der Spitze Ihrer Funktion. Dies ist nicht immer möglich.
(weiterer Tipp)
vim
person in diesen Tagen :).undefined index bedeutet, der in ein array von Ihnen angeforderte nicht verfügbar für array-index zum Beispiel
undefined variable bedeutet, dass Sie verwendet haben, völlig nicht vorhandenen oder variable, die nicht definiert oder initialisiert werden, indem Sie diesen Namen zum Beispiel
undefined offset bedeutet, dass in der Reihe, um die Sie gebeten haben, für nicht vorhandene Schlüssel. Und die
die Lösung für dieses ist, vor Gebrauch zu überprüfen
Zu diesem Teil der Frage:
Keine definitiven Antworten, aber hier sind einige mögliche Erklärungen für warum-Einstellungen können 'plötzlich' ändern:
Upgrade von PHP auf eine neuere version, die anderen Standardeinstellungen für error_reporting, display_errors oder anderen relevanten Einstellungen.
Haben Sie entfernt oder eingeführt haben einige code, der (möglicherweise in einer Abhängigkeit) setzt, die relevanten Einstellungen, die zur Laufzeit mit
ini_set()
odererror_reporting()
(Suche nach diesen im code)Ändern Sie die webserver-Konfiguration (vorausgesetzt, dass apache hier):
.htaccess
Dateien und die vhost-Konfigurationen können auch manipulieren die php-Einstellungen.Regel verstoßen nicht angezeigt /gemeldet werden (siehe PHP-Handbuch)
so ist es möglich, dass bei der Konfiguration der server, die php.ini-Datei konnte nicht geladen werden für einige Grund (Datei-Berechtigungen??) und Sie wurden auf die Standard-Einstellungen. Später, der " bug " wurde behoben (durch einen Unfall) und jetzt KANN man es laden Sie die richtige php.ini-Datei mit dem error_reporting gesetzt, um zu zeigen, verstoßen.
Wenn die Arbeit mit Klassen, die Sie brauchen, um stellen Sie sicher, Referenz-member-Variablen mit
$this
:Ein weiterer Grund, warum ein undefined index notice geworfen wird, wäre das eine Spalte weggelassen wurde, aus einer Datenbank-Abfrage.
I. e.:
Dann versuchen, Zugriff auf mehrere Spalten/Zeilen innerhalb einer Schleife.
I. e.:
oder in einem
while
Schleife:Etwas anderes, das muss angemerkt werden, dass auf einem *NIX-OS und Mac-OS X, die Dinge sind case-sensitive.
Konsultieren Sie die followning Q&A auf Stack:
Sind die Tabellennamen in MySQL case-Sensitiv?
mysql case sensitive Tabellennamen in Abfragen
MySql - und Kleinschreibung Ausgabe der Tabellen in verschiedenen server
Mit einem ternäre ist einfach, lesbar und sauber:
Pre PHP 7
Weisen Sie einer Variablen den Wert einer anderen Variablen, wenn es gesetzt ist, sonst weisen Sie
null
(oder was auch immer Standard Wert):PHP 7+
Das gleiche, außer mit Null Coalescing-Operator. Es gibt nicht mehr eine Notwendigkeit zu nennen
isset()
wie diese gebaut wird, und keine Notwendigkeit die variable zurückzugeben, wie es übernommen, um den Rückgabewert der variable, die überprüft wird:Beide wird stop-die Hinweise von der OP-Frage, und beide sind das genaue äquivalent:
Wenn Sie nicht benötigen, setzen einer neuen variable dann können Sie direkt verwenden, um die dreistellige zurückgegebenen Wert, wie mit
echo
, Funktion, Argumente, etc:Echo:
Funktion:
Den oben genannten arbeiten werden genau das gleiche mit den arrays, einschließlich der Sitzungen, etc, ersetzen Sie die variable, die überprüft wird z.B.:
$_SESSION['checkMe']
oder wie viele Ebenen, die Sie benötigen, z.B.:
$clients['personal']['address']['postcode']
Unterdrückung:
Ist es möglich zu unterdrücken, um die PHP-Notizen mit
@
oder reduzieren Sie Ihre error reporting level, aber es nicht das problem zu beheben, es hört einfach auf, es wird berichtet in der error-log. Dies bedeutet, dass Ihr code immer noch versucht, eine variable zu verwenden, die nicht gesetzt wurde, die kann oder kann nicht bedeuten, etwas nicht so funktionieren wie Sie sollen - je nachdem, wie entscheidend der fehlende Wert ist.Sollten Sie wirklich prüfen, für diese Ausgabe und Handhabung ist es angemessen, entweder dienen eine andere Nachricht, oder auch nur die Rückgabe eines null-Wert als alles andere um die genaue Staat.
Wenn Sie nur Sorge um den Hinweis, nicht in die Fehler-log, dann als eine option, die Sie könnte Sie einfach ignorieren Sie den Fehler melden.
Wahrscheinlich, Sie wurden mit alten PHP-version, bis und jetzt aufgerüstet PHP das ist der Grund, es funktioniert ohne Fehler bis jetzt von Jahren.
bis PHP4 gab es keine Fehlermeldung, wenn Sie mithilfe von Variablen, ohne es zu definieren, sondern als von PHP5 weiter es wirft Fehler bei den codes, wie bereits erwähnt, in Frage stellen.
Beim Umgang mit Dateien, einen richtigen enctype-und eine POST-Methode benötigt, die trigger eine undefined index notice, wenn Sie entweder nicht in das Formular aufgenommen.
In der Anleitung steht die folgende grundlegende syntax:
HTML
PHP
Referenz:
Eine häufige Ursache für eine variable nicht nach einem HTML-Formular eingereicht wurde, ist das Formular-element ist nicht enthalten innerhalb einer
<form>
tag:Beispiel: Element nicht innerhalb der
<form>
Beispiel: Element nun innerhalb der
<form>
Fragte ich eine Frage dazu und ich war nach diesem post mit der Nachricht:
Teile ich meine Frage und Lösung hier:
Dies ist der Fehler:
Linie 154 ist das problem. Dies ist, was ich in Zeile 154:
Ich denke, das problem ist, dass ich Schreibe, wenn die Bedingungen für die variable
$city
, das ist nicht das entscheidende, sondern der Wert in$key => $city
. Zuerst konnte Sie bestätigen, ob das ist die Ursache der Warnung? Zweitens, wenn das ist das problem, warum es ist, dass ich nicht schreiben kann, ein Zustand, basierend auf dem Wert? Muss es sein, mit dem Schlüssel, den ich brauche, um zu schreiben, das für eine Bedingung?UPDATE 1: Das problem ist, dass bei der Ausführung
$citiesCounterArray[$key]
manchmal die$key
entspricht einem Schlüssel, der nicht vorhanden ist in der$citiesCounterArray
array, aber das ist nicht immer der Fall auf der Grundlage der Daten von meinem loop. Was ich brauche ist eine Bedingung, so dass, wenn$key
im Feld vorhanden, dann wird der code ausgeführt, andernfalls übersprungen.UPDATE 2: Das ist, wie ich es behoben indem
array_key_exists()
:Diese Fehler auftreten, wenn wir über eine variable, die nicht festgelegt ist.
Der beste Weg, um mit diesen umzugehen ist festgelegt Fehlermeldungen während der Entwicklung.
Einstellen Fehler-reporting über:
Auf Produktions-Server für die Fehlerberichterstattung deaktiviert ist, deshalb bekommen wir auch nicht diese Fehler.
Auf dem Entwicklungs-server, aber wir können die Fehlerberichterstattung auf.
Um loszuwerden, diese Fehler, sehen wir das folgende Beispiel:
Können wir initialisieren die Variablen
NULL
bevor Sie Ihre Werte oder Ihre Verwendung.So, wir können den code ändern, wie:
Wird dies nicht stören, alle der Programm-Logik und wird nicht zu Bemerken, auch wenn
$test
keinen Wert.Also, grundsätzlich ist es immer besser, Fehler-reporting AUF für die Entwicklung.
Und beheben Sie alle Fehler.
Ist und auf Produktions -, Fehler-reporting, sollten aus sein.
Diese Mitteilungen sind, weil Sie nicht über die verwendeten Variablen
defined
undmy_index
Schlüssel war nicht in$my_array
variable.Dieser Mitteilungen waren jedes mal ausgelöst, wenn, weil Ihr
code
ist nicht richtig, aber wahrscheinlich hatten Sie nicht die Berichterstattung von Mitteilungen auf.Lösen des bugs:
Anderen Weg, um dies heraus:
In PHP müssen Sie zur Faust und definieren Sie die variable nach, dass Sie es verwenden können.
Wir können prüfen, variable definiert ist oder nicht in einer sehr effizienten Art und Weise!.
Einfache Erklärung