Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Walidacja daty - tylko preg_match?
@rtur
post
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


to zależy co z tą datą chcesz robić
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Przy pomocy preg_match spokojnie sprawdzisz poprawność formatu wejściowych danych, ale nie poprawność daty. Po sprawdzeniu formatu powinieneś skorzystać jeszcze z checkdate.
Go to the top of the page
+Quote Post
@rtur
post
Post #4





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

Ostrzeżenie: (0%)
-----


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';
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
@rtur
post
Post #6





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

Ostrzeżenie: (0%)
-----


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

Ten post edytował @rtur 31.03.2015, 18:42:07
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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


Ten post edytował Crozin 1.04.2015, 08:10:20
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
@rtur
post
Post #9





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

Ostrzeżenie: (0%)
-----


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');}


Ten post edytował @rtur 6.04.2015, 14:41:27
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 04:59