2012-01-22 82 views
1

以下代碼在ajax調用中。我試圖確保人們不會經常使用會話對具有某個ID的問題進行投票。如果聲明,會話變量

所以他們點擊一個按鈕,它執行下面的PHP代碼:

$id=$_GET["id"]; 


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


    //there is code here to add the vote to the database 
} 
else{ 
echo "sorry, you've already voted recently"; 
} 

所以我創造了其持有的最後一投的time()每個問題ID的會話變量。我會用cookies做到這一點,但他們可以被禁用。

目前,我的邏輯存在一個錯誤,因爲它允許用戶不斷點擊按鈕並添加儘可能多的投票。

任何人都可以看到我所犯的錯誤嗎?

+1

什麼是防止有人只是刪除/不接受會話cookie? – Mike

+0

哦,謝謝你們,不知道這個,認識用戶會更好嗎?它不需要非常安全。 – JoeRocc

回答

2
  1. 讓人很沒有意義。
  2. 會話確實使用具有相同缺陷的cookie
  3. 與字符串不同,PHP中的變量應該用引號括起來。這種錯誤的使用將在某一天導致錯誤。
  4. 我沒有看到兩次檢查isset($_SESSION[$id])
  5. PHP中存在一個錯誤,它不允許$ _SESSION數組的數字索引。不知道現在是否改正了。
  6. 正如Sajid指出的那樣,您必須在使用$ _SESSION數組之前調用session_start()。

現在的邏輯。
給我,看來代碼不會讓任何人投票。因爲它不會首次通過isset($_SESSION[$id])條件,並且不會讓$_SESSION[$id]設置等等。

它似乎是正確的條件是

if ((!isset($_SESSION['vote'][$id]) OR (time() - $_SESSION['vote'][$id]) > 180)) 
+1

你是我現在最喜歡的人!對所有人的教訓**「PHP中存在一個不允許使用$ _SESSION數組索引的錯誤。」**的確是正確的。我只是將一個字符附加到'$ id'的開頭。 – JoeRocc

1

您需要致電session_start()才能在發送任何標頭之前啓動會話。否則,除非將ini設置爲自動啓動會話,否則將不啓用會話。此外,您的服務器必須正確配置才能存儲會話文件(通常需要一個可寫的tmp目錄)。查看更多有關會議這裏:http://www.php.net/manual/en/ref.session.php

+0

感謝sajid,我以前在服務器上使用了會話,並且我已經在index.php中啓動了會話。 – JoeRocc

+0

@JoeRocc你必須在每個使用會話的頁面上運行'session_start()',而不僅僅是'index.php'(除非像Sajid提到的那樣,會話自動啓動被啓用)。 – Frxstrem

+0

哦!謝謝,但令人沮喪的是,它仍然增加了一個投票,無論用戶是否已經投票或沒有其他想法? – JoeRocc

-1

也許時間()返回毫秒,你應該比18萬,而不是180

+0

哈哈,謝謝你的投票,這只是一個主意。 – BenjaminLinus

+1

也許有人必須在回答之前用手動驗證他們的猜測? –

+0

這不是「無處不在的想法」網站這是問答網站。 –

0

有可能是與if語句有問題。嘗試使用會話,以防止重複投票以下

$id=$_GET["id"]; 


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


    //there is code here to add the vote to the database 
} 
else{ 
    echo "sorry, you've already voted recently"; 
} 
+0

「嘗試」 - 爲了什麼? –

+0

感謝ralfe,我試過這個,很不幸,它沒有改變任何東西......:/ – JoeRocc

+0

好吧,以及我將要做的調試將如下: $ a = isset($ _ SESSION [$ id ]); $ b = time() - $ _SESSION [$ id]; echo「($ a && $ b> 180)||!{$ b})」; 然後看到'呈現'如果語句表達式和可能會變得明顯嗎? – ralfe