2012-01-25 76 views
2

我真的很想在這裏試圖讓這個Ajax調用工作,對於這個問題的大量抱歉。檢測cookie是否啓用了PHP,頭部重定向

用戶點擊一個按鈕,這啓動了一個Ajax調用來添加投票到數據庫。這是所謂的「addvote.php」的文件:

<?php 
session_start(); 


/* COOKIECHECK START */ 

setcookie('test', 1, time()+3600); 
if(!isset($_GET['cookies'])){ 
    header("Location:/thought/addvote.php?cookies=true&id=".$_GET['id']."&ans=".$_GET['ans']); 
} 

if(count($_COOKIE) > 0){ 
    $cookies=1; 
} else { 
    $cookies=0; 
} 

/* COOKIECHECK END */ 



if($cookies==1) { 

    $id=$_GET["id"]; 
    $vId="v".$id; 

if (((isset($_SESSION[$vId]) && ((time() - $_SESSION[$vId]) > 180))) || (!isset($_SESSION[$vId]))) { 
    // last vote was more than 3 minutes ago 
    $_SESSION[$vId] = time(); // update/create vote time stamp 

     //ADD VOTE TO DATABASE 

    } 
    else { 
    echo "You've voted on this already"; 
    } 
} 
else { 
    echo "Please enable cookies to make your vote count"; 
} 


?> 

什麼是應該發生:用戶進行檢查,看他們是否有啓用Cookie。如果是這樣,他們可以添加投票,如果不告訴他們啓用cookie。如果他們啓用了cookies,而且他們還沒有投票 - 如果他們已經投了票,請添加一個投票,告訴他們。

實際發生的事情:尚未投票的用戶點擊該按鈕,發起ajax呼叫併成功添加投票,則不向用戶發送消息。然後,他們轉到另一個問題,然後點擊投票按鈕,「addvote.php」啓動,但這次它返回「你已經投票了」,並添加投票!這讓我擔心頁面調用會運行兩次,首先它會添加投票,然後再次嘗試(並返回錯誤)。

也許它與標題()有關?

然後,每個問題都會返回相同的信息並添加投票 - 除非我等一會兒,然後它對第一個問題起作用,同樣的事情會再次發生。

值得注意的是: GET變量與頭部一起傳遞,以便我知道他們在談論哪個問題以及他們是否單擊否或是。

再次,道歉,這個問題是一個可怕的問題。

回答

1

無論如何這不會阻止投票作弊。要測試用戶是否啓用了Cookie,您可以在投票頁面上使用JavaScript設置cookie,並使用PHP進行檢查。但是,顯然,如果有人想作弊,他或她會手動刪除您的Cookie。

Furthemore,你需要經過header()調用添加exit使你的代碼工作:

setcookie('test', 1, time()+3600); 
if(!isset($_GET['cookies'])){ 
    header("Location:/thought/addvote.php?cookies=true&id=".$_GET['id']."&ans=".$_GET['ans']); 
    exit; 
} 
+0

非常感謝鐵木爾!失蹤的'出口;'的確是問題所在。 – JoeRocc

+1

您需要時刻記住調用'header()'不會終止腳本執行。這就是爲什麼'exit;'或'die();'是需要的...... – Timur