【问题标题】:Parsing JS array with JS and then passing it to PHP用JS解析JS数组,然后传给PHP
【发布时间】:2015-02-20 00:01:02
【问题描述】:

我正在创建一个用于计算荷兰道路税的系统,因为我有一些 JS 数组(数据所在的位置),我正在用 JS 解析它们(同时,因为它是相同的)数据格式),然后使用 XMLHttpRequest 对象将其作为 JSON 格式传递给 PHP。

为此,我首先制作了这个数据映射器:

var roadTaxData = {
    provinceWeightFuelPricesData: {
        personen_auto: {
            noord_holland: dataNoordHolland,
            zeeland: dataZeeland
            //TODO: Add all the provinces with it's data to the personen_auto object
        },
        kampeer_auto: {
            noord_holland: dataNoordHolland2,
            zeeland: dataZeeland2
        }
    }
}

这个格式是:

  • 车辆类型
  • 哪个省
  • 数据属于该省。

然后我制作了这个小解析器来将它解析为一个数组:

/*
 Loop through all the specific vehicle types inside the provinceWeightFuelPricesData object
 */
for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
    /*
        Where the data is getting stored for each vehicle type
     */
    var data = {},
        /*
            Every province with its data contained in the vehicle type
         */
        provinces = roadTaxData.provinceWeightFuelPricesData[vehicleType];

    /*
     Loop through all province's with its data in the specific vehicle type
     */
    for (var province in provinces) {
        /*
         Define each province data
         */
        var provinceData = provinces[province];
        /*
         Add the province to the object as an key
         */
        data[province] = [];
        /*
         Loop through the data which belongs to every province
         */
        for (var provinceDataIndex = 0; provinceDataIndex < provinceData.length; provinceDataIndex++) {

            /*
             Add the province data to the array
             */
            data[province].push(provinceData[provinceDataIndex]);
        }
        console.log('Parsed a the province: ' + province + " from the vehicle type " + vehicleType);
        console.log('');
    }
    console.log('Parsed the vehicle type: ' + vehicleType);
    console.log('');
    console.log(data);
    passToPHP(vehicleType, JSON.stringify(data));
}

这一切都很好,当我这样做时,它会返回正确的数组和数据:

console.log(data);

但是当我用这种方法将它传递给 PHP 时:

function passToPHP (paramName, data) {
    if (typeof paramName === "string" && typeof data === "string") {
        var httpc = new XMLHttpRequest(); // simplified for clarity"
        httpc.open("POST", INSTALL_FILE, true); // sending as POST

        httpc.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        /*
         For testing
         */
        httpc.onreadystatechange = function () { //Call a function when the state changes.
            if (httpc.readyState == 4 && httpc.status == 200) { // complete and no errors
                console.log(httpc.responseText); // some processing here, or whatever you want to do with the response
            }
        };
        httpc.send(paramName + "=" + data);
    }
}

使用这个 PHP 文件:

header('Content-Type: application/json');

$personen_auto = $_POST['personen_auto'];
$kampeer_auto  = $_POST['kampeer_auto'];


print_r(json_decode($personen_auto));
print_r(json_decode($kampeer_auto));

我首先得到了这个错误,它没有从$_POST 重新调整kampeer_auto 索引,我实际上发送了它:


通知:未定义索引:kampeer_auto in C:\Users\Bas\Documents..\Cars\install.php6 行

然后是personen_auto对象的数据日志。

然后这条消息的另一个错误,它没有重新调整 personen_auto 索引,我也刚刚解析并打印出来?


通知:未定义索引:personen_auto in C:\Users\Bas\Documents..\Cars\install.php5

问题

  • 它为什么不重新协调那些$_POST 变量?
  • 我怎样才能让 PHP 在当时只收到 1 个 $_POST 索引?

我自己的尝试

我尝试将 passPHP() 方法放在 for 循环之外,如下所示:

/*
 Loop through all the specific vehicle types inside the provinceWeightFuelPricesData object
 */
for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
    /*
        Where the data is getting stored for each vehicle type
     */
    var data = {},
        /*
            Every province with its data contained in the vehicle type
         */
        provinces = roadTaxData.provinceWeightFuelPricesData[vehicleType];

    /*
     Loop through all province's with its data in the specific vehicle type
     */
    for (var province in provinces) {
        /*
         Define each province data
         */
        var provinceData = provinces[province];
        /*
         Add the province to the object as an key
         */
        data[province] = [];
        /*
         Loop through the data which belongs to every province
         */
        for (var provinceDataIndex = 0; provinceDataIndex < provinceData.length; provinceDataIndex++) {

            /*
             Add the province data to the array
             */
            data[province].push(provinceData[provinceDataIndex]);
        }
        console.log('Parsed the province: ' + province + " from the vehicle type " + vehicleType);
        console.log('');
    }
    console.log('Parsed the vehicle type: ' + vehicleType);
    console.log('');
    //console.log(data);
}
passToPHP(vehicleType, JSON.stringify(data));

但这仅将一个变量传递给 PHP(kampeer_auto)。

【问题讨论】:

    标签: javascript php arrays json javascript-objects


    【解决方案1】:

    代码每次调用 php 时只发送一个车辆类型。相关代码是

    for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
        data = ...
        passToPHP(vehicleType, JSON.stringify(data));
    }
    

    第一个调用仅通过“personen_auto”(并且 kampeer_auto 未定义);第二次调用仅通过 'kampeer_auto' 并且 personen_auto 未定义。

    将 passToPHP 移到循环外的代码的修订版每次通过循环时仍然重置数据,因此底部数据将仅包含最后一个汽车的省份。

    要传递所有汽车,需要附加数据(不重新初始化),数据必须收集到汽车特定的部分(不混合),passToPHP 需要构建一个多参数查询字符串,每个汽车。所有这些都将重建 roadTaxData 对象。

    或者只是将所有 roadTaxData.provinceWeightFuelPricesData 传递给 php 并让 php 循环并分离自动类型。


    编辑:将对象传递给 php.ini 时不需要将它们转换为数组。当可选的第二个参数设置为true,如json_decode($data, true) 时,php 的 json_decode() 可以将对象解码为关联数组。简单的

    passToPHP('json', JSON.stringify(roadTaxData.provinceWeightFuelPricesData));
    

    在php中

    $data = json_decode($_POST['json'], true);
    $kampeer_auto = $data['kampeer_auto']);
    $personen_auto = $data['personen_auto']);
    

    【讨论】:

    • 嗯,好的,谢谢,但我不喜欢每个vehicle_type 都存储在一个数组中的事实。我将如何向 PHP 发送更多数据?
    • 我不确定我是否理解。是roadTaxData.provinceWeightFuelPricesData 的问题吗?将多个vehicleTypes传递给php与传递一个数组相同,但增加了双重编码的复杂性——查询参数本身是一个key-value hash(http查询编码),每个vehicleType的fueldPricesData也是一个key-value hash (json编码)。我有一个 nodejs 版本的 php http_build_query() 调用,它构建了一个与 php 兼容的分层查询字符串,但我不确定这就是你要找的(它在 npmjs.org/package/arlib 中)
    【解决方案2】:

    尝试将数据作为未解析的 json 字符串传递给 php,并使用 json_decode 显式解析。

    所以发送一个 $_POST 参数 json=string(字符串是数据的 urlencoded JSON.stringify),并让 php 解码 json_decode($_POST['json'], true)。这应该返回一个代表 js 对象的数组。

    【讨论】:

    • 什么意思?一个工作正常(最后一个循环解析),但是当我尝试得到两个时它不起作用。
    【解决方案3】:

    尝试将数据声明放在循环之外。目前正在为 roadTaxData.provinceWeightFuelPricesData 中的每个条目重置/清除,因此您只会将最后一个条目发送到服务器。

    var data = {};
    
    for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
    

    然后,正如@Andras 建议的那样,您需要在服务器端解码 JSON:

    $data = json_decode( $_POST['json'], true );
    
    $personen_auto = $data['personen_auto'];
    $kampeer_auto  = $data['kampeer_auto'];
    

    【讨论】:

    • 谢谢,但这不会向 PHP 发送多个数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2021-01-07
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多