json — Angular 6 и PHP: HttpClient не отправляет массивы на сервер даже при использовании добавления в httpParams

Мне нужно отправить массив данных с помощью HttpClient из Angular 6 в PHP сервер.

У меня есть выпадающий список, из которого я выбрал, и вставка в массив:

arrayOfLegalProtection=[];
addSit(){
let l_id = '';
let p_id = '';
let s_id = '';
let add_date = '';
l_id = this.formGroup.controls['l_id'].value;

p_id = this.formGroup.controls['p_id'].value;
s_id = this.formGroup.controls['s_id'].value;
add_date = this.formGroup.controls['add_date'].value;
this.showSubHeader++;
this.arrayOfLegalProtection.push({lId: l_id,
pId: p_id,
sId: s_id,
addDate: add_date})
console.log(this.arrayOfLegalProtection);
}

Результат консоли показывает мне правильные значения:

[{ «LID»: «1», «ИУП»: «1», «Sid»: «2», «addDate»: «2018-09-14»},

{ «LID»: «», «Pid»: «1», «Sid»: «5», «addDate»: «2018-09-14»},

{ «LID»: «», «Pid»: «2», «Sid»: «», «addDate»: «2018-09-20»}]

Теперь мне нужно добавить этот массив в метод post httpclient и отправить его на сервер, но, как сказано в обсуждении этого поста, массивы не могут быть отправлены через Angular’s HttpClient библиотека.

Нам нужно использовать приложение, или JSON.stringify() или же .append(),

я опубликовал вопрос после использования метода JSON.stringify() и, как вы можете видеть, были ошибки. И даже echo count($array) всегда 1 даже если многомерный массив содержит 0 или N строки данных.

Поэтому я переключился на другой метод, используя .append():

saveUnitData(unit_type,
location_type_id, user_id, number_of_hh, unit_status, add_date, arrayOfActualities)
{
console.log(user_id);
let httpParam = new HttpParams().set('unit_type', unit_type)
.set('location_type_id', location_type_id)
.set('user_id', user_id)
.set('number_of_hh', number_of_hh)
.set('unit_status',unit_status)
.set('add_date', add_date);
Object.keys(arrayOfActualities).forEach(key=>{
httpParam = httpParam.append('arrayOfActualities', arrayOfActualities);
})
//.set('arrayOfActualities', arrayOfActualities);
let headerOptions = new HttpHeaders();
headerOptions.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
console.log('h'+arrayOfActualities);
return this.http.post(this.globalVar.UnitSavedataUrl, httpParam, {headers: headerOptions});
}

Используя этот код:

Object.keys(arrayOfActualities).forEach(key=>{
httpParam = httpParam.append('arrayOfActualities', arrayOfActualities);

Я попытался преобразовать объект в массив, используя append, чтобы его можно было отправить через службу httpClient.

В заголовке запроса мы видим обычные отправленные данные, но массив повторяется сотни и сотни раз.

введите описание изображения здесь

И ответ от сервера всегда:

C: \ wamp64 \ WWW \ DEV \ UnitSaveData.php: 23: строка
«[{ «LegalId»: «», «protectionId»: «», «situationId»: «», «addDate»: «2018-09-14»}, { «legalId»: «», «protectionId»:» », «situationId»: «», «addDate»: «2018-09-14»}] (Длина = 147)

Но ничего не было добавлено в базу данных.

Обратите внимание, что сценарий PHP такой же, как предыдущий пост без ответа

0

Решение

Я нашел решение.

Да, HttpClient() принять массив как HttpParams(),

Для углового сценария, Я делал следующее:

let httpParam = new HttpParams().set('unit_type', unit_type)
.set('location_type_id', location_type_id)
.set('user_id', user_id)
.set('number_of_hh', number_of_hh)
.set('unit_status',unit_status)
.set('add_date', add_date)
.set('arrayOfActualities', arrayOfActualities);

Как HttpParams() упомянутая документация, .set() принять значение в виде строки, которая запутала серверный скрипт даже при использовании json_encode(),

Таким образом, решение было добавить arrayOfActualities массив:

let httpParam = new HttpParams().set('unit_type', unit_type)
.set('location_type_id', location_type_id)
.set('user_id', user_id)
.set('number_of_hh', number_of_hh)
.set('unit_status',unit_status)
.set('add_date', add_date)
.set('arrayOfActualities', arrayOfActualities);

httpParam.append('arrayOfActualities', JSON.stringify(arrayOfActualities));

На стороне PHP, мне нужно использовать json_decode($arr, true), чтобы позволить серверному сценарию выполнять итерации по массиву, поскольку итерации по массиву json создавали для меня проблему, поскольку он не мог прочитать заголовки полей из-за двойных кавычек:

$arr = json_decode($arrayOfActualities, true);
if(count($arr)>0)
{
foreach($arr as $array)
{

}
}

...

Как сказал @ Б.Флеминг:

Ваш PHP-скрипт вызывает json_encode (), который производит JSON
строка. Если вы хотите преобразовать JSON в массив, выполните
json_decode (). Прежде всего, тем не менее, убедитесь, что все, что вы
передача в json_decode () уже не является массивом.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]