【问题标题】:PHP Unserialize from jquery serialize multiple rowsPHP反序列化从jquery序列化多行
【发布时间】:2017-12-18 23:16:43
【问题描述】:

下午好,

我们正在使用 .serialize() 函数进行 jquery ajax 调用。我们这样做是因为表单有多个列/行,我们希望通过一次调用 ajax 来保存它们。 serialize 函数获取所有相关的表单数据并将其序列化。这是发送到 php ajax 调用的内容。

$.ajax({
    type: "POST",
            url: "ajax/SaveClaimParts.php",
            data: { 
                'ClaimID': $('.hdn-claim-id').val(),
                'Parts': $('.parts-form').serialize()
            },
            dataType: "json",
            success: function(data)
            {
                console.log("Happy");
            },
            error: function()
            {
                console.log("An error occurred while processing the save.");
            }
        });             

这很好用,因为当我看到发送到服务器进行处理的内容时看起来像这样。

claim_part_no=12349&claim_part_desc=TUBE&claim_part_no=85555&claim_part_desc=BRACKET

请注意重复的 part_no 和 part_desc。这不是一个错误,而是我们要提交 2 行的事实。每行包含一个零件号和一个零件序号。

现在的问题是如何在 php 中分解这个字符串,以便可以逐行保存/插入。

这是我尝试过的:

$Parts = $_POST['Parts'];
$PartsArray = array();
parse_str($Parts, $PartsArray);

这可行,但它只有 $PartsArray 中的最后一行。任何帮助将不胜感激。

谢谢。 乔治·埃瓦兹

【问题讨论】:

  • 我可以建议将claim_part_desc 重命名为row[0][claim_part_desc]row[1][claim_part_desc] 等,以便PHP 可以在一个漂亮且简单的行数组中处理它,或者使用claim_part_no 作为键的一部分。否则,只要您没有复选框字段或空字段,您就可以使用claim_part_desc[] 并通过索引将数组拼接在一起。
  • 请展示更多尝试。请使用示例输入数据发布您的预期查询。 @Scuzzy 是对的,如果您想要一个 claim_part_no 的数组,那么您需要将您的 $_POST 数据重组为多维的——否则您将覆盖值。
  • 尽管我无法控制 html 部分,但我确实将其提交给“网络开发人员”,他们确实同意使用索引号对所有未来的“行”进行编码。感谢您的帮助。

标签: php jquery json serialization


【解决方案1】:

根据您提供的字符串:

claim_part_no=12349&claim_part_desc=TUBE&claim_part_no=85555&claim_part_desc=BRACKET

编辑:由于您有重复键,因此不使用关联数组更有意义。以下代码已更新,以反映在 javascript 序列化中重复保留您的密钥。

您可以使用strpossubstr 解析这个, 像这样:

$current_key = 0;
foreach ( explode( '&', $str ) as $substring )
{
    $divisor = strpos( $substring, '=' );
    $key = substr( $substring, 0, $divisor );
    $val = substr( $substring, $divisor + 1, strlen( $substring ) );
    $PartsArray[$current_key][$key] = $val;
    if ( $key == 'claim_part_no' )
    {
        $current_key++;
    }
}

那么如果你var_dump( $partsArray ); 你应该得到这样的东西:

array (size=2)
  0 => 
    array (size=2)
      'claim_part_no' => string '12349' (length=5)
      'claim_part_desc' => string 'TUBE' (length=4)
  1 => 
    array (size=2)
      'claim_part_no' => string '85555' (length=5)
      'claim_part_desc' => string 'BRACKET' (length=7)

只要您的序列化不包含 &= 作为返回值的一部分,这应该可以正常工作,所以不要使用它来解析任何 url 编码的内容 (& 将编码为& 并打破它)

【讨论】:

  • 我刚刚注意到您重复按键,稍等片刻,我会更新答案。
  • 感谢您的帮助。这让我有正确的心态去完成我需要做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2010-12-20
  • 2011-08-01
相关资源
最近更新 更多