2012-04-24 36 views
1

我目前正在關注此tutorial以創建一個簡單的投票系統。驗證該用戶只投一票

它工作正常,除了用戶應該只能投票一次的驗證部分。本教程使用IP,它不適用於具有動態IP的用戶

<?php 
include("config.php"); 
$ip=$_SERVER['REMOTE_ADDR']; 

if($_POST['id']) 
{ 
$id=$_POST['id']; 
$id = mysql_escape_String($id); 
//Verify IP address in Voting_IP table 
$ip_sql=mysql_query("select ip_add from Voting_IP where mes_id_fk='$id' and ip_add='$ip'"); 
$count=mysql_num_rows($ip_sql); 

if($count==0) 
{ 
// Update Vote. 
$sql = "update Messages set up=up+1 where mes_id='$id'"; 
mysql_query($sql); 
// Insert IP address and Message Id in Voting_IP table. 
$sql_in = "insert into Voting_IP (mes_id_fk,ip_add) values ('$id','$ip')"; 
mysql_query($sql_in); 
echo "<script>alert('Thanks for the vote');</script>"; 
} 
else 
{ 
echo "<script>alert('You have already voted');</script>"; 
} 

$result=mysql_query("select up from Messages where mes_id='$id'"); 
$row=mysql_fetch_array($result); 
$up_value=$row['up']; 
echo $up_value; 

} 
?> 

有沒有更好的方法來確保用戶只投一次?

回答

1

如何簡化

<?php 
//HERE include DB config and set variables 
$result = mysql_query("SELECT * FROM votes WHERE id = '$id' AND ip = '$ip'"); 
    $count = mysql_num_rows($result); 
if($count > 0){ 
    echo "<script>alert('You have already voted');</script>"; 
} 
else{ 
    //Update Sets 
} 
?> 

但最終,你應該使用用戶帳戶或餅乾。雖然用戶可以清除Cookie的瀏覽器,但用戶也可以擁有動態IP地址。這也將適應誰正在使用一個大的網絡,一個單一的IP用戶(免費Wi-Fi網絡,學校,工作場所)

我認爲,讓用戶帳戶是最好的辦法

<?php 
$result = mysql_query("SELECT * FROM votes WHERE username = '$_SESSION[username]' AND id    = '$id'"); 
?> 
0

另一種方式爲確保用戶只投票一次,而不創建用戶帳戶,需要創建一個投票系統,用戶必須提供他們的電子郵件地址以進行確認。

  1. 用戶通過輸入他們的電子郵件地址進行投票;這個地址是 存儲在數據庫中。
  2. 當用戶提交表決,然後發郵件到該地址,請確認投票
  3. 當表決被確認則是一個合法的票,並在將來很容易地檢查
  4. 淨化未經證實的票從數據庫流程結束

上述步驟也可以用於(小變化)以確認比賽的年齡或其他重要的人口統計信息。我們在我們的客戶網站上進行競賽時使用了這種方法,並且運行良好。

1

不需要對此進行數據庫存儲。相反,在投票:

set_cookie($_POST['id'], "1", time()+60*60*24*365) 

然後,當您顯示檢查後如果cookie設置有:

if(!($_COOKIE[$_POST['id']])){ //if user hasn't voted 
    // display vote buttons 
}else{ 
    // don't display vote buttons 
}