Php HTML5表单验证机制:设置服务器端验证后失效
好吧,标题太奇怪了,我当然应该告诉你们发生了什么:)。我正在创建一个HTML5表单。我希望使用HTML5新技术和CSS3新的伪类(当然我记得关于服务器端验证)对该表单进行充分验证。我会举一个例子: HTML: 众所周知:好的验证在用户浏览器和服务器上都是严格相同的。所以,若我只允许用户输入电子邮件号码,服务器将接受信件,那个么这是一个错误。若用户可以输入数字,服务器将不接受,这是一个错误 有什么问题?我在向一个用户索要一封电子邮件。用户输入asd@asd在HTML5术语中,这是一个完美的验证电子邮件(asd可以是本地主机,所以不需要dot)。这就是为什么输入得到验证,并且一切正常。现在,我将这封电子邮件发送到我的PHP脚本,它要求更高。例如,它: PHP 所以发电子邮件asd@asd当然没有通过这个验证 是否有任何机制允许我建议浏览器回复这封电子邮件仍然不好,但使用HTML5方法? 更准确地说。我编写了一个PHP表单类wch,它首先检查POST数据,然后呈现表单。因此,如果缺少某些内容,我可以使用发送的POST数据呈现表单,以避免忘记输入值。这是做这种事情的常用方法 因此,在PHP知道电子邮件无效但HTML5认为它有效后,我将呈现输入电子邮件。更多代码(实际上是片段,向您展示想法…):Php HTML5表单验证机制:设置服务器端验证后失效,php,html,forms,css,validation,Php,Html,Forms,Css,Validation,好吧,标题太奇怪了,我当然应该告诉你们发生了什么:)。我正在创建一个HTML5表单。我希望使用HTML5新技术和CSS3新的伪类(当然我记得关于服务器端验证)对该表单进行充分验证。我会举一个例子: HTML: 众所周知:好的验证在用户浏览器和服务器上都是严格相同的。所以,若我只允许用户输入电子邮件号码,服务器将接受信件,那个么这是一个错误。若用户可以输入数字,服务器将不接受,这是一个错误 有什么问题?我在向一个用户索要一封电子邮件。用户输入asd@asd在HTML5术语中,这是一个完美的验证电子
$email=isset($\u POST['email'])$_张贴['email']:'';
如果(验证($email)){
//你想用表格做什么都行
标题(“位置:/成功祝贺伟大的形式hoooray”);
}
否则{
回声“…”;
echo”“;//这封$email在这里很重要!
回声“
回声“;
}
是否有机会建议浏览器此输入无效?我曾想过只有在验证错误的情况下才回显某种
。但我被困在这里了
我认为这个问题、例子和答案将对很多人有用,他们想制作一个符合标准的表格,但错过了一些东西
谢谢你的回复和问候
更新
真的不知道如何才能做到这一点吗?我正在考虑启动一个赏金:)。不久前,我在尝试使用regex验证电子邮件时遇到了相同的电子邮件验证问题。我搜索了web并找到了此功能
function validateMail($email) {
$isValid = true;
$atIndex = strrpos($email, "@");
if (is_bool($atIndex) && !$atIndex) {
return false;
}
else {
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64) {
return false;
}
else if ($domainLen < 1 || $domainLen > 255) {
return false;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.') {
return false;
}
else if (preg_match('/\\.\\./', $local)) {
return false;
}
else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
return false;
}
else if (preg_match('/\\.\\./', $domain)) {
return false;
}
else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
str_replace("\\\\","",$local))) {
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) {
return false;
}
}
if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) {
return false;
}
}
return $isValid;
}
功能验证电子邮件($email){
$isValid=true;
$atIndex=strrpos($email,“@”);
如果(是布尔($atIndex)和&!$atIndex){
返回false;
}
否则{
$domain=substr($email$atIndex+1);
$local=substr($email,0,$atIndex);
$localLen=strlen($local);
$domainLen=strlen($domain);
如果($localLen<1 | |$localLen>64){
返回false;
}
else if($domainLen<1 | |$domainLen>255){
返回false;
}
else if($local[0]='.| |$local[$localLen-1]='.){
返回false;
}
else if(预匹配('/\.\.\./',$local)){
返回false;
}
else如果(!preg_match('/^[A-Za-z0-9\\-\\.]+$/',$domain)){
返回false;
}
else if(preg\u匹配('/\.\.\./',$domain)){
返回false;
}
如果(!preg_match('/^(\\\.\.\.[A-Za-z0-9!\\\%&`\\/$\'*+?^{}\\\\.-])+$/',则,
str\u replace(“\\\\”,“,$local))){
如果(!preg_match('/^'(\\\\\“\\\[^”])+“$/”,str_replace(“\\\\”,“,$local))){
返回false;
}
}
if($isValid&!(checkdnsrr($domain,“MX”)| | checkdnsrr($domain,“A”)){
返回false;
}
}
返回$isValid;
}
在文章中,它说该函数基于RFC-5322标准。它从未让我失望。好的,我已经回答了我自己的问题。这是一件多么自私的事情。如果PHP返回无效,那么我们可以响应
echo '<input name="mail" .... data-validate="This email address does not exist" />';
echo';
然后包含javascript,检查输入是否有自己的数据验证属性。如果有,设置自定义有效性消息(在文档准备就绪时),例如:
$(document).ready(function() {
var elements = $('input[data-validate]');
for (var i = 0; i < elements.length; i++) {
var error = $(elements[i]).attr('data-validate');
elements[i].setCustomValidity(error);
$(elements[i]).removeAttr('data-validate');
}
});
$(文档).ready(函数(){
变量元素=$(“输入[数据验证]”);
对于(var i=0;i
在这种情况下,我们可以在php验证返回错误后使用html5验证机制。并且php的相同错误将返回给用户。多么好的语义解决方案啊!!
如果输入不正确,您可以输入一些不同的消息。例如“域不存在”,“邮件中没有@!”!“等等
希望它能帮助某些人…你认为这个解决方案怎么样?
我会等待评论,如果有人+1我,我会将其标记为已回答…因为我对回答自己感到陌生
更新
事情并不像我想的那么简单。这不是一个100%的好答案,但是,这是一个好主意:)。问题是,在设置自定义有效性后,表单不能再提交了。因此Javascript还应该触发submit click函数,然后将所有自定义有效性重置为init状态
真实答案
所以…这样做不是一个好主意。让标准赶上现实,让我们等到浏览器真正检查电子邮件是否存在的时候。在这之前,尽你所能在浏览器端进行验证,并将主要、强大的验证留给服务器端。如果到底出了什么问题,请使用你自己的电子邮件验证机制错误报告,不要试图使用jquery将它们从php反射回html5
$email = isset($_POST['email']) ? $_POST['email'] : '';
if (Validate($email)) {
// do whatever You want with the form
header("Location: /success-congratulations-great-form-hoooray");
}
else {
echo "<form>...";
echo "<input type="email" value=\"$email\">"; // this $email is important here!
echo "<input type=\"submit\" ... />
echo "</form>";
}
function validateMail($email) {
$isValid = true;
$atIndex = strrpos($email, "@");
if (is_bool($atIndex) && !$atIndex) {
return false;
}
else {
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64) {
return false;
}
else if ($domainLen < 1 || $domainLen > 255) {
return false;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.') {
return false;
}
else if (preg_match('/\\.\\./', $local)) {
return false;
}
else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
return false;
}
else if (preg_match('/\\.\\./', $domain)) {
return false;
}
else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
str_replace("\\\\","",$local))) {
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) {
return false;
}
}
if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) {
return false;
}
}
return $isValid;
}
echo '<input name="mail" .... data-validate="This email address does not exist" />';
$(document).ready(function() {
var elements = $('input[data-validate]');
for (var i = 0; i < elements.length; i++) {
var error = $(elements[i]).attr('data-validate');
elements[i].setCustomValidity(error);
$(elements[i]).removeAttr('data-validate');
}
});