back to top

Errori PHP: visualizzare, gestire e correggere gli errori nel codice

In questo articolo cercheremo di fare una panorameica degli errori più frequenti nei quali ci si può imbattere quando si sviluppa un’applicazione in PHP.

Iniziamo col dire che gli errori all’interno di un programma PHP possono essere classificati in quattro categorie:

  1. Notice – Si tratta di una pluralità di situazioni nelle quali l’interprete PHP interecetta una qualche incongruenza o imprecisione all’interno del codice che sta per eseguire. Si tratta di errori non particolarmente gravi ma comunque, essendo errori, degni di essere presi in visione. Rientrano in questa categoria: E_STRICT, E_USER_NOTICE, e E_NOTICE.
  2. Warnings – Si tratta di errori non fatali che, come tali, non impediscono che l’esecuzione dello script giunga a compimento tuttavia il risultato atteso dallo sviluppatore non può essere raggiunto. Rientrano in questa categoria: E_WARNING, E_CORE_WARNING, E_COMPILE_WARNING, e E_USER_WARNING.
  3. Parse error – Si tratta di errori di sintassi che lo sviluppatore ha commesso nella stesura del codice PHP. Questo tipo di errore viene rilevato dall’interprete PHP in fase di compilazione del codice.
  4. Fatal error – Si tratta di problemi gravi che causano l’interruzione nell’esecuzione dello script. Essi possono essere generati in qualsiasi fase, tra cui l’inizializzazione, l’analisi e l’esecuzione del codice. Questa categoria include: E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, e E_USER_ERROR.

Errore PHP: una pagina bianca!

Molto spesso, purtroppo, quando uno script PHP contiene un errore il risultato prodotto a video consiste in una pagina bianca che non offre alcuna informazione circa l’errore che si è verificato.

Una simile situazione è dovuta in realtà ad una cattiva configurazione del server web di sviluppo: quando si sviluppa un’applicazione, infatti, è molto importante assicurarsi che il server restituisca a video gli errori in quanto ciò diventa determinante in fase di debug. Per fare ciò è importante settare la direttiva display_errors su ON ed impostare il livello di errore su E_ALL (o, meglio ancora, su E_STRICT).

Per fare ciò è necessario intervenire all’interno del file php.ini impostando le seguenti configurazioni:

display_errors = On
display_startup_errors = On
error_reporting = E_ALL | E_STRICT

Se non avete accesso al file di configurazione del PHP non disperate, potete ottenere lo stesso risultato attraverso il codice PHP della vostra applicazione. In tal caso è necessario aggiungere, in cima al vostro script, le seguenti linee di codice:

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

E’ bene precisare che queste impostazioni sono da implementre solo in fase di sviluppo e debug mentre per il web-server "di produzione" è buona norma rimuovere ogni avviso circa eventuali errori in quanto ciò potrebbe rivelarsi piuttosto pericoloso.

Vediamo di seguito i messaggi di errore più comuni di PHP offrendo per ciascuno dei pratici suggerimenti per la sua risoluzione.

Notice

Notice: Use of undefined constant xyz – assumed ‘xyz’

Questo è un errore abbastanza comune causato quasi sempre dall’utilizzo di una parola semplice al posto di una stringa; ad esempio si assegna un valore (non numerico) ad una variabile senza utilizzare apici e virgolette:

$var = xyz; // errore!!!
$var = 'xyz'; // corretto

Nel caso del codice errato mostrato qui sopra, l’inteprete PHP andrà alla ricerca di una costante xyz e, non trovandola, vi restituirà l’errore Notice: Use of undefined constant xyz – assumed ‘xyz’.

Per risolvere questo errore andate a cercare la parola in questione all’interno del vostro codice per capire se effettivamente era vostra intenzione richiamare una costante (ed avete sbagliato il nome) oppure se, più probabilmente, vi siete scordati le virgolette…

Notice: Undefined variable: xyz

Questo messaggio di errore è decisamente auto-esplicativo: si è tentato di utilizzare una variabile che non è stata ancora definita. Questo di solito accade quando si vuole incrementare una variabile il cui valore non è stato definito in precedenza, ad esempio:

$xyz++;

Oppure quando si cerca di concatenare una variabile a se stessa (come si fa spesso all’interno dei cicli):

$xyz .= '...';

Di solito questo errore si verifica quando si utilizzando operatori come:

+=
-=
.=

E’ vero che PHP garantisce che una variabile non inizializzata sarà uguale a NULL, tuttavia è sempre una buona cosa dichiarare le variabili che si intende utilizzare all’interno del codice con dei valori di default. Si tratta di una buona pratica di programmazione che serve ad assicurarsi che tutte le variabili siano inizializzate prima dell’effettivo utilizzo (di solito le variabili comuni vengono definite nella parte superiore della pagina o della funzione).

Notice: Undefined index: xyz

Questo errore è simile al precedente ma non riguarda una variabile ma l’indice di un array. Questo errore, in pratica, ci comunica che l’array esiste ma non esiste l’indice indicato. Ad esempio:

if ($_GET['xyz'] == 'ok') echo 'ok';

In questo caso se il valore ‘xyz’ non è presente nella variabile superglobale $_GET otterremo l’errore Notice: Undefined index….

E’ buona norma, in queste circostanze, utilizzare la funzione isset() per verificare se l’indice è stato settato prima di utilizzarlo:

if (isset($_GET['xyz']) && $_GET['xyz'] == 'ok') echo 'ok';

Warnings

Warning: Cannot modify header information – headers already sent

Questo è un errore molto specifico e pertanto piuttosto facile da risolvere. In pratica si è cercato di inviare delle informazioni all’interno delle intestazioni HTTP dopo aver inviato un output (ad esempio attraverso echo o print). Questo, infatti, è un errore in quanto tutte le informazioni di questo tipo devono essere inviate obbligatoriamente prima dell’output. Di seguito un esempio di errore:

echo 'Ciao';
header('Content-type: text / plain');

Tutto quello che dovete fare per risolvere questo problema è fare in modo che tutto ciò che viene inviato attraverso la funzione header() sia "al di sopra" di ogni output. Questa regola vale anche per tutte le altre funzioni che utilizzano le intestazioni HTTP come, ad esempio, quelle relative a cookie e sessioni.

Warning: Wrong parameter count for nome_funzione()

Questo è un errore piuttosto semplice da correggere. In questo caso, infatti, PHP ci informa che non abbiamo passato il giusto numero di parametri a una funzione o ad un metodo specifico:

function nome_completo($nome,$cognome) {
  return $nome . ' ' . $cognome;
} 
$var = nome_completo('Max');

In questo caso l’errore restituisce il numero di riga corretto e pertanto diventa molto semplice correggere l’errore. nel nostro esempio abbiamo passato alla funzione nome_completo() un solo parametro quando invece se ne aspettava due. Alcune volte l’errore è dimenticato dalla mancanza di una virgola per separare due parametri.

Parse error

Parse error: syntax error, unexpected T_STRING … unexpected T_VARIABLE … unexpected T_IF…

Tutti questi messaggi, di fatto, sono diversi esempi del medesimo errore: il compilatore PHP ci avvisa di aver trovato un tipo di costrutto che non era atteso ne attendibile. Questi errori, quasi sempre, sono il frutto di un errore di battitura. Ad esempio:

if $xyz == 1) echo 'uno';

Nell’esempio qui sopra ci siamo dimenticati di aprire la parentesi tonda dopo l’if. In questo caso otteremo unexpected T_VARIABLE in quanto l’interprete si è ritrovato di fronte ad una variabile – $xyz – che non si aspettava.

Qualsiasi messaggio di errore che include una parola che inizia con T_ si riferisce ad un token, cioè ad una rappresentazione interna di un costrutto del linguaggio. Ad esempio, T_VARIABLE è il token utilizzato da PHP per indicare una variabile. Analogamente T_STRING è il token che rappresenta una stringa, e così via. L’elenco dei token è disponibile a questa pagina della documentazione ufficiale di PHP.

In generale, questi possono essere alcuni degli errori più difficili da rintracciare perché spesso il numero di riga indicato nell’errore potrebbe essere molto lontano dalla linea in cui è stato commesso l’errore effettivo. E’ buona norma, pertanto, eseguire regolamente dei test di esecuzione dello script in fase di programmazione in modo da dover cercare l’errore su una porzione limitata di codice, in caso contrario il rischio è di dover cercare un ago in un pagliaio.

Parse error: syntax error, unexpected $end

Questo errore è collegato agli errori citati in precedenza, ma vale la pena trattarlo separatamente. Questo messaggio di errore ci informa che l’interprete PHP è arrivato alla fine del file ma si aspettava ancora qualcosa (che non c’è stato). Molto spesso questo errore è determinato dalla mancanza di una "}" nel codice. Purtroppo si dovrà eseguire la scansione dell’intero file per scoprire dove è stato commesso l’errore…

Questo errore, inoltre, può essere generato anche da una cattiva sintassi relativa al costrutto heredoc. La sintassi heredoc richiede che il delimitatore finale deve essere il primo elemento della linea, senza nessun altro carattere, compresi gli spazi, che lo precede. Spesso, a causa di errori di battitura o editor che tentano di fare la formattazione automatica del codice, questa regola non viene rispettata e ciò produce questo errore.

Parse error: syntax error, unexpected ‘=’, expecting ‘;’

Anche questo errore fa parte della stessa famiglia degli errori visti in precedenza. In questa circostanza l’interprete PHP è molto preciso nell’informarci di ciò che si stava aspettando (e non ha trovato) ad esempio un uguale per l’assegnazione di un valore a una variabile o un punto e virgola come terminatore di un’itruzione.

Il debug di questo tipo di errore è un po’ più semplice del precedente in quanto PHP, di solito, indica una linea di codice piuttosto vicina al punto esatto dove è stato commesso l’errore.

Fatal error

Fatal error: Call to undefined function nome_funzione()

Questo messaggio di errore ci informa che è stata effettuata una chiamata ad una funzione che non esiste. Molto probabilmente questo è il risultato di un errore di battitura oppure perchè ci si è dimenticati di includere il file che contiene la funzione.

Fatal Error: Cannot redeclare nome_funzione()

Questo errore significa esattamente quello che dice: si è cercato di definire nuovamente una funzione che era già stata definita. Molto spesso questo errore capita perchè si creano due funzioni aventi lo stesso nome oppure si crea una funzione personalizzata usando il nome di una funzione nativa di PHP oppure, ancora più di frequente, perchè si include il medesimo file (dove è presente la funzione) più di una volta. Una buona norma per evitare questo tipo di errore è utilizzare la funzione include_once() al posto di include() al fine di evitare, appunto, inclusioni multiple del medesimo file.

Fatal error: Maximum execution time of 60 seconds exceeded

PHP ha impostato un limite temporale ben preciso per l’esecuzione degli script, ciò per evitare che un codice mal scritto (ad esempio un loop) non esaurisca le risorse del web-server. Questo errore, pertanto, significa semplicemente che la tua pagina ha impiegato troppo tempo per l’esecuzione ed ha superato il limite massimo. Per riprodurre questo errore è sufficiente impostare un ciclo infinito:

while (true);

Un codice del genere non avrà mai una fine pertanto, per fortuna, ci pensa PHP ad interrompere l’esecuzione di questo codice una volta raggiunto il timelimit impostato nel php.ini.

A volte questo messaggio può essere generato da un errore vero e proprio in fase di programmazione (i cicli sono alquanto sospetti in tal senso) ma a volte un lungo tempo di esecuzione può essere dovuto a processi particolarmente complessi ed in tal caso di può procedere ad aumentare il timelimit impostato di default per l’esecuzione degli script. Per farlo possiamo agire sul php.ini oppure direttamente all’interno dello script attraverso la funzione set_time_limit().

E’ importante ricordare al lettore, tuttavia, che è bene fare attenzione e non esagerare: impostare un timelimit molto ampio attraverso il php.ini, ad esempio, potrebbe rivelarsi piuttosto pericolo in quanto, in caso di errori, si potrebbe seriamente compromettere la stabilità del web-server.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

Cannot modify header information – headers already sent: come risolvere l’errore PHP

L'errore di PHP cannot modify header information - headers...

Ricavare l’estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano l’orario corretto? Probabilmente...
Pubblicitร