javascript和php使用ajax通信传递JSON的实例


Posted in Javascript onAugust 21, 2018

JS和PHP直接通信常用ajax完成,以实现js上UI的动态变化。通信使用JSON或者XML传递数据。下面详细描述两者直接JSON字符串的传递。

下面案例是要传递这样的json数据:

{
 "bookid": "558a6be36c72a" , 
 "resitems": [
  {
   "res_id": "558a6bff6bd55",
   "res_name": "IMG_8421.jpg",
   "src_origin": "558a6bff6bd55.jpg",
   "src_hd": "558a6bff6bd55_hd_1920_1280.jpg",
   "src_sd": "558a6bff6bd55_sd_1024_682.jpg",
   "src_td": "558a6bff6bd55_td_300_200.jpg"
  },
  {
   "res_id": "558a6c4a716a2",
   "res_name": "IMG_8477.jpg",
   "src_origin": "558a6c4a716a2.jpg",
   "src_hd": "558a6c4a716a2_hd_1920_1280.jpg",
   "src_sd": "558a6c4a716a2_sd_1024_682.jpg",
   "src_td": "558a6c4a716a2_td_300_200.jpg"
  }
 ]
 
}

ajax:

首先要熟悉ajax的用法,它是连接浏览器和服务器的桥梁。

一般用法如下:

$.ajax({
  type:"POST",
  url:"SQLHelper.php",
  dataType:'json',
  async:false,
  data:{'json':jsonStr}
  });

其中type的类型可以是GET和POST,url是服务器处理的脚本程序。dataType类型有text,json,xml等等,async通常使用false,data是具体要传递的json字符串,并且给服务器post一个叫做json字段的数据,PHP端可以$_POST['json']就可以获取post过来的数据。如果需要接收返回数据,

var req= $.ajax({
  type:"POST",
  url:"SQLHelper.php",
  dataType:'json',
  async:false,
  data:{'json':jsonStr}
  });
var response=req.responseText;

上面使用ajax实现了一次普通的客户端到服务器的一次数据传递。下面的问题是怎么去获得上面的jsonStr呢?像开篇提及的那种json字符串怎么才能生成的问题 附:如果遇到含有中文的url 如下操作:

location=encodeURI('content_p.html?id='+catalogid+'&title='+bookTitle+'&thumb='+bookThumb);

JavaScript->PHP:

使用js数组来完成json对象的封装:

var arrX={resitems:[]};
  arrX.bookid=bookid;
  for (var i=0; i < cellList.length; i++) {
   var item=cellList[i];
   var jsonRes={};
   jsonRes.bookid=bookid;
   jsonRes.res_id=item.itemStruct.id;
   jsonRes.res_name=item.itemStruct.name;
   jsonRes.src_origin=item.itemStruct.src;
  jsonRes.src_hd=item.itemStruct.src_hd;
  jsonRes.src_sd=item.itemStruct.src_sd;
  jsonRes.src_td=item.itemStruct.src_td;
  arrX.resitems.push(jsonRes);
 };
 
 var jsonResStr=JSON.stringify(arrX);

上面的代码是先创建arrX的json对象,对对象添加各种属性、变量等。最后通过stringify转化为字符串,这个获得的字符串jsonResStr就是一个普通字符串了,可以通过ajax传递到服务器了,值得注意的是,这里如果有中文,那是没问题的,不会出现乱码问题。在完成了JOSN封装之后,开始使用ajax传递到PHP页面

$.ajax({
   type:"POST",
   url:"SQLHelper.php",
   dataType:"json",
   async:false,
   data:{'jsonResPanel':jsonResStr},
   success:function(json){}
  });

php对接收到的json数据解析并且写入到数据库:

if (isset($_POST['jsonResPanel'])) {
  $data=$_POST['jsonResPanel'];
  $arr=(array)(json_decode($data));
  $items=(array)($arr['resitems']);
  $bookid=$arr['bookid'];
  $sql="";
  for ($i=0; $i < count($items); $i++) { 
   $value=(array)($items[$i]);
   $bookid=$value['bookid'];
   $res_id=$value['res_id'];
   $res_name=$value['res_name'];
   $src_origin=$value['src_origin'];
   $src_hd=$value['src_hd'];
   $src_sd=$value['src_sd'];
   $src_td=$value['src_td'];
   $sql.="insert into resourcesheet(bookid,res_id,res_name,src_origin,src_hd,src_sd,src_td)values
   ('{$bookid}','{$res_id}','{$res_name}','{$src_origin}','{$src_hd}','{$src_sd}','{$src_td}');";
  }
  $sqli=new SQLHelper('ugumanage');
  //先删除bookid下所有资源
  $sqlDelete="delete from resourcesheet where bookid='{$bookid}'";
  $sqli->execute_dml($sqlDelete);
  $sqli->multi_execute_dml($sql);
  $sqli->close_connect();
 }

需要注意的是第三号在拿到json字符串之后便使用json_decode函数解析成对象,这个时候只是一个普通php对象,无法给我提供有效信息,需要将它强制转换为数组array即可变为我们熟悉的php数组,在拿到信息的数组之后,我们便可以像操作普通php数组那样提取json传递过来的所有信息了,上面代码将json的部分信息添加到数据库的一张表里边,当然如果传递的json字符串过长,建议使用GZip在客户端对字符串压缩之后再传递,接收端解压缩即可。

PHP->JavaScript:

如果客户端需要查询数据库的数据,必然需要要求服务器查询,由php将查询结果通过json返回给客户端。

首先客户端通过ajax发送查询请求给php

var request=$.ajax({url:'SQLHelper.php?loadResPanel='+bookid,async:false});
var jsonStr=request.responseText;

第二行表示得到了查询结果,下面来看看在php端是怎么生成这个结果并返回的。

if (isset($_REQUEST['loadResPanel'])) {
  $bookid=$_REQUEST['loadResPanel'];
  $sqli=new SQLHelper('ugumanage');
  $arr=array();
  $arrItems=array();
  $arrInfo=array();
  $head=urlencode("http://{$_SERVER['HTTP_HOST']}/cloud/"); 
  $sql0="select *from contentsheet where bookid='{$bookid}'";
  $res0=$sqli->execute_dql($sql0);
  while ($row0=$res0->fetch_assoc()) {
   $catalogid=$row0['catalogid'];
   $bookid=$row0['bookid'];
   $title=urlencode($row0['title']);
  }
  $sql1="select *from resourcesheet where bookid='{$bookid}'";
  $res1=$sqli->execute_dql($sql1);
  while ($row1=$res1->fetch_assoc()) {
   $item=array('bookid'=>$row1["bookid"],'res_id'=>$row1['res_id'],'res_name'=>urlencode($row1["res_name"]),
   'src_origin'=>$row1["src_origin"],'src_hd'=>$row1["src_hd"],'src_sd'=>$row1["src_sd"],'src_td'=>$row1["src_td"]);
   array_push($arrItems,$item);
  }


  $arrInfo['head']=$head;
  $arrInfo['catalogid']=$catalogid;
  $arrInfo['bookid']=$bookid;
  $arrInfo['title']=$title;
  $arr['info']=$arrInfo;
  $arr['items']=$arrItems;
  $json=urldecode(json_encode($arr)) ;
  echo $json;
  $sqli->close_connect();
 }

值得注意的是第七行这种,遇到特殊符号或者中文字符,在php端需要将它们统一转码,具体转成了什么,我们不用关心,只需要知道在外面套一个urlencode函数就可以了。创建json同样是使用数组,编制好数组之后,通过json_encode可以直接将其转化为json字符串。这里在返回给客户端之前,仍然需要再使用urldecode解码,这样传递出来的json字符串才不会有乱码现象。

客户端接收到json字符串后同样需要对它进行解析成javascript对象。

var request=$.ajax({url:'SQLHelper.php?loadResPanel='+bookid,async:false});
 var jsonStr=request.responseText;

 var jsonObj=JSON.parse(jsonStr);
 var info=jsonObj.info;
 var items=jsonObj.items;

 document.getElementById('textBox').value=info.title;
 for (var i=0; i < items.length; i++) {
   var item=new UploadItemStruct();
  item.id=items[i].res_id;
  item.head=info.head;
  item.name=items[i].res_name;
  // item.type=$(this).attr('type');
  item.src=items[i].src_origin;
  item.src_hd=items[i].src_hd;
  item.src_sd=items[i].src_sd;
  item.src_td=items[i].src_td;
  addCellSubThree(document.getElementById("divPanel"),item); 
 };

注意的是第四行。解析json的关键方法是JSON.parse方法,json字符串变成javascript对象之后,便可以任意提取json传递过来的讯息了。

以上这篇javascript和php使用ajax通信传递JSON的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Ext 今日学习总结
Sep 19 Javascript
禁用页面部分JavaScript不是全部而是部分
Sep 03 Javascript
javascript根据时间生成m位随机数最大13位
Oct 30 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
Nov 04 Javascript
JavaScript DOM元素尺寸和位置
Apr 13 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
Nov 26 Javascript
javascript正则表达式总结
Feb 29 Javascript
Bootstrap文件上传组件之bootstrap fileinput
Nov 25 Javascript
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 jQuery
详解微信小程序实现WebSocket心跳重连
Jul 31 Javascript
原生js+css调节音量滑块
Jan 15 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
Dec 28 Javascript
小程序开发基础之view视图容器
Aug 21 #Javascript
详解微信小程序的 request 封装示例
Aug 21 #Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 #Javascript
vue监听对象及对象属性问题
Aug 20 #Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 #Javascript
Vue插件打包与发布的方法示例
Aug 20 #Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
Aug 20 #Javascript
You might like
德生PL990的分析评价
2021/03/02 无线电
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
php生成略缩图代码
2012/07/16 PHP
php中动态调用函数的方法
2015/03/16 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
前端性能优化建议
2020/09/17 Javascript
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
python删除字符串中指定字符的方法
2018/08/13 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
求网格中的黑点分布
2013/11/06 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
cf搞笑广告词
2014/03/14 职场文书
企业读书活动总结
2014/06/30 职场文书
实习协议书范本
2014/09/25 职场文书
南京南京观后感
2015/06/02 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
DIY胆机必读:各国电子管评价
2022/04/06 无线电