在 PHP 中解析一个 jquery 序列化字符串

Posted

技术标签:

【中文标题】在 PHP 中解析一个 jquery 序列化字符串【英文标题】:Parse a jquery serialize string in PHP 【发布时间】:2012-06-30 03:32:27 【问题描述】:

在人们扑倒我之前,我已经看到了这个帖子:How do I php-unserialize a jQuery-serialized form?

我的问题非常相似,但我的数据却大不相同。我正在使用 AJAX 调用来发布帖子,数据发布得很好(jQuery 是 1.7)。当用户单击几个链接并深入到此表单和 ajax 脚本时,表单和 AJAX 会动态加载。

AJAX 看起来像:(顺便说一句,我知道你应该对我们使用 .on() 但我似乎无法像我一样使用 .live() )

$('#ajaxCaptionForm').live('submit', function(e)
    e.preventDefault(); 
    $.ajax(
        'type':'POST',
        'data':formData: $('#ajaxCaptionForm').serialize(),
        'success':function()
            parent.$.fancybox.close();
        
    );   
); // closing form submit 

表格如下:

<form method="Post" action="localhost/controller" id="ajaxCaptionForm" name="ajaxCaptionForm">
    <label for="Caption">Caption</label><input type="text" id="Caption" name="Caption" value="Leaf lesions.">
    <label for="Keywords">Keywords</label>
    <p>Please seperate keywords by a comma
    <input type="text" id="Keywords" name="Keywords" value=""></p>
    <input type="hidden" id="imageID" name="imageID" value="87595">
    <input type="submit" value="Update Image" name="yt3" clicked="true">
</form>

序列化后的数据如下:(根据firebug)

formData=Caption%3DFruit%2Blesions.%26Keywords%3D%26imageID%3D87592

当我回应回应时,我得到了这个:

"Caption=Leaf+symptoms+of+++CCDV.&Keywords=&imageID=87655"

我的问题是:

    关键字字段为空,即使我输入内容也是如此 当我更改内容时,标题字段不会在帖子中更改。

    如何访问每个变量?标题、关键词和图片。 $_POST 也不起作用:

    Yii::app()->request->getParam('imageID')

【问题讨论】:

首先live是贬值尝试委托..('body').delegate('#ajaxCaptionForm','submit', function(e) On 不起作用 bcz 你的 jquery 版本尚未实现..你可以尝试委托 我也无法让代理工作。 .live 适用于我所有其他 ajax 加载的表单。 @ubercooluk:请正确英语。谢谢。 (即没有“bcz”和“ur”) on 在 1.7 中支持。他很可能只是没有正确使用它。 【参考方案1】:

您似乎正在将序列化的表单数据(应该已经是 URL 编码的 key=values)作为 JSON 键值对中的值。这是你打算做的吗?

来自http://api.jquery.com/serialize/,请注意一旦通过 .serialize() 发送的表单数据“是标准 URL 编码表示法的文本字符串。”

来自http://api.jquery.com/jQuery.ajax/,请注意数据设置“如果不是字符串,则转换为查询字符串”。

因此,您将采用“标准 URL 编码表示法”的文本字符串,然后在数据设置中将其作为键值 JSON 对中的值。

我认为你的可能应该是这样的(忽略 live() v. on() 问题):

$('#ajaxCaptionForm').live('submit', function(e)
    e.preventDefault(); 
        $.ajax(
            'type':'POST',
            'data':$('#ajaxCaptionForm').serialize(),
            'success':function()
                parent.$.fancybox.close();
            
        );   
    ); // closing form submit 

这也是为什么您无法按预期访问任何内容的原因,因为所有内容都在“formData”键下传递。您可以执行 print_r($_POST) 来验证这一点,或 echo Yii::app()->request->getQueryString();两者都应该打印出您作为 PHP 数组提交的所有数据,向您显示键和值。

作为建议,这是何时使用 Firebug 控制台查看正在提交的参数的完美示例。

【讨论】:

以上是关于在 PHP 中解析一个 jquery 序列化字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 解析 php 脚本返回的 JSON 字符串

jQuery to PHP - 序列化字符串

用 JQuery/PHP 解析嵌套的 JSON 字符串对象?

golang 类型断言的学习

php中序列化与反序列化

PHP反序列化漏洞解析