Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Walidacja daty - tylko preg_match?
Forum PHP.pl > Forum > Przedszkole
@rtur
Witam odbieram dane z linku i pobieram na ich podstawie dane z bazy, czy jedyną metodą walidacji daty jest preg_match, czy jest jakaś inna funkcja?
Pyton_000
to zależy co z tą datą chcesz robić
Crozin
Przy pomocy preg_match spokojnie sprawdzisz poprawność formatu wejściowych danych, ale nie poprawność daty. Po sprawdzeniu formatu powinieneś skorzystać jeszcze z checkdate.
@rtur
pobieram dane albo z dziś (domyślnie) albo z konkretnego wybranego dnia, ale chcę aby jak ktoś wpisze z palca w linku w parametrze data cos innego jak date pokazało mu wpisy z dziś
  1. $getDate = $_GET['data'];
  2. if(isset($getDate) && preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$getDate)){
  3. $DataStart = $getDate.' 00:00:00';
  4. $DataEnd = $getDate.' 23:59:59';
  5. } else{
  6. $DataStart = date('Y-m-d').' 00:00:00';
  7. $DataEnd = date('Y-m-d').' 23:59:59';
  8. }
  9. $query='select news from tabela_newsy where data_publikacji >= \''.$DataStart.'\' and data_publikacji <= \''.$DataEnd.'\' order by data_publikacji desc';
Crozin
1. Kod wyrzuci Ci błąd w przypadku braku parametru "data" w adresie.
2. Można podać datę 2014-02-31, która nie jest poprawną datą.
3. Powinieneś korzystać z PDO i tzw. bindowania parametrów.
@rtur
ad 1: a nie załatwia tego isset($getDate)?
  1. if(isset($getDate) && ...) { // czy jest i ma odpowiedni format
  2. ....
  3. }else{ // nie ma parametru data lub błędny format w parametrze

ad 2: dlatego pytałem czy tylko preg_match, akurat ten jest "dziurawy" i przepuszcza ale myśle że udałoby się zbudować taki który by nie przepuścił, ale po co kombinować z preg_match jak może jest coś bardziej odpowiedniego do tego...? no właśnie może checkdate() spróbuje...
ad 3: prawdopodobnie będę to robił na PDO
Crozin
1. Nie, ponieważ linijkę wcześniej wykorzystujesz tę zmienną (czy właściwie odnosisz się do indeksu tablicy), tak jakby istniała - przypisanie jej wartości do zmiennej $getDate.

  1. if (!isset($_GET['date'])) {
  2. // brak parametru w adresie
  3. }
  4.  
  5. if (preg_match('#^(\\d{4})-(\\d{2})-(\\d{2})$#', $_GET['date'], $m) !== 1) {
  6. // nieprawidłowy format
  7. }
  8.  
  9. if (!checkdate($m[1], $m[2], $m[3])) {
  10. // nieprawidłowa data
  11. }
  12.  
  13. // OK
Pyton_000
Zawsze możesz próbować utworzyć obiekt DateTime na podstawie przesłanego parametru. Jak utworzy to jest git, a potem tylko robisz output z formatem jaki sobie chcesz. To załatwi Ci cały problem.
@rtur
Dziękuje za wszystkie wskazówki
Zrobiłem tak:
  1. if(isset($_GET['dzien']) && preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/si',$_GET['dzien'])) {
  2. $dzien=explode('-',$_GET['dzien']);
  3. if(count($dzien)==3){
  4. if(checkdate($dzien[1],$dzien[2],$dzien[0])){
  5. $wybranyDzien = $_GET['dzien'];
  6. }
  7. else {$wybranyDzien = date('Y-m-d');}
  8. }
  9. else {$wybranyDzien = date('Y-m-d');}
  10. }
  11. else {$wybranyDzien = date('Y-m-d');}
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.