PHP克隆对象导致多个对象?

时间:2011-07-28 10:39:04

标签: php count clone

首先我展示代码:

//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

我真的不明白为什么会这样。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

您对代码的处理方式是,如果$_REQUEST action等于值duplicate,那么您正在执行以下操作:

  1. 从会话中获取购物车(以前存储过)
  2. 克隆购物车并将其存储在temp
  3. 然后将temp复制回购物车
  4. 最后将购物车存入会话
  5. 然后我想你在某处显示你的卡片......
  6. 这里发生的是克隆指令仅在您单击重复链接时才有效。我想你的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();
}