Php jquery序列化和$.post

Php jquery序列化和$.post,php,jquery,serialization,post,get,Php,Jquery,Serialization,Post,Get,我试图使用jQuery中的$.post方法从表单发送大量数据。我首先使用serialize()函数将所有表单数据生成一个长字符串,然后在服务器端分解。 奇怪的是,当我尝试使用$.post发送它时,它会将serialize()的结果附加到URL,就像我使用GET发送一样。 有人知道为什么会这样吗 以下是jquery: $("#addShowFormSubmit").click(function(){ var perfTimes = $("#addShowForm").serialize();

我试图使用jQuery中的$.post方法从表单发送大量数据。我首先使用serialize()函数将所有表单数据生成一个长字符串,然后在服务器端分解。 奇怪的是,当我尝试使用$.post发送它时,它会将serialize()的结果附加到URL,就像我使用GET发送一样。 有人知道为什么会这样吗

以下是jquery:

$("#addShowFormSubmit").click(function(){
  var perfTimes = $("#addShowForm").serialize();
  $.post("includes/add_show.php", {name: $("#showTitle").val(), results: perfTimes }, function(data) {
    $("#addShowSuccess").empty().slideDown("slow").append(data);
  });
});  
以下是php:

$show = $_POST['name'];
$results = $_POST['results'];
$perfs = explode("&", $results);
foreach($perfs as $perf) {
    $perf_key_values = explode("=", $perf);
    $key = urldecode($perf_key_values[0]);
    $values = urldecode($perf_key_values[1]);
}
echo $key, $values;  

尝试使用serializeArray()而不是serialize()。serialize()将生成一个url编码的查询字符串,而serializeArray()将生成一个JSON数据结构。

是什么让您相信数据是附加到url的

无论如何,在表单数据本身中传递表单值不是更有意义吗?它将允许您跳过“分解”步骤:


所以这可能有点迟钝,但我做了一个函数来帮助我做这件事,因为我厌倦了每次都做一大堆修复。serializeArray有点烦人,因为它提供了一个对象集合,而我只想让PhP重构一个关联数组。下面的函数将遍历序列化数组,并仅在存在值时使用适当的属性构建新对象

首先,函数(它采用所讨论表单的ID):

在构建帖子时,我通常也会使用一个对象,因为我通常在表单数据之前标记两个或三个其他值,并且我认为这看起来比内联定义要干净,所以最后一步如下所示:

var payload = new Object(); 
//stringify requires json2.js from http://www.json.org/js.html
payload.data = JSON.stringify(data);

$.post("page.php", payload,  
    function(reply) {
        //deal with reply.
    });
服务器端您所要做的就是
$payload=json\u decode($\u POST['data'],true)
,您拥有一个关联数组,其中键是表单字段的名称


完整的免责声明,多个选择可能在这里不起作用,您可能只会得到列表中最后一个值。这也是专门为适合我的一个项目而创建的,所以您可能需要调整它以适合您。例如,我在服务器上的所有回复都使用json。

试试这种语法。我使用它来序列化表单,并通过ajax调用来发布WCF服务。此外,您可以将其发送回单个JSON对象,而不是按照您的方式构建对象。试试这个:

var serializedForm = serializedForm = $("#addShowForm").serializeArray();

$.post("includes/add_show.php", 
    {
        "myObjectName": ("#showTitle").val(), results: perfTimes 
    }, function(data) 
        {
            $("#addShowSuccess").empty()
            .slideDown("slow")
            .append(JSON.stringify(serializedForm)); 
        });

在php方面,您可能需要研究。如果使用第二个可选参数,它将把url字符串解析为变量或数组。

如果使用
元素激活序列化和ajax,并且
元素位于
表单
元素内,则
按钮将自动充当表单提交,不管其他什么。单击jQuery指定的任务

type='submit'
是一回事。如果将表格放在
元素中,他们将提交表格

type='button'
是不同的。它只是一个普通按钮,不会提交表单(除非您有意让它通过JavaScript提交表单)

如果表单元素没有指定action属性,则此提交只是将数据发送回同一页面。因此,您将看到页面刷新,以及URL中出现的序列化数据,就像您在ajax中使用GET一样

可能的解决方案 1-使
键入
按钮
。如上所述,这将阻止按钮提交表单

之前:

<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
    <button id='mySubmitButton'>Submit</button>
</form>
<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
    <button id='mySubmitButton'>Submit</button>
</form>

显然,没有看到你所有的代码,我不知道你的问题是否如此,但我见过您描述的行为的唯一原因是,提交按钮是一个没有指定类型的

出现此问题的另一个可能原因是:如果您有一个表单,但没有分配任何类型的提交操作,则在填写表单时只要按“ENTER”键,表单将提交到当前URL,因此您将看到序列化数据出现在URL中,就好像您正在使用GET ajax事务一样。此问题的一个简单解决方案是,在按下ENTER键时阻止其提交表单:

//Prevent Form Submission when Pressing Enter
$("form").bind("keypress", function(e) {
if (e.keyCode == 13)
    return false;
});

实际上,真正的诀窍是在click处理程序中调用事件的
preventDefault()
方法。这将阻止执行浏览器的本机操作。将按钮保留在表单中,但使用表单的提交处理程序并返回false
$('#myForm')。提交(function(){var data=this.serialize();$.post(this.attr('action'),data,function(){alert('done!'});返回false})
type=“button”
添加到
标记以避免表单提交。它不应该是“&”而不是&?
<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
<button type='button' id='mySubmitButton'>Submit</button>
</form>
<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
    <button id='mySubmitButton'>Submit</button>
</form>
<form id='myForm'>
    <!--Some inputs, selects, textareas, etc here-->
</form>
<button id='mySubmitButton'>Submit</button>
$("#addShowFormSubmit").click(function(event){
  event.preventDefault();
  var perfTimes = $("#addShowForm").serialize();
  $.post("includes/add_show.php", {name: $("#showTitle").val(), results: perfTimes },      function(data) {
    $("#addShowSuccess").empty().slideDown("slow").append(data);
  });
});
//Prevent Form Submission when Pressing Enter
$("form").bind("keypress", function(e) {
if (e.keyCode == 13)
    return false;
});