.serialize不能正确传递参数

时间:2014-02-05 15:44:48

标签: php jquery

我将带有$ .post的序列化表单发送到Controller PHP:

$.post('/Controller.php',
    {
        action: 'register',
      data: $('#regForm').serialize()                       
    },
  function(msg){

        if(parseInt(msg.status)==1)
        {
            window.location=msg.txt;
        }
        else if(parseInt(msg.status)==0)
        {
            error(1,msg.txt);
        }

        hideshow('loading',0);
    }, 
    "json"      
);  

我现在希望能够通过$ _POST ['fieldname']访问表单字段  但反而 我在$ _POST ['data']中有一个Get like参数字符串-.-我做错了什么?

3 个答案:

答案 0 :(得分:1)

它正如您所说的那样发送数据。 .serialize()创建了一个“查询字符串”,您将其添加到$_POST['data']

而不是你拥有的,试试这个:

var formData = $('#regForm').serialize();
var extraFields = {action: 'register'};

$.post('/Controller.php', $.param(extraFields)+'&'+formData, function(msg){
    if(parseInt(msg.status)==1)
    {
        window.location=msg.txt;
    }
    else if(parseInt(msg.status)==0)
    {
        error(1,msg.txt);
    }

    hideshow('loading',0);
}, 'json');

现在您应该可以获得$_POST['action']$_POST['fieldname']

答案 1 :(得分:0)

$ .post格式如下:

jQuery.post( url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ] )

所以你的第一个参数是url正确,第二个参数是数据。这就是为什么你将$ _POST ['data']和$ _POST ['action']作为post参数,因为你确实发送了两个url参数'action'和'data'。你可以这样做并直接将表格作为数据发送:

$.post('/Controller.php',
       $('#regForm').serialize(),
  function(msg){

        if(parseInt(msg.status)==1)
        {
            window.location=msg.txt;
        }
        else if(parseInt(msg.status)==0)
        {
            error(1,msg.txt);
        }

        hideshow('loading',0);
    }, 
    "json"      
);  

然后你会得到你要求的东西,$ _POST ['fieldname']

答案 2 :(得分:0)

确保表单中的输入字段分配了name属性,否则jQuery将无法正确发送数据。

另一种选择是使用serializeArray。两个has been discussed here.

之间的差异
$.post('/Controller.php',
    {
        action: 'register',
      data: $('#regForm').serializeArray()                       
    },
  function(msg){
        if(parseInt(msg.status)==1)
        {
            window.location=msg.txt;
        }
        else if(parseInt(msg.status)==0)
        {
            error(1,msg.txt);
        }

        hideshow('loading',0);
    }      
)