Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] walidacja godziny
Forum PHP.pl > Forum > Przedszkole
Jarod
Mam w bazie pole odzina typu TIME.

Czyli godzina przetrzymywana jest jako, np. 16:55:34

Testuje formularz i gdy użytkownik wpisze string to skrypt się wywala. Jak sprawdzać czy użytkownik wpisał poprawnie godzine?

ps. musi być możliwość ręcznej edycji godziny (tylko godziny i minuty).
siemakuba
chodzi ci o to, czy wpisał godzinę w poprawnym formacie? (np. 15:22 jest OK?)

moze byc regEx, ale nie zabezpieczysz sie latwo przed np. wpisaniem goindzy 65:98 :/

wiec, probujesz rozbic wpisana wartosc przez ':'. Jezeli otrzymujesz tablice dwuelementowa w wwyniku takiego rozbicia - OK, jedziesz dalej. A dalej rzutujesz oba elementy tablicy na int, sprawdzasz czy znajduja sie w odpowiednim przedziale (0-24, 0-59) i juz wiesz czy jest OK.

  1. <?php
  2. function checkTime($time)
  3. {
  4. $t = explode(':', $time);
  5.  
  6. if (count($t) != 2)
  7. { return false;
  8. }
  9.  
  10. $hour = (int) $t[0];
  11. $minute = (int) $t[1];
  12.  
  13. if ( ($minute < 0 || $minute > 59) || ($hour < 0 || $hour > 24) )
  14. { return false;
  15. }
  16. return true;
  17. }
  18. ?>


byc moze mozna to rozwiazac jakos bardziej "elegancko", ale wlasnie takie rozwiazanie wpadlo mi do glowy :>

pozdr.
nospor
@siemakuba tez kiedys robilem podobnie. ale teraz tak mi wpadl pomysl, zeby rzutowac czas do znacznika czasu i spowrotem do godziny. jesli po przektalceniach godziny są ok, znaczy ze godzina jest poprawna:
  1. <?php
  2. function checkTime($time){
  3. return @($time === date('H:i',strtotime($time)));
  4. }
  5.  
  6. echo checkTime('23:80') ? 'ok <br />' : 'nieok <br />';
  7. echo checkTime('23:12') ? 'ok <br />' : 'nieok <br />';
  8. echo checkTime('23:') ? 'ok <br />' : 'nieok <br />';
  9. ?>

Są jakies luki w tym systemie? Jak pisalem wpadlem na to teraz i za bardzo nie tescilem, ale wydaje sie byc ok.

@J4r0d kto zapomnial o znaczikach w tytule? winksmiley.jpg prosze poprawic
siemakuba
@nospor: bardzo fajna koncepcja! szybki test pokazal ze zalozenie jest sluszne. Niekoniecznie potrzebna jest @ z przodu, bo nawet takie wywolanie strtotime('siemakuba') zwraca bez problemu wartosc (00:00) i zadnego bledu (chyba ze E_NOTICE - sprawdzalem na E_ALL ~&E_NOTICE).

mozna zamiast malpy zrzutowac to na (bool) tak dla pewnosci. Chociaz zupelnie nie jest to konieczne.

pozdr.
nospor
Cytat
Niekoniecznie potrzebna jest @ z
Uwierz, potrzebna jest smile.gif Moze masz wylaczone wyswietlanie warningow, ale moj trzeci przyklad pluje wlasnie warningiem, dlatego tez dalem malpe smile.gif

Cytat
Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970

Na chama mozna by sie bawic w warunki, ale to by wydluzylo skrypt, ja chcialem to w jednej linii zmiescic
siemakuba
Cytat
Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970

no, to wszystko jasne :) test przeprowadziłem na Unixie, i tak jak pisalem z wylaczonym E_NOTICE jedynie.
Z małpą czy bez - koncepcja jest fajna i warta przyzwyczajenia sie do niej :)

pozdr.

edit:
sorki... gapa jestem... display_errors = 0...

edit2:
Cytat
ja chcialem to w jednej linii zmiescic

tak, dobry one-liner nie jest zły :)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.