Hoe zorg ik ervoor dat PHP-fouten worden weergegeven?

Ik heb mijn PHP ini-bestand (php.ini) gecontroleerd en display_errorsis ingesteld en ook de foutrapportage is E_ALL. Ik heb mijn Apache-webserver opnieuw opgestart.

Ik heb deze regels zelfs bovenaan mijn script gezet, en het vangt zelfs geen simpele parseerfouten op. Ik declareer bijvoorbeeld variabelen met een "$"en ik sluit geen statements";". Maar al mijn scripts tonen een blanco pagina over deze fouten, maar ik wil de foutenin de uitvoer van mijn browser zien.

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

Wat valt er nog te doen?


Antwoord 1, autoriteit 100%

Dit werkt altijd voor mij:

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

Dit zorgt er echter niet voor dat PHP parseerfouten toont – de enige manier om die fouten te tonen is door je php.ini aan te passen met deze regel:

display_errors = on

(als je geen toegang hebt tot php.ini, dan kan het plaatsen van deze regel in .htaccessook werken):

php_flag display_errors 1

Antwoord 2, autoriteit 5%

Je kunt geen parseerfouten opvangen als je de uitvoer van fouten tijdens runtime inschakelt, omdat het het bestand parseert voordat het daadwerkelijk iets uitvoert (en aangezien het hierbij een fout tegenkomt, zal het niets uitvoeren). U moet de feitelijke serverconfiguratie wijzigen zodat display_errors is ingeschakeld en het juiste error_reporting-niveau wordt gebruikt. Als je geen toegang hebt tot php.ini, kun je mogelijk .htaccess of iets dergelijks gebruiken, afhankelijk van de server.

Deze vraagkan aanvullende informatie opleveren.


Antwoord 3, autoriteit 4%

In uw php.ini:

display_errors = on

Herstart vervolgens uw webserver.


Antwoord 4, autoriteit 3%

Om alle fouten weer te geven, moet u:

1. Zorg dat deze regels in het PHP-script staan dat je vanuit de browser aanroept (meestal index.php):

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

2.(a) Zorg ervoor dat dit script geen syntaxisfouten bevat

—of—

2.(b) Zet display_errors = Onin uw php.ini

Anders kan het die 2 regels niet eens uitvoeren!

U kunt controleren op syntaxisfouten in uw script door het volgende uit te voeren (op de opdrachtregel):

php -l index.php

Als u het script opneemtvan een ander PHP-script, dan geeft het syntaxisfoutenweer in het meegeleverde-script. Bijvoorbeeld:

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

Antwoord 5, autoriteit 2%

Bij sommige webhostingproviders kunt u PHP-parameters wijzigen in het .htaccess-bestand.

U kunt de volgende regel toevoegen:

php_value display_errors 1

Ik had hetzelfde probleem als het uwe en deze oplossing heeft het opgelost.


Antwoord 6

Het kan zijn dat alle instellingen voor “foutrapportage” of “weergavefouten” niet lijken te werken in PHP 7. Dat komt omdat de foutafhandeling is veranderd. Probeer in plaats daarvan dit:

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

Of, om uitzonderingen en fouten in één keer op te vangen (dit is niet achterwaarts compatibel met PHP 5):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

Antwoord 7

Dit werkt:

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

Antwoord 8

Gebruik:

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

Dit is de beste manier om het te schrijven, maar een syntaxisfout geeft lege uitvoer, dus gebruik de console om te controleren op syntaxisfouten. De beste manier om PHP-code te debuggen is door de console te gebruiken; voer het volgende uit:

php -l phpfilename.php

Antwoord 9

Stel dit in in uw index.phpbestand:

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

Antwoord 10

Maak een bestand met de naam php.iniin de map waar uw PHP-bestand zich bevindt.

Voeg binnen php.ini de volgende code toe (ik geef een eenvoudige fout bij het weergeven van code):

display_errors = on
display_startup_errors = on

Antwoord 11

Omdat we nu PHP 7 gebruiken, zijn de hier gegeven antwoorden niet meer correct. De enige die nog in orde is, is die van Frank Forte, zoals hij het heeft over PHP 7.

Aan de andere kant, in plaats van te proberen fouten op te vangen met een try/catch, kun je een truc gebruiken: gebruik include.

Hier drie stukjes code:

Bestand: tst1.php

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

Als u dit in PHP 7 uitvoert, wordt er niets weergegeven.

Probeer nu dit:

Bestand: tst2.php

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

Bestand: tst3.php

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

Voer nu tst2 uit waarmee de foutrapportage wordt ingesteld en voeg vervolgens tst3 toe. Je zult zien:

Parseerfout: syntaxisfout, onverwacht einde van bestand, verwacht variabele (T_VARIABLE) of ${ (T_DOLLAR_OPEN_CURLY_BRACES) of {$ (T_CURLY_OPEN) in tst3.php op regel 4


Antwoord 12

Als je ondanks het volgen van alle bovenstaande antwoorden (of als je je php.ini-bestand niet kunt bewerken), nog steeds geen foutmelding krijgt, probeer dan een nieuw PHP-bestand te maken dat foutrapportage mogelijk maakt en voeg dan de probleem bestand. bv:

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

Ondanks dat alles correct was ingesteld in mijn php.ini-bestand, was dit de enige manier waarop ik een naamruimtefout kon opvangen. Mijn exacte scenario was:

//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 {
    ...
}

Antwoord 13

Ik zou normaal gesproken de volgende code gebruiken in mijn eenvoudige PHP-projecten.

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 = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;
        default:
            exit('The application environment is not set correctly.');
    }
}

Antwoord 14

Als u zich op de een of andere manier in een situatie bevindt waarin u de instelling niet kunt wijzigen via php.iniof .htaccess, heeft u pech omdat u fouten weergeeft wanneer uw PHP-scripts bevatten parseerfouten. Je zou dan moeten oplossen om de bestanden op de opdrachtregelals volgt te pluizen :

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

Als uw host zo vergrendeld is dat het niet toestaat de waarde te wijzigen via php.iniof .htaccess, kan het ook niet toestaan de waarde te wijzigen via ini_set. Je kunt dat controleren met het volgende PHP-script:

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

Antwoord 15

Je kunt zoiets als hieronder doen:

Stel de onderstaande parameters in uw hoofdindexbestand in:

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

Vervolgens kunt u op basis van uw vereisten kiezen welke u wilt laten zien:

Voor allefouten, waarschuwingen en mededelingen:

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

Voor allefouten:

   error_reporting(E_ERROR);

Voor allewaarschuwingen:

   error_reporting(E_WARNING);

Voor allekennisgevingen:

   error_reporting(E_NOTICE);

Voor meer informatie, kijk hier.


Antwoord 16

U kunt uw eigen aangepaste fouthandler toevoegen, die extra foutopsporingsinformatie kan bieden. Bovendien kun je het instellen om je de informatie via e-mail te sturen.

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something 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");

Antwoord 17

Deze code bovenaan zou moeten werken:

error_reporting(E_ALL);

Probeer echter de code op de telefoon in het bestand te bewerken:

error_reporting =on

Antwoord 18

De beste/gemakkelijke/snelle oplossing die je kunt gebruiken als het om snel debuggen gaat, is om je code te omringen met catch-uitzonderingen. Dat is wat ik doe als ik iets snel in productie wil controleren.

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

Antwoord 19

   <?php
    // Turn off error reporting
    error_reporting(0);
    // Report runtime errors
    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    // Report all errors
    error_reporting(E_ALL);
    // Same as error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);
    // Report all errors except E_NOTICE
    error_reporting(E_ALL & ~E_NOTICE);
    ?>

Zolang je site live is, moet het bestand php.iniom veiligheidsredenen display_errors hebben uitgeschakeld. Voor de ontwikkelomgeving kan display_errors echter worden ingeschakeld voor het oplossen van problemen.


Antwoord 20

Schrijf gewoon:

error_reporting(-1);

Antwoord 21

U kunt dit doen door het php.ini-bestand te wijzigen en het volgende toe te voegen

display_errors = on
display_startup_errors = on

OF je kunt ook de volgende code gebruiken, omdat dit altijd voor mij werkt

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

Antwoord 22

Als je Xdebughebt geïnstalleerd, kun je elke instelling overschrijven door het volgende in te stellen:

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

force_display_errors

Type: int, Standaardwaarde: 0, Geïntroduceerd in Xdebug >= 2.3 Als dit
instelling is ingesteld op 1, dan worden fouten altijd weergegeven, ongeacht
wat de instelling van PHP’s display_errors is.

force_error_reporting

Type: int, Standaardwaarde: 0, Geïntroduceerd in Xdebug >= 2.3
Deze instelling is een bitmasker, zoals error_reporting. Dit bitmasker wordt logisch geORd met het bitmasker weergegeven door error_reporting om te bepalen welke fouten moeten worden weergegeven. Deze instelling kan alleen worden gemaakt in php.ini en stelt je in staat om bepaalde fouten te forceren, ongeacht wat een applicatie doet met ini_set().


Antwoord 23

Misschien wil je deze code gebruiken:

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

Antwoord 24

Meld alle fouten behalve E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Alle PHP-fouten weergeven

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Alle foutrapportage uitschakelen

error_reporting(0);

Antwoord 25

Als het op de opdrachtregel staat, kun je phpuitvoeren met -ddisplay_errors=1om de instelling in php.inite negeren:

php -ddisplay_errors=1 script.php

Antwoord 26

U kunt op eenvoudige manieren een PHP-fout in uw display weergeven.
Plaats eerst deze onderstaande code in uw php.ini-bestand.

display_errors = on;

(als je geen toegang hebt tot php.ini, kan het plaatsen van deze regel in .htaccess ook werken):

php_flag display_errors 1

OF je kunt ook de volgende code gebruiken in je index.php-bestand

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

Antwoord 27

In Unix CLIis het erg praktisch om alleen fouten naar een bestand:

./script 2> errors.log

Gebruik vanuit je script ofwel var_dump()of een equivalent zoals gewoonlijk (zowel STDOUT als STDERR zullen de uitvoer ontvangen), maar om alleen in het logbestandte schrijven:

fwrite(STDERR, "Debug infos\n"); // Write in errors.log^

Dan vanuit een andere shell, voor live wijzigingen:

tail -f errors.log

of gewoon

watch cat errors.log

Antwoord 28

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

Zet dit bovenaan je pagina.

Other episodes