Categorie
PHP

PHP error reporting e l’operatore @

PHP stampa sul browser dell’utente (salvo diversa impostazione) i messaggi di errore che vengono generati quando qualcosa va storto.
Generalmente gli errori possono essere uno di questi tre tipi:

  1. Avvisi (Notice), che non fermano l’esecuzione di uno script e non sono necessariamente un problema.
  2. Avvertenze (Warning), che indicano un problema, ma non interrompono l’esecuzione di uno script.
  3. Errori (Error), che fermano uno script.

Error Reporting

Come regola generale, si vuole che PHP relazioni su qualsiasi tipo di errore mentre ci troviamo in fase di sviluppo, ma non visualizzi alcun errore specifico una volta che il sito va in linea.
Per motivi di sicurezza ed estetica, è generalmente imprudente che un utente veda messaggi di errore PHP dettagliati. Spesso, i messaggi di errore, in particolare quelli relativi a database ririveleranno alcuni aspetti dietro le quinte della tua applicazione Web che sarebbe meglio non mostrare.
È possibile universalmente regolare il livello di segnalazione degli errori direttamente sul file di configurazione php.ini (o con la funzione ini_set()) o in alternativa, è possibile modificare questo comportamento sui nostri scripts utilizzando la funzione error_reporting().
Questa funzione viene utilizzata per stabilire che tipo di errori PHP dovrebbe riferire. La funzione accetta un numero o una costante, vedi: http://php.net/manual/en/function.error-reporting.php.

error_reporting(0); // Non mostrare errori.

L’impostazione 0 disattiva completamente la segnalazione degli errori.
Al contrario,

error_reporting(E_ALL); //Mostra tutti gli errori

dirà a PHP di riferire su ogni errore che si verifica.
I numeri possono essere aggiunti fino a personalizzare il livello di segnalazione degli errori, oppure è possibile utilizzare il bit-operator | (or), ~ (not), & (and) con le costanti.
Con l’impostazione seguente nessun errore Notice verrà segnalato:

error_reporting (E_ALL & ~E_NOTICE); //Non mostrare errori notizia

Poichè E_ALL è una costante (come le altre), non è racchiusa tra virgolette.
Con PHP 5 è stato introdotto un nuovo livello di errore E_STRICT.
Attenzione E_STRICT non viene incluso nel E_ALL e, pertanto, occorre abilitarlo in modo esplicito. http://php.net/manual/en/migrating5.errorrep.php
Questo tipo di messaggi aiuta lo sviluppatore a seguire le più attuali tecniche e metodologie di programmazione, per esempio ci avvisa riguardo all’utilizzo di funzioni deprecate.

L’operatore di silence (@)

Gli errori individuali possono essere soppressi in PHP utilizzando l’operatore @. Ad esempio, se non si vuole che PHP riveli che non è possibile includere un file, possiamo usare questo codice:

@include ('mioFile.inc.php');

se non volgiamo vedere errori su una divisione per zero:

$a = 35;
$b = 0;
$num = @($a/$b);

Ma è sopratutto su funzioni database related che dovrebbe essere usato, in quanto in ambiente di produzione è altamente sconsigliato (oltre che brutto) mostrare errori che possono rivelare l’indirizzo dell’host o nome del db, piuttosto che l’utente con il quale intendiamo collegarci.

@mysql_connect("host", "utente", "password");

Anteporre l’operatore @ alla funzione, come abbiamo detto in precedenza, sopprime qualsiasi messaggio di errore, ma ora non abbiamo modo di sapere se mysql_connect() sia effettivamente in grado di collegarsi o meno. Per risolvere questo, abbiamo bisogno di controllare il valore di ritorno. Secondo la documentazione mysql_connect(), restituisce un identificativo di connessione MySQL in caso di successo e FALSE in caso di fallimento. Allora, facciamo così:

$db = @mysql_connect("host", "utente", "password";
if( $db === false )
{
   echo "Connessione al db fallita.";
   exit();
}

Conclusioni

PHP restituisce diverse tipi di errori (in relazione alla loro natura e gravità) e ci offre diverse armi per poterli gestire. In linea di massima direi che in fase di sviluppo il programmatore dovrebbe visualizzare tutti gli errori, per questo consiglio di abilitare anche E_STRIC, mentre in ambiente di produzione ai visitatori non dovrebbe essere mostrato nessun errore, sia per motivi estetici sia e soprattutto per motivi di sicurezza.
Il modo migliore per gestire gli errori, però, è quello di farlo attraverso la creazione di una propria funzione che verrà chiamata quando si verificano errori. Utilizzando la funzione set_error_handler(), ma di questo parleremo un’altra volta.

Buona segnalazione di errori a tutti!

Risorse

http://php.net/manual/en/function.error-reporting.php
http://php.net/manual/en/language.operators.errorcontrol.php
http://php.net/manual/en/migrating5.errorrep.php
http://php.net/manual/en/function.ini-set.php

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.