javascript - jquery的$.ajax() 提交到php的post的数据不对
<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:$('#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 之前调用了。
建议 当你输入完密码之后的验证函数中 如果验证通过 则直接将其加密后赋值到表单某个隐藏域中
$('#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; });
把判断拿出来,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方法前把密码加密后的字符串做好

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

CakePHP ialah rangka kerja MVC sumber terbuka. Ia menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP mempunyai beberapa perpustakaan untuk mengurangkan beban tugas yang paling biasa.

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data
