我使用Ajax来检查我的注册表单中的字段是否有效。
我的验证函数:
<script type='text/javascript'>
function validate(field, query) {
xmlhttp = new XMLHttpRequest(); // Creating Object
xmlhttp.onreadystatechange = function () // Checking if readyState changes
{
if (xmlhttp.readyState != 4 && xmlhttp.status == 200) // Validation Under Process
{
document.getElementById(field).innerHTML = "Validating..";
}
else if (xmlhttp.readyState == 4 && xmlhttp.status == 200) // Validation Completed
{
document.getElementById(field).innerHTML = xmlhttp.responseText;
}
else // If an error is encountered
{
document.getElementById(field).innerHTML = "Unknown Error Occurred. <a href='index.php'>Reload</a> the page.";
}
}
xmlhttp.open("GET", "check.php?field=" + field + "&query=" + query, false);
xmlhttp.send();
}
</script>
和我的check.php:
if ($field == "email")
{
$check = $db->prepare("SELECT * FROM users WHERE email = :query");
$check->bindParam(':query', $query);
$check->execute();
$count = $check->rowCount();
if ($count > 0)
{
echo "<script type='text/javascript'>document.getElementById('regr_btn').disabled = true;</script>";
echo "<font color=red>Email already exists</font>";
}
else
{
echo "<script type='text/javascript'>document.getElementById('regr_btn').disabled = false;</script>";
echo "<font color=green>Email available</font>";
}
if (!filter_var($query, FILTER_VALIDATE_EMAIL)) {
echo "<font color=red><br />Please enter a valid Email</font>";
echo "<script type='text/javascript'>document.getElementById('regr_btn').disabled = true;</script>";
}
else {
echo "<script type='text/javascript'>document.getElementById('regr_btn').disabled = false;</script>";
我的echo "<font color=red>Email already exists</font>";
工作完全正常。
但是正如你所看到的,我也尝试echo "<script type='text/javascript'>document.getElementById('regr_btn').disabled = false;</script>";
当电子邮件已经存在于我的数据库中时。
但不知何故它不起作用。我还试图显示:none而不是禁用我的按钮,但仍然没有结果。
如果我把document.getElementById('regr_btn').disabled = true;
到谷歌浏览器的控制台,那么它的工作很好。所以我的javascript没有被调用。
如果我是您,我会切换到使用jQuery并简单地传递一个响应,然后在您的页面中处理响应。下面是一个简短的例子:
$.ajax({
type: 'POST',
url: '/path/to/php/file.php',
data: {email: $('#email-field').val()},
dataType: 'json',
success: function(response) {
if(response.count > 0) {
$('#email-field-result').css('color', 'Red').text('E-mail already taken');
$('#reg_btn').prop('disabled', true);
} else {
$('#email-field-result').css('color', 'Green').text('E-mail available');
$('#reg_btn').prop('disabled', false);
}
}
});
和PHP:
$query = filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL);
$check = $db->prepare("SELECT * FROM users WHERE email = :query");
$check->bindParam(':query', $query);
$check->execute();
$count = $check->rowCount();
$return = array(
'count' => $count
);
echo json_encode($return);
如果你使用JSON返回你的响应,它允许你从PHP脚本返回复杂的响应
我的建议是使用php只返回响应:"有效","无效","重复",然后在javascript函数执行ajax调用修改相应的DOM。
让php回显一些javascript是无稽之谈(至少我是这么认为的)
的例子:
if(data = "Valid") {
$('#div_with_message').html('Email already exists');
}else{
$('#reg_btn').attr('disabled',true);
}