Angular 6 и PHP: HttpClient не отправляет массивы на сервер даже при использовании добавления в httpParams - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно отправить массив данных, используя 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"}]

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

Нам нужно использовать append, или 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.

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

enter image description here

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

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

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

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

1 Ответ

0 голосов
/ 10 сентября 2018

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

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

Для сценария Angular я делал следующее:

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 () уже не является массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...