下午好,
我们正在使用.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 =支架
请注意重复的part_no和part_desc。这不是错误,而是我们想要提交2行的事实。每行包含一个部分#和一个部分desc。
现在的问题是如何在php中打破这个字符串,以便逐行保存/插入。
以下是我的尝试:
$Parts = $_POST['Parts'];
$PartsArray = array();
parse_str($Parts, $PartsArray);
这有效,但它只有$ PartsArray中的最后一行。任何帮助将不胜感激。
谢谢。 乔治艾瓦兹
答案 0 :(得分:1)
根据您提供的字符串:
<强> claim_part_no = 12349&安培; claim_part_desc = TUBE&安培; claim_part_no = 85555&安培; claim_part_desc =支架强>
编辑:由于您有重复键,因此不使用关联数组更有意义。以下代码已更新,以反映在javascript序列化中重复保留您的密钥。
您可以使用strpos
和substr
解析此问题,
像这样的东西:
$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编码的内容( &
将编码为&
并打破此项。