2017-01-09 158 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; 
}