如何停止防止重复输入我的 PHP 会话?
How do I stop prevent duplicate entries to my PHP Session?
我目前正在开展一个项目,我将数据存储在 PHP 个会话 (PS) 中。由于各种原因,我只想使用一个 PS 来解决这个特定问题,这当然意味着我的 PS 将是一个又大又长的字符串。为了解决这个问题,我有一个模式;每个 "block" 都以以下格式存储:$CategoryID;$StartingPoint;$Available;&。
要访问特定 "block" 的起点,我使用以下代码:
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;
}
}
}
我的 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;&... "block" 我的 getter 有什么用?那是我的问题。
我不明白的是为什么我的代码不起作用。它使用相同的双爆炸 + 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 的起始指针值。
如果是,那么它已经被添加,因此不需要添加另一个条目。
如果没有,则添加一个全新的条目。
第一次加载代码 "works",因为字符串具有唯一值。但是,在我调用 AJAX 之后,该字符串的长度为 150 个字符(通常为 30ish 等)并且具有重复值。
TL;DR;我在我的 PHP 会话变量中得到了重复的值,我不明白为什么我试图通过我的 if 语句来防止重复条目。它在第一次加载时有效,但在 AJAX 之后就无效了。为什么?
如有任何建议、提示或想法,我们将不胜感激。
谢谢。
您的整个方法看起来很疯狂,因为您可以将关联数组存储在会话变量中。您无法获得重复项,因为数组键始终是唯一的。
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']++;
}
}
我目前正在开展一个项目,我将数据存储在 PHP 个会话 (PS) 中。由于各种原因,我只想使用一个 PS 来解决这个特定问题,这当然意味着我的 PS 将是一个又大又长的字符串。为了解决这个问题,我有一个模式;每个 "block" 都以以下格式存储:$CategoryID;$StartingPoint;$Available;&。
要访问特定 "block" 的起点,我使用以下代码:
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;
}
}
}
我的 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;&... "block" 我的 getter 有什么用?那是我的问题。
我不明白的是为什么我的代码不起作用。它使用相同的双爆炸 + 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 的起始指针值。 如果是,那么它已经被添加,因此不需要添加另一个条目。 如果没有,则添加一个全新的条目。
第一次加载代码 "works",因为字符串具有唯一值。但是,在我调用 AJAX 之后,该字符串的长度为 150 个字符(通常为 30ish 等)并且具有重复值。
TL;DR;我在我的 PHP 会话变量中得到了重复的值,我不明白为什么我试图通过我的 if 语句来防止重复条目。它在第一次加载时有效,但在 AJAX 之后就无效了。为什么?
如有任何建议、提示或想法,我们将不胜感激。
谢谢。
您的整个方法看起来很疯狂,因为您可以将关联数组存储在会话变量中。您无法获得重复项,因为数组键始终是唯一的。
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']++;
}
}