首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP克隆对象会导致多个对象吗?

PHP克隆对象会导致多个对象吗?
EN

Stack Overflow用户
提问于 2011-07-28 18:39:04
回答 3查看 230关注 0票数 1

首先,我展示代码:

代码语言:javascript
运行
复制
//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

我真的不明白为什么会这样。如有任何帮助,我们不胜感激!

EN

回答 3

Stack Overflow用户

发布于 2011-07-28 19:44:03

您正在对代码执行的操作是,如果action的值等于duplicate,则您正在执行以下操作:

  1. 从会话中获取购物车(先前已存储)
  2. 克隆购物车并将其存储在temp
  3. 中,然后将临时数据复制回cart
  4. 中,最后将购物车存储到会话

  1. 然后我假设您显示了卡片somewhere...

这里发生的情况是,仅当您单击复制链接时,克隆说明才有效。我假设你的PHP和html在同一个文件中,所以当你在一个新的窗口中打开它时,购物车会更新两个项目并存储在会话中(这对你页面的所有实例都是通用的),当你重新加载页面时,同样的两个项目会从会话中提取出来并显示给你。另外,在这里,您需要观察$_REQUEST['action']仍然存在,因此它多复制了1个项目。现在,每当您刷新页面时,它将继续复制1个以上的项目。

作为解决方案,在克隆购物车之后,尝试使用unset()函数取消该操作,以便只在需要时运行php。

票数 1
EN

Stack Overflow用户

发布于 2011-07-28 18:43:41

我怀疑当你刷新页面时,它会给你三个,因为旧的$_REQUEST['array_index']仍然存在。您需要设置一个会话变量来指示操作已完成,并在继续执行此操作之前对其进行检查。

代码语言:javascript
运行
复制
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'];
    }
}
票数 0
EN

Stack Overflow用户

发布于 2011-07-28 18:49:53

由于$_REQUEST也包含$_GET,我猜您的&action=duplicate位于url中,并且您的代码会在您重新加载页面时频繁执行。

我建议在复制后重定向(使用header('Location: ...');,参见:header),但仅在从url中删除action-var之后。

更新

下面是使用函数getUrlCurrently的一个简短示例:

代码语言:javascript
运行
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6857625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档