error-reporting unterdrücken - Wie bekomme ich PHP-Fehler angezeigt?




im browser (20)

Ich habe meine PHP ini Datei überprüft und Anzeigefehler gesetzt ist und auch Fehler melden ist E_ALL . Ich habe meinen Apache-Webserver neu gestartet.

Ich habe diese Zeilen sogar an die Spitze meines Skripts gesetzt, und es werden nicht einmal einfache Syntaxfehler gefunden. Zum Beispiel deklariere ich Variablen mit einem "$" und schließe keine Anweisungen ";" . Aber alle meine Skripte zeigen eine leere Seite zu diesen Fehlern, aber ich möchte die Fehler in meiner Browser-Ausgabe sehen.

error_reporting(E_ALL);
ini_set('display_errors', 1);

Was bleibt zu tun?


Answers

Einige Webhosting-Anbieter können PHP-Parameter in der .htaccess- Datei ändern.

Sie können folgende Zeile hinzufügen:

php_value display_errors 1

Ich hatte das gleiche Problem wie Ihres und diese Lösung hat es behoben.


Das wird funktionieren:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>

Wenn Sie sich in einer Situation befinden, in der Sie die Einstellungen nicht über php.ini oder .htaccess ändern können, haben Sie kein Glück mehr, Fehler anzuzeigen, wenn Ihre PHP-Skripte Parse-Fehler enthalten. Sie müssten dann auflösen, um die Dateien in der Befehlszeile wie folgt einzufügen:

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

Wenn Ihr Host so gesperrt ist, dass der Wert nicht über php.ini oder .htaccess php.ini kann, darf der Wert auch nicht über ini_set . Sie können das mit dem folgenden PHP-Skript überprüfen:

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}

Hier ist ein PHP-Skript:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

Für eine detailliertere Erklärung von PHP-Fehlern besuchen Sie PHP Error - error_reporting () .


Die beste / einfachste / schnellste Lösung, die Sie verwenden können, wenn es sich um ein schnelles Debugging handelt, besteht darin, Ihren Code mit abfangenden Ausnahmen zu umgeben. Das mache ich, wenn ich bei der Produktion etwas schnell überprüfen will.

try {

//Page code

} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Ich hoffe das hilft.


Sie können einen eigenen benutzerdefinierten Fehlerhandler hinzufügen, der zusätzliche Debug-Informationen bereitstellen kann. Außerdem können Sie es einrichten, um Sie per E-Mail zu senden.

function ERR_HANDLER($errno ,$errstr, $errfile, $errline){
    $msg="<b>Someting bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0,$exception->getMessage(),$exception->getFile(),$exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"],$error["message"],$error["file"],$error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

Ich würde normalerweise mit dem folgenden Code in meinem einfachen PHP-Projekt gehen, die sehr klein sind, wenn das Projekt groß wird, dann werde ich empfehlen.

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT','DEVELOPMENT');
}

$base_url   =   null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url   =   'http://localhost/product/';
            ini_set('display_errors',1);
            ini_set('display_startup_errors',1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url   =   'Prod url'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}

Hoffe das hilft.


Dieser Code oben sollte funktionieren error_reporting (E_ALL);

Versuchen Sie jedoch, den Code am Telefon in der Datei zu bearbeiten

error_reporting = ein


Sie können keine Parse-Fehler abfangen, wenn die Fehlerausgabe zur Laufzeit aktiviert wird, da die Datei vor der eigentlichen Ausführung der Datei analysiert wird (und da sie dabei einen Fehler feststellt, wird nichts ausgeführt). Sie müssen die tatsächliche Serverkonfiguration ändern, damit display_errors aktiviert ist und die entsprechende error_reporting-Ebene verwendet wird. Wenn Sie keinen Zugriff auf die php.ini haben, können Sie abhängig vom Server möglicherweise .htaccess oder ähnliches verwenden.

Diese Frage kann zusätzliche Informationen liefern.


Wenn Sie trotz aller obigen Antworten (oder Sie können Ihre php.ini-Datei nicht bearbeiten) immer noch keine Fehlermeldung erhalten, versuchen Sie eine neue PHP-Datei zu erstellen, die Fehlerberichte ermöglicht und dann die Problemdatei einfügt. z.B:

error_reporting(9999999);
ini_set('display_errors', 1);
require_once('problem_file.php');

Obwohl alles in meiner php.ini Datei richtig eingestellt war, konnte ich nur dadurch einen Namespace-Fehler php.ini . Mein genaues Szenario war:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

Sie können Folgendes tun:

Legen Sie die Parameter in Ihrer Hauptindexdatei fest

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);

Dann können Sie anhand Ihrer Anforderung auswählen, welche Sie anzeigen möchten:

Für alle Fehler, Warnungen und Hinweise

    error_reporting(E_ALL); OR error_reporting(-1);

Für alle Fehler

    error_reporting(E_ERROR);

Für alle Warnungen

    error_reporting(E_WARNING);

Für alle Hinweise

    error_reporting(E_NOTICE);

Weitere Informationen finden Sie here


Einfach schreiben:

error_reporting(-1);

Benutzen:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Dies ist der beste Weg, um es zu schreiben, aber ein Syntaxfehler gibt eine leere Ausgabe. Verwenden Sie die Konsole also, um nach Syntaxfehlern zu suchen. Der beste Weg, um PHP-Code zu debuggen, ist die Verwendung der Konsole; führe folgendes aus:

php -l phpfilename.php

Wenn Sie xdebug installiert haben, können Sie jede Einstellung überschreiben, indem Sie Folgendes festlegen:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

Typ: int, Standardwert: 0, Eingeführt in Xdebug> = 2.3 Wenn diese Einstellung auf 1 gesetzt ist, werden immer Fehler angezeigt, unabhängig von der Einstellung von PHP's display_errors.

force_error_reporting

Typ: int, Standardwert: 0, Eingeführt in Xdebug> = 2.3 Diese Einstellung ist eine Bitmaske wie error_reporting. Diese Bitmaske wird logisch ODER-verknüpft mit der Bitmaske, die durch Fehlerreport dargestellt wird, um anzuzeigen, welche Fehler angezeigt werden sollen. Diese Einstellung kann nur in der php.ini vorgenommen werden und ermöglicht es Ihnen, bestimmte Fehler zu erzwingen, unabhängig davon, was eine Anwendung mit ini_set () ausführt.


Da wir PHP7 jetzt ausführen, sind die hier gegebenen Antworten nicht mehr korrekt. Der einzige noch in Ordnung ist der von Frank Forte, da er über PHP7 spricht. Auf der anderen Seite, anstatt zu versuchen, Fehler mit einem try / catch zu fangen, können Sie einen Trick verwenden: use include. Hier 3 Stück Code:

Datei: tst1.php

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
// Missing " and ;
echo "Testing
?>  

Das Ausführen in PHP7 zeigt nichts

Versuchen Sie Folgendes:

Datei: tst2.php

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
include ("tst3.php");
?> 

Datei: tst3.php

<?php
// Missing " and ;
echo "Testing
?>  

Führen Sie jetzt tst2 aus, das die Fehlerberichterstattung einstellt, und schließen Sie dann tst3 ein. Du wirst sehen:

Parse-Fehler: Syntaxfehler, unerwartetes Ende der Datei, erwartete Variable (T_VARIABLE) oder $ {(T_DOLLAR_OPEN_CURLY_BRACES) oder {$ (T_CURLY_OPEN) in tst3.php in Zeile 4


Erstellen Sie eine Datei namens php.ini in dem Ordner, in dem sich Ihre PHP-Datei befindet.

In php.ini fügen Sie den folgenden Code hinzu (Ich gebe einen einfachen Fehler, der den Code zeigt):

display_errors = on

display_startup_errors = on

Um alle Fehler anzuzeigen, müssen Sie:

1. Lassen Sie diese Zeilen im PHP-Skript, das Sie aufrufen, vom Browser (typischerweise index.php ):

error_reporting(E_ALL);
ini_set('display_errors', 1);

2. (a) Stellen Sie sicher, dass dieses Skript keine Syntaxfehler aufweist

-oder-

2. (b) Setze display_errors = On in deiner php.ini

Sonst kann es nicht einmal diese 2 Zeilen laufen!

Sie können in Ihrem Skript nach Syntaxfehlern suchen, indem Sie (in der Befehlszeile) Folgendes ausführen:

php -l index.php

Wenn Sie das Skript aus einem anderen PHP-Skript einfügen, werden Syntaxfehler im enthaltenen Skript angezeigt. Beispielsweise:

index.php

error_reporting(E_ALL);
ini_set('display_errors', 1);

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser

Das habe ich gelernt. In der Datei PHP.INI

error_reporting = E_ALL
display_errors = On

Setze dies in deiner index.php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Die MySQL-Erweiterung ist die älteste der drei und war die ursprüngliche Art und Weise, mit der Entwickler mit MySQL kommunizieren. Diese Erweiterung wird nun wegen der Verbesserungen in den neueren Versionen von PHP und MySQL zugunsten der mysqli_ anderen PDOdeprecated .mysqli_ PDO

  • mysqli_ ist die "verbesserte" Erweiterung für die Arbeit mit MySQL-Datenbanken. Es nutzt die Funktionen, die in neueren Versionen des MySQL-Servers verfügbar sind, stellt dem Entwickler sowohl eine funktionsorientierte als auch eine objektorientierte Schnittstelle zur Verfügung und erledigt einige andere einfache Dinge.

  • PDO bietet eine API, die die meisten Funktionen konsolidiert, die zuvor auf die wichtigsten Erweiterungen des Datenbankzugriffs verteilt wurden, z. B. MySQL, PostgreSQL, SQLite, MSSQL usw. Die Schnittstelle stellt dem Programmierer Objekte auf hoher Ebene zur Verfügung, die mit Datenbankverbindungen, Abfragen und Datenbanken arbeiten können Ergebnissätze und Low-Level-Treiber führen die Kommunikation und das Ressourcenhandling mit dem Datenbankserver durch. In PDO wird viel diskutiert und gearbeitet, und es wird als die geeignete Methode für das Arbeiten mit Datenbanken in modernem, professionellem Code betrachtet.





php error-reporting