我正在制作一个计算荷兰公路税的系统,因为我有一些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));
我首先收到此错误,但未重新合并kampeer_auto
的{{1}}索引,我实际发送的是{<1}}:
注意:未定义的索引:kampeer_auto in C:\ Users \ Bas \ Documents .. \ Cars \ install.php 6
然后是personen_auto对象的数据日志。
然后这个消息又出现了一个错误,它没有重新解析$_POST
索引,我刚刚解析并打印出来了?
通知:未定义的索引:personen_auto in C:\ Users \ Bas \ Documents .. \ Cars \ install.php 5
问题
personen_auto
变量?我自己尝试
我已经尝试将passPHP()方法放在for循环之外,如下所示:
$_POST
但是只传递了一个变量到PHP(/*
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));
)。
答案 0 :(得分:1)
尝试将数据作为未解析的json字符串传递给php,并使用json_decode显式解析它。
因此发送一个$ _POST参数json=string
(字符串是数据的urlencoded JSON.stringify),并使用php解码json_decode($_POST['json'], true)
。那应该返回一个代表js对象的数组。
答案 1 :(得分:1)
尝试在循环外部放置数据声明。它目前正在为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'];
答案 2 :(得分:1)
代码每次调用只发送一个vehicleType到php。相关代码是
for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
data = ...
passToPHP(vehicleType, JSON.stringify(data));
}
第一个电话通过&#39; personen_auto&#39;只有(并且kampeer_auto未定义);第二个电话只通过&#39; kampeer_auto&#39;和personen_auto未定义。
在循环外移动passToPHP的代码的修订版仍然会在每次循环时重置数据,因此在底部数据将仅包含最后一个自动省份。
要传递所有汽车,需要将数据附加到(未重新初始化),必须将数据收集到自动特定部分(不混合),并且passToPHP需要构建一个多参数查询字符串,每个汽车。所有这些都将重建roadTaxData对象。
或者只是将所有roadTaxData.provinceWeightFuelPricesData传递给php并使用php循环并分离自动类型。
<小时/>
编辑:在将对象传递给php时,您不需要将对象转换为数组。当可选的第二个参数设置为true
时,Php的json_decode()可以将对象解码为关联数组,如json_decode($data, true)
。简单地
passToPHP('json', JSON.stringify(roadTaxData.provinceWeightFuelPricesData));
并在php中
$data = json_decode($_POST['json'], true);
$kampeer_auto = $data['kampeer_auto']);
$personen_auto = $data['personen_auto']);