代码之家  ›  专栏  ›  技术社区  ›  Mitya

FormData-sent数组以逗号分隔的列表形式到达

  •  0
  • Mitya  · 技术社区  · 4 年前

    我正在构建一些表单数据,用数组填充,然后通过POST发送,通过:

    let fd = new FormData();
    for (section in this.data.choices) {
        let key = section+(this.data.choices[section] instanceof Array ? '[]' : '');
        fd.append(key, this.data.choices[section]);
    }
    fetch('?get=plan', {method: 'post', body: fd}) //...
    

    以下是 this.data.choices :

    {
        "mode": "o7ew4xqybwt",
        "packages": [
            "wx2xv1cakbe"
        ],
        "usertypes": [
            "s"
        ],
        "subjects": [
            "bxn5g1igm4l",
            "u1osgpv37fl",
            "q2scwqb27k7",
            "fl9riri0wpr"
        ]
    }
    

    然而在接收端,在PHP中,数组是扁平的。print\r($\u POST)提供:

    Array
    (
        [mode] => o7ew4xqybwt
        [packages] => Array
            (
                [0] => wx2xv1cakbe
            )
        [usertypes] => Array
            (
                [0] => s
            )
        [subjects] => Array
            (
                [0] => bxn5g1igm4l,u1osgpv37fl,q2scwqb27k7,fl9riri0wpr
            )
    )
    

    毫无疑问,我错过了一些简单的东西,但任何帮助都将不胜感激。

    2 回复  |  直到 4 年前
        1
  •  2
  •   ADyson    4 年前

    我认为你应该把数据作为JSON发送。它省去了很多麻烦,避免了您引入的这种结构转换错误。相反,您可以直接将JS对象字符串化为JSON,并将其发送到服务器。

    然后在PHP端,您可以接收并解码它,然后像使用常规对象一样使用它(参见 Receive JSON POST with PHP

        2
  •  1
  •   nice_dev    4 年前
    fd.append(key, this.data.choices[section]);
    

    上面的行表示向键添加一个值,而不考虑 [] 或普通钥匙。您必须循环遍历它们,将它们作为数组值逐个添加。

    let fd = new FormData();
    for (section in this.data.choices) {
        if(this.data.choices[section] instanceof Array){
            this.data.choices[section].forEach(value => fd.append(section + '[]', value));           
        }else{
            fd.append(section, this.data.choices[section]);    
        }    
    }
    fetch('?get=plan', {method: 'post', body: fd}) //
    

    另一种方法是,使用header按原样发送JSON Content-type:application/json .