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對象的封裝:
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傳遞過來的訊息了。

