Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang tutorial php javascript - jquery的$.ajax() 提交到php的post的数据不对

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

Jul 06, 2016 pm 01:51 PM
javascript jquery php

<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>
Salin selepas log masuk
Salin selepas log masuk

是这样,我的目的是,在提交之前,对密码进行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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

但是后台php的$_REQUEST和$_POST都收不到数据。如下图:
javascript - jquery的$.ajax() 提交到php的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>
Salin selepas log masuk
Salin selepas log masuk

是这样,我的目的是,在提交之前,对密码进行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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

但是后台php的$_REQUEST和$_POST都收不到数据。如下图:
javascript - jquery的$.ajax() 提交到php的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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

你可以处理完密码再发送$.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;
});
Salin selepas log masuk

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

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

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

};
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方法前把密码加密后的字符串做好

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

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

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

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

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

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

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

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

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

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

Panduan Ringkas CakePHP Panduan Ringkas CakePHP Sep 10, 2024 pm 05:27 PM

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.

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

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

See all articles