2015-04-30 30 views
7

Buduję prosty skrypt weryfikacji daty i natknąłem się na duży problem.data wydania formularza weryfikacji

$correct_date = FALSE; 
if ($legal_month == $month_wozero || $legal_month == $month_wzero) { 
    if ($legal_day == $day_wzero || $legal_day == $day_wozero) { 
     if ($legal_year == $year) 
      $correct_date = TRUE; 
    } 
} 

$ legal_day, $ legal_month, $ legal_year = wejście użytkownik

$ day_wozero/wzero, $ month_wozero/wzero, $ czas roku = server

Użytkownik musi wprowadzić datę, w której złożył zamówienie. Ale oczywiście, to nigdy nie zadziała tak, jak skonfigurowałem swój skrypt. Lokalizacja firmy to -2 godziny od serwera. Ale to nie ma znaczenia, skoro ktoś może złożyć zamówienie w dowolnym miejscu w Stanach Zjednoczonych. Więc jeśli są w Nowym Jorku, może to być następny dzień, a biznes będzie w LA, daty będą się różnić. Również może to być ostatni dzień miesiąca, a miesiąc w Nowym Jorku również będzie różnił się od LA.

Jedynym sposobem, jaki temu towarzyszy, jest zbudowanie całego zagnieżdżonego zbioru reguł, aby dostosować się do różnicy czasu i miesiąca w określonych godzinach. Ale jestem prawie pewien, że musi istnieć inny sposób obejścia tego, czego nie jestem świadomy.

Wszelkie sugestie?

+0

Dlaczego nie całkowicie wyłączyć wymaganie dotyczące daty? – ceejayoz

+0

@ceejayoz Myślałem o tym, zanim zadałem to pytanie. Ale mam nadzieję na proste rozwiązanie. – Sickest

Odpowiedz

2

Musisz znać strefę czasową użytkownika, aby to zrobić. Możesz poprosić ich o wprowadzenie (niezawodny, ale nie przyjazny dla użytkownika) lub użyć biblioteki GeoIP. Jednak GeoIP jest mniej niezawodny, ponieważ użytkownicy mogą być za VPN lub proxy, które mogą ukryć swoje IP.

Być może można również wykonać walidację po stronie JS. Byłoby to niezawodny (zakładając, że zegar systemowy użytkownika jest poprawny), ale oczywiście nie jest bezpieczny, więc zależy to od twojego przypadku użycia.

3

Chciałbym dodać listę rozwijaną strefy czasowej i spróbować wybrać właściwą dla nich przy użyciu JS, abyś mógł spać spokojnie wiedząc, że jest on dostarczany od strony klienta.

Po otrzymaniu danych z serwera należy użyć tych informacji, aby przekonwertować datę użytkownika na strefę czasową serwera i porównać je lub utworzyć wartość daty serwera, która znajduje się w strefie czasowej dostarczonej przez użytkownika i sprawdzić, czy jest ona ustawiona.

Przykład

// We'll want this for later 
$server_timezone = date_default_timezone_get(); 

// Did the user supply a timezone and is it valid? 
if(
    $_POST['user_supplied_timezone'] !== '' && 
    date_default_timezone_set($_POST['user_supplied_timezone']) === TRUE 
) 
{ 
    // This accepts yyyy/m/d or yyyy/mm/dd formats 
    if(
     $_POST['user_year'] === date('Y') && 
     ($_POST['user_month'] === date('n') || $_POST['user_month'] === date('m')) && 
     ($_POST['user_day'] === date('j') || $_POST['user_day'] === date('d')) 
    ) 
    { 
     // TRUE 
    } 
} 

// It is officially "later" 
date_default_timezone_set($server_timezone); 
+0

Nie sądzę, aby dodanie listy rozwijanej strefy czasowej było czymś, co chcę zrobić, aby rozwiązać ten problem. Ale to całkiem fajne rozwiązanie. dzięki – Sickest

+0

@Setest Zawsze możesz dodać go jako '' i poproś JS o podanie wartości, jeśli nie chcesz, aby użytkownik się z tym bałaganił. – MonkeyZeus

+0

@ Czy masz szczęście w rozwiązaniu problemu? – MonkeyZeus

Powiązane problemy