JS和PHP直接通訊經常使用ajax完成,以實現js上UI的動態變化。通訊使用JSON或者XML傳遞數據。下面詳細描述二者直接JSON字符串的傳遞。javascript
下面案例是要傳遞這樣的json數據:php
{ "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:html
首先要熟悉ajax的用法,它是鏈接瀏覽器和服務器的橋樑。java
通常用法以下: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過來的數據。若是須要接收返回數據,sql
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:json
使用js數組來完成json對象的封裝:數組
1 var arrX={resitems:[]}; 2 arrX.bookid=bookid; 3 for (var i=0; i < cellList.length; i++) { 4 var item=cellList[i]; 5 var jsonRes={}; 6 jsonRes.bookid=bookid; 7 jsonRes.res_id=item.itemStruct.id; 8 jsonRes.res_name=item.itemStruct.name; 9 jsonRes.src_origin=item.itemStruct.src; 10 jsonRes.src_hd=item.itemStruct.src_hd; 11 jsonRes.src_sd=item.itemStruct.src_sd; 12 jsonRes.src_td=item.itemStruct.src_td; 13 arrX.resitems.push(jsonRes); 14 }; 15 16 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數據解析而且寫入到數據庫:
1 if (isset($_POST['jsonResPanel'])) { 2 $data=$_POST['jsonResPanel']; 3 $arr=(array)(json_decode($data)); 4 $items=(array)($arr['resitems']); 5 $bookid=$arr['bookid']; 6 $sql=""; 7 for ($i=0; $i < count($items); $i++) { 8 $value=(array)($items[$i]); 9 $bookid=$value['bookid']; 10 $res_id=$value['res_id']; 11 $res_name=$value['res_name']; 12 $src_origin=$value['src_origin']; 13 $src_hd=$value['src_hd']; 14 $src_sd=$value['src_sd']; 15 $src_td=$value['src_td']; 16 $sql.="insert into resourcesheet(bookid,res_id,res_name,src_origin,src_hd,src_sd,src_td)values 17 ('{$bookid}','{$res_id}','{$res_name}','{$src_origin}','{$src_hd}','{$src_sd}','{$src_td}');"; 18 } 19 $sqli=new SQLHelper('ugumanage'); 20 //先刪除bookid下全部資源 21 $sqlDelete="delete from resourcesheet where bookid='{$bookid}'"; 22 $sqli->execute_dml($sqlDelete); 23 $sqli->multi_execute_dml($sql); 24 $sqli->close_connect(); 25 }
須要注意的是第三號在拿到json字符串以後便使用json_decode函數解析成對象,這個時候只是一個普通php對象,沒法給我提供有效信息,須要將它強制轉換爲數組array便可變爲咱們熟悉的php數組,在拿到信息的數組以後,咱們即可以像操做普通php數組那樣提取json傳遞過來的全部信息了,上面代碼將json的部分信息添加到數據庫的一張表裏邊,固然若是傳遞的json字符串過長,建議使用GZip在客戶端對字符串壓縮以後再傳遞,接收端解壓縮便可。
PHP->JavaScript:
若是客戶端須要查詢數據庫的數據,必然須要要求服務器查詢,由php將查詢結果經過json返回給客戶端。
首先客戶端經過ajax發送查詢請求給php
1 var request=$.ajax({url:'SQLHelper.php?loadResPanel='+bookid,async:false});
2 var jsonStr=request.responseText;
第二行表示獲得了查詢結果,下面來看看在php端是怎麼生成這個結果並返回的。
1 if (isset($_REQUEST['loadResPanel'])) { 2 $bookid=$_REQUEST['loadResPanel']; 3 $sqli=new SQLHelper('ugumanage'); 4 $arr=array(); 5 $arrItems=array(); 6 $arrInfo=array(); 7 $head=urlencode("http://{$_SERVER['HTTP_HOST']}/cloud/"); 8 $sql0="select *from contentsheet where bookid='{$bookid}'"; 9 $res0=$sqli->execute_dql($sql0); 10 while ($row0=$res0->fetch_assoc()) { 11 $catalogid=$row0['catalogid']; 12 $bookid=$row0['bookid']; 13 $title=urlencode($row0['title']); 14 } 15 $sql1="select *from resourcesheet where bookid='{$bookid}'"; 16 $res1=$sqli->execute_dql($sql1); 17 while ($row1=$res1->fetch_assoc()) { 18 $item=array('bookid'=>$row1["bookid"],'res_id'=>$row1['res_id'],'res_name'=>urlencode($row1["res_name"]), 19 'src_origin'=>$row1["src_origin"],'src_hd'=>$row1["src_hd"],'src_sd'=>$row1["src_sd"],'src_td'=>$row1["src_td"]); 20 array_push($arrItems,$item); 21 } 22 23 24 $arrInfo['head']=$head; 25 $arrInfo['catalogid']=$catalogid; 26 $arrInfo['bookid']=$bookid; 27 $arrInfo['title']=$title; 28 $arr['info']=$arrInfo; 29 $arr['items']=$arrItems; 30 $json=urldecode(json_encode($arr)) ; 31 echo $json; 32 $sqli->close_connect(); 33 }
值得注意的是第七行這種,遇到特殊符號或者中文字符,在php端須要將它們統一轉碼,具體轉成了什麼,咱們不用關心,只須要知道在外面套一個urlencode函數就能夠了。建立json一樣是使用數組,編制好數組以後,經過json_encode能夠直接將其轉化爲json字符串。這裏在返回給客戶端以前,仍然須要再使用urldecode解碼,這樣傳遞出來的json字符串纔不會有亂碼現象。
客戶端接收到json字符串後一樣須要對它進行解析成javascript對象。
1 var request=$.ajax({url:'SQLHelper.php?loadResPanel='+bookid,async:false}); 2 var jsonStr=request.responseText; 3 4 var jsonObj=JSON.parse(jsonStr); 5 var info=jsonObj.info; 6 var items=jsonObj.items; 7 8 document.getElementById('textBox').value=info.title; 9 for (var i=0; i < items.length; i++) { 10 var item=new UploadItemStruct(); 11 item.id=items[i].res_id; 12 item.head=info.head; 13 item.name=items[i].res_name; 14 // item.type=$(this).attr('type'); 15 item.src=items[i].src_origin; 16 item.src_hd=items[i].src_hd; 17 item.src_sd=items[i].src_sd; 18 item.src_td=items[i].src_td; 19 addCellSubThree(document.getElementById("divPanel"),item); 20 };
注意的是第四行。解析json的關鍵方法是JSON.parse方法,json字符串變成javascript對象以後,即可以任意提取json傳遞過來的訊息了。