I dag har jeg besluttet mig for, at jeg en gang for alle ville skrive en ordenlig guide til, hvordan man får vist PHP-fejl, uanset om serveren som standard viser dem, eller ej.
Grunden til jeg lige pludselig fik den her idé, kommer sig af jeg har for lidt tid siden sad, og hjalp en kammerat med noget PHP – helt almindeligt. Hvad der dog ikke var så almindeligt, taget i betragtning det var et test-miljø, var at der ikke blev vist PHP-fejl! Eftersom dette tæt på umuliggøre debugging, spurgte ham hvorfor de ikke blev vist. Han fortæller mig så, at han ikke kan få til at virke med alle de guides, han har læst rundt omkring på sin Google-søgninger! Det er selvfølgelig ikke i orden, at der ikke ligger en ordenlig guide til den slags, så her er min der burde virke på på noget nær alle webservere.
Hvordan får jeg dem vist?
Det er faktisk meget simpelt, at få vist PHP-fejlene. Det eneste der kræves for denne metode, er at du smider den her linie kode, før ALT andet PHP kode. Og jeg mener ALT. Det mest optimale, ville være linie 1 i filen, da du så er sikker på, at den viser dem alle. Her er linien:
<?php
ini_set("display_errors", "1");
?>
For mange af jer giver den her linie sikkert fin mening, men her er uanset hvad en lille forklaring:
Sets the value of the given configuration option. The configuration option will keep this new value during the script’s execution, and will be restored at the script’s ending.
Det er hvad der står, om funktionen ini_set på php.net. Det betyder på gammeldags dansk, at den ændre en værdi i konfigurations-filen til PHP (php.ini), mens scriptet udføres, og sætter den tilbage, når scriptet er færdigt. Hvad kan man så bruge det til? Det kan man bruge f.eks. her hvor vi skal sætte PHP fejl til at vises. Det vil vi meget gerne have sker i vores test-miljø, men det er ikke så hensigtsmæssigt, for vores ‘rigtige’ side vi viser offentligheden. Af den årsag, bruger vi den her linie til at vise PHP fejl ,der bliver generet af særlige filer – dem i vores test-miljø.
Det første af de to parameter vi giver funktionen, fortæller hvilken indstilling der skal ændres på i php.ini. Det næste, nr. to, fortæller hvad værdien skal ændres til. “Display_errors” er indstillingen, der fortæller om PHP, skal vise fejlene. Denne indstilling, sætter vi til 1 (true) for at få dem vist.
Det var meget simpelt ikke? Dette er dog ikke altid nok da nogle webhostes, har gjort sådan at selv hvis man siger den skal vise fejl, har de sat en anden indstilling (den der fortæller hvilke fejl der evt. skal vises) til ingen. Dette kan dog også ordnes, direkte fra koden. Den linie ser sådan her ud:
<?php error_reporting(E_ALL); ?>
Den her linie fungere på sammen måde som ini_set linien fra før. Den går ind og sætter en særlig indstilling til en særlig værdi. Man har dog for netop denne indstilling, error_reporting, lavet en særlig funktion, til at gøre det. Funktionen har kun et parameter, og det er hvilke fejl der skal vises. Som udgangspunkt vil du have vist alt, E_ALL, eftersom det også viser NOTICE level (ud over parse, fatal osv), der er utrolig gode til at finde ud af, hvorfor koden ikke virker som den skal. Der findes dog også mange andre værdier man kan sætte den til, alt efter hvilke fejl man vil have vist. Her er listen taget fra php.ini:
- E_ALL: All errors and warnings (includes E_STRICT as of PHP 6.0.0)
- E_ERROR: Fatal run-time errors
- E_RECOVERABLE_ERROR: Almost fatal run-time errors
- E_WARNING: Run-time warnings (non-fatal errors)
- E_PARSE: Compile-time parse errors
- E_NOTICE: Run-time notices (these are warnings which often result from a bug in your code, but it’s possible that it was intentional (e.g., using an uninitialized variable and relying on the fact it’s automatically initialized to an empty string)
- E_STRICT: Run-time notices, enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code
- E_CORE_ERROR: Fatal errors that occur during PHP’s initial startup
- E_CORE_WARNING: Warnings (non-fatal errors) that occur during PHP’s initial startup
- E_COMPILE_ERROR: Fatal compile-time errors
- E_COMPILE_WARNING: Compile-time warnings (non-fatal errors)
- E_USER_ERROR: User-generated error message
- E_USER_WARNING: User-generated warning message
- E_USER_NOTICE: User-generated notice message
- E_DEPRECATED: Warn about code that will not work in future versions
Det er vigtigt at understrege, at denne funktion lige som ini_set sørger for at indstillingen kun er ændret under udførelsen af det script hvor linen er i.
Jeg bruger normalt E_ALL til mine test, da de viser alt hvad PHP kunne finde på at ville vise mig. Mine test-filers første linier ser derfor altså sådan her ud:
<?php
ini_set("display_errors", "1");
error_reporting(E_ALL);
?>
Grunden til at jeg også har linie to med altid, er for at være sikker på, at jeg ikke kommer til at ligge og slås med, at php.ini som standard, ikke viser alle de fejl jeg gerne vil se.
Jeg håber du kunne bruge min guide. Hvis du har nogle spørgsmål, eller bare gerne vil sige tak, så smid gerne en kommentar neden for.