2013-05-30 65 views
0

我有一些PHP驗證碼用於驗證出生日期。代碼應該確保一個條目是(必填字段)格式是DD/MM/YYYY年必須在2000年& 2004年。出生日期驗證問題

我與我的代碼有問題是,它正確地檢查是否沒有進行輸入並轉發錯誤消息,但是如果我輸入任何隨機字符,它將接受它,而不檢查輸入數據的格式或字符。

這裏是我的代碼:

<?php 

if (isset($_POST['submit'])) { 

$msgd = ""; 
$dob = $_POST["dob"]; 

if(strlen($dob) > 0) { 
    if(substr_count($dob,'/') == 2) 
    { 
     list($d,$m,$y) = explode('/',$dob); 
     if (($y >= 2000 && $y <= 2004)) 
     { 
     return checkdate($d,$m,$y); 
     } else { 
     $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
     } 
    } 
    } else { 
    $msgd = '<span class="error"><b>You must enter a date</b></span>'; 
} 
} 

?> 

<b>Date of Birth</b> 
<br> 
<input type="text" id="dob" name="dob"><?php echo $msgd; ?> 

誰能幫我一個解決方案?

+1

我在這裏看到'return',但沒有函數頭。我想知道如果沒有設置'$ _POST ['submit']',用戶會看到什麼。 – raina77ow

+2

或者你可以節省你的自己很多麻煩,並使月,日,年下拉菜單。這樣你就知道這些值無論如何都是有效的,你只需要驗證是否空白。 –

回答

2

我想,我只想看看使用正則表達式驗證日期

$pattern = '#^((0[1-9])|([1-2][0-9])|(3[0-1]))/((0[1-9])|(1[0-2]))/(200[0-4])$#'; 

if (1 === preg_match($pattern, $dob) { 
    // date is valid 
} else { 
    // date is invalid 
} 

你甚至可以如果您喜歡,可以捕獲月份,日期和年份的子模式。

$1 => day sub-pattern 
$4 => month sub-pattern 
$8 => year sub-pattern 

或命名的子模式像這樣使用:

$pattern = '#^(?<day>(0[1-9])|([1-2][0-9])|(3[0-1]))/(?<month>(0[1-9])|(1[0-2]))/(?<year>200[0-4])$#'; 
if (1 === preg_match($pattern, $dob, $matches)) { 
    // date is valid 
    $day = $matches['day']; 
    $month = $matches['month']; 
    $year = $matches['year']; 
} else { 
    // date is invalid 
} 

使用這個正則表達式的好處是,它避免了寫一堆的代碼行爆炸的日期,然後每個人一天驗證/月/年組件。

+0

嗯我有一個服務器erorr當我試過這 – AJJ

+0

啊偉大的第二個一套代碼工作得很好,非常感謝! – AJJ

+0

@francis請注意編輯。看起來我的一個編輯改變日/月的順序原本沒有采取(我有他們在錯誤的順序,首先)。最新的更新使它們按正確的順序排列。 –

0

嘗試改變:

if (($y >= 2000 && $y <= 2004)) 
{ 
    return checkdate($d,$m,$y); 
} else { 
    $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
} 

到:

if (($y >= 2000 && $y <= 2004) && checkdate($m, $d, $y)) 
{ 
    $msgd = 'The date is fine!'; 
} else { 
    $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
} 

checkdate()提供的值是錯誤的順序。另外,我已將checkdate()函數移至if條件。

您也不需要使用return關鍵字,因爲此代碼看起來並不在函數中。

編輯

試試這個代碼:

<?php 
    $msgd = ''; 
    $dob = ''; 

    if (isset($_POST['submit'])) { 
     $dob = $_POST["dob"]; 

     if(strlen($dob) > 0) { 
      if(substr_count($dob,'/') == 2) 
      { 
       list($d,$m,$y) = explode('/',$dob); 

       if(!is_numeric($d) || !is_numeric($m) || !is_numeric($y)) 
       { 
        $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
       } else { 

        if (($y >= 2000 && $y <= 2004) && checkdate($m, $d, $y)) 
        { 
         $msgd = 'The date is fine!'; 
        } else { 
         $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
        } 
       } 
      } else { 
       $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
      } 
     } else { 
      $msgd = '<span class="error"><b>You must enter a date</b></span>'; 
     } 
    } 
?> 

<b>Date of Birth</b> 
<br> 
<input type="text" id="dob" name="dob" value="<?php echo $dob; ?>"><?php echo $msgd; ?> 
+0

剛纔也試過這個,同樣的問題,它需要我輸入什麼,甚至不顯示文本'日期很好!因爲理由。 – AJJ

+0

你能舉一個用戶進入的例子嗎? –

+0

此外,就在'if'條件之前,什麼是輸出當你做一個'的var_dump($ _ POST);' –

1
<?php 

if (isset($_POST['submit'])) { 

$msgd = ""; 
$dob = $_POST["dob"]; 

if(strlen($dob) > 0) { 
    if(substr_count($dob,'/') == 2) 
    { 
     list($d,$m,$y) = explode('/',$dob); 
     if (($y >= 2000 && $y <= 2004)) 
     { 
     ?> 
      <b>Date of Birth</b> 
      <br> 
      <input type="text" id="dob" name="dob"><?php echo $msgd; 
     } else { 
     $msgd = '<span class="error"><b>You must enter a correct date</b></span>'; 
     } 
    } 
    } else { 
    $msgd = '<span class="error"><b>You must enter a date</b></span>'; 
} 
} 

?> 
+0

剛剛試過這個,沒有運氣仍然得到同樣的問題 – AJJ