首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >即使用户一次又一次地输入相同的电子邮件,代码也不会停止提交表单。

即使用户一次又一次地输入相同的电子邮件,代码也不会停止提交表单。
EN

Stack Overflow用户
提问于 2012-01-17 08:11:14
回答 1查看 267关注 0票数 1

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

这是我的javascript AJAX函数

代码语言:javascript
代码运行次数:0
运行
复制
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输入标签

代码语言:javascript
代码运行次数:0
运行
复制
<form method="post" action="./new.php" onsubmit="return check_entireform()">
<input type="text" name="email" id="jemail"/>
</form>

这是我的user_exists.php文件

代码语言:javascript
代码运行次数:0
运行
复制
   <?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文件,然后检查该电子邮件是否已经被人使用,并在已经使用的情况下回显一些信息。

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

如果有更好的解决方案来找出是否有人已经在使用电子邮件,那就是great.Thanks

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-17 08:25:51

AJAX中的第一个A是用于异步的.

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

无论您想做什么,都应该在回调函数中这样做。

始终防止提交,并将引用传递给表单:

代码语言:javascript
代码运行次数:0
运行
复制
<form method="post" action="./new.php" onsubmit="check_entireform(this); return false;">

接受以下参考:

代码语言:javascript
代码运行次数:0
运行
复制
function check_entireform(theform) {

如有需要,请提交表格:

代码语言:javascript
代码运行次数:0
运行
复制
   if (xmlhttp.readyState==4 && xmlhttp.status==200)
   {
        var y =xmlhttp.responseText;
        if(y != "user with that email is already registered")
            theform.submit();
   }

jsFiddle演示 -没有AJAX,只有模拟

从PHP中返回更符合逻辑的内容

提示:不是从PHP返回长字符串,而是只返回0或1。您应该将AJAX查询看作是--在这种情况下没有问题(可以使用这封电子邮件吗?)1表示是,0表示不。

这样您就可以将代码更改为:

代码语言:javascript
代码运行次数:0
运行
复制
        var canBeUsed =xmlhttp.responseText;
        if (canBeUsed) theform.submit();

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

URL-编码查询字符串参数值

在这一行:

代码语言:javascript
代码运行次数:0
运行
复制
 var x ="user_exists.php?email="+ new_email;

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

代码语言:javascript
代码运行次数:0
运行
复制
 var x ="user_exists.php?email="+ encodeURIComponent(new_email);

清理PHP中的输入

总是对来自外部的任何数据进行清理(并验证)。在当前的形式中,您的代码容易受到SQL注入的攻击,这是的一个巨大的问题。

在向查询中插入数据之前,应该在查询上使用mysql_real_escape_string() (或者更好的是,使用http://php.net/manual/en/book.pdo.php处理数据库内容)。

代码语言:javascript
代码运行次数:0
运行
复制
 $email = mysql_real_escape_string($_GET["email"]);
 if(mysql_query("SELECT email FROM user_info WHERE email='$email'"))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8891451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档