[PHP] Controllo su data e ora in form

starsuper
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.

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
marx1
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.

starsuper
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?

marx1
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.

starsuper
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"])
{
..



:(

Rggb1
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 ;)

starsuper
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 ;)

Rggb1
Arrivo dove ho detto, mi cito:
"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.

starsuper
ho provato a modificare cosi

			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] !

starsuper
Ora c'è un altro problemino pen piu grave, la data , nel formato YY:MM:GG .... :(

Rggb1
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.

starsuper
NOn ho la minima idea di come usare preg match ho provato a studiarci la sintassi ma non sono freschissimo di reg expression :)

Rggb1
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
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.