[PHP] Controllo su data e ora in form
Sto facendo un sitarello che mi gestisce registrazioni, login e per ogni utente loggato, una tabella su cui inserire una prenotazione tramite un form con data e ora.
Sono al punto dei controlli, ma ho 2 controlli che mi fanno impazzire. Non riesco infatti a limitare gli orari tra 8 e 20 e inoltre non riesco ad assicurarmi che sia un int ( se scrivo nel form al campo orario: CIAO, non genera errore per capirsi), e stessa cosa non gestisco le date.
Sono al punto dei controlli, ma ho 2 controlli che mi fanno impazzire. Non riesco infatti a limitare gli orari tra 8 e 20 e inoltre non riesco ad assicurarmi che sia un int ( se scrivo nel form al campo orario: CIAO, non genera errore per capirsi), e stessa cosa non gestisco le date.
foreach(\$righe as \$riga)//controllo ogni elemento del vettore, con foreach infatti controllo nel vettore\$righe (par1) ogni elemnto chiamato \$riga (par 2) { \$r = explode("^^^",\$riga);//genero un array chiamato \$r che ha per elementi ogni elemento del file separato da ^^^ if (\$r[0]==\$_GET["data"] and \$r[2]==\$_GET["orario"]) \$presente = 1;//allora aggiorno il flag,perche l'evento che si vuole scrivere è già presente } if (\$presente == 1) // controllo sul flag se è già presente genero messaggo di errore \$msg = "<h1>Impossibile prenotare perchè già occupato.</h1>"; else // se invece non è presente l'evento, allora { if (trim(\$_GET["data"]) != '' and trim(\$_GET["orario"]) != ''){ \$msg = "<h1>Prenotazione effettuata</h1>"; // genero messaggio di ok \$f = \$f . "\n".\$_GET["data"]."^^^".\$_SESSION["username"]."^^^".\$_GET["orario"];//aggiungo a capo in fondo(append)al file le str ottenute dal form file_put_contents("impegni.txt",\$f); // riscrivo tutto il file } elseif(trim(\$_GET["data"]) == '' or trim(\$_GET["orario"]) == ''){ \$presente =2; } elseif((trim(\$_GET["orario"])>8)and(trim(\$_GET["orario"])<=20)){ -----> SINTASSI PER IL CONTROLLO DELL'ORA ? \$presente=3; } } if (\$presente==2){ \$msg ="<h1>Impossibile prenotare, campo vuoto</h1>"; } if (\$presente==3){ \$msg ="<h1>DATA NON VALIDA</h1>"; }
Risposte
Per assicurati che sia un int lo puoi controllare con la funzione is_numeric
http://php.net/manual/en/function.is-numeric.php
Per controllare la l'orario quella sintassi va ben se usi solo l'ora altrimenti non funziona. Per farlo cosi devi prima fare un'explode o un substr dipende da come vien scritta l'ora.
Ti consiglio di controllare cosa viene scritto con javascript.
http://php.net/manual/en/function.is-numeric.php
Per controllare la l'orario quella sintassi va ben se usi solo l'ora altrimenti non funziona. Per farlo cosi devi prima fare un'explode o un substr dipende da come vien scritta l'ora.
Ti consiglio di controllare cosa viene scritto con javascript.
No è per un progetto e devo usare solo php... isnumeric l'ho usato ma non funge, o meglio non da grandi risultati ! Scusami ma che explode dovrei fare?
Che isnumeric non funzioni mi pare strano l'ho usata abbastanza volte con ottimi risultati. L'explode che ti consigliavo era per dividere ore minuti e secondi ma forse non ti serve perchè hai solo le ore mi pare di capire. comunque un'altra possibilità è quella di scriverti l'espressione regolare per la data e per l'ora usando preg_match così puoi vedere la correttezza formale della data e dell'ora.
Scusami ma sono u novizio.. Certo, considero solo le ore (9,19,14 etc), quindi non devo fare eslplosioni. A quanto leggo preg_match potrebbe essere
\$testo='\{8,20}/' \$testo2='\{,2}/' if(preg_match(\$testo,\$_get["orario"]) and (preg_match(\$testo2,/\$_get["orario"]) { ..

C'è un problema: dici di voler controllare se il valore del parametro "ORARIO" passato (come GET data) sia un numero, compreso fra 8 e 20. Ma il tuo segmento di codice non controlla mai questa condizione, infatti:
- se il campo è nel file, mette "presente=1"
- se presente è uguale a 1, imposta un messaggio a "impossibile..." e continua
- altrimenti, se presente NON è uguale a 1:
- - controlla se "DATA" e "ORARIO" contengano qualcosa (per la precisione qualcosa di diverso dal carattere spazio), e se è così impostano un messaggio a "prenotazione fatta".
- - altrimenti, impostano "presente=2"
Quindi il programma non raggiungerà mai la condizione di controllo del valore di "ORARIO". Quando hai aggiustato il codice, usa pure is_numeric
- se il campo è nel file, mette "presente=1"
- se presente è uguale a 1, imposta un messaggio a "impossibile..." e continua
- altrimenti, se presente NON è uguale a 1:
- - controlla se "DATA" e "ORARIO" contengano qualcosa (per la precisione qualcosa di diverso dal carattere spazio), e se è così impostano un messaggio a "prenotazione fatta".
- - altrimenti, impostano "presente=2"
Quindi il programma non raggiungerà mai la condizione di controllo del valore di "ORARIO". Quando hai aggiustato il codice, usa pure is_numeric

Ti ringrazio, ma io infatti ho posto la condizione all'interno dell else del presente==1,in modo che in tutti gli altri casi controlli ! e poi tramite:
elseif((trim(\$_GET["orario"])>8)and(trim(\$_GET["orario"])<=20)){
controllo il parametro orario... scusami ma non riesco a capire dove vuoi arrivare
elseif((trim(\$_GET["orario"])>8)and(trim(\$_GET["orario"])<=20)){
controllo il parametro orario... scusami ma non riesco a capire dove vuoi arrivare

Arrivo dove ho detto, mi cito:
Supponiamo il programma abbia raggiunto il punto in cui "presente" non è uguale a 1 (ovvero è dopo il primo else), una volta eseguito trim() dei parametri DATA e ORARIO (cosa che esegue sempre, quindi è come averla eseguita prima una tantum), si possono avere i seguenti quattro casi distinti:
- DATA è diversa da '', ORARIO è diversa da '': scrive "prenotazione effettuata" ed aggiorna il file;
- DATA è diversa da '', ORARIO è uguale a '': mette presente=2;
- DATA è uguale a '', ORARIO è diversa da '': mette presente=2;
- DATA è uguale a '', ORARIO è uguale a '': mette presente=2.
Ripeto: rivedi il funzionamento del codice.
"Rggb":
Quindi il programma non raggiungerà mai la condizione di controllo del valore di "ORARIO".
Supponiamo il programma abbia raggiunto il punto in cui "presente" non è uguale a 1 (ovvero è dopo il primo else), una volta eseguito trim() dei parametri DATA e ORARIO (cosa che esegue sempre, quindi è come averla eseguita prima una tantum), si possono avere i seguenti quattro casi distinti:
- DATA è diversa da '', ORARIO è diversa da '': scrive "prenotazione effettuata" ed aggiorna il file;
- DATA è diversa da '', ORARIO è uguale a '': mette presente=2;
- DATA è uguale a '', ORARIO è diversa da '': mette presente=2;
- DATA è uguale a '', ORARIO è uguale a '': mette presente=2.
Ripeto: rivedi il funzionamento del codice.
ho provato a modificare cosi
Ho capito cosa intendevi, il controllo andava fatto nel caso in cui il contenuto dei get fosse !=0 .... Ho modificato un po' cosi, vorrei fare in modo che, nel caso in cui i campi non sono vuoti allora controllo get[orario] !
if (trim(\$_GET["data"]) != '' and trim(\$_GET["orario"]) != '') { if((trim(\$_GET["orario"])>8)and(trim(\$_GET["orario"])<=20)) { \$msg = "<h1>Prenotazione effettuata</h1>"; // genero messaggio di ok \$f = \$f . "\n".\$_GET["data"]."^^^".\$_SESSION["username"]."^^^".\$_GET["orario"];//aggiungo a capo in fondo(append)al file impegni le str ottenute dal form file_put_contents("impegni.txt",\$f); // riscrivo tutto il file impegni.txt } }
Ho capito cosa intendevi, il controllo andava fatto nel caso in cui il contenuto dei get fosse !=0 .... Ho modificato un po' cosi, vorrei fare in modo che, nel caso in cui i campi non sono vuoti allora controllo get[orario] !
Ora c'è un altro problemino pen piu grave, la data , nel formato YY:MM:GG ....

Puoi usare preg_match come consigliato prima, o fare explode della variabile in una lista di tre variabili usando ":" come separatore; se tutto va a buon fine, puoi controllare se queste tre variabili sono una data valida.
NOn ho la minima idea di come usare preg match ho provato a studiarci la sintassi ma non sono freschissimo di reg expression

Allora come dicevo - e come ti ho riportato in un altro post
- puoi fare una explode della stringa in una lista di tre elementi. Se la variabile da controllare si chiama \$data allora
Ovviamente puoi "aggiustare" il tutto a tuo piacimento.

list(\$yy, \$mm, \$dd)=explode(":", \$data); // controllo della data, puo' essere quanto piu' raffinato si desidera if (\$yy < 11 || \$mm < 1 || \$mm > 12 || \$dd < 1 || \$dd > 31) { // codice per data errata } else { // codice per data corretta }
Ovviamente puoi "aggiustare" il tutto a tuo piacimento.