La funzione checkdate per verificare una data

Gli argomenti di questa pagina

  • Premessa
  • Primo passo: controllare formato ed errori di digitazione
  • Secondo passo: controllare la data con la funzione checkdate()
  • Dividere una data con la funzione preg_split()

Premessa

In molti casi non c'è modo per tenere conto dei diversi formati di data o se la data è corretta.
Se una data viene fornita dallo script (da un DB o da altre fonti controllate dal programmatore) è difficile che sia sbagliata. Ma se è fornita da un utente è difficile essere completamente sicuri del suo formato e/o della sua correttezza. Potrebbe avere uno dei seguenti formati:

  • gg/mm/aaaa
  • mm/gg/aaaa
  • aaaa/mm/gg ... ecc

Ma addirittura potrebbe anche essere non corretta (31/02/2014) o, peggio, contenere caratteri non validi per una data (12/o5/2014).

Primo passo: controllare formato ed errori di digitazione

Una prima strategia per ottenere da un utente il giusto formato di una data ed evitare errori di digitazione è quella di non presentare una semplice casella di testo, ma tre distinte <select> (menù a discesa) per la data e, se necessario, altre per gli orari, come nell'esempio che segue:

In questo modo siamo sicuri dove trovare i vari segmenti di tata e ora inseriti e che nei dati forniti non ci sono errori di digitazione.

Secondo passo: controllare la data con la funzione checkdate()

Purtroppo quella della scelta delle <select> non risolve completamente il problema. Infatti, nonostante tutto, è ancora possibile inserire date sbagliate del tipo:

  • 30/02/2014
  • 31/04/2014 ... ecc
  • mancanza di uno o più campi

Per eseguire un controllo sulle date è possibile usare la funzione checkdate() che usa questa sintassi:

checkdate(month,day,year)

I tre parametri sono tutti obbligatori e vanno elencati nell'ordine mese, giorno, anno.
La funzione checkdate() restituisce TRUE se la data in esame è corretta, FALSE se la data non è corretta.
Ma se si omette qualche parametro o si passa un parametro vuoto, come negli esempi qui sotto, vengono mostrati dei Warning:
Warning: checkdate() expects exactly 3 parameters, 2 given in percorso file on line xxx
Warning: checkdate() expects parameter 3 to be long, string given in percorso file on line xxx
Per evitare l'insorgere di questi Warning, è possibile usare l'operatore di controllo errori '@'.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
if (@checkdate(1,12,2011)) {
    echo 
"Data Giusta<br />";
} else {
    echo 
"Data Sbagliata<br />";
}
if (@
checkdate(2,29,2011)) {
    echo 
"Data Giusta<br />";
} else {
    echo 
"Data Sbagliata<br />";
}
if (@
checkdate(4,31,2011)) {
    echo 
"Data Giusta<br />";
} else {
    echo 
"Data Sbagliata<br />";
}
//    ATTENZIONE A QUESTA
if (@checkdate(4,12)) {
    echo 
"* Data Giusta<br />";
} else {
    echo 
"* Data Sbagliata<br />";
}
//    E A QUESTA
if (@checkdate(4,12,"")) {
    echo 
"* Data Giusta<br />";
} else {
    echo 
"* Data Sbagliata<br />";
}
?>
Data Giusta
Data Sbagliata
Data Sbagliata
* Data Sbagliata
* Data Sbagliata

Dividere una data con la funzione preg_split()

Però non sempre ci troviamo come nell'esempio mostrato qui sopra dove da un form ci vengono restituite le porzioni di date già pronte per l'uso.
Molto spesso ci veniamo a trovare di fronte a date già formattate e tocca a noi dividere le nelle sue parti più elementari.
Tra le funzioni che il PHP ci mette a disposizione ho preferito usare la funzione preg_split() che individua un carattere separatore tra uno di quelli presenti nel pattern '/[-\.\/: ]/' e che sono tra i più usati in un valore data.
Anche qui un'altra scelta. Invece di mettere le porzioni di date in una matrice (vedi ultimo esempio in basso allo script) le raccolgo in una lista di variabili usando la funzione list().

1
2
3
4
5
<?php
$data_1 
"18/07/2013";
$data_2 "12/01/2014";
$data_3 "31/02/2014";
?>
1
2
3
4
5
6
7
8
<?php
list($giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data_1);
if (@
checkdate($mese$giorno$anno)) {
    echo 
$data_1 ": Data Giusta<br />";
} else {
    echo 
$data_1 ": Data Sbagliata<br />";
}
?>
18/07/2013: Data Giusta
1
2
3
4
5
6
7
8
<?php
list($giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data_2);
if (@
checkdate($mese$giorno$anno)) {
    echo 
$data_2 ": Data Giusta<br />";
} else {
    echo 
$data_2 ": Data Sbagliata<br />";
}
?>
12/01/2014: Data Giusta
1
2
3
4
5
6
7
8
<?php
list($giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data_3);
if (@
checkdate($mese$giorno$anno)) {
    echo 
$data_3 ": Data Giusta<br />";
} else {
    echo 
$data_3 ": Data Sbagliata<br />";
}
?>
31/02/2014: Data Sbagliata
1
2
3
4
<?php
$tmp 
preg_split('/[-\.\/: ]/'$data_2);
echo 
implode (" "$tmp);
?>
12 01 2014

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum