2017-01-09 192 views
0

我正在構建一個網站,要求用戶輸入他們的出生日期作爲表格的一部分。當他們點擊提交時,表單被提交給MySQL數據庫。日期輸入字段驗證

其中一個colums類型(dob)被設置爲PHPmyAdmin的日期。我有3位[DD] [MM] [YYY]。

我的問題是,如果用戶只在[DD]或[MM]字段中輸入1個字符,則會在數據庫中完全拋出日期。

例如,如果用戶在我的數據庫中輸入[01] [02] [2000]我收到2000-02-01。如果用戶輸入[1] [2] [2000],我會在我的數據庫中收到0000-20-12。

我的問題是,我怎麼能檢查這種使用某種驗證,以提示用戶在開始時添加0 - 或者 - 如果表單未提交,則在後端添加0。

如果有人提供代碼,他們能否添加註釋來解釋每個部分的作用?只是試着去學習。

非常感謝!

傑克

+1

我建議你閱讀這篇總結,然後再回來與任何剩下的問題:http://stackoverflow.com/a/3126175/683977輸入值的 驗證/衛生是一個安全的應用程序的一個主要關鍵,所以繼續學習。 – pintxo

+0

@Santi,謝謝你。我一定會讀一讀,並繼續學習。 –

回答

0

嗯,我說你有幾個選項...

的AVO通過正確使用參數化查詢和適當的對象類型來完全確認這個問題。第二個讓文本從輸入到數據庫的方式變爲unsanitized,你會打開注入和惡意攻擊。

如果字段類型爲date,那麼您應該將它作爲日期傳遞,等等等等。供應巴斯克小吃的提供,在上面你應該熟悉評論一個很好的鏈接:https://stackoverflow.com/a/3126175/683977


如果您打算堅持使用當前的方法(同樣,不推薦):

2。使箱子<select>列表,而不是文本框。

合併的投入和使用HTML5的「日期」輸入:<input type="date" />

4.使用PHP,檢查的月份和日期字段的長度。如果輸入的長度只有一個字符,則需要輸入0

5.使用一些簡單的JavaScript來檢查字段的長度,如果它們是一個字符,通知用戶他們必須使用所需的格式。


如果你讓輸入數據直接進入你的數據庫,你基本上離開,知道如何使用它的用戶開放MySQL的面板了。如果這只是一個個人項目,不會看到白天,你可以使用這些方法之一 - 但是,第二個方法是公開的,你必須重新考慮這一點。

+0

感謝您的建議,SQLinjection是我正在尋求解決的問題,但我希望前端能夠像我在進入下一步之前那樣工作。只是一個個人項目。謝謝您的意見。 –

+0

我決定使用選擇框,列出月份和年份的日期,並將值設置爲01,02等。 –

0

在PHP

if(strlen($DD) === 1) { 
    $DD = '0' .$DD; 
} 

if(strlen($MM) === 1) { 
    $MM = '0' .$MM; 
} 

它檢查已輸入的字符串的長度,並且如果該長度爲1時,增加了一個0到字符串的開頭。

或者您可以將用戶出生日期存儲爲使用PHP日期函數的單個變量和格式。

$input = '2/1/2000'; 
$birthday = date('Y-m-d', strtotime($input)); 

生日輸出 「2000年2月1日」

0

您需要使用這個代碼。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<title>JavaScript form validation - checking date</title>  
</head><br><body onload='document.form1.text1.focus()'> 
<div class="mail"> 
<h2>Input a valid date [dd/mm/yyyy or dd-mm-yyyy format]</h2> 
<form name="form1" action="#"> 
<ul> 
<li><input type='text' name='text1'/></li> 
<li>&nbsp;</li> 
<li class="submit"><input type="submit" name="submit" value="Submit" onclick="validatedate(document.form1.text1)"/></li> 
<li>&nbsp;</li> 
</ul> 
</form> 
</div> 
</body> 
</html> 

JS

function validatedate(inputText) 
    { 
    var dateformat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/; 
    // Match the date format through regular expression 
    if(inputText.value.match(dateformat)) 
    { 
    document.form1.text1.focus(); 
    //Test which seperator is used '/' or '-' 
    var opera1 = inputText.value.split('/'); 
    var opera2 = inputText.value.split('-'); 
    lopera1 = opera1.length; 
    lopera2 = opera2.length; 
    // Extract the string into month, date and year 
    if (lopera1>1) 
    { 
    var pdate = inputText.value.split('/'); 
    } 
    else if (lopera2>1) 
    { 
    var pdate = inputText.value.split('-'); 
    } 
    var dd = parseInt(pdate[0]); 
    var mm = parseInt(pdate[1]); 
    var yy = parseInt(pdate[2]); 
    // Create list of days of a month [assume there is no leap year by default] 
    var ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31]; 
    if (mm==1 || mm>2) 
    { 
    if (dd>ListofDays[mm-1]) 
    { 
    alert('Invalid date format!'); 
    return false; 
    } 
    } 
    if (mm==2) 
    { 
    var lyear = false; 
    if ((!(yy % 4) && yy % 100) || !(yy % 400)) 
    { 
    lyear = true; 
    } 
    if ((lyear==false) && (dd>=29)) 
    { 
    alert('Invalid date format!'); 
    return false; 
    } 
    if ((lyear==true) && (dd>29)) 
    { 
    alert('Invalid date format!'); 
    return false; 
    } 
    } 
    } 
    else 
    { 
    alert("Invalid date format!"); 
    document.form1.text1.focus(); 
    return false; 
    } 
    } 

CSS

li {list-style-type: none; 
font-size: 16pt; 
} 
.mail { 
margin: auto; 
padding-top: 10px; 
padding-bottom: 10px; 
width: 400px; 
background : #D8F1F8; 
border: 1px soild silver; 
} 
.mail h2 { 
margin-left: 38px; 
} 
input { 
font-size: 20pt; 
} 
input:focus, textarea:focus{ 
background-color: lightyellow; 
} 
input submit { 
font-size: 12pt; 
} 
.rq { 
color: #FF0000; 
font-size: 10pt; 
}