Notice o Warning: A non well formed numeric value encountered in php - fix

Giorgio Borelli

Se anche tu hai ricevuto il messaggio di Notifica o di Allerta da parte dell'interprente php "Notice Warning: A non well formed numeric value encountered in" ... allora sei nel posto giusto per capire il perché si verifica, come risolverlo ed eliminarlo definitivamente in modo che non compaia più. Andiamo a scoprirne di più

Come ben saprai anche tu se sei uno sviluppatore, php è un linguaggio interpretato e non fortemente tipizzato, o meglio si dice che il php è un linguaggio a tipizzazione debole, che tradotto in parole semplici significa che per la dichiarazione delle variabili non è necessario specificarne il tipo ed inoltre queste possono ricevere tipi e valori diversi. Se da un lato la tipizzazione debole consente una grande libertà e flessibilità nella stesura del codice sorgente, d'altro canto è verissimo che questa può indurre ad errori a run-time o di logica non voluti, per fare un esempio in php non si distingue se ad una variabile atta a contenere un intero viene assegnata una stringa contenente un simbolo (carattere) numerico, capite bene che questo può indurre ad errori molto subdoli e di difficile individuazione.

Tuttavia col passare del tempo e col rilascio delle nuove versioni anche PHP sta tendendo sempre più verso una tipizzazione forte, o quanto meno un po' più forte di prima. Difatti con il rilascio della versione php 7.1 a seconda le impostazioni settate a livello di configurazione php, l'interprete mostra dei 'notice' o dei 'warning' se si sta tentando di fare assegnazioni o conversioni (casting) tra tipi non compatibili tra loro, come ad esempio nel caso di numeri e stringhe, e come avrai già intuito il verificarsi del messaggio php "Notice Warning: A non well formed numeric value encountered in" è proprio legato al concetto di tipizzazione e cast da parte di php, che adesso quanto meno avvisa con questo messaggio quando si cerca di effettuare un'assegnazione o trattazione di tipo non valido.

Facciamo un esempio così da capire meglio cosa stiamo dicendo, supponiamo di stare utilizzando la funzione date per catturare e formattare una data inserita e passata nella url, nello script php avremo:

 

$date_start = date("d",$_GET['date_start']);

 

Con questa istruzione vedremo subito che l'interprete php ci segnalerà il warning: "A non well formed numeric value encountered in", questo perché il secondo parametro della funzione date si aspetta un numero intero e non una stringa prelevata in query string tramite GET! La signature o firma della funzione date lo indica esattamente, eccola:

 date ( string $format [, int $timestamp = time() ] ) : string

Il primo parametro della funzione php date e di tipo stringa ed indica la formattazione che dovrà avere la data (ad es aaaa-mm-gg), il secondo parametro è uno unix timestamp (la data espressa in numero di secondi trascorsi sui sistemi Unix e simili) che è di tipo intero.

Giustamente quindi l'interprete php non appena rileva che in date viene passato come secondo parametro una stringa e non un intero, adesso a partire dalla versione php 7.1 lo segnala quanto meno con un notice, ecco il manifestarsi di quel messaggio, e per rimuoverlo non basta far altro che convertire opportunamente la data di tipo testuale in un intero [che ne rappresenta la stessa data in numero di secondi trascorsi a partire dal 1 Gennaio 1970 (January 1 1970 00:00:00 GMT)] tramite la funzione strtotime(), in questo modo:

 

$date_start = date("d",strtotime($_GET['date_start']));

 

Adesso i tipi vengono rispettati ed il messaggio "Notice: A non well formed numeric value encountered in" non verrà più mostrato.

 

Analogo discorso vale quando si cerca in php di eseguire delle espressioni matematiche tra tipi diversi, sebbene l'interprete php sia in grado di riconoscere un numero anche quando viene trattato come stringa, ripetiamo che a partire dalla versione 7.1 viene quanto meno notificato il messaggio che si sta eseguendo un'operazione non logicamente valida seppur accettata, infatti sia i warning che i notice non sono degli errori che interrompono l'esecuzione dello script, ma sono pur sempre degli "errori" che è meglio evitare, vuoi perché sporcano la logica e generano inserimenti nei file di log, vuoi perché possono indurre in errori non voluti e difficili da individuare.

E quando l'interprete php segnala un warning piuttosto che un notice? Il warning (attenzione) è un semplice messaggio per segnalare l'uso di tipi non compatibili ma in grado comunque di portare ad un risultato corretto da parte dell'interprete php, come ad es. nel caso di somma algebrica stra stringhe numeriche o tra numeri e stringhe numeriche: $num = 3 + "7"; questo produrrà un warning. Il notice invece viene mostrato quando l'espressione o l'utilizzo tra tipi sebbene calcolata porta ad un risultato errato o inaspettato, come ad es. nella somma tra stringhe numeriche ed alfabetiche, o tra numeri e lettere.

Ecco questo è tutto sul messaggio "Notice Warning: A non well formed numeric value encountered in" che si verifica in php, per qualsiasi altro dubbio, domanda o approfondimento in merito ti rimando allo spazio dei commenti.

Categorie: fix | PHP

Tags: , , ,

Aggiungi Commento

biuquote
Loading