我有一个用户注册表单。我正在通过AJAX进行服务器端验证。我的问题的快速总结是,在验证2个字段时,第二个字段验证出错。如果我评论第一个字段,那么第二个字段不会显示任何错误。它有这种奇怪的行为。下面详细信息:PHP,MySQL,jQuery,AJAX:json数据返回正确的响应,但前端返回错误
的HTML,JS和PHP代码都低于:
HTML表单:
<form id="SignupForm" action="">
<fieldset>
<legend>Free Signup</legend>
<label for="username">Username</label>
<input name="username" type="text" id="username" /><span id="status_username"></span><br />
<label for="email">Email</label>
<input name="email" type="text" id="email" /><span id="status_email"></span><br />
<label for="confirm_email">Confirm Email</label>
<input name="confirm_email" type="text" id="confirm_email" /><span id="status_confirm_email"></span><br />
</fieldset>
<p>
<input id="sbt" type="button" value="Submit form" />
</p>
</form>
JS:
<script type="text/javascript">
$(document).ready(function()
{
$("#email").blur(function()
{
var email = $("#email").val();
var msgbox2 = $("#status_email");
if(email.length > 3)
{
$.ajax({
type: 'POST',
url: 'check_ajax2.php',
data: "email="+ email,
dataType: 'json',
cache: false,
success: function(data)
{
if(data.success == 'y')
{
alert('Available');
}
else
{
alert('Not Available');
}
}
});
}
return false;
});
$("#confirm_email").blur(function()
{
var confirm_email = $("#confirm_email").val();
var email = $("#email").val();
var msgbox3 = $("#status_confirm_email");
if(confirm_email.length > 3)
{
$.ajax({
type: 'POST',
url: 'check_ajax2.php',
data: 'confirm_email='+ confirm_email + '&email=' + email,
dataType: 'json',
cache: false,
success: function(data)
{
if(data.success == 'y')
{
alert('Available');
}
else
{
alert('Not Available');
}
}
, error: function (data)
{
alert('Some error');
}
});
}
return false;
});
});
</script>
PHP代码:
<?php //check_ajax2.php
if(isset($_POST['email']))
{
$email = $_POST['email'];
$res = mysql_query("SELECT uid FROM members WHERE email = '$email' ");
$i_exists = mysql_num_rows($res);
if(0 == $i_exists)
{
$success = 'y';
$msg_email = 'Email available';
}
else
{
$success = 'n';
$msg_email = 'Email is already in use.</font>';
}
print json_encode(array('success' => $success, 'msg_email' => $msg_email));
}
if(isset($_POST['confirm_email']))
{
$confirm_email = $_POST['confirm_email'];
$email = (isset($_POST['email']) && trim($_POST['email']) != '' ? $_POST['email'] : '');
$res = mysql_query("SELECT uid FROM members WHERE email = '$confirm_email' ");
$i_exists = mysql_num_rows($res);
if(0 == $i_exists)
{
if(isset($email) && isset($confirm_email) && $email == $confirm_email)
{
$success = 'y';
$msg_confirm_email = 'Email available and match';
}
else
{
$success = 'n';
$msg_confirm_email = 'Email and Confirm Email do NOT match.';
}
}
else
{
$success = 'n';
$msg_confirm_email = 'Email already exists.';
}
print json_encode(array('success' => $success, 'msg_confirm_email' => $msg_confirm_email));
}
?>
问题:
只要我确认在check_ajax2.php文件$_POST['email']
以及$_POST['confirm_email']
,为confirm_email现场验证总是返回一个错误。用我有限的Firebug的知识,但是,我也发现,下面分别答复,当我进入的领域电子邮件和confirm_email:
RESPONSE 1: {“成功”:“Y”,“msg_email “:” 通过电子邮件将可用的 “}
RESPONSE 2: {” 成功 “:” Y “ ”msg_email“: ”通过电子邮件将可用的“} { ”成功“: ”N“, ”msg_confirm_email“:” 电子邮件和确认电子邮件不匹配。“}
虽然RESPONSE 2显示我们通过msg_confirm_email收到正确的消息,但从第nt结束时,弹出警报“Some error”(我启用了调试警报)。我花了48小时试图尽可能地改变代码的每一部分,但只取得了很小的成功。有什么奇怪的是,如果我完全评论$_POST['email']
字段的验证,那么验证$_POST['confirm_email']
字段显示正确无误。如果我启用它,它会正确验证电子邮件字段,但是当它到达验证confirm_email字段的位置时,它会再次向我显示错误。
我也尝试在check_ajax2.php页面中将重命名成功变量改为$_POST['email']
和$_POST['confirm_email']
的其他不同名称,但没有成功。我将在表单中添加更多字段并在check_ajax2.php页面中进行验证。所以我不打算使用不同的Ajax页面来验证每个字段(我认为这样做并不明智)。我不是一个jQuery或AJAX大师,所以所有帮助解决这个问题是高度赞赏。
预先感谢您。
+1。丹尼尔,非常感谢你的解决方案。它像一个魅力。此外,我尝试了你给我的验证json响应的链接,但是当我点击验证按钮时,它给了我解析失败的结果。我给了它一个{“成功”的输入:“y”,“msg_email”:“电子邮件可用”} {“成功”:“n”,“msg_confirm_email”:“电子邮件和确认电子邮件不匹配。”}。我做对了吗?对不起,我是一个全新的链接,你给了我,因此问题。 – Devner 2010-05-27 20:57:58
我很高兴它的工作!是的,你做的是正确的事情。它表示“解析失败”,因为字符串“{”success“:”y“,”msg_email“:”电子邮件可用“} {”success“:”n“,”msg_confirm_email“:”电子邮件和确认电子邮件不匹配。 “}'不是有效的JSON。基本上,如果jsonlint网站显示“解析失败”,那么您知道jQuery将调用您的错误处理程序。 – 2010-05-27 21:21:31
非常感谢您花时间解释它。欣赏它。此外,我只是想知道,如果你知道我可以用来缩短各个领域的PHP错误检查代码的方法吗?我的意思是,目前对于需要验证的每个字段,我将不得不在JS和PHP处理中添加相应的代码。那么是否有任何方法可以让JS(首选)和PHP中的代码变得简单,以验证这些代码而无需分别为它们分别编写代码?如果有任何问题,请告诉我。单击代码和错误检查已经太麻烦了! – Devner 2010-05-27 22:03:52