Frage Referenz - Was bedeutet dieser Fehler in PHP?


Was ist das?

Dies ist eine Anzahl von Antworten auf Warnungen, Fehler und Hinweise, die Sie beim Programmieren von PHP kennen lernen können und keine Ahnung haben, wie Sie diese beheben können. Dies ist auch ein Community-Wiki, so dass jeder eingeladen wird, diese Liste hinzuzufügen und zu pflegen.

Warum ist das?

Fragen wie "Header bereits gesendet" oder "Ein Mitglied eines Nicht-Objekts aufrufen" Popup häufig auf Stack Overflow. Die Ursache dieser Fragen ist immer dieselbe. Die Antworten auf diese Fragen wiederholen sie in der Regel und zeigen dann die OP, welche Zeile in ihrem speziellen Fall geändert werden soll. Diese Antworten fügen der Site keinen Wert hinzu, da sie nur für den jeweiligen Code des OP gelten. Andere Benutzer mit dem gleichen Fehler können die Lösung nicht einfach auslesen, da sie zu lokal sind. Das ist traurig, denn sobald Sie die Ursache erkannt haben, ist das Beheben des Fehlers trivial. Daher versucht diese Liste, die Lösung allgemein zu erklären.

Was soll ich hier machen?

Wenn Ihre Frage als ein Duplikat markiert wurde, finden Sie unten Ihre Fehlermeldung und wenden Sie das Update auf Ihren Code an. Die Antworten enthalten in der Regel weitere Links, die untersucht werden sollten, falls die allgemeine Antwort nicht klar sein sollte.

Wenn Sie etwas beitragen möchten, fügen Sie bitte Ihre "Lieblings" -Fehlermeldung, Warnung oder Hinweis, eine pro Antwort, eine kurze Beschreibung, was es bedeutet (auch wenn es nur Begriffe auf ihre Handbuchseite hervorhebt), eine mögliche Lösung oder Debugging-Ansatz und eine Auflistung vorhandener Q & A, die wertvoll sind. Fühlen Sie sich auch frei, vorhandene Antworten zu verbessern.

Die Liste

Siehe auch


907


Ursprung


Antworten:


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

Das passiert, wenn Ihr Skript versucht, einen HTTP-Header an den Client zu senden, aber bereits zuvor ausgegeben wurde, was dazu führte, dass die Header bereits an den Client gesendet wurden.

Das ist ein E_WARNING und es wird das Skript nicht stoppen.

Ein typisches Beispiel wäre eine Vorlagendatei wie diese:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

Das session_start() Die Funktion wird versuchen, Header mit dem Sitzungscookie an den Client zu senden. Aber PHP hat bereits Header gesendet, als es das geschrieben hat <html> Element zum Ausgabestrom. Du müsstest das verschieben session_start() Zum Seitenanfang.

Sie können dies lösen, indem Sie durch die Linien gehen Vor der Code, der die Warnung auslöst und überprüft, wo sie ausgegeben wird. Verschieben Sie einen Header, der Code vor diesem Code sendet.

Eine oft übersehene Ausgabe sind neue Zeilen nach dem Schließen von PHP ?>. Es ist eine Standardübung, die man weglassen sollte ?> wenn es das Letzte in der Datei ist. Ebenso ist eine andere häufige Ursache für diese Warnung beim Öffnen <?php hat ein leeres Leerzeichen, eine Zeile oder ein unsichtbares Zeichen davor, was dazu führt, dass der Webserver die Header und die Whitespace / Newline sendet, also wenn PHP mit dem Parsen beginnt, wird es keinen Header senden können.

Wenn Ihre Datei mehrere hat <?php ... ?> Code-Block in, sollten Sie keine Leerzeichen zwischen ihnen haben. (Hinweis: Sie könnten mehrere Blöcke haben, wenn Sie Code hatten, der automatisch konstruiert wurde)

Stellen Sie außerdem sicher, dass in Ihrem Code keine Byte-Bestellmarkierungen vorhanden sind, z. B. wenn die Codierung des Skripts UTF-8 mit BOM lautet.

Verwandte Fragen:


225



Schwerwiegender Fehler: Aufruf einer Member-Funktion ... bei einem Nicht-Objekt

Passiert mit ähnlichem Code xyz->method() woher xyz ist kein Objekt und deshalb auch nicht method kann nicht angerufen werden.

Dies ist ein schwerwiegender Fehler, der das Skript stoppt (Vorwärtskompatibilitätshinweis: Es wird ein abfangbarer Fehler, der mit PHP 7 beginnt).

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

EIN typisch Beispiel wäre

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

Im obigen Beispiel kann die Abfrage nicht vorbereitet werden und prepare() wird zuweisen false zu $statement. Versuche, die execute() Methode wird dann zu dem schwerwiegenden Fehler führen, weil false ist ein "Nicht-Objekt", da der Wert ein boolescher Wert ist.

Herausfinden Warum Ihre Funktion hat einen booleschen Wert anstelle eines Objekts zurückgegeben. Zum Beispiel, überprüfen Sie die $pdo Objekt für den letzten Fehler, der aufgetreten ist. Details darüber, wie Sie dies debuggen können, hängen davon ab, wie Fehler für die jeweilige Funktion / das fragliche Objekt / die betroffene Klasse gehandhabt werden.

Wenn auch die ->prepare scheitert dann dein $pdo Datenbank-Handle-Objekt wurde nicht in den aktuellen Umfang übernommen. Finde heraus, wo es definiert wurde. Dann übergeben Sie es als Parameter, speichern Sie es als Eigenschaft, oder teilen Sie es über den globalen Bereich.

Ein anderes Problem kann bedingt sein, ein Objekt zu erstellen und dann zu versuchen, eine Methode außerhalb dieses bedingten Blocks aufzurufen. Beispielsweise

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

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

Verwandte Fragen:


156



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

Auch bekannt als die Weiße Seite des Todes oder Weißer Bildschirm des Todes. Dies geschieht, wenn die Fehlerberichterstattung deaktiviert ist und ein schwerwiegender Fehler (häufig Syntaxfehler) aufgetreten ist.

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

Manchmal kann es einfacher sein, die Anzeige von Fehlern vorübergehend zu aktivieren. Die weiße Seite zeigt dann die Fehlermeldung an. Seien Sie vorsichtig, denn diese Fehler sind für jeden sichtbar, der die Website besucht.

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 wird die Anzeige von Fehlern aktivieren und die Berichterstattung auf die höchste Stufe setzen.

Seit der ini_set() Wird zur Laufzeit ausgeführt, hat es keine Auswirkungen auf Syntax- / Syntaxfehler. Diese Fehler werden im Protokoll angezeigt. Wenn Sie sie auch in der Ausgabe anzeigen möchten (z. B. in einem Browser), müssen Sie die Option display_startup_errors Richtlinie zu true. Tun Sie dies entweder in der php.ini oder in einem .htaccess oder von jede andere Methode, die sich auf die Konfiguration auswirkt Vor Laufzeit.

Sie können die gleichen Methoden verwenden, um das zu setzen log_fehler und Fehlerprotokoll Anweisungen, um Ihren eigenen Speicherort für Protokolldateien auszuwählen.

Wenn Sie im Protokoll suchen oder das Display verwenden, erhalten Sie eine viel bessere Fehlermeldung und die Codezeile, in der Ihr Skript zum Stillstand kommt.

Verwandte Fragen:

Ähnliche Fehler:


100



Hinweis: Undefinierter Index

Tritt auf, wenn Sie versuchen, auf ein Array mit einem Schlüssel 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 existiert nicht im Array, was zu einem E_NOTICE ausgelöst werden.

Die Lösung besteht darin, sicherzustellen, dass der Index oder Offset vor dem Zugriff auf diesen Index existiert. 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 existieren 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 array';
}

Wenn Sie Code wie haben:

<?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 übergeben wird und dieser Code ein zweites Mal ausgeführt wird, existiert der Array-Index. 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:


89



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

Zuallererst:

Bitte, nicht benutzen mysql_* Funktionen in neuem Code. Sie werden nicht mehr gepflegt und sind offiziell veraltet. Siehe die rote Box? Lernen vorbereitete Aussagen stattdessen und verwenden PDO oder MySQLi - Dieser Artikel wird Ihnen helfen zu entscheiden, welche. Wenn Sie PDO wählen, Hier ist ein gutes Tutorial.


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

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

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

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

Verwandte Fragen:

Zugehörige Fehler:

Andere mysql* Funktionen, die ebenfalls eine mysql-Ergebnisressource als Parameter erwarten, erzeugen aus dem gleichen Grund den gleichen Fehler.


75



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

$this ist eine spezielle Variable in PHP welche nicht zugeordnet werden können. Wenn auf einen Kontext zugegriffen wird, in dem er 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 im 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. Benutzen self::$static_property um auf die statische Eigenschaft zuzugreifen.

  2. Wenn Code aus einer Klassenmethode in eine normale Funktion oder nur in den globalen Bereich kopiert wurde und das behalten $thisspezielle Variable.
    Wie repariert man: Überprüfen Sie den Code und ersetzen Sie ihn $this mit einer anderen Substitutionsvariablen.

Verwandte Fragen:

  1. Nennen Sie die nicht statische Methode als statisch: PHP Fataler Fehler: Verwenden von $ this, wenn nicht im Objektkontext
  2. Kopieren Sie den Code: Schwerwiegender Fehler: Verwenden von $ this, wenn nicht im Objektkontext
  3. Alles "Using $ this, wenn nicht im Objektkontext" Fragen zu Stackoverflow

69



Schwerwiegender Fehler: Aufruf zu undefinierter Funktion XXX

Tritt auf, wenn Sie versuchen, eine Funktion aufzurufen, die noch nicht definiert ist. Häufige Ursachen sind fehlende Erweiterungen und Includes, bedingte Funktionsdeklarationen, Funktion in der Funktionsdeklaration oder einfache Tippfehler.

Beispiel 1 - Conditional Function Declaration

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

In diesem Fall, fn() wird nie erklärt, weil $someCondition ist nicht wahr.

Beispiel 2 - Funktion in der Funktionserklärung

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

In diesem Fall, fn wird nur einmal deklariert createFn() wird angerufen. Beachten Sie, dass nachfolgende Aufrufe an createFn() wird einen Fehler bei der Rückmeldung einer bestehenden Funktion auslösen.

Sie können dies auch für eine integrierte PHP-Funktion sehen. Suchen Sie nach der Funktion in das offizielle Handbuchund prüfen, zu welcher "Erweiterung" (PHP-Modul) es gehört und welche PHP-Versionen es unterstützen.

Im Fall einer fehlenden Erweiterung installiere diese Erweiterung und aktiviere sie in der php.ini. Informationen zu der Erweiterung, in der Ihre Funktion angezeigt wird, finden Sie in den Installationsanweisungen im PHP-Handbuch. Möglicherweise können Sie die Erweiterung auch mit Ihrem Paketmanager aktivieren oder installieren (z. apt in Debian oder Ubuntu, yum in Red Hat oder CentOS) oder ein Control Panel in einer Shared Hosting-Umgebung.

Wenn die Funktion in einer neueren Version von PHP von dem, was Sie verwenden, eingeführt wurde, finden Sie möglicherweise Links zu alternativen Implementierungen in dem Handbuch oder seinem Kommentarabschnitt. Wenn es aus PHP entfernt wurde, suchen Sie nach Informationen zu den Gründen, da dies möglicherweise nicht mehr erforderlich ist.

Stellen Sie bei fehlenden Includes sicher, dass die Datei, die die Funktion deklariert, vor dem Aufruf der Funktion eingefügt wird.

Im Falle von Tippfehlern, korrigieren Sie den Tippfehler.

Verwandte Fragen:


66



Parse-Fehler: Syntaxfehler, unerwarteter T_XXX

Passiert wenn du hast T_XXX Zeichen an unerwarteter Stelle, unausgewogene (überflüssige) Klammern, Verwendung von Short-Tags, ohne sie in php.ini zu aktivieren, und viele mehr.

Verwandte Fragen:

Für weitere Hilfe siehe:


65



Schwerwiegender Fehler: Kann den Funktionsrückgabewert im Schreibkontext nicht verwenden

Dies passiert normalerweise, wenn eine Funktion direkt mit verwendet wird empty.

Beispiel:

if (empty(is_null(null))) {
  echo 'empty';
}

Das ist weil empty ist ein Sprachkonstrukt und keine Funktion, es kann nicht mit einem Ausdruck als Argument in PHP-Versionen vor 5.5 aufgerufen werden. Vor PHP 5.5, das Argument zu empty()muss ein sein Variable, aber ein beliebiger Ausdruck (wie der Rückgabewert einer Funktion) ist in PHP 5.5+ zulässig.

emptyüberprüft trotz seines Namens nicht, ob eine Variable "leer" ist. Stattdessen prüft es, ob eine Variable nicht existiert, oder == false. Ausdrücke (wie is_null(null) im Beispiel) wird immer als existent angesehen, also hier empty prüft nur, ob es gleich falsch ist. Sie könnten ersetzen empty() hier mit !, z.B. if (!is_null(null))oder explizit mit falsch vergleichen, z.B. if (is_null(null) == false).

Verwandte Fragen:


60