javascript — анализирует массив JS с помощью JS, а затем передает его в переполнение стека.

Я делаю систему для расчета дорожных налогов в Нидерландах, там у меня есть несколько массивов JS (где находятся данные), которые я анализирую с JS (все одновременно, потому что это тот же формат данных ), а затем передать его в PHP в формате JSON, используя XMLHttpRequest объект.

Для этого я сначала сделал этот картограф данных:

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 индекс из $_POST, который я на самом деле отправляю:

уведомление: Неопределенный индекс: kampeer_auto in
C: \ Users \ Bas \ Documents .. \ Автомобили \ install.php онлайн 6

Затем журнал данных объекта personen_auto.

Затем еще одна ошибка с этим сообщением, которая не восстанавливает personen_auto индекс, который я тоже только что разобрал и распечатал?

уведомление: Неопределенный индекс: personen_auto in
C: \ Users \ Bas \ Documents .. \ Автомобили \ install.php онлайн 5

Вопросы

  • Как это получается, что это не воссоздает те, $_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).

6

Решение

код отправляет только один vehicleType на вызов php. Соответствующий код

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

Первый вызов проходит только «personen_auto» (и kampeer_auto не определен); второй вызов проходит только ‘kampeer_auto’, а personen_auto не определено.

Пересмотренная версия кода, которая перемещает passToPHP за пределы цикла, по-прежнему сбрасывает данные каждый раз через цикл, так что в нижней части данные будут содержать только самые последние области авто.

Чтобы передать все autos, данные должны быть добавлены (не реинициализированы), данные должны быть собраны в автоматически определенные секции (не смешанные), и passToPHP должен построить многопараметрическую строку запроса, по одной на auto. Все это в значительной степени перестроит объект roadTaxData.

Или просто передайте все roadTaxData.provinceWeightFuelPricesData в php, и у вас есть цикл php и отдельные типы авто.


Редактировать: вам не нужно конвертировать объекты в массивы при передаче их в php. Phon’s json_decode () может декодировать объекты в ассоциативные массивы, если для необязательного второго параметра установлено значение true, как 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']);
1

Другие решения

попробуйте передать данные в php как неразобранную строку json и явно проанализировать ее с помощью json_decode.

Так что отправьте один параметр $ _POST json=string (строка — это JSON.stringify данных в кодировке urlencoded) и имеет php-декодирование json_decode($_POST['json'], true), Это должно вернуть массив, который представляет объект js.

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'];
1
По вопросам рекламы [email protected]