Angular 6 和 PHP:即使在使用附加到 httpParams 时,HttpClient 也不会将数组发送到服务器

alim1990

我需要使用HttpClientofAngular 6PHP服务器发送一组数据

我有一些下拉列表,我从中选择并推入一个数组:

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","prId":"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, or JSON.stringify()or .append()

在使用 和 的方法后发布了一个问题JSON.stringify(),如您所见,存在错误。即使多维数组包含 0或多行数据echo count($array)也总是1如此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:string '[{"legalId":"","protectionId":"","situationId":"","addDate":"2018-09-14 "},{"legalId":"","protectionId":"","situationId":"","addDate":"2018-09-14"}]' (length=147)

但是没有向数据库添加任何内容。

请注意,PHP 脚本与之前未答复的帖子相同

alim1990

我找到了解决方案。

是的,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)
     {

     }
  }

...

正如@B.Fleming 所说:

您的 PHP 脚本正在调用 json_encode(),它会生成一个 JSON 字符串。如果您的意图是将 JSON 转换为数组,请执行 json_decode()。但是,在任何事情之前,请确保您传递给 json_decode() 的任何内容都不是数组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Angular4:HttpClient和HttpParams:在httpParams.set()中将对象作为值传递

HttpParams与Angular 6中的Put和Post将返回类型更改为Observable <HttpEvent <T >>一起使用

如何在Angular 6中在提交时将动态绑定表单字段发送到服务器

Angular 2到最新版本-jsonp和URLSearchParams到HttpClient和HttpParams

使用JQuery Mobile使用PHP,POST和JSON将数据发送到服务器时出现问题

使用 HttpClient / HttpParams 以角度发布多维数组 (string[][])

带有 HTTP PUT 的 JavaScript Fetch() 不会将 FormData 发送到 PHP 服务器

Angular2 HttpParams未按预期发送

'+'字符在HttpParams angular 6中转换为空间

使用React JS和Laravel将带有图像文件的POST请求发送到数据库时出现内部服务器错误

使用POST方法和HttpURLConnection将Android的JSON对象发送到PHP服务器

HTTPparams 422(不可处理实体)和 FastAPI 的 Angular 错误

使用.NET HttpClient将JSON发送到WebAPI服务器

如何转换Swift日期和TimeInterval,以便可以发送到php服务器?

如何使用angular将表单数据发送到服务器?

无法使用angular js将base 64图像数据发送到服务器

如何使用angular 2将表单数据发送到服务器api?

无法使用angular js将base 64图像发送到服务器

使用PartMap中的Retrofit和WebKitFormBoundary将文件发送到服务器

使用Swift录制和回放视频并将视频发送到服务器

使用Ajax POST请求将图像和JSON数据发送到服务器?

如何使用改造 2.0 将图像和描述发送到服务器

使用套接字将用户名和密码发送到TCP服务器

如何使用Ajax将用户名和密码发送到快递服务器?

使用 AsyncTask 和 POST 方法将变量发送到服务器并取回 JSON 对象

使用Map的Angular 6 HttpClient

当客户端使用 Socket.io 发送到服务器时关闭快速服务器

当我尝试在我的服务器上使用它时,为什么该命令不会发送到我的 DM

angularjs 在使用 POST 将数据发送到服务器时使 json 格式错误