如果声明,会话变量

时间:2012-01-22 05:54:10

标签: php session time

以下代码位于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";
}

所以我正在为每个问题id创建一个会话变量,该ID包含他们最后一次投票的time()。我会用cookies做这件事,但可以禁用它们。

目前,我的逻辑存在一个错误,因为它允许用户继续点击按钮并添加任意数量的投票。

有人能看到我犯过的错误吗?

4 个答案:

答案 0 :(得分:2)

  1. 使用会话来防止多次投票毫无意义。
  2. 会话确实使用具有相同缺点的cookie
  3. 与字符串不同,PHP中的变量应该在没有引号的情况下进行处理。这样的错误用法有一天会导致错误。
  4. 我认为检查isset($_SESSION[$id])两次没有意义。
  5. PHP中存在一个错误,它不允许$ _SESSION数组的数字索引。如果现在已经纠正了Dunno。
  6. 正如Sajid所指出的那样,你必须在使用$ _SESSION数组之前调用session_start()。
  7. 现在的逻辑。
    对我来说,似乎代码不会让任何人投票。因为它不会第一次通过isset($_SESSION[$id])条件,也不会让$_SESSION[$id]设置等等。

    似乎正确的条件是

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

答案 1 :(得分:1)

您需要在发送任何标头之前调用session_start()来启动会话。否则,除非启用了自动启动会话的ini设置,否则不会启用会话。此外,您的服务器必须正确配置为能够存储会话文件(通常需要可写的tmp目录)。在此处查看有关会话的更多信息:http://www.php.net/manual/en/ref.session.php

答案 2 :(得分: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";
}

答案 3 :(得分:-1)

也许time()返回毫秒,你应该比较180000而不是180。