1286 Stimmen

Referenz - Was bedeutet dieser Fehler in PHP?

Was ist das?

Dies ist eine Anzahl von Antworten zu Warnungen, Fehlern und Hinweisen, die Ihnen beim Programmieren von PHP begegnen können und zu denen Sie keine Ahnung haben, wie Sie sie beheben sollen. Dies ist auch ein Community-Wiki, zu dem jeder eingeladen ist, indem er diese Liste ergänzt und pflegt.

Warum ist das so?

Fragen wie "Headers already sent" oder "Aufruf eines Mitglieds eines Nicht-Objekts" tauchen häufig auf Stack Overflow auf. Die Ursache dieser Fragen ist immer dieselbe. Die Antworten auf diese Fragen wiederholen in der Regel dieselben Informationen und zeigen dann dem Fragesteller, welche Zeile sie in ihrem speziellen Fall ändern sollen. Diese Antworten fügen der Website keinen Mehrwert hinzu, weil sie nur auf den spezifischen Code des Fragestellers zutreffen. Andere Benutzer, die denselben Fehler haben, können die Lösung nicht leicht herausfinden, da sie zu lokalisiert sind. Das ist schade, denn sobald man die Ursache verstanden hat, ist es trivial, den Fehler zu beheben. Daher versucht diese Liste, die Lösung auf allgemeine Weise zu erklären, um sie anzuwenden.

Was soll ich hier machen?

Wenn Ihre Frage als Duplikat dieser hier markiert wurde, finden Sie unten Ihre Fehlermeldung und wenden Sie die Lösung auf Ihren Code an. Die Antworten enthalten in der Regel weitere Links, um zu untersuchen, falls es nicht klar genug aus der allgemeinen Antwort allein wird.

Wenn Sie einen Beitrag leisten möchten, fügen Sie bitte Ihre "Lieblings"-Fehlermeldung, Warnung oder Hinweis hinzu, eine kurze Beschreibung dessen, was sie bedeutet (auch wenn es nur sind Hervorhebung von Begriffen auf ihrer Handbuchseite), einen möglichen Lösungsansatz oder Debugging-Ansatz und eine Auflistung von vorhandenen Q&A, die von Wert sind. Fühlen Sie sich auch frei, vorhandene Antworten zu verbessern.

Die Liste

Siehe auch:

305voto

Gordon Punkte 304254

Warnung: Header Informationen können nicht geändert werden - Header wurden bereits gesendet

Tritt auf, wenn Ihr Skript versucht, einen HTTP-Header an den Client zu senden, aber bereits zuvor Ausgabe vorhanden war, was dazu führte, dass die Header bereits an den Client gesendet wurden.

Dies ist eine E_WARNING und es wird das Skript nicht stoppen.

Ein typisches Beispiel wäre eine Vorlagendatei wie diese:

    Meine Seite

...

Die Funktion session_start() wird versuchen, Header mit dem Session-Cookie an den Client zu senden. Aber PHP hat bereits Header gesendet, als es das -Element in den Ausgabestrom schrieb. Sie müssten session_start() nach oben verschieben.

Sie können dies lösen, indem Sie die Zeilen vor dem Code durchgehen, der die Warnung auslöst, und überprüfen, wo er Ausgaben erzeugt. Verschieben Sie jeglichen Header-Sendecode vor diesen Code.

Eine oft übersehene Ausgabe sind neue Zeilen nach dem Schließen von PHP's ?>. Es gilt als Standardpraxis, ?> zu ignorieren, wenn es das Letzte in der Datei ist. Ebenso ist eine häufige Ursache für diese Warnung, wenn das öffnende ein Leerzeichen, eine Zeile oder ein unsichtbares Zeichen davor hat, was dazu führt, dass der Webserver die Header und das Leerzeichen/Zeilenumbruch sendet, so dass PHP beim Parsen keinen Header übermitteln kann.

`

Wenn Ihre Datei mehr als einen -Codeblock enthält, sollten Sie keine Leerzeichen dazwischen haben. (Hinweis: Sie könnten mehrere Blöcke haben, wenn Sie Code haben, der automatisch erstellt wurde)

Stellen Sie außerdem sicher, dass Sie keine Byte Order Marks in Ihrem Code haben, zum Beispiel wenn die Codierung des Skripts UTF-8 mit BOM ist.

Ähnliche Fragen:

`

208voto

hakre Punkte 184133

Schwerwiegender Fehler: Aufruf einer Methode an einem Nicht-Objekt

Tritt bei ähnlichem Code wie xyz->methode() auf, wobei xyz kein Objekt ist und daher die methode nicht aufgerufen werden kann.

Dies ist ein schwerwiegender Fehler, der das Skript stoppt (Hinweis zur Vorwärtskompatibilität: Ab PHP 7 wird es zu einem auffangbaren Fehler).

Oft deutet dies darauf hin, dass der Code keine Überprüfungen auf Fehlerbedingungen hat. Überprüfen Sie, dass es sich bei einem Objekt tatsächlich um ein Objekt handelt, bevor Sie seine Methoden aufrufen.

Ein typisches Beispiel wäre

// ... etwas Code mit PDO
$anweisung = $pdo->prepare('ungültige Abfrage', ...);
$anweisung->execute(...);

In dem obigen Beispiel kann die Abfrage nicht vorbereitet werden und prepare() weist false an $anweisung zu. Wenn Sie dann versuchen, die Methode execute() aufzurufen, führt dies zu dem schwerwiegenden Fehler, da false kein "Objekt" ist, sondern ein Boolean-Wert.

Finden Sie heraus, weshalb Ihre Funktion anstelle eines Objekts einen Boolean-Wert zurückgegeben hat. Überprüfen Sie beispielsweise das $pdo-Objekt auf den zuletzt aufgetretenen Fehler. Details zur Fehlerbehebung hängen davon ab, wie Fehler für die jeweilige Funktion/das jeweilige Objekt/die Klasse behandelt werden.

Wenn sogar das ->prepare scheitert, wurde Ihr Datenbankverbindungs-Objekt $pdo möglicherweise nicht in den aktuellen Bereich übergeben. Finden Sie heraus, wo es definiert wurde. Übergeben Sie es dann als Parameter, speichern Sie es als Eigenschaft oder teilen Sie es über den globalen Bereich.

Ein weiteres Problem könnte sein, dass bedingt ein Objekt erstellt und dann außerhalb dieses bedingten Blocks eine Methode aufgerufen wird. Zum Beispiel

if ($irgendeineBedingung) {
    $meinObj = new MeinObj();
}
// ...
$meinObj->irgendeineMethode();

Indem Sie versuchen, die Methode außerhalb des bedingten Blocks auszuführen, ist Ihr Objekt möglicherweise nicht definiert.

Verwandte Fragen:

131voto

nalply Punkte 23497

Nichts ist zu sehen. Die Seite ist leer und weiß.

Auch bekannt als die Weiße Seite des Todes oder Weiße Bildschirm des Todes. Dies geschieht, wenn die Fehlermeldung deaktiviert ist und ein schwerwiegender Fehler (oft Syntaxfehler) auftritt.

Wenn Sie die Fehlerprotokollierung aktiviert haben, finden Sie die konkrete Fehlermeldung in Ihrem Fehlerprotokoll. Dies wird normalerweise in einer Datei namens "php_errors.log" sein, entweder an einem zentralen Ort (z. B. /var/log/apache2 in vielen Linux-Umgebungen) oder im Verzeichnis des Skripts selbst (manchmal in einer shared-Hosting-Umgebung verwendet).

Manchmal ist es möglicherweise einfacher, vorübergehend die Anzeige von Fehlern zu aktivieren. Die weiße Seite wird dann die Fehlermeldung anzeigen. Seien Sie vorsichtig, denn diese Fehler sind für alle Besucher der Website sichtbar.

Dies kann leicht durch Hinzufügen des folgenden PHP-Codes am Anfang des Skripts erfolgen:

ini_set('display_errors', 1); error_reporting(~0);

Der Code aktiviert die Anzeige von Fehlern und setzt die Berichterstattung auf das höchste Niveau.

Da das ini_set() zur Laufzeit ausgeführt wird, hat es keine Auswirkungen auf Syntaxfehler. Diese Fehler erscheinen im Protokoll. Wenn Sie sie auch im Output anzeigen möchten (z. B. in einem Browser), müssen Sie die display_startup_errors-Direktive auf true setzen. Tun Sie dies entweder in der php.ini oder in einer .htaccess-Datei oder durch eine beliebige andere Methode, die die Konfiguration vor der Laufzeit beeinflusst.

Sie können die gleichen Methoden verwenden, um die Direktiven log_errors und error_log festzulegen, um Ihren eigenen Protokolldateispeicherort auszuwählen.

Wenn Sie im Protokoll nachsehen oder die Anzeige verwenden, erhalten Sie eine weitaus bessere Fehlermeldung und die Codezeile, an der Ihr Skript zum Stillstand kommt.

Ähnliche Fragen:

Ähnliche Fehler:

113voto

Gordon Punkte 304254

"Hinweis: Undefinierter Index" oder "Warnung: Undefinierter Array-Schlüssel"

Tritt auf, wenn versucht wird, auf ein Array mit einem Schlüssel zuzugreifen, der im Array nicht existiert.

Ein typisches Beispiel für einen Undefinierter Index-Hinweis wäre (Demo)

$data = array('foo' => '42', 'bar');
echo $data['spinat'];
echo $data[1];

Sowohl spinat als auch 1 existieren nicht im Array, was dazu führt, dass ein E_NOTICE ausgelöst wird. In PHP 8.0 ist dies stattdessen ein E_WARNING.

Die Lösung besteht darin, sicherzustellen, dass der Index oder der Offset vorhanden ist, bevor auf diesen Index zugegriffen wird. Dies kann bedeuten, dass ein Fehler in Ihrem Programm behoben werden muss, um sicherzustellen, dass diese Indizes existieren, wenn Sie es erwarten. Oder es kann bedeuten, dass Sie überprüfen müssen, ob die Indizes mit array_key_exists oder isset existieren:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinat', $data)) {
    echo $data['spinat'];
}
else {
    echo 'Kein Schlüssel "spinat" im Array vorhanden';
}

Wenn Sie Code wie diesen haben:

dann wird $_POST['message'] nicht gesetzt, wenn diese Seite zum ersten Mal geladen wird, und Sie erhalten den oben genannten Fehler. Erst wenn das Formular abgesendet wird und dieser Code ein zweites Mal ausgeführt wird, existiert der Array-Index. Normalerweise überprüfen Sie dies mit:

if ($_POST)  ..  // wenn das $_POST-Array nicht leer ist
// oder
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // Seite wurde mit POST angefordert

Ähnliche Fragen:

95voto

xdazz Punkte 155864

Warnung: mysql_fetch_array() erwartet als Parameter 1 ein Ressource, boolean gegeben

Zuallererst:

*Bitte verwenden Sie keine `mysql_` Funktionen in neuem Code**. Sie werden nicht mehr gewartet und sind offiziell veraltet. Siehst du das rote Kästchen? Informieren Sie sich über prepared statements und verwenden Sie stattdessen PDO oder MySQLi - dieser Artikel wird Ihnen bei der Entscheidung helfen. Wenn Sie sich für PDO entscheiden, gibt es hier ein gutes Tutorial: hier ist ein gutes Tutorial.


Dies tritt auf, wenn Sie versuchen, Daten aus dem Ergebnis von mysql_query abzurufen, aber die Abfrage fehlgeschlagen ist.

Dies ist eine Warnung und wird das Skript nicht stoppen, aber Ihr Programm falsch machen.

Sie müssen das Ergebnis überprüfen, das von mysql_query zurückgegeben wird, indem Sie

$res = mysql_query($sql);
if (!$res) {
   trigger_error(mysql_error(),E_USER_ERROR);
}
// Nach der Überprüfung Daten abrufen

Ähnliche Fragen:

Ähnliche Fehler:

Andere mysql* Funktionen, die auch eine MySQL-Ergebnisressource als Parameter erwarten, werden aus dem gleichen Grund denselben Fehler produzieren.

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