我有一个小表单,其中包含名字,姓氏和日期。在单击以提交表单时,我希望它检查数据库是否有重复条目(使用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:
// DATABASE CONNECTION INFORMATION REMOVED
$first = $_GET['first'];
$last = $_GET['last'];
$date = date('Y-m-d',strtotime($_GET['date']));
$sql = "SELECT COUNT(*) AS count FROM Table WHERE First='$first' AND ".
"Last='$last' AND Date='$date'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row['count'] > 0) {
if($row['count'] == 1) {
echo "There is already an entry for ".$first." ".$last." on ".
date('M jS',strtotime($date)).".\n".
"Are you sure you want to submit this entry?";
}
else { // plural version of the same message
echo "There are already ".$row['count']." entries for ".$first." ".
$last." on ".date('M jS',strtotime($date)).".\n".
"Are you sure you want to submit this entry?";
}
} else {
echo "clean";
}
答案 0 :(得分:1)
以下是使用同步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;
}
答案 1 :(得分:0)
这行代码返回undefined
。
var test = xmlHttp.send(null);
您必须了解的是send()
调用立即返回并且Javascript一直在运行。同时,您的AJAX请求正在后台运行。此外,请求完成后会调用onreadystatechange
处理程序,无论是10ms还是100s,其余代码都不会收到其返回值。
我想在确认完成后你想提交表格。您只知道请求何时从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);