根据ajax条件提交表单不起作用

时间:2014-11-13 08:14:18

标签: php jquery html ajax

我有一个表单提交页面,在表单提交时调用一个函数。根据ajax中的条件包含ajax.Form提交.Ajax msg有两个值1和0,一次一个值。我的要求是当msg == 1表格不提交而msg == 0提交表格时。但现在两种情况下表格都没有提交。

我的代码如下。任何人都可以提供解决方案吗?

主页

<form action="addCustomer_basic.php" method="post"
name="adFrm" id="myform" >
<input name="name" type="text"   
 class="txtfld" id="name"    
 value=">" style="width:250px;"/>
<input name="email" type="text" 
class="txtfld" id="email" value=""  style="width:250px;"/>
<input name="submit" type="submit" value="Submit" />
</form>

 <script language="JavaScript">
 $(function() {

 $("#myform").submit(function(e) {
    var $form = $(this);
    var cust_name = $form.find('[name="name"]').val();
       e.preventDefault();// prevent submission
    var email = $form.find('[name="email"]').val();
    $.ajax({
      type: "POST",
      url: 'ajx_customer_mailid.php',
      data:'cust_name='+cust_name + '&email=' + email,
      success: function(msg) 
         { 
         alert(msg);
         if(msg==1) 
            {
            alert("Email Id already excist in database");
               return false;     
          }
          else 
           {
          self.submit();
          }
      }
   });


 });

 });
</script>

ajx_customer_mailid.php

<?php
 require_once("codelibrary/inc/variables.php");
 require_once("codelibrary/inc/functions.php");
 $cust_id=$_POST['cust_name'];
 $email=$_POST['email'];
 $se="select * from customer where name='$cust_id' and email='$email'";
 $se2=mysql_query($se);
 if($num>0)
  {
    echo $status=1;    
  }
 else
 {
   echo $status=0;  
 }
 ?>

2 个答案:

答案 0 :(得分:0)

我没有ajax你的代码,只是将msg直接设置为1或2。 查看我的代码,现在您可以模拟它:

    $("#myform").submit(function(e) {
        var $form = $(this);
        e.preventDefault();// prevent submission
        var msg = 2; 
        if (msg === 1) {
            alert("Email Id already excist in database");
            return false;
        } else {
            $form.submit(); //This causes Too much recursion
        }
    });

其中有一些错误。

所以,self.submit();很糟糕:

TypeError: self.submit is not a function
   self.submit();

您需要将其重写为$form.submit();

但在这种情况下,如果表单需要提交,您将在控制台中收到错误:

too much recursion

这是因为,如果成功,则会再次触发提交。但是,因为在之前的案例中它是成功的,它将再次成功,再次触发提交,等等。

<强>更新 让我们更清楚这里发生了什么。提交表单后,在致电e.preventDefault()之后会阻止表单提交。当ajax需要提交表单时,它会触发submit(),但是你阻止它提交,但是ajax条件会再次成立,所以你再次提交,并防止,这是一个inifinte循环,是什么导致了很多递归。

注意:

if($num>0) $num来自哪里?您的php文件中没有任何$num。您也不会获取您的SQL查询行。

  • 使用mysqli_*PDO函数代替mysql_*,因为它们已被弃用。

  • 通过转义变量来避免sql注入。

所以你需要像这样使用:

$se = "select * from customer where name='$cust_id' and email='$email'";
$se2 = mysql_query($se);
$num = mysql_num_rows($se2); //NEED THIS!
if ($num > 0) {
    echo $status = 1;
} else {
    echo $status = 0;
}

但我建议使用它:

$se = "SELECT COUNT(*) AS cnt FROM customer WHERE name='".mysql_real_escape_string($cust_id)."' and email='".mysql_real_escape($email)."'";
$se2 = mysql_query($se);
$row = mysql_fetch_assoc($se2); //NEED THIS!
if ($row["cnt"] > 0) {
    echo $status = 1;
} else {
    echo $status = 0;
}

答案 1 :(得分:0)

当您的ajax调用完成时,提交处理程序已经完成,因此提交继续,您知道它是异步的,因此该函数进行ajax调用并继续执行。您可以执行类似这样的操作http://jsfiddle.net/x7r5jtmx/1/代码执行的操作是进行ajax调用,然后等待,直到ajax success更新变量的值,更新值时,如果值为1 ,不需要做任何事情,因为我们已经从提交中停止了表单。如果值为0,则触发单击按钮以重新提交表单。您无法在提交处理程序中调用submit,但可以触发单击按钮。你显然需要改变ajax调用,只需在你的成功中设置msg

var data = {
        json: JSON.stringify({
            msg: 0 //change to 1 to not submit the form
        }),
        delay: 1
}

var msg = null;

var echo = function() {    
    return $.ajax({
        type: "POST",
        url: "/echo/json/",
        data: data,
        cache: false,
        success: function(json){
            msg = json.msg;
        }
    });
};

$( "#myform" ).submit(function( event ) {
    echo();

    var inter = setInterval(function(){
        console.log("waiting: " + msg);
        if (msg != null){
            clearInterval(inter);
        }
        if (msg == 0){
            $( "#myform" ).off();  //unbind submit handler to avoid recursion
            $( "#btnn" ).trigger("click"); //submit form
        }
    }, 200);

   return false; //always return false, we'll submit inside the interval
});