首先我展示代码:
//item duplication code goes here
elseif($_REQUEST['action'] == 'duplicate'){
$array_index = $_REQUEST['array_index'];
$cart = $_SESSION['cart'];
$tempItem = clone $cart[$array_index];
$cart[]=$tempItem;
$_SESSION['cart'] = $cart;
}
例如,如果我在购物车中有1个项目,按下该链接将给我2个相同的项目。事实是,直接结果是正确的(我在新标签中打开链接)但是在我刷新页面(旧标签)之后,它给了我3个。
要解释一下,请看一段简短的视频:
http://www.youtube.com/watch?v=OORcT5KxZqw
我真的不明白为什么会这样。任何帮助表示赞赏!
答案 0 :(得分:1)
您对代码的处理方式是,如果$_REQUEST
action
等于值duplicate
,那么您正在执行以下操作:
这里发生的是克隆指令仅在您单击重复链接时才有效。我想你的PHP与html在同一个文件中,所以当你在新窗口中打开它时,购物车会更新2个项目并存储在会话中(这对你页面的所有实例都是通用的)以及当你重新加载你的页面时从会话中提取相同的2个项目并向您显示。此外,您还需要观察$_REQUEST['action']
仍然存在,以便更多地复制1项。现在,无论何时刷新页面,它都会继续复制1个项目。
作为解决方案,尝试在克隆购物车后使用unset()
函数取消设置操作,以便php仅在需要时运行。
答案 1 :(得分:0)
我怀疑在刷新页面时它会给你三个,因为旧的$_REQUEST['array_index']
仍在闲逛。您需要设置会话变量以指示操作已完成,并在继续执行此操作之前进行检查。
elseif($_REQUEST['action'] == 'duplicate'){
// Check if you already duplicated this array_index
if (!isset($_SESSION['duplication_done']) || (isset($_SESSION['duplication_done']) && $_SESSION['duplication_done'] != $_REQUEST['array_index']) {
$array_index = $_REQUEST['array_index'];
$cart = $_SESSION['cart'];
$tempItem = clone $cart[$array_index];
$cart[]=$tempItem;
$_SESSION['cart'] = $cart;
// After duplicating, store this array_index in $_SESSION
$_SESSION['duplication_done'] = $_REQUEST['array_index'];
}
}
答案 2 :(得分:0)
由于$_REQUEST也持有$_GET,我猜您的&action=duplicate
位于网址中,您的代码会在您重新加载页面时执行。
我建议在复制后重定向(使用header('Location: ...');
,请参阅:header),但只能在从网址中删除action
- var之后重新定位。
<强>更新强>:
使用函数getUrlCurrently这是一个简短的例子:
function getUrlCurrently($filter = array()) {
$pageURL = isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on" ? "https://" : "http://";
$pageURL .= $_SERVER["SERVER_NAME"];
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= ":".$_SERVER["SERVER_PORT"];
}
$pageURL .= $_SERVER["REQUEST_URI"];
if (strlen($_SERVER["QUERY_STRING"]) > 0) {
$pageURL = rtrim(substr($pageURL, 0, -strlen($_SERVER["QUERY_STRING"])), '?');
}
$query = $_GET;
foreach ($filter as $key) {
unset($query[$key]);
}
if (sizeof($query) > 0) {
$pageURL .= '?' . http_build_query($query);
}
return $pageURL;
}
if ($_REQUEST['action'] == 'duplicate'){
// your duplication code here ...
// after the duplication
header('Location: ' . getUrlCurrently(array(
'action', 'array_index' // <--- unsetting the problematic url-vars
)));
exit();
}