該實例通過ThinkPHP結合Ajax與mysql實現了客戶端的通信功能,具體如下:
1、使用js的ajax局部刷新功能,每次刷新將數據庫中讀取出的新記錄插入到頁面的顯示區域,代碼如下:
1
|
window.onload =setInterval(showWords1000); //加載完成之后開始執行刷新功能 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
function showWords() //刷新時被調用函數,實現ajax請求 { xmlHttp=GetXmlHttpObject(); //從自定義的函數中獲取請求對象。 if (xmlHttp== null ) { alert ( "Browser does not support HTTP Request" ) return ; } var url= "index.php?g=Ksks&m=Comments&a=refresh" ; //要請求的路徑使用shuipfcms框架,所以g是分組,m是action控制器,a是模板 url=url+ "&data_id=" +$( "#data_id" ).val(); //接上,data_id傳的參數,用于查詢數據庫的id url=url+ "&lasttime=" +$( "i" ).last().siblings( 'input' ).val(); //lasttime是頁面顯示數據的最后一個記錄的時間戳,查找時根據大于這個時間戳的條件查找 xmlHttp.onreadystatechange=stateChanged; //響應狀態改變時調用的函數 xmlHttp.open( "GET" ,url, true ); //使用get方法提交 xmlHttp.send(); //上面傳參之后,這句可要可不要 } function stateChanged() //實現向頁面插入數據功能 { var str = "" ; if (xmlHttp.readyState==4 || xmlHttp.readyState== "complete" ) { eval( "var arrs=" +xmlHttp.responseText); //獲取由action響應輸出的數據,因為數據室php數組格式,需用eval或json轉化成js數組格式 var chdiv=$( "#conversation_history" ); //通信聊天記錄框 for ( var j=0;j<arrs.length;j++){ //循環插入數據 var obj=$( "<tr><td><h3></h3></td><td></td></tr>" ); //定義頁面當中記錄框的html格式代碼 var i=$( "<i> " +arrs[j].times+ "</i><input type='hidden' value='" +arrs[j].times+ "'>" ); //i標簽i為thinkphp定義的直接將時間輸出到input隱藏并且存儲得到數據里面的聊天發送時間 var p=$( "<p></p>" ); p.html(arrs[j].content); //聊天內容 p.append(i); var h3value=arrs[j].name; //發送的作者 obj.find( "h3" ).html(h3value+ ":" ); if (h3value== "主持人" ) {obj.find( "h3" ).addClass( "presenter" );} //主持人會特別顯示 obj.find( "td:last" ).append(p); chdiv.append(obj); //追加到table里面 } chdiv.parent().scrollTop(chdiv.parent()[0].scrollHeight+0); //滾動到底部 } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function GetXmlHttpObject() //定義ajax請求對象 { var xmlHttp= null ; try { // Firefox, Opera 8.0+, Safari xmlHttp= new XMLHttpRequest(); } catch (e) { //Internet Explorer try { xmlHttp= new ActiveXObject( "Msxml2.XMLHTTP" ); } catch (e) { xmlHttp= new ActiveXObject( "Microsoft.XMLHTTP" ); } } return xmlHttp; } |
2、action控制器,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
function refresh(){ $data_id = I( 'get.data_id' ); //獲得嘉賓id $lasttime = I( 'get.lasttime' ); //print_r(date("Y-m-d H:i:s",$lasttime)); if (! $data_id ) $this ->error( "該訪談不存在!" ); $data = M( "ksks_words_memoir" ); //print_r(date('Y-m-d H:i:s',$lasttime)); if (! $data ) $this ->error( "初始化數據失敗!" ); //$words = $data->where(array('dataid' => $data_id))->order('time asc')->select(); //print_r($data->where(array('time' => $lasttime))->select()); $where [ 'time' ] = array ( 'gt' , $lasttime ); $count = $data ->where( $where )-> count (); //print_r(date("Y-m-d H:i:s",$lasttime)); $words = $data ->where( $where )->select(); $datas = array (); //要返回的數組 $i = 0; foreach ( $words as $word ) { $datas [ $i ][ 'name' ] = $word [ 'name' ]; $datas [ $i ][ 'content' ] = $word [ 'content' ]; $datas [ $i ][ 'times' ] = date ( 'Y-m-d H:i:s' , $word [ 'time' ]); $lasttime = $word [ 'time' ]; $i = $i +1; } setCookie( 'lasttime' , $lasttime ); $datas = json_encode( $datas ); //$this->cache(); echo $datas ; } |
3、聊天頁面,代碼如下:
1
2
3
4
5
6
7
8
9
10
|
< volist name = "words" id = "vo" > < tr > < td >< h3 <if condition = "$vo['name']=='主持人'" >class="presenter"</ if >>{$vo.name}:</ h3 ></ td > < td > < div >{$vo.content}< i > {$vo.time|date="Y-m-d H:i:s",###}</ i > < input type = "hidden" name = "time" value = "{$vo.time}" > </ div > </ td > </ tr > </ volist > |