首頁  >  文章  >  web前端  >  PHP結合jQuery實現的評論頂、踩功能_jquery

PHP結合jQuery實現的評論頂、踩功能_jquery

WBOY
WBOY原創
2016-05-16 15:49:311265瀏覽

當我們瀏覽網頁時,我們想對網頁內容如文章、評論中的觀點持贊同或反對意見時,可以透過點擊網頁中的「頂」和「踩」來進行投票。而整個互動過程,開發者可以透過ajax非同步來實現,從而提高使用者體驗。

本文結合實例,講解使用PHP MySql jQuery實現的「頂」和「踩」投票功能,透過記錄用戶IP,判斷用戶的投票行為是否有效,該實例也可以擴展到投票系統中。如果您具備PHP、MySql和jQuery相關基礎知識,那麼請繼續往下閱讀。

準備

我們先準備為整個實例運行所需的mysql資料表,實例中需要兩個表,votes表用來記錄對應文章或評論的用戶投票數,並且我們默認寫入一條id為1的數據以便演示,votes_ip表用來記錄使用者每次投票的IP,程式根據使用者IP決定投票是否有效。

 
CREATE TABLE IF NOT EXISTS `votes` ( 
 `id` int(10) NOT NULL AUTO_INCREMENT, 
 `likes` int(10) NOT NULL DEFAULT '0', 
 `unlikes` int(10) NOT NULL DEFAULT '0', 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
 
 
INSERT INTO `votes` (`id`, `likes`, `unlikes`) VALUES 
(1, 30, 10); 
 
CREATE TABLE IF NOT EXISTS `votes_ip` ( 
 `id` int(10) NOT NULL, 
 `vid` int(10) NOT NULL, 
 `ip` varchar(40) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

HTML

在頁面中,有兩個分別表示「頂」和「踩」的按鈕,即#dig_up和#dig_down,按鈕上記錄了投票的票數以及分別所佔的百分比,非常直觀的對比投票結果。

 
<div class="digg"> 
  <div id="dig_up" class="digup"> 
    <span id="num_up"></span> 
    <p>很好,很强大!</p> 
    <div id="bar_up" class="bar"><span></span><i></i></div> 
  </div> 
    <div id="dig_down" class="digdown"> 
    <span id="num_down"></span> 
    <p>太差劲了!</p> 
    <div id="bar_down" class="bar"><span></span><i></i></div> 
  </div> 
  <div id="msg"></div> 
</div> 

CSS

我們必須使用CSS來美化頁面,我們使用一張圖diggs.png來定位不同的按鈕背景,透過設定position來定位各元素之間的位置關係。

 
.digg{width:420px; height:120px; margin:80px auto 20px auto; position:relative} 
#dig_up,#dig_down{width:200px; height:48px; margin:10px; position:relative; 
border:1px solid #d3d3d3; padding-left:42px; cursor:pointer} 
.digup{background:url(diggs.png) no-repeat 4px 2px;} 
.digup_on{background:url(diggs.png) no-repeat 4px -49px;} 
.digdown{background:url(diggs.png) no-repeat 4px -102px;} 
.digdown_on{background:url(diggs.png) no-repeat 4px -154px;} 
#num_up,#num_down{position:absolute; right:6px; top:18px; font-size:20px;} 
#dig_up p{height:24px; line-height:24px; color:#360} 
#dig_down p{height:24px; line-height:24px; color:#f30} 
.bar{width:100px; height:12px; line-height:12px; border:1px solid #f0f0f0; 
position:relative; text-align:center} 
.bar span{display:block; height:12px; } 
.bar i{position:absolute; top:0; left:104px;} 
#bar_up span{background:#360} 
#bar_down span{background:#f60} 
#msg{position:absolute; right:20px; top:40px; font-size:18px; color:#f00} 

jQuery

本範例也依賴jQuery,因此一定不能忘了在頁面中先載入jquery庫檔。

首先,jQuery要處理的是滑鼠分別滑向兩個投票按鈕時變換的背景圖片,透過addClass()和removeClass()來實現。

 
$(function(){ 
  //鼠标滑向和离开投票按钮时,变换背景样式 
  $("#dig_up").hover(function(){ 
    $(this).addClass("digup_on"); 
  },function(){ 
    $(this).removeClass("digup_on"); 
  }); 
  $("#dig_down").hover(function(){ 
    $(this).addClass("digdown_on"); 
  },function(){ 
    $(this).removeClass("digdown_on"); 
  }); 
   
  //初始化数据 
  getdata("do.php",1); 
   
  //单击“顶”时 
  $("#dig_up").click(function(){ 
    getdata("do.php&#63;action=like",1); 
  }); 
  //单击“踩”时 
  $("#dig_down").click(function(){ 
    getdata("do.php&#63;action=unlike",1); 
  }); 
}); 

然後,我們初始化數據,就是頁面載入後,要顯示初始的已經投票的結果,包括各投票數和所佔百分比。我們將取得資料的操作寫在一個自訂函數getdata()中,透過傳遞不同的請求位址和id參數來完成資料的載入。函數getdata()中,向URL發送一個ajax請求,根據後台處理的返回結果,如果投票成功則更改頁面中相應的元素內容,包括投票數和所佔百分比。

 
function getdata(url,sid){ 
  $.getJSON(url,{id:sid},function(data){ 
    if(data.success==1){//投票成功 
      $("#num_up").html(data.like); 
      //通过控制宽度来显示百分比进度条效果 
      $("#bar_up span").css("width",data.like_percent); 
      $("#bar_up i").html(data.like_percent); 
      $("#num_down").html(data.unlike); 
      $("#bar_down span").css("width",data.unlike_percent); 
      $("#bar_down i").html(data.unlike_percent); 
    }else{//投票失败 
      $("#msg").html(data.msg).show().css({'opacity':1,'top':'40px'}) 
      .animate({top:'-50px',opacity:0}, "slow"); 
    } 
  }); 
} 

PHP

資料的取得都是透過do.php來完成,do.php根據前端頁面傳遞的參數,連接資料庫,根據條件判斷分別進入「頂」、「踩」和初始資料處理模組,以下是do. php模組程式碼結構:

 
include_once("connect.php");//连接数据库 
 
$action = $_GET['action']; 
$id = 1; 
$ip = get_client_ip();//获取ip 
 
if($action=='like'){//顶 
  likes(1,$id,$ip); 
}elseif($action=='unlike'){//踩 
  likes(0,$id,$ip); 
}else{ 
  echo jsons($id); 
} 

函數likes()用來處理「頂」和「踩」投票模組,首先是判斷用戶IP是否已經投票過了,如果已經投票則直接返回相應提示,如果用戶IP沒有投票記錄則更新votes表,將對應的投票數加1,然後向votes_ip表中插入該用戶的IP記錄,如果操作成功,則調用jsons()輸出投票後的投票數和所佔百分比等數據,否則輸入操作失敗的提示訊息。

 
function likes($type,$id,$ip){ 
  $ip_sql=mysql_query("select ip from votes_ip where vid='$id' and ip='$ip'"); 
  $count=mysql_num_rows($ip_sql); 
  if($count==0){//还没有顶过 
    if($type==1){//顶 
      $sql = "update votes set likes=likes+1 where id=".$id; 
    }else{//踩 
      $sql = "update votes set unlikes=unlikes+1 where id=".$id; 
    } 
    mysql_query($sql); 
     
    $sql_in = "insert into votes_ip (vid,ip) values ('$id','$ip')"; 
    mysql_query($sql_in); 
     
    if(mysql_insert_id()>0){ 
      echo jsons($id); 
    }else{ 
      $arr['success'] = 0; 
      $arr['msg'] = '操作失败,请重试'; 
      echo json_encode($arr); 
    } 
  }else{ 
    $msg = $type==1&#63;'您已经顶过了':'您已经踩过了'; 
    $arr['success'] = 0; 
    $arr['msg'] = $msg; 
    echo json_encode($arr); 
  } 
} 

函數jsons()用來讀取votes表中對應id的投票數,併計算百分比,最後將這些資訊以json格式輸出,供前端頁面使用。

 
function jsons($id){ 
  $query = mysql_query("select * from votes where id=".$id); 
  $row = mysql_fetch_array($query); 
  $like = $row['likes']; 
  $unlike = $row['unlikes']; 
  $arr['success']=1; 
  $arr['like'] = $like; 
  $arr['unlike'] = $unlike; 
  $like_percent = round($like/($like+$unlike),3)*100; 
  $arr['like_percent'] = $like_percent.'%'; 
  $arr['unlike_percent'] = (100-$like_percent).'%'; 
   
  return json_encode($arr); 
} 

此實例可以應用到常見的"讚"、同意和反對評論、投票系統等場景中,運用了Ajax原理實現的前後端交互功能。 do.php中還有個函數get_client_ip()用來取得使用者真實IP,這個函式之前我有文章也發過,已經打包在程式碼中歡迎下載,在此不貼出來了。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn