Ik heb dit in de index.php

error_reporting(1);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL & ~E_WARNING);

Nu wil ik dit in een <div></div> wegzetten, zodat ik die regels, er iets fout is, dat ik het in boven in de page zie.
Maar dat lukt mij niet, heb ik via een maat van mij, een een stukje hulp gekregen voor een eigen error reporting te maken.

function errorHandler(int $type, string $msg, ?string $file = NULL, ?int $line = NULL) {
echo $type.' : '. $msg.' in : '. $file.' on line : '. $line;
}
$warning = set_error_handler('errorHandler' , E_ALL);

en heb ik in de ingelade page, dit gemaakt.

if($error == 1){ 
include('./inc/Errors.php');
echo "<div class='warningbox'>Still under construction<br />".$warning."</div>";
}

Maar echter als er een fout is op een page. Dan laat hij het zien op de page die geincluded wordt.
En niet in de warningbox waar ik het juist wil hebben.
De $warnig wordt wel uitgespuugd, maar niet in de div element.
Hoe kan dat? Ligt dat aan de error reporting zelf? of heb ik iets over het hoofd gezien? of is het niet mogenlijk om het in een div element te plaatsen?
Jep, je moet nog even verder doorspitten.
Arno van Zanten op 02/05/2023 16:35:34

@ozzie,

No return.... hmmmm

Lees wat er staat op php.net (vertaal het). Kijk vervolgens wat jij hebt gedaan. Vraag jezelf dan eens af wat je niet goed hebt gedaan. ;-)
@ozzie

Retourneert de eerder gedefinieerde fouthandler (indien aanwezig). Als de ingebouwde fouthandler wordt gebruikt, wordt null geretourneerd. Als de vorige fouthandler een klassemethode was, retourneert deze functie een geïndexeerde array met de klasse en de naam van de methode.


Ook al maak ik een eigen error_handler, hij gebruikt toch de in gebakken error_handler van de PHP?
want deze :

error_reporting(1);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL & ~E_WARNING);

Heb ik uitstaan of liever gezegd, verwijderd in de php script.
Teminste zo lees en begrijp ik het uit dat verhaal.
En wat verwacht je dan met dit?

<?php
$warning = set_error_handler('errorHandler' , E_ALL);
echo "<div class='warningbox'>Still under construction<br />".$warning."</div>";
?>

Met een eigen errorhandler kan je zelf de foutafhandeling in PHP uitbreiden. Je kan de foutmeldingen in een eigen jasje stoppen, maar ook bijvoorbeeld zelf functies toevoegen, zoals het sturen van mails of wat je maar wilt. Theoretisch kan je zelfs je huisverlichting rood laten oplichten, om maar wat geks te bedenken.

Ikzelf gebruik in mijn site de exception-handler, omdat ik (en andere door mij gebruikte packages) exceptions gebruiken. Als er een exception wordt opgeroepen, dan laat ik een aparte pagina zien met een gebruiksvriendelijke foutmelding, en in de ontwikkelmodus toon ik een 'stacktrace' die laat zien waar de fout zit.

Een aparte pagina is altijd nog het beste, zo voorkom je dat je een halve pagina ziet met dingen die niet werken vanwege je fout.
Begin nou eerst eens met een eenvoudige test.

Genereer bijvoorbeeld een fout ...

$failure = 42 / 0;

... en bedenk hoe je van daaruit uitkomt bij je foutmelding:

<div><p>Delen door nul is niet toegestaan.</p></div>

Je hoeft echt niet gelijk aan test-driven development (TDD) te gaan doen, maar gestructureerd werken brengt je sneller veel verder dan ad hoc dingen aan- en uitzetten.
Kijk dit stukje code staat in de error.php

function errorHandler(int $type, string $msg, ?string $file = NULL, ?int $line = NULL) {
echo $type.' : '. $msg.' in : '. $file.' on line : '. $line;
}
$warning = set_error_handler('errorHandler' , E_ALL);


en met deze roep ik hem aan (wordt in de index.php ingeladen)

if($error == 1){
include('./inc/Errors.php');
echo "<div class='warningbox'>Still under construction<br />".$warning."</div>";
}
Wat verwacht je precies te zien met $warning?

Kijk eens wat die errorHandler() functie doet? Die regelt de vormgeving.

[size=xsmall]Toevoeging op 03/05/2023 17:56:44:[/size]

Ward van der Put op 03/05/2023 16:09:53

Begin nou eerst eens met een eenvoudige test.

Genereer bijvoorbeeld een fout ...

$failure = 42 / 0;

En dan kom je bij exceptions uit, in plaats van errors.
Test maar uit door ook EOL-versies te kiezen.

https://3v4l.org/UR6dF
Die doet het, maar hij zet het niet daar waar ik het wil.
Ik heb in de index.php een <div></div> aangemaakt helemaal bovenaan in de page.
Nu heb ik met de index.php een paar includes, die bepaalde dingen doen.
Nu heb ik zeg maar een page hallo.php geinclude, daar zit zeg maar 1 foutje in bv en de $warning doet het, maar zet het niet in de <div></div> bovenaan in de page waar ik het speciaal heb aangemaakt, maar in daar waar de page hallo.php aangeroepen is.
Je wilt dergelijke errors bij voorkeur op een schone pagina plaatsen. Niets zo vervelend als een error te tonen, en daarna data die daardoor niet zichtbaar is, terwijl je dat anders wel zou verwachten.

Voor zover ik weet kan je niet zomaar zeggen: "Hier wil ik het".

Reageren