jQuery/Php 错误来自未序列化 post 数据的非法字符串偏移量

jQuery/Php Error Illegal string offset from unserialized post data

我正在发布一个 jquery 从 modal/pop 向上 div 标记发布的序列化数据,名称属性如 formdata[1]field_x

<div class="modal fade show" id="modal-payref-settings" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="modal-paycode-detailsLabel" aria-modal="true" role="dialog" style="padding-right: 17px; display: block;">
<div class="modal-dialog   modal-dialog-scrollableX   "><div class="modal-content ">
<div class="modal-body ">
<input type="text" name="formdata[1]payref_autonum" class="form-control dropdown-vw-item-text input-payref-autonum  ">
<input type="text" name="formdata[1]payref_prefix" class="form-control  input-payref input-payref-prefix  text-end">
<input type="text" name="formdata[1]payref_suffix" class="form-control  input-payref input-payref-suffix text-end">
<input type="text" name="formdata[1]payref_pad" class="form-control  input-payref input-payref-num-pad text-end" value="4">
<input type="text" name="formdata[1]payref_next" class="form-control  input-payref input-payref-num  text-end" value="876">
<input type="text" name="formdata[1]payref_sample" class="form-control input-payref-sample text-end" placeholder="Sample" aria-label="Sample" readonly="">
</div>
<!-- modal-body ends -->
</div>
</div>
</div>


$.ajax({
type: 'POST',
    url: 'model/trcode.php',
    data: {
        'a': 'SAVE_PAYREF',
    
      'formdata':$('#modal-payref-settings').find('[name^="formdata"]').serialize(),
    },
  //  dataType: "JSON",
    success: function (jsonStr) {
       alert(jsonStr);
    }
});

Fetch/XHR 捕获序列化的发布数据,这表明发布是正确的。 return 与 print_r($_POST["formdata"] ); .

的结果相同

formdata%5B1%5Dpayref_autonum=Yes&formdata%5B1%5Dpayref_prefix=P2022&formdata%5B1%5Dpayref_suffix=&formdata%5B1%5Dpayref_pad=4&formdata%5B1%5Dpayref_next=876&formdata%5B1%5Dpayref_sample=

数据正在反序列化parse_str($_POST["formdata"], $formdata );。但是 $formdata return 一个空数组。

(
  [formdata] => Array
   (
     [1] => 
   )
)

您正在尝试将字符串用作完整数组

您可以将 ajax 代码更改为

$.ajax({
type: 'POST',
    url: 'model/trcode.php',
    data: {
        'a': 'SAVE_PAYREF',
    
      'formdata':$('#modal-payref-settings').find('[name^="formdata"]').serialize(),
    },
  dataType: "JSON",
contentType: false,
            cache: false,
            processData:false,
    success: function (jsonStr) {
       console.log(jsonStr);
    }
});

在 model/trcode.php 页面内您可以通过

echo json_encode($_POST["formdata"]);

如果使用 alert(jsonStr) 而不是 console.log(jsonStr),您有时不会得到实际输出,因为您正在传递对象。

问题是您的表单字段 name 属性不是数组(您认为它是一个数组,但存在语法错误)。要解决此问题,请执行以下操作:

像这样更改名称:formdata[1][payref_autonum] 等等。