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