javascript - jquery的$.ajax() 提交到php的post的数据不对

 有一颗爱心和寂寞的心 发布于 2022-11-30 19:08
$('#form1').submit(function(){
        
        $.ajax({ 
            url:'login.php?act=login',
            data:$('#form1').serialize(),
            type:'POST',
            dataType:'text',
            beforeSend:function(){
                }
                if($('#password').val()==''){
                    alert('密碼不能為空');
                    return false;
                }else{
                    var p = $('#password').val();
                    alert(p);
                    $('#password').val(hex_md5(p));
                    alert($('#password').val());
                }
            },
            success:function(msg){
                ......
                };
            }
        });
        return false;
    });

是这样,我的目的是,在提交之前,对密码进行md5计算,达到加密传输密码的作用。

可是实际的效果是,当我password值为123的时候,alert($('#password').val()) 打印出来是对的202cb962ac59075b964b07152d234b70 ,可是post到后台php之后,还是123 。

我感觉像是data:$('#form1').serialize()已经在beforeSend之前取值了,所以传到后面还是旧值。

经过测试,如果我把md5加密那一块拿出来,放到$.ajax()之前进行操作,是没有问题的。只是这样用起来不方便,有没办法让serialize()在beforSend之后执行呢?

补充:
在使用后贴@lisfan 提供的方法后,提交正常了

$('#form1').submit(function(){
        
        $.ajax({ 
            url:'login.php?act=login',
            **data:null,**
            type:'POST',
            dataType:'text',
            beforeSend:function(){
                }
                if($('#password').val()==''){
                    alert('密碼不能為空');
                    return false;
                }else{
                    var p = $('#password').val();
                    alert(p);
                    $('#password').val(hex_md5(p));
                    alert($('#password').val());
                    **this.data=$('#form1').serialize();**
                }
            },
            success:function(msg){
                ......
                };
            }
        });
        return false;
    });

但是后台php的$_REQUEST和$_POST都收不到数据。如下图:

下面是firebug看到的post数据,上面是php分别print $_REQUEST、$_POST和php://input的数据, 可以看到在file_get_contents("php://input")中是看到了原始数据的,但是为啥没有被封装到$_POST中去呢?

.

9 个回答
  • 在不修改题主原有结构的前提下,试试修改如下,看带 * 星号的位置

    $('#form1').submit(function(){
            
            $.ajax({ 
                url:'login.php?act=login',
                **data:null,**
                type:'POST',
                dataType:'text',
                beforeSend:function(){
                    }
                    if($('#password').val()==''){
                        alert('密碼不能為空');
                        return false;
                    }else{
                        var p = $('#password').val();
                        alert(p);
                        $('#password').val(hex_md5(p));
                        alert($('#password').val());
                        **this.data=$('#form1').serialize();**
                    }
                },
                success:function(msg){
                    ......
                    };
                }
            });
            return false;
        });
    2022-11-30 19:16 回答
  • 你可以处理完密码再发送$.AJAX()请求 就是先处理 beforeSend 函数的内容,再发送请求,这样 $('#form1').serialize() 的数据就是正确的

    2022-11-30 19:16 回答
  • 这说明 $('#form1').serialize() 这一函数在 beforeSend 之前调用了。

    2022-11-30 19:16 回答
  • 建议 当你输入完密码之后的验证函数中 如果验证通过 则直接将其加密后赋值到表单某个隐藏域中

    2022-11-30 19:16 回答
  • $('#form1').submit(function() {
      if ($('#password').val() == '') {
        alert('密碼不能為空');
        return false;
      }
      var p = $('#password').val();
      alert(p);
      $('#password').val(hex_md5(p));
      alert($('#password').val());
    
    
      $.post('login.php?act=login',
        $(this).serialize(),
        function(msg) {
          console.log(msg);
        }
      );
      return false;
    });
    2022-11-30 19:16 回答
  • 把判断拿出来,ajax放到密码加密后面。

    2022-11-30 19:16 回答
  • 这是因为,在执行$.ajax时,js引擎会创建一个字面量对象,创建对象时,data的值被存为了当时的$('#form1').serialize()返回值,也就是123。
    可以看下面的例子:
    var c=1;
    var a={

    b:c,
    d : function(){
        c=2
    }

    };
    console.log(a.b);// 1
    a.d();//c=2
    console.log(a.b);// 1
    这就可以解释上面的问题了。
    可能解决方式只有将md5加密移动到创建字面量对象之前。

    2022-11-30 19:16 回答
  • 首先,既然要md5,为什么还要赋值到password的input上,没有安全隐患么?其次,beforeSend函数是在发送请求前调用,不是在Ajax方法前调用,你在调用ajax方法时已经将form表单数据取出,设置到函数的参数中,那后面才修改的表单值怎么可能会自动更新到ajax的data中,根本是异想天开了。把密码md5的操作提到Ajax方法调用之前就对了

    2022-11-30 19:16 回答
  • 在ajax方法前把密码加密后的字符串做好

    2022-11-30 19:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有