2012-01-22 80 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