• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 3年前 (2022-01-23) 29次浏览 已收录 0个评论
文章目录[隐藏]

<body>

<code>$('#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);                  <b>6本文来源gao@dai!ma.com搞$代^码!网7</b><pre>搞gaodaima代码

$(‘#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 提供的方法后,提交正常了

<code>$('#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;    });</code>

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

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

.

回复内容:

<body>

<code>$('#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;    });</code>

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

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

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

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

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

<code>$('#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;    });</code>

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

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

.

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

<code>$('#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;    });</code>

你可以处理完密码再发送$.AJAX()请求 就是先处理 beforeSend 函数的内容,再发送请求,这样 $(‘#form1’).serialize() 的数据就是正确的

这说明 $(‘#form1’).serialize() 这一函数在 beforeSend 之前调用了。

建议 当你输入完密码之后的验证函数中 如果验证通过 则直接将其加密后赋值到表单某个隐藏域中

<code class="js">$('#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;});</code>

把判断拿出来,ajax放到密码加密后面。

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

<code>b:c,d : function(){    c=2}</code>

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

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

在ajax方法前把密码加密后的字符串做好


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:javascript – jquery的$.ajax() 提交到php的post的数据不对

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址