Due errori molto comuni per chi programma in PHP sono i famigerati undefined index e undefined offset. In questo articolo vedremo quali sono le cause di questi errori e come eliminarli dai nostri script.
Iniziamo, fin da subito, a dire che entrambi questi errori nascono da una cattiva gestione degli array in PHP da parte dello sviluppatore e sono accumunati dall’essere facilmente identificabili e risolvibili, grazie ad avvisi estremamente esplicativi.
Notice: Undefined index
L’errore Undefined index è di tipo Notice, cioè della tipologia dei "meno gravi" in quanto trattasi di errore "non bloccante" in fase di esecuzione dello script.
La causa di questo errore è da ricercarsi nel tentativo di accedere ad un dato elemento di un array che non risulta disponibile.
La sintassi dell’errore mostrato a video è la seguente:
Notice: Undefined index: <em>chiave_mancante</em> in <em>percorso_script</em> on line <em>numero_riga</em>
Come potete vedere la sintassi è assolutamente esplicativa, in quanto l’interprete PHP ci dice:
- qual’è la chiave dell’array che ha generato l’errore;
- qual’è lo script che contiene il richiamo alla chiave mancante;
- qual’è la linea di codice dove si è verificato l’errore.
Facciamo un esempio pratico:
// Per prima cosa definiamo un array con le caratteristiche di una ipotetica automobile
$auto = array(
'marca' => 'Fiat',
'modello' => 'Punto',
'alimentazione' => 'Benzina',
'colore' => 'Rosso'
);
// stampo a video la marca della vettura
echo $auto['marca'] . '<br>';
// stampo a video l'anno di immatricolazione
echo $auto['immatricolazione'];
Eseguendo questo codice, come avrete già capito, otterremo un errore di questo tipo:
Notice: Undefined index: immatricolazione in /path/to/esempio.php on line 13
L’errore è dovuto al fatto che abbiamo cercato di accedere alla chiave "immatricalozaione" che non abbiamo previsto in fase di definizione del nostro array.
Ovviamente potremo ottenere questo errore anche se la chiave è stata originariamente prevista all’interno dell’array, ma in seguito è intervenuta una qualche operazione che l’ha rimossa. Ad esempio:
// Per prima cosa definiamo un array con le caratteristiche di una ipotetica automobile
$auto = array(
'marca' => 'Fiat',
'modello' => 'Punto',
'alimentazione' => 'Benzina',
'colore' => 'Rosso'
);
// elimino la marca della vettura
unset($auto['marca']);
// stampo a video la marca
echo $auto['marca'];
Anche in questo caso otterremo un errore Undefined index in quanto la chiave "marca" non è più disponibile nel nostro array $auto, essendo intervenuta un’operazione di eliminazione (funzione unset()) che l’ha rimossa prima del tentativo di accesso.
Notice: Undefined offset
L’errore Undefined offset è molto simile al precedente e, ancora una volta, è dovuto al tentativo di accedere ad un elemento di un array non disponibile. Questa volta, però, l’elemento è stato richiamato dallo sviluppatore non mediante una chiave ma attraverso un indice numerico.
La sintassi dell’errore è la seguente:
Notice: Undefined offset: <em>indice_numerico_mancante</em> in <em>percorso_script</em> on line <em>numero_riga</em>
Valgono le stesse osservazioni viste sopra in merito alla sintassi dell’errore.
Vediamo ora un esempio pratico:
// definiamo un semplice array
$frutta = array('mela','pera','arancia');
// stampiamo a video l'elemento con indice numerico 0
echo $frutta[0] . '<br>';
// ora stampiamo l'elemento con indice numerico 3
echo $frutta[3];
Ancora una volta il nostro codice produrrà un errore simile a questo:
Notice: Undefined offset: 3 in /path/to/esempio.php on line 8
L’errore si genera in quanto nel nostro array $frutta non è presente l’indice n.3 (ricordiamo che nelle array PHP il primo elemento ha indice 0), pertanto l’interprete PHP genererà questo errore per avvisarci che il codice ha cercato di accedere ad un elemento inesistente.
Anche per Undefined offset, l’errore si genera sia se l’elemento non era disponibile già originariamente che se è intervenuto qualche cambiamento successivo (prima del tentativo di accesso, ovviamente).
Evitare gli errori Undefined index e Undefined offset
Per evitare il verificarsi di entrambi questi errori è consigliabile far ricorso a quelle buone norme di programmazione che suggeriscono di verificare l’esistenza di un elemento prima del suo utilizzo. Nel caso degli array esistono due funzioni ad hoc.
Verificare con isset()
PHP dispone di un’apposita funzione che consente di verificare l’esistenza di una variabile. La funzione in questione è isset e si utilizza così:
/*
Esempio di verifica chiave
*/
if (isset($auto['immatricolazione'])) {
// ora sono sicuro che la chiave 'immatricolazione' esiste...
echo $auto['immatricolazione'];
}
/*
Esempio di verifica indice numerico
*/
if (isset($frutta[3])) {
// ora sono sicuro che l'indice numerico 3 esiste...
echo $frutta[3];
}
Per maggiori informazioni su questa utilissima funzione vi suggerisco di leggere qui.
Verificare con array_key_exists()
Si tratta di un’altra funzione di verifica di PHP, questa volta specifica per gli array. In pratica, attraverso questa funzione, è possibile verificare se un dato indice numerico esiste o meno all’interno di un array. Vediamo un esempio:
/*
Esempio di verifica chiave
*/
if (array_key_exists('immatricolazione', $auto)) {
// ora sono sicuro che la chiave 'immatricolazione' esiste...
echo $auto['immatricolazione'];
}
/*
Esempio di verifica indice numerico
*/
if (array_key_exists(3, $frutta)) {
// ora sono sicuro che l'indice numerico 3 esiste...
echo $frutta[3];
}
Per maggiori informazioni su questa utile funzione vi invito a leggere qui.