650 Stimmen

Wie kann ich nützliche Fehlermeldungen in PHP erhalten?

Oft versuche ich, ein PHP-Skript auszuführen, und erhalte nur einen leeren Bildschirm zurück. Keine Fehlermeldung, nur ein leerer Bildschirm. Die Ursache könnte ein einfacher Syntaxfehler (falsche Klammer, fehlendes Semikolon), ein fehlgeschlagener Funktionsaufruf oder etwas ganz anderes sein.

Es ist sehr schwierig, herauszufinden, was schief gelaufen ist. Am Ende muss ich Code auskommentieren, überall "echo"-Anweisungen eingeben usw., um das Problem einzugrenzen. Aber es muss doch einen besseren Weg geben, oder?

Gibt es eine Möglichkeit, PHP dazu zu bringen, eine nützliche Fehlermeldung auszugeben, wie es Java tut?

1 Stimmen

5 Stimmen

@JuannStrauss, Das ist noch untertrieben. Und wenn Sie schließlich siehe die Fehler, es heißt T_PAAMAYIM_NEKUDOTAYIM . Oder vielleicht "muss eine Instanz von integer sein, integer gegeben" .

2 Stimmen

3voto

AVKurov Punkte 156

Für diejenigen, die nginx verwenden und einen weißen Bildschirm haben, auch für Dateien mit <?php echo 123; . In meinem Fall hatte ich diese erforderliche Option für PHP nicht in der nginx-Konfigurationsdatei:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Diese Option war nicht in der Datei fastcgi_params enthalten, so dass PHP nicht funktionierte und keine Fehler in den Protokollen auftraten.

0 Stimmen

Ich hatte das gleiche Problem und seine aufgrund Nginx Standard-Konfigurationsdatei fehlt diese Zeile.

2voto

Yogi Ghorecha Punkte 1256

PHP-Fehlerbehandlung

Manchmal läuft Ihre Anwendung nicht so, wie sie soll, was zu einem Fehler führt. Es gibt eine Reihe von Gründen, die zu Fehlern führen können, zum Beispiel:

Auf dem Webserver ist möglicherweise kein Speicherplatz mehr vorhanden Ein Benutzer hat möglicherweise einen ungültigen Wert in ein Formularfeld eingegeben Die Datei oder der Datenbankdatensatz, auf den Sie zugreifen wollten, existiert möglicherweise nicht. Die Anwendung hat möglicherweise keine Berechtigung, in eine Datei auf der Festplatte zu schreiben. Ein Dienst, auf den die Anwendung zugreifen muss, ist möglicherweise vorübergehend nicht verfügbar. Diese Arten von Fehlern werden als Laufzeitfehler bezeichnet, da sie zum Zeitpunkt der Ausführung des Skripts auftreten. Sie unterscheiden sich von Syntaxfehlern, die behoben werden müssen, bevor das Skript ausgeführt werden kann.

Eine professionelle Anwendung muss in der Lage sein, solche Laufzeitfehler elegant zu behandeln. Normalerweise bedeutet dies, dass der Benutzer klarer und präziser über das Problem informiert wird.

Verstehen der Fehlerstufen

Wenn ein Problem auftritt, das verhindert, dass ein Skript ordnungsgemäß ausgeführt wird, löst die PHP-Engine normalerweise einen Fehler aus. Jeder Fehler wird durch einen Integer-Wert und eine zugehörige Konstante dargestellt. In der folgenden Tabelle sind einige der üblichen Fehlerstufen aufgeführt:

enter image description here

Die PHP-Engine löst einen Fehler aus, wenn sie auf ein Problem mit Ihrem Skript stößt, aber Sie können auch selbst Fehler auslösen, um benutzerfreundlichere Fehlermeldungen zu erzeugen. Auf diese Weise können Sie Ihre Anwendung anspruchsvoller gestalten. Der folgende Abschnitt beschreibt einige gängige Methoden zur Fehlerbehandlung in PHP:

Grundlegende Fehlerbehandlung mit der Funktion die()

<?php // Try to open a non-existent file
     $file = fopen("sample.txt", "r");
?>

Wenn die Datei nicht existiert, erhalten Sie möglicherweise eine Fehlermeldung wie diese: Warning: fopen(sample.txt) [function.fopen]: failed to open stream: No such file or directory in C:\wamp\www\project\test.php in Zeile 2

Wenn wir einige einfache Schritte befolgen, können wir verhindern, dass die Benutzer solche Fehlermeldungen erhalten:

<?php
if(file_exists("sample.txt")){
    $file = fopen("sample.txt", "r");
} else{
    die("Error: The file you are trying to access doesn't exist.");
}
?>

Wenn Sie nun das obige Skript ausführen, erhalten Sie die folgende Fehlermeldung: Fehler: Die Datei, auf die Sie zuzugreifen versuchen, existiert nicht.

Wie Sie sehen können, können wir durch die Implementierung einer einfachen Prüfung, ob die Datei existiert oder nicht, bevor wir versuchen, auf sie zuzugreifen, eine Fehlermeldung erzeugen, die für den Benutzer aussagekräftiger ist.

Die oben verwendete Funktion die() zeigt einfach die benutzerdefinierte Fehlermeldung an und beendet das aktuelle Skript, wenn die Datei "sample.txt" nicht gefunden wird.

Erstellen eines benutzerdefinierten Fehlerhandlers

Sie können Ihre eigene Fehlerbehandlungsfunktion erstellen, um mit den von der PHP-Engine erzeugten Laufzeitfehlern umzugehen. Die benutzerdefinierte Fehlerbehandlung bietet Ihnen mehr Flexibilität und eine bessere Kontrolle über die Fehler. Sie kann den Fehler untersuchen und entscheiden, was mit dem Fehler zu tun ist, z. B. eine Meldung an den Benutzer anzeigen, den Fehler in einer Datei oder Datenbank protokollieren oder per E-Mail versenden, versuchen, das Problem zu beheben und weiterzumachen, die Ausführung des Skripts beenden oder den Fehler ganz ignorieren.

Die benutzerdefinierte Fehlerbehandlungsfunktion muss mindestens zwei Parameter (errno und errstr) verarbeiten können, kann aber optional drei weitere Parameter (errfile, errline und errcontext) akzeptieren, wie unten beschrieben:

enter image description here

Hier ist ein Beispiel für eine einfache benutzerdefinierte Funktion zur Fehlerbehandlung. Dieser Handler, customError(), wird immer dann ausgelöst, wenn ein Fehler auftritt, egal wie trivial er ist. Er gibt dann die Details des Fehlers an den Browser aus und stoppt die Ausführung des Skripts.

<?php
// Error handler function
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
?>

Sie müssen PHP mitteilen, dass es Ihre benutzerdefinierte Fehlerbehandlungsfunktion verwenden soll - rufen Sie einfach die eingebaute Funktion set_error_handler() auf und geben Sie den Namen der Funktion an.

<?php
// Error handler function
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}

// Set error handler
set_error_handler("customError");

// Trigger error
echo($test);
?>

Fehlerprotokollierung

Fehlermeldungen in einer Textdatei protokollieren

Sie können auch Details des Fehlers in der Protokolldatei protokollieren, etwa so:

<?php
function calcDivision($dividend, $divisor){
    if($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
        return false;
    } else{
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";

    error_log($message, 3, "logs/app_errors.log");
    die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>

Einen Fehler auslösen

Die PHP-Engine löst zwar immer dann einen Fehler aus, wenn sie auf ein Problem mit Ihrem Skript stößt, Sie können jedoch auch selbst Fehler auslösen. Dies kann dazu beitragen, Ihre Anwendung robuster zu machen, da potenzielle Probleme erkannt werden können, bevor sie sich zu schwerwiegenden Fehlern entwickeln.

Um einen Fehler in Ihrem Skript auszulösen, rufen Sie die Funktion trigger_error() auf und übergeben die Fehlermeldung, die Sie generieren möchten:

trigger_error("There was a problem.");

Betrachten Sie die folgende Funktion, die die Division von zwei Zahlen berechnet.

<?php
function calcDivision($dividend, $divisor){
    return($dividend / $divisor);
}

// Calling the function
echo calcDivision(10, 0);
?>

Wenn ein Wert von Null (0) als $divisor-Parameter übergeben wird, sieht der von der PHP-Engine erzeugte Fehler etwa so aus: Warnung: Division durch Null in C:\wamp\www\project\test.php in Zeile 3

Diese Nachricht scheint nicht sehr informativ zu sein. Betrachten Sie das folgende Beispiel, das die Funktion trigger_error() verwendet, um den Fehler zu erzeugen.

<?php
function calcDivision($dividend, $divisor){
    if($divisor == 0){
        trigger_error("The divisor cannot be zero", E_USER_WARNING);
        return false;
    } else{
        return($dividend / $divisor);
    }
}

// Calling the function
echo calcDivision(10, 0);
?>

Jetzt erzeugt das Skript diese Fehlermeldung: Warnung: Der Divisor kann nicht Null sein in C:\wamp\www\project\error.php in Zeile 4

Wie Sie sehen können, erklärt die Fehlermeldung des zweiten Beispiels das Problem deutlicher als die des vorherigen Beispiels.

0 Stimmen

Sie haben Ihre Antwort kopiert von tutorialrepublic.com/php-lehrgang/php-fehlerbehandlung.php ohne Namensnennung. Geben Sie die Arbeit anderer nicht als Ihre eigene aus.

2voto

too much php Punkte 85034

Sind Sie sicher, dass PHP tatsächlich die ' display_errors Einstellung aus .htaccess? Prüfen Sie die Ausgabe der phpinfo() Funktion, um sicher zu gehen.

Außerdem sollten Sie sicherstellen, dass Sie nicht ' @ ', könnte es Ihre Fehler zum Schweigen bringen, wenn Sie '@include ...' oder '@some_function(...)' irgendwo in der Stack-Trace verwendet haben.

0 Stimmen

Das ist es. display_errors ist in der serverweiten Konfiguration ausgeschaltet, aber es werden weniger Fehler angezeigt, wie z. B. nicht übereinstimmende Parameternummern usw. Ich habe nicht die @ Ich habe bei diesem Projekt noch nie einen Operator gesehen und vermeide ihn im Allgemeinen aus genau diesem Grund.

0 Stimmen

Sie sollten auch überprüfen, ob display_errors nicht irgendwo von einem PHP-Skript geändert wird.

0 Stimmen

Ich habe dieses Framework von Grund auf aufgebaut, also nein, ist es nicht (es sei denn, etwas im Kern ändert es aus irgendeinem Grund...)

2voto

Lewis LaCook Punkte 104

Versuchen Sie, die Fehlerberichtsstufe in Ihren aktuellen php-Dateien einzustellen. Oder, wie andere vorgeschlagen haben, überprüfen Sie Ihre Server-Einstellungen - es könnte etwas in der php.ini sein oder eine Einschränkung bei Ihrem Hoster. Verlassen Sie sich nicht nur auf .htaccess. Drucken Sie bei der Fehlersuche auch alle Variablen aus, die Ihnen verdächtig vorkommen könnten.

0 Stimmen

Ich habe keinen Zugriff auf die php.ini. Und wenn diese Fehler auftauchen, ist es ein Syntaxfehler, also hilft print_r nicht.

3 Stimmen

Wenn Sie keinen Zugriff auf die php.ini haben, sollten Sie nicht auf diesem Server entwickeln. Verwenden Sie Shared Hosting für die Produktion und Ihren lokalen Rechner für die Entwicklung.

0 Stimmen

Und wenn in der Produktion Fehler auftreten? Wir würden alle gerne glauben, dass das nicht passiert, aber es passiert.

1voto

Quamis Punkte 10581

Mit @inexistent_function_call(); in Ihrem Code bewirkt, dass der Intepreter stillschweigend stirbt und das Parsen des Skripts abbricht. Sie sollten nach ungültigen Funktionen suchen und versuchen, den fehlerunterdrückenden Operator (das @-Zeichen) nicht zu verwenden

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