Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.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 AJAX确认表单提交_Php_Javascript_Ajax_Forms_Validation - Fatal编程技术网

PHP AJAX确认表单提交

PHP AJAX确认表单提交,php,javascript,ajax,forms,validation,Php,Javascript,Ajax,Forms,Validation,我有一个小表格,里面有名字、姓氏和日期。单击提交表单时,我希望它检查数据库中是否有重复条目(使用Ajax),如果已经有1+个条目,则显示一个确认窗口,确认另一次提交。如果没有任何条目,则确认不应显示 出于某种原因,它似乎在显示确认,而没有来自Ajax PHP页面的结果。如果我在xmlHttp.send(null)行之后引入一个警报,它会从PHP获取文本(如需要),这让我觉得我误解了代码的执行顺序。代码如下: Javascript: function check_duplicates()

我有一个小表格,里面有名字、姓氏和日期。单击提交表单时,我希望它检查数据库中是否有重复条目(使用Ajax),如果已经有1+个条目,则显示一个确认窗口,确认另一次提交。如果没有任何条目,则确认不应显示

出于某种原因,它似乎在显示确认,而没有来自Ajax PHP页面的结果。如果我在
xmlHttp.send(null)
行之后引入一个警报,它会从PHP获取文本(如需要),这让我觉得我误解了代码的执行顺序。代码如下:

Javascript:

    function check_duplicates() {
        var first = document.getElementById('first_name').value;
        var last = document.getElementById('last_name').value;
        var date = document.getElementById('event_date').value;

        var xmlHttp = GetXmlHttpObject();
        if (xmlHttp == null) {
            alert ("Your browser does not support AJAX!");
            return;
        }

        var result = "ERROR - Ajax did not load properly";
        var url="check_duplicate.php";
        url=url+"?first="+first;
        url=url+"&last="+last;
        url=url+"&date="+date;

        xmlHttp.onreadystatechange=function() {
            if(xmlHttp.readyState==4) {
                result = xmlHttp.responseText;
                alert("RESULT="+result);
                if(result != "clean") {
                    var validate = confirm(result);
                    return validate;
                }
            }
        }

        xmlHttp.open("GET",url,true);
        var test = xmlHttp.send(null);
    }
    function GetXmlHttpObject() {
        var xmlHttp = null;
        try {
            // Firefox, Opera 8.0+, Safari
            xmlHttp=new XMLHttpRequest();
        }
        catch (e) {
                // Internet Explorer
                try {
                    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
                }
                catch (e) {
                    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
        }

        return xmlHttp;
    }
PHP:


这一行代码返回未定义的代码

 var test = xmlHttp.send(null);
您必须了解的是,
send()
调用立即返回,Javascript保持运行。同时,您的AJAX请求正在后台运行。此外,请求完成后,将调用
onreadystatechange
处理程序,无论需要10毫秒还是100秒,其余代码都不会收到其返回值

我想你想在确认完成后提交表格。您只知道从
onreadystatechange
处理程序内部完成请求的时间。这里的问题是,为了等待AJAX请求完成,您必须覆盖表单的默认行为

您需要在表单提交事件上调用
preventDefault()
,然后在确认后手动提交数据

    xmlHttp.onreadystatechange=function() {
        if(xmlHttp.readyState==4) {
            var confirmed = false;
            var result = xmlHttp.responseText;
            if (result == "clean")
                confirmed = true;
            else
                confirmed = confirm("RESULT="+result);

            if (confirmed) {
                var url = "addData.php";
                url=url+"?first="+encodeURIComponent(first);
                url=url+"&last="+encodeURIComponent(last);
                url=url+"&date="+encodeURIComponent(date);
                window.location = url;
            }
        }
    }
此外,在构建URL时,应该使用encodeURIComponent

    url=url+"?first="+encodeURIComponent(first);
    url=url+"&last="+encodeURIComponent(last);
    url=url+"&date="+encodeURIComponent(date);

下面是一个使用同步AJAX的答案。这样,您就不必重载默认表单处理来让它工作。但是,在确认请求运行时,所有javascript都将被阻止,这意味着无论确认请求持续多长时间,您的网页都可能会突然停止

如果应该添加记录,此函数将返回true,否则返回false

function check_duplicates() {
    var first = document.getElementById('first_name').value;
    var last = document.getElementById('last_name').value;
    var date = document.getElementById('event_date').value;

    var xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null) {
        alert ("Your browser does not support AJAX!");
        return false;
    }

    var result = "ERROR - Ajax did not load properly";
    var url="check_duplicate.php";
    url=url+"?first="+encodeURIComponent(first);
    url=url+"&last="+encodeURIComponent(last);
    url=url+"&date="+encodeURIComponent(date);

    xmlHttp.open("GET",url,false);
    xmlHttp.send(null);

    var validated = true;
    var result = xmlHttp.responseText;

    if (result != 'clean')
        validated = confirm("RESULT="+result);

    return validated;
}

它是否警告“RESULT=ERROR-Ajax未正确加载”?否,它警告“RESULT=”,但正如我所说,如果我在
var test=xmlHttp.send(null)之后放置一个简单的警告然后使用正确的输出(来自PHP)发出警报。这让我对函数调用的延迟/顺序感到困惑。啊,但是您已经将result的值设置为“ERROR-Ajax没有正确加载”,这将被覆盖为空白。您的php在某处返回空白。不过,我看不出在哪里。我认为PHP根本没有受到影响。我把它编辑成只看
die(“PHP页面点击”)并且它仍然不会触发,除非在调用
send()
后有一些延迟。我不确定是什么原因造成的…所以如果你在延迟后检查,你会得到“PHP页面命中”?这很奇怪。我很感谢您的尝试,但不,我不是通过Ajax执行插入操作,我想在提交表单之前检查重复项。我知道
send()
返回未定义,它只是设置了一个变量进行测试。我使用ajax有点慢,所以请耐心听我说,但“他的其余代码”即警报和确认,仅在调用onreadystatechange处理程序时发生?他遗漏了处理表单提交事件的部分。事件到达后,他发出ajax请求(立即返回),然后进行常规表单提交。在所有情况下,表单在确认ajax请求完成之前很久就提交了。您必须按顺序强制这些事情发生,或者通过确保同步ajax请求,或者通过覆盖默认表单提交。我将发布另一个解决方案,使用同步请求。没有迹象表明他在检查validate变量后没有提交表单,但即使是这样,它仍然无法解释为什么请求返回时为空。
function check_duplicates() {
    var first = document.getElementById('first_name').value;
    var last = document.getElementById('last_name').value;
    var date = document.getElementById('event_date').value;

    var xmlHttp = GetXmlHttpObject();
    if (xmlHttp == null) {
        alert ("Your browser does not support AJAX!");
        return false;
    }

    var result = "ERROR - Ajax did not load properly";
    var url="check_duplicate.php";
    url=url+"?first="+encodeURIComponent(first);
    url=url+"&last="+encodeURIComponent(last);
    url=url+"&date="+encodeURIComponent(date);

    xmlHttp.open("GET",url,false);
    xmlHttp.send(null);

    var validated = true;
    var result = xmlHttp.responseText;

    if (result != 'clean')
        validated = confirm("RESULT="+result);

    return validated;
}