首頁  >  文章  >  後端開發  >  php+jQuery實現「頂」與「踩」投票功能的方法

php+jQuery實現「頂」與「踩」投票功能的方法

墨辰丷
墨辰丷原創
2018-06-01 09:48:111141瀏覽

本文結合實例,講解使用PHP MySql jQuery實現的「頂」與「踩」投票功能,判斷使用者的投票行為是否有效。

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

我們先準備為整個實例運行所需的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,按鈕上記錄了投票的票數以及分別所佔的百分比,非常直觀的對比投票結果。

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

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?action=like",1); 
 }); 
 //单击“踩”时 
 $("#dig_down").click(function(){ 
  getdata("do.php?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({&#39;opacity&#39;:1,&#39;top&#39;:&#39;40px&#39;}) 
   .animate({top:&#39;-50px&#39;,opacity:0}, "slow"); 
  } 
 }); 
}

PHP

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

#
include_once("connect.php");//连接数据库 
 
$action = $_GET[&#39;action&#39;]; 
$id = 1; 
$ip = get_client_ip();//获取ip 
 
if($action==&#39;like&#39;){//顶 
 likes(1,$id,$ip); 
}elseif($action==&#39;unlike&#39;){//踩 
 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=&#39;$id&#39; and ip=&#39;$ip&#39;"); 
 $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 (&#39;$id&#39;,&#39;$ip&#39;)"; 
  mysql_query($sql_in); 
   
  if(mysql_insert_id()>0){ 
   echo jsons($id); 
  }else{ 
   $arr[&#39;success&#39;] = 0; 
   $arr[&#39;msg&#39;] = &#39;操作失败,请重试&#39;; 
   echo json_encode($arr); 
  } 
 }else{ 
  $msg = $type==1?&#39;您已经顶过了&#39;:&#39;您已经踩过了&#39;; 
  $arr[&#39;success&#39;] = 0; 
  $arr[&#39;msg&#39;] = $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[&#39;likes&#39;]; 
 $unlike = $row[&#39;unlikes&#39;]; 
 $arr[&#39;success&#39;]=1; 
 $arr[&#39;like&#39;] = $like; 
 $arr[&#39;unlike&#39;] = $unlike; 
 $like_percent = round($like/($like+$unlike),3)*100; 
 $arr[&#39;like_percent&#39;] = $like_percent.&#39;%&#39;; 
 $arr[&#39;unlike_percent&#39;] = (100-$like_percent).&#39;%&#39;; 
  
 return json_encode($arr); 
}

該實例可以應用到常見的"讚"、同意和反對評論、投票系統等場景中,運用了Ajax原理實現的前後端互動功能。 do.php中還有個函數get_client_ip()用來取得使用者真實IP。

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。

相關推薦:

php 取得xml介面資料的處理方法

php取得剛插入資料的id 的幾種方法

php基於單例模式封裝mysql類別的方法

以上是php+jQuery實現「頂」與「踩」投票功能的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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