如何阻止阻止重复输入PHP会话?

时间:2016-08-12 21:58:17

标签: php ajax session-variables session-cookies

我目前正在开发一个项目,我将数据存储在PHP Sessions(PS)中。出于各种原因,我只想使用一个PS来解决这个问题,这当然意味着我的PS将是一个很长的字符串。为了解决这个问题,我有一个模式;每个“块”以下列格式存储:$ CategoryID; $ StartingPoint; $ Available;&。

要访问特定“块”的起点,我使用以下代码:

function getStartPosition($CategoryID)
{
    $feedItems = explode("&", $_SESSION['feedData']);
    foreach($feedItems as $fI)
    {
        $temp = explode(";", $fI);
        /*
        $temp[0] = Category ID;
        $temp[1] = Starting Position;
        $temp[2] = Available;
        */

        if($CategoryID == $temp[0])
        {
            $startPos = $temp[1];
        }
    }
    return $startPos;
}

然后我执行一个for循环,带有一个动态起始值 - 从前一个代码中检索的起始值。在for循环中的每个循环结束时,我使用以下代码将起始值增加1:

function setStartPosition($CategoryID)
    {
        $feedItems = explode("&", $_SESSION["feedData"]);
        foreach($feedItems as $fI)
        {
            $temp = explode(";", $fI);

            /*$temp[0] = Category ID;
            $temp[1] = Starting Position;
            $temp[2] = Available;*/

            if($temp[0] == $CategoryID)
            {
                $search = $temp[0] . ";" . $temp[1] . ";" . $temp[2] . ";&";
                $replacement = $temp[0] . ";" . ($temp[1]+1) . ";" . $temp[2] . ";&";
                $_SESSION["feedData"] = str_replace($search, $replacement, $_SESSION["feedData"]);
                return;
            }
        }
    }

我的吸气者和制定者工作 - 他们得到,他们设定,他们做他们的工作。使用以下字符串:6; 0; Y;& 14; 0; Y;& 33; 0; Y;& 64; 0; Y;&我可以通过$ temp [0]获得类别6,14,33和64的起始值。因此,我可以安全地假设我的双爆+ foreach方法有效。

然而,我的问题是初始化它们。如果我有一个6; 0; Y;& 14; 0; Y;& 33; 0; Y;& 64; 0; Y;&的字符串,我可以识别一个类别的起始位置。如果我有6; 0; Y;& 6; 0; Y;&然后我遇到问题,因为一旦每个for循环周期结束,字符串就变成6; 1; 0; Y;& 6; 0; 0; Y;& ...什么是“阻止”我的吸气剂去做?那是我的问题。

我不明白为什么我的代码不起作用。它使用相同的双爆+ for-each方法来获取数据,从而识别每个块,但我的解决方案不会阻止重复条目。因此,当我通过AJAX调用重新执行代码时,我将有多个重复的条目。我的代码:

function addToSession($CategoryID)
    {
        if(isset($_SESSION["feedData"]))
        {
            $feedItems = explode("&", $_SESSION['feedData']);
            foreach($feedItems as $fI)
            {
                $temp = explode(";", $fI);
                /*$temp[0] = cid;
                $temp[1] = sp;
                $temp[2] = av;*/
                $temp[1] = (int)$temp[1];
                // also tried: 
                // if ($temp[1] == $CategoryID)
                // but does not work either
                if($temp[1] == 1 || $temp[1] > 1)
                {
                 // do nothing -> already in session
                }
                else
                {
                    $_SESSION["feedData"] .= $CategoryID . ";0;Y;&";
                }
                //return $temp[0];
            }
        }
        else
        {
            $_SESSION["feedData"] .= $CategoryID . ";0;Y;&";

        }
        return;
    }

对我来说,代码如下: 如果会话feedData不存在,则创建它并添加一个块。 然后,从那以后的每个函数调用中,检查块是否已经具有大于1的起始指针值。 如果是,则已添加,因此无需添加其他条目。 如果没有,则添加一个新的条目。

代码在首次加载时“有效”,因为该字符串具有唯一值。但是,在我的AJAX调用之后,字符串长度为150个字符(通常为30个字符等)并且具有重复值。

TL; DR;我在我的PHP Session变量中得到重复的值,我不明白为什么我试图通过我的if语句来防止重复的条目。它适用于首次加载,但此后不适用于AJAX。为什么?

任何建议,提示或想法将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

你的整个方法看起来很疯狂,因为你可以在会话变量中存储关联数组。您无法获得重复项,因为数组键始终是唯一的。

function addToSession($CategoryID) {
    if (!isset($_SESSION['feedData'])) {
        $_SESSION['feedData'] = array();
    }
    if (isset($_SESSION['feedData'][$CategoryID]) {
        // do nothing - already in session
    } else {
        $_SESSION['feedData'][$CategoryID] = array('startingPosition' => 0, 'available' => 'Y');
    }
}

function getStartingPosition($CategoryID) {
    if (isset($_SESSION['feedData'][$CategoryID]) {
        return $_SESSION['feedData'][$CategoryID]['startingPosition'];
    } else {
        return null;
    }
}

function setStartingPosition($CategoryID) {
    if (isset($_SESSION['feedData'][$CategoryID]) {
        $_SESSION['feedData'][$CategoryID]['startingPosition']++;
    }
}