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
“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
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 MySQLi – Dieser 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.
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:
-
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.
-
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:
- Call non-static method as static: PHP Fatal error: Using $this when not in object context
- Code kopieren: Schwerwiegender Fehler: Verwendung von $this, wenn nicht im Objektkontext
- Alle Fragen zu “$this verwenden, wenn nicht im Objektkontext” auf Stackoverflow
9949000cookie-checkReferenz – Was bedeutet dieser Fehler in PHP?yes
Um Diskussionen aus Kommentaren zu entfernen, gehen Sie bitte zu Das Metafrage
– Earlz
8. Oktober 2012 um 13:56 Uhr
X-Ref: PHP-Parse-/Syntaxfehler; und Wie löst man sie?; Anderswo: Häufige PHP-Fehler und Lösungen
– hakre
11. August 2013 um 21:47 Uhr
Sieh dir das an codierung.smashingmagazine.com/2011/11/30/… und dies auch mediawiki.org/wiki/Manual:Errors_and_symptoms
– Benutzer2543022
27. August 2013 um 14:26 Uhr
X-Referenz: Beheben von PHP-Fehlern (Mai 2013; von Jason McCreary)
– hakre
3. September 2013 um 16:37 Uhr