【问题标题】:Code does not stop from submitting the form even when user enters the same email again and again即使用户一次又一次地输入相同的电子邮件,代码也不会停止提交表单
【发布时间】:2025-12-27 22:50:16
【问题描述】:

当用户提交表单时,我正在尝试向服务器发送 AJAX 请求,我这样做是为了检查该电子邮件是否已被其他人使用,或者它是否是新的。

这是我的 javascript AJAX 函数

function check_entireform()
{ 
    var new_email = document.getElementById('jemail').value;
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            var y =xmlhttp.responseText;
            if(y=="user with that email is already registered")
                return false;
        }
    }

    var x ="user_exists.php?email="+ new_email;
    xmlhttp.open("GET",x,true);
    xmlhttp.send();
}

这是我的 html 输入标签

<form method="post" action="./new.php" onsubmit="return check_entireform()">
<input type="text" name="email" id="jemail"/>
</form>

这是我的 user_exists.php 文件

   <?php
     $email=$_GET["email"];
     if(mysql_query("SELECT email FROM user_info WHERE email='$email'"))
       echo "user with that email is already registered";
     else
       echo"user got a new email";
   ?>

当用户提交表单时,我想通过 AJAX 将用户电子邮件发送到 user_exists.php 文件,然后检查该电子邮件是否已被某人使用,如果已在使用中回显一些信息.

我不知道哪里出了问题。我一直在提交相同的电子邮件,但它没有回显,也没有阻止我提交表单。

如果有任何更好的解决方案来确定电子邮件是否已被某人使用,那就太好了。谢谢

【问题讨论】:

  • 为什么我无法以正确的方式编辑帖子?有人可以帮我这样做吗?
  • 每个代码行应该以 4 个空格开头。代码标签用于在段落中提到代码时突出显示代码
  • 感谢约翰编辑帖子!

标签: php javascript ajax forms validation


【解决方案1】:

AJAX 中的第一个 A 表示异步。

这意味着回调函数(你为onreadystatechange定义的那个)只会在服务器响应时运行。另一方面,您的 submit 处理程序 check_entireform 将比这更早返回。它返回undefined,其计算结果为false,因此您的表单未提交。

你想做什么,都应该在回调函数中做。

始终阻止提交并传递对表单的引用:

<form method="post" action="./new.php" onsubmit="check_entireform(this); return false;">

接受引用:

function check_entireform(theform) {

然后根据需要提交表单:

   if (xmlhttp.readyState==4 && xmlhttp.status==200)
   {
        var y =xmlhttp.responseText;
        if(y != "user with that email is already registered")
            theform.submit();
   }

jsFiddle Demo - 没有 AJAX,只有模拟


从你的 PHP 中返回一些更合乎逻辑的东西

提示:不要从 PHP 返回一个长字符串,而应该简单地返回 0 或 1。在这种情况下,您应该将 AJAX 查询视为是 - 否问题(这封电子邮件可以用过的?)。 1 表示是,0 表示否。

因此您可以将代码更改为:

        var canBeUsed =xmlhttp.responseText;
        if (canBeUsed) theform.submit();

它将变得更容易阅读和维护。


URL 编码查询字符串参数值

在这一行:

 var x ="user_exists.php?email="+ new_email;

您应该对new_email 变量进行URL 编码,因为某些字符(如&amp;)在查询字符串中具有特殊含义并且应该被编码。您可以使用encodeURIComponent() 函数来执行此操作:

 var x ="user_exists.php?email="+ encodeURIComponent(new_email);

清理 PHP 中的输入

始终清理(并验证)来自外部的任何数据。在当前形式下,您的代码容易受到SQL Injection 的攻击,这是一个巨大 问题。

在将数据插入查询之前,您应该在其上使用mysql_real_escape_string()或者更好的是,使用PDO 作为您的数据库内容)。

 $email = mysql_real_escape_string($_GET["email"]);
 if(mysql_query("SELECT email FROM user_info WHERE email='$email'"))

【讨论】: