首先,我展示代码:
//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
我真的不明白为什么会这样。如有任何帮助,我们不胜感激!
发布于 2011-07-28 19:44:03
您正在对代码执行的操作是,如果action
的值等于duplicate
,则您正在执行以下操作:
中
这里发生的情况是,仅当您单击复制链接时,克隆说明才有效。我假设你的PHP和html在同一个文件中,所以当你在一个新的窗口中打开它时,购物车会更新两个项目并存储在会话中(这对你页面的所有实例都是通用的),当你重新加载页面时,同样的两个项目会从会话中提取出来并显示给你。另外,在这里,您需要观察$_REQUEST['action']
仍然存在,因此它多复制了1个项目。现在,每当您刷新页面时,它将继续复制1个以上的项目。
作为解决方案,在克隆购物车之后,尝试使用unset()
函数取消该操作,以便只在需要时运行php。
发布于 2011-07-28 18:43:41
我怀疑当你刷新页面时,它会给你三个,因为旧的$_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'];
}
}
发布于 2011-07-28 18:49:53
由于$_REQUEST也包含$_GET,我猜您的&action=duplicate
位于url中,并且您的代码会在您重新加载页面时频繁执行。
我建议在复制后重定向(使用header('Location: ...');
,参见:header),但仅在从url中删除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();
}
https://stackoverflow.com/questions/6857625
复制相似问题