【问题标题】:How do I stop prevent duplicate entries to my PHP Session?如何停止防止重复条目进入我的 PHP 会话?
【发布时间】:2016-12-20 00:04:00
【问题描述】:

我目前正在从事一个项目,我在 PHP 会话 (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 循环中的每个循环结束时,我使用以下代码将起始值加一:

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;
            }
        }
    }

我的 getter 和 setter 工作 - 他们得到,他们设置,他们做他们的工作。使用以下字符串: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 个字符(通常为 30ish 等)并且具有重复值。

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

我们将不胜感激任何建议、提示或想法。

谢谢。

【问题讨论】:

  • 为什么要设计自己的格式来编码会话变量?使用serializejson_encode
  • 你为什么要让自己这么难?您可以简单地将数组存储到会话中:)
  • addToSession 从不检查$CategoryID 是否已经在会话变量中。 if() 带有注释“什么都不做 -> 已经在会话中”不会检查 $CategoryID。应该是if($temp[0] == $CategoryID)
  • 您有一条评论说您尝试过if ($temp[1] == $CategoryID)。您似乎忘记了哪个字段包含该类别!
  • 你怎么会遇到同样的问题?关联数组不能有重复的键。

标签: php ajax session-variables session-cookies


【解决方案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']++;
    }
}

【讨论】:

  • 正是我所说的。 +1
  • 这比我尝试做的更干净/更好。谢谢,巴尔玛。我正在重新编写代码以包含关联数组,但这将是一个有用的指南。
  • 跟进:重新编写了我的代码,我设法得到了我想要的工作。谢谢,巴尔玛。
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多