Referenz – Was bedeutet dieser Fehler in PHP?

Lesezeit: 10 Minuten

Was ist das?

Dies ist eine Reihe von Antworten zu Warnungen, Fehlern und Hinweisen, auf die Sie beim Programmieren von PHP stoßen könnten und die keine Ahnung haben, wie Sie sie beheben können. Dies ist auch ein Community-Wiki, daher ist jeder eingeladen, sich an der Ergänzung und Pflege dieser Liste zu beteiligen.

Warum ist das?

Fragen wie „Header bereits gesendet“ oder „Anruf eines Mitglieds eines Nicht-Objekts“ tauchen häufig auf Stack Overflow auf. Die Ursache dieser Fragen ist immer die gleiche. Die Antworten auf diese Fragen wiederholen sie also normalerweise und zeigen dem OP dann, welche Zeile in seinem speziellen Fall geändert werden muss. Diese Antworten fügen der Site keinen Wert hinzu, da sie nur für den speziellen Code des OP gelten. Andere Benutzer, die denselben Fehler haben, können die Lösung nicht einfach daraus lesen, weil sie zu lokalisiert sind. Das ist traurig, denn sobald Sie die Grundursache verstanden haben, ist es trivial, den Fehler zu beheben. Daher versucht diese Liste, die Lösung allgemein anzuwenden.

Was soll ich hier tun?

Wenn Ihre Frage als Duplikat dieser Frage markiert wurde, suchen Sie bitte unten nach Ihrer Fehlermeldung und wenden Sie die Korrektur auf Ihren Code an. Die Antworten enthalten in der Regel weitere Links, die untersucht werden können, falls dies aus der allgemeinen Antwort allein nicht ersichtlich sein sollte.

Wenn Sie einen Beitrag leisten möchten, fügen Sie bitte Ihre “Lieblings”-Fehlermeldung, -Warnung oder -Hinweis, eine pro Antwort, eine kurze Beschreibung der Bedeutung (auch wenn es sich nur um das Hervorheben von Begriffen auf ihrer Handbuchseite handelt), eine mögliche Lösung oder einen Debugging-Ansatz und hinzu eine Auflistung bestehender Fragen und Antworten, die von Wert sind. Fühlen Sie sich auch frei, vorhandene Antworten zu verbessern.

Die Liste

  • Nichts ist zu sehen. Die Seite ist leer und weiß. (auch bekannt als Weiße Seite/Bildschirm des Todes)
  • Code läuft nicht/scheinbar werden Teile meines PHP-Codes ausgegeben
  • Warnung: Header-Informationen können nicht geändert werden – Header wurden bereits gesendet
  • Warnung: mysql_fetch_array() erwartet, dass Parameter 1 eine Ressource ist, boolean gegeben alias
    Warnung: mysql_fetch_array(): Das angegebene Argument ist keine gültige MySQL-Ergebnisressource
  • Warnung: [function] erwartet, dass Parameter 1 eine Ressource ist, boolesch gegeben
  • Warnung: [function]: Öffnen des Streams fehlgeschlagen: [reason]
  • Warnung: open_basedir-Einschränkung in Kraft
  • Achtung: Division durch Null
  • Warnung: Unzulässiger String-Offset ‘XXX’
  • Warnung: count(): Parameter muss ein Array oder ein Objekt sein, das Countable implementiert
  • Error: Syntax Error, unerwartet ‘[‘
  • Parse error: syntax error, unexpected T_XXX
  • Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
  • Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
  • Parse error: syntax error, unexpected ‘require_once’ (T_REQUIRE_ONCE), expecting function (T_FUNCTION)
  • Parse error: syntax error, unexpected T_VARIABLE
  • Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX bytes)
  • Fatal error: Call to a member function … on a non-object or null
  • Fatal Error: Call to Undefined function XXX
  • Fatal Error: Cannot redeclare XXX
  • Fatal error: Can’t use function return value in write context
  • Fatal error: Declaration of AAA::BBB() must be compatible with that of CCC::BBB()’
  • Return type of AAA::BBB() should either be compatible with CCC::BBB(), or the #[\ReturnTypeWillChange] Attribut verwendet werden soll
  • Schwerwiegender Fehler: Verwendung von $this, wenn nicht im Objektkontext
  • Schwerwiegender Fehler: Objekt der Klasse Closure konnte nicht in String konvertiert werden
  • Schwerwiegender Fehler: Undefinierte Klassenkonstante
  • Schwerwiegender Fehler: Uncaught TypeError: Argument #n muss vom Typ x sein, y angegeben
  • Hinweis: Array-zu-String-Konvertierung
  • Hinweis: Versuch, die Eigenschaft eines Nicht-Objekt-Fehlers zu erhalten
  • Hinweis: Undefinierte Variable oder Eigenschaft
  • “Hinweis: Undefinierter Index” oder “Warnung: Undefinierter Array-Schlüssel”
  • Hinweis: Undefinierter Offset XXX [Reference]
  • Hinweis: Nicht initialisierter String-Offset: XXX
  • Hinweis: Verwendung der undefinierten Konstante XXX – angenommen ‘XXX’
  • MySQL: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax, um near … at line … zu verwenden.
  • Strenge Standards: Nicht statische Methode [<class>::<method>] sollte nicht statisch aufgerufen werden
  • Warnung: Die Funktion erwartet, dass Parameter X boolesch/String/Integer ist
  • HTTP-Fehler 500 – Interner Serverfehler
  • Veraltet: Die Zugriffssyntax für Arrays und Strings mit geschweiften Klammern ist veraltet

Siehe auch:

  • Referenz – Was bedeutet dieses Symbol in PHP?

Schwerwiegender Fehler: Aufruf einer Member-Funktion … für ein Nicht-Objekt

Passiert mit Code ähnlich wie xyz->method() wo xyz ist kein Objekt und daher das method kann nicht angerufen werden.

Dies ist ein schwerwiegender Fehler, der das Skript stoppen wird (Aufwärtskompatibilitätshinweis: Ab PHP 7 wird es zu einem abfangbaren Fehler).

Meistens ist dies ein Zeichen dafür, dass der Code keine Prüfungen auf Fehlerbedingungen enthält. Überprüfen Sie, ob ein Objekt tatsächlich ein Objekt ist, bevor Sie seine Methoden aufrufen.

Ein typisches Beispiel wäre

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

Im obigen Beispiel kann die Abfrage nicht vorbereitet und ausgeführt werden prepare() wird zuweisen false zu $statement. Versucht anzurufen execute() -Methode führt dann zu dem schwerwiegenden Fehler, weil false ist ein “Nicht-Objekt”, weil der Wert ein boolescher Wert ist.

Finden Sie heraus warum Ihre Funktion hat einen booleschen Wert anstelle eines Objekts zurückgegeben. Überprüfen Sie zum Beispiel die $pdo Objekt für den zuletzt aufgetretenen Fehler. Details zum Debuggen hängen davon ab, wie Fehler für die betreffende Funktion/Objekt/Klasse behandelt werden.

Wenn überhaupt die ->prepare scheitert dann dein $pdo Das Datenbank-Handle-Objekt wurde 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 kann darin bestehen, ein Objekt bedingt zu erstellen und dann zu versuchen, eine Methode außerhalb dieses bedingten Blocks aufzurufen. Zum Beispiel

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

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

Verwandte Fragen:

  • Aufruf einer Member-Funktion für ein Nicht-Objekt
  • Listen Sie alle PHP-Fragen zum Thema “Schwerwiegender Fehler: Aufruf einer Member-Funktion … für ein Nicht-Objekt” auf Stackoverflow auf

  • error_reporting(~0); warum nicht -1? Das ist was ~0 wertet zu und ist viel weniger kryptisch.

    – Fabrício Matté

    31. März 2013 um 2:43 Uhr


  • Ich denke, beide sind ähnlich kryptisch. ~0 ist expliziter IMO: negieren Sie den leeren Bitsatz, dh aktivieren alle Flaggen. -1 soll nicht wie in strpos() in C für «nicht gefunden» stehen, sondern als Bitset mit allen gesetzten Flags, da -1 binär ist 1111'1111'1111'1111 (für 32 Bit).

    – Nämlich

    31. März 2013 um 12:04 Uhr


  • Hoppla, 1111'1111'1111'1111 ist wirklich 16 Bit, aber ich hoffe, Sie verstehen, was ich meine.

    – Nämlich

    31. März 2013 um 13:38 Uhr


  • Ein weiterer Grund, warum Sie dies möglicherweise bekommen haben, ist, weil Sie gesetzt haben return false; in Ihrem PHP-Code

    – Maiskolben

    26. Oktober 2020 um 17:19 Uhr

“Hinweis: Undefinierter Index” oder “Warnung: Undefinierter Array-Schlüssel”

Tritt auf, wenn Sie versuchen, mit einem Schlüssel auf ein Array zuzugreifen, der nicht im Array vorhanden ist.

Ein typisches Beispiel für eine Undefined Index Hinweis wäre (Demo)

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

Beide spinach und 1 existieren nicht im Array, was zu einem führt E_NOTICE ausgelöst werden. In PHP 8.0 ist dies stattdessen ein E_WARNING.

Die Lösung besteht darin, sicherzustellen, dass der Index oder Offset vorhanden ist, bevor auf diesen Index zugegriffen wird. Dies kann bedeuten, dass Sie einen Fehler in Ihrem Programm beheben müssen, um sicherzustellen, dass diese Indizes vorhanden sind, wenn Sie dies erwarten. Oder es kann bedeuten, dass Sie testen müssen, ob die Indizes mit vorhanden sind array_key_exists oder isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

Wenn Sie Code haben wie:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

dann $_POST['message'] wird nicht festgelegt, wenn diese Seite zum ersten Mal geladen wird, und Sie erhalten den obigen Fehler. Nur wenn das Formular gesendet wird und dieser Code ein zweites Mal ausgeführt wird, ist der Array-Index vorhanden. Normalerweise überprüfen Sie dies mit:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Verwandte Fragen:

  • Referenz: „Hinweis: Undefinierte Variable“ und „Hinweis: Undefinierter Index“
  • Alle PHP “Notice: Undefined Index”-Fragen zu Stackoverflow
  • http://php.net/arrays

  • Ich neige dazu zu verwenden if(!empty($_POST['message'])){ //do stuff }

    – kurdtseite

    28. April 2019 um 23:02 Uhr

Warnung: mysql_fetch_array() erwartet, dass Parameter 1 eine Ressource ist, boolesch gegeben

Zuallererst:

Bitte nicht verwenden mysql_* Funktionen in neuem Code. Sie werden nicht mehr gepflegt und sind offiziell veraltet. Siehe die rote Kiste? Lernen vorbereitete Erklärungen stattdessen und verwenden PDO oder MySQLiDieser Beitrag hilft Ihnen bei der Entscheidung, welche. Wenn Sie sich für PDO entscheiden, hier ist eine gute Anleitung.


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

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

Sie müssen das von zurückgegebene Ergebnis überprüfen mysql_query durch

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Verwandte Fragen:

  • mysql_fetch_array() erwartet, dass Parameter 1 eine Ressource ist, ein boolescher Wert, der in select angegeben ist
  • Alle “mysql_fetch_array() erwartet Parameter 1 als Ressource, boolesch gegeben” Fragen zu Stackoverflow

Verwandte Fehler:

  • Warnung: [function] erwartet, dass Parameter 1 eine Ressource ist, boolesch gegeben

Andere mysql* Funktionen, die auch eine MySQL-Ergebnisressource als Parameter erwarten, erzeugen aus demselben Grund denselben Fehler.

  • Ich neige dazu zu verwenden if(!empty($_POST['message'])){ //do stuff }

    – kurdtseite

    28. April 2019 um 23:02 Uhr

Schwerwiegender Fehler: Verwendung von $this, wenn nicht im Objektkontext

$this ist eine spezielle Variable in PHP die nicht zugeordnet werden können. Wenn in einem Kontext darauf zugegriffen wird, in dem es nicht existiert, wird dieser schwerwiegende Fehler ausgegeben.

Dieser Fehler kann auftreten:

  1. Wenn eine nicht statische Methode statisch aufgerufen wird. Beispiel:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Wie repariert man: Überprüfen Sie Ihren Code erneut, $this kann nur in einem Objektkontext verwendet werden und sollte niemals in einer statischen Methode verwendet werden. Außerdem sollte eine statische Methode nicht auf die nicht statische Eigenschaft zugreifen. Verwenden self::$static_property um auf die statische Eigenschaft zuzugreifen.

  2. Wenn Code aus einer Klassenmethode in eine normale Funktion oder nur in den globalen Geltungsbereich kopiert wurde und halten die $this spezielle Variable.
    Wie repariert man: Überprüfen Sie den Code und ersetzen Sie ihn $this mit einer anderen Substitutionsvariable.

Verwandte Fragen:

  1. Call non-static method as static: PHP Fatal error: Using $this when not in object context
  2. Code kopieren: Schwerwiegender Fehler: Verwendung von $this, wenn nicht im Objektkontext
  3. Alle Fragen zu “$this verwenden, wenn nicht im Objektkontext” auf Stackoverflow

  • Vielleicht möchten Sie auch erwähnen, wie dies mit Closures funktioniert (sogar bei nicht statischen Methoden) und wie es in 5.4 “behoben” wird.

    – Kendall Hopkins

    7. Oktober 2012 um 18:12 Uhr

  • @hakre Ich habe über einen statischen Anruf in einer Schließung gesprochen. Wie $closure = function() { self::method(); }.

    – Kendall Hopkins

    9. Oktober 2012 um 16:55 Uhr

  • @KendallHopkins: Das ist ein anderer Fehler: “Schwerwiegender Fehler: Zugriff auf self:: nicht möglich, wenn kein Klassenbereich aktiv ist” Allerdings mit $this Sie können das Maßgeschneiderte auslösen “Schwerwiegender Fehler: Verwenden von $this, wenn nicht im Objektkontext” : $closure = function() { $this->method(); };

    – hakre

    9. Oktober 2012 um 17:02 Uhr


994900cookie-checkReferenz – Was bedeutet dieser Fehler in PHP?

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

Privacy policy