Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php HTML5表单验证机制:设置服务器端验证后失效_Php_Html_Forms_Css_Validation - Fatal编程技术网

Php HTML5表单验证机制:设置服务器端验证后失效

Php HTML5表单验证机制:设置服务器端验证后失效,php,html,forms,css,validation,Php,Html,Forms,Css,Validation,好吧,标题太奇怪了,我当然应该告诉你们发生了什么:)。我正在创建一个HTML5表单。我希望使用HTML5新技术和CSS3新的伪类(当然我记得关于服务器端验证)对该表单进行充分验证。我会举一个例子: HTML: 众所周知:好的验证在用户浏览器和服务器上都是严格相同的。所以,若我只允许用户输入电子邮件号码,服务器将接受信件,那个么这是一个错误。若用户可以输入数字,服务器将不接受,这是一个错误 有什么问题?我在向一个用户索要一封电子邮件。用户输入asd@asd在HTML5术语中,这是一个完美的验证电子

好吧,标题太奇怪了,我当然应该告诉你们发生了什么:)。我正在创建一个HTML5表单。我希望使用HTML5新技术和CSS3新的伪类(当然我记得关于服务器端验证)对该表单进行充分验证。我会举一个例子:

HTML:

众所周知:好的验证在用户浏览器和服务器上都是严格相同的。所以,若我只允许用户输入电子邮件号码,服务器将接受信件,那个么这是一个错误。若用户可以输入数字,服务器将不接受,这是一个错误

有什么问题?我在向一个用户索要一封电子邮件。用户输入asd@asd在HTML5术语中,这是一个完美的验证电子邮件(asd可以是本地主机,所以不需要dot)。这就是为什么输入得到验证,并且一切正常。现在,我将这封电子邮件发送到我的PHP脚本,它要求更高。例如,它:

PHP

所以发电子邮件asd@asd当然没有通过这个验证

是否有任何机制允许我建议浏览器回复这封电子邮件仍然不好,但使用HTML5方法?

更准确地说。我编写了一个PHP表单类wch,它首先检查POST数据,然后呈现表单。因此,如果缺少某些内容,我可以使用发送的POST数据呈现表单,以避免忘记输入值。这是做这种事情的常用方法

因此,在PHP知道电子邮件无效但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');
    }
});