Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Data - funkcja sprawdzania jej poprawności
Forum PHP.pl > Forum > PHP
wbeatn
Kłaniam się.

Nie wiem dokładnie gdzie coś takiego zamówić więc dlatego piszę tutaj.
Mianowicie chciałbym zlecić odpłatnie zrobienie pewnej funkcji, która ma na celu sprawdzenia poprawności daty z zapisu w konkretnej formie.

Skrypt pobiera wartość $_GET daty zapisanej w postaci 'ddmmYYYY' tj. np. dla 2 lutego 2024 roku --> 02022024, a np. dla 9 listopada 2013 --> 09112013

Potrzebuje teraz funkcji, która odrzuci wartość $_GET z błędną data.
Na razie poradziłem sobie tylko z wymuszeniem by data była ośmioznakowym ciągiem cyfr.
Lecz teraz sprawa jest bardziej skomplikowana.

Otóż data powinna zostać zaakceptowana tylko jeśli:

- wartosc dni i miesięcy w niej nie jest większa niz 31 dla dni i 12 dla miesiąca
- wartosc dni w lutym nie jest wyzsza niz 29 dla roku przestpnego i 28 w roku nieprzestepnym
- wartość dni w miesiącach kwiecien, czerwiec, wrzesien, listopad nie jest wyższa niż 30
- wartość dni w miesiącach styczeń, marzec, maj, lipiec, sierpien, październik, grudzień nie jest wyższa niż 31
- data nie jest dniem dzisiejszym i dniami wcześniejszymi tj. akceptuje tylko daty od dnia jutrzejszego z jutrzejszym wlacznie

w efekcie jeśli chodzi o kod PHP miałoby to wyglądać mw. tak (np. gdyby funkcja nazywała się checkdatefromget):

  1. if(checkdatefromget($_GET['date'])) {
  2.  
  3. // tutaj kod do wykonania
  4.  
  5. } else {
  6.  
  7. echo 'Data jest nieprawidłowa';
  8.  
  9. }


Jest to dla mnie zbyt skomplikowane gdyż jestem początkującym "programistą" i nie znam wszystkich możliwości PHP. Ograniczam się do pisania prostych skryptów. Zależy mi na czasie i dlatego chciałbym zamówić gotowca, bo sam nie dałbym rady stworzyć takiej funkcji nawet siedząc tydzień.

Jeśli są jacyś chętni to zapraszam na PW.

MODERATORA PROSZĘ O PRZENESIENIE TEMATU DO ODPOWIEDNIEGO DZIAŁU
Michael2318
Nie ten dział.
Poszlo PW smile.gif
Crozin
Już bez przesady...
  1. function abc($date) {
  2. if (!is_string($date) || strlen($date) !== 8) {
  3. return;
  4. }
  5.  
  6. $day = substr($date, 0, 2);
  7. $month = substr($date, 2, 2);
  8. $year = substr($date, 4);
  9.  
  10. try {
  11. $dt = new \DateTime("{$year}-{$month}-{$day}");
  12. $tomorrow = new \DateTime('+1 day');
  13. $tomorrow->setTime(0, 0, 0);
  14.  
  15. if ($dt->format('dmY') !== $date) {
  16. return;
  17. }
  18.  
  19. if ($dt < $tomorrow) {
  20. return;
  21. }
  22.  
  23. return $dt;
  24. } catch (\Exception $e) {}
  25. }
  26.  
  27. $test = abc($_GET['def']);
  28.  
  29. if ($test === null) {
  30. // bledna data
  31. }
  32.  
  33. var_dump($test);
Napisane z palca, więc może się coś posypać.

Dowolną kwotę wpłać na dowolną fundację OPP: http://www.mpips.gov.pl/bip/wykaz-organiza...ku-publicznego/

EDIT: Kod można znacząco skrócić wykorzystując przykład @maniek74 - dodając jeszcze sprawdzanie czy data jest datą w przyszłości.
maniek74
  1. <?php
  2.  
  3. $date = '20022024';
  4. if(validateDate($date, 'dmY')) {
  5. print 'poprawna';
  6. } else {
  7. print 'nie';
  8. }
  9.  
  10.  
  11.  
  12. function validateDate($date, $format)
  13. {
  14. $d = DateTime::createFromFormat($format, $date);
  15. return $d && $d->format($format) == $date;
  16. }
  17. ?>
  18.  


Pozdrawiam

ps. Nie musisz nic kombinować więcej, jesli data jest nie poprawna zwróci false poprawna true
Crozin
@maniek74: Twój kod może wyrzucić wyjątek, który wywali całą aplikację.
maniek74
Jaki, możesz podac przykład, bo testowałem i rózne bzdury wpisaywał i jak było poprawnie to zwracało true a jak nie to false.
wbeatn
Dziękuje wielkie!


PS. Swoją drogą wychodzi moj brak znajomosci fukcji PHP etc. Nie sadzilem ze to moze byc tak nieduzy kod
Crozin
Ahh... pomyłka. DateTime::createFromFormat nie wywali wyjątku w przeciwieństwie do konstruktora DateTime. wink.gif
maniek74
  1. <?php
  2.  
  3. $date = '08062014';
  4. if(validateDate($date, 'dmY') && $date > date('dmY')) {
  5. print 'poprawna';
  6. } else {
  7. print 'nie';
  8. }
  9.  
  10.  
  11.  
  12. function validateDate($date, $format)
  13. {
  14. $d = DateTime::createFromFormat($format, $date);
  15. return $d && $d->format($format) == $date;
  16. }
  17. ?>
  18.  



Nie ma opcji żeby wywaliło, sprawdziłem na wszystkie sposoby zamiast cyfr dałem litery i też dobrze działa
wbeatn
Cytat(maniek74 @ 7.06.2014, 18:35:01 ) *
  1. <?php
  2.  
  3. $date = '08062014';
  4. if(validateDate($date, 'dmY') && $date > date('dmY')) {
  5. print 'poprawna';
  6. } else {
  7. print 'nie';
  8. }
  9.  
  10.  
  11.  
  12. function validateDate($date, $format)
  13. {
  14. $d = DateTime::createFromFormat($format, $date);
  15. return $d && $d->format($format) == $date;
  16. }
  17. ?>
  18.  



Nie ma opcji żeby wywaliło, sprawdziłem na wszystkie sposoby zamiast cyfr dałem litery i też dobrze działa


Niestety w tym kodzie np. data 09032014 daje wynik 'poprawna' a powinno dawac 'nie', bo 9 marca 2014 jest za nami - jak sie domyslam kwestiatego, ze wartosc dnia jest wyzsza niz dnia daty dzisiejszej - czyli wieksza od 07

Jakaś rada?



Póki co rozwiązanie od Crozin działa elegencko! Niech Bóg ci błogosławi jeśliś nie ateista!
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.