替换/更新SESSION数组

时间:2015-10-03 21:00:09

标签: php arrays session cart associative

这与我的第一篇文章有​​关,但是新的问题。我不确定协议,所以我创建了一个新主题。 (link to first post)

我在这里搜索并发现了几个不同的问题实例,但似乎无法理解任何足以继续我自己的程序。

简要说明:购物车。我在页面上列出了一些带有itemID的项目。用户点击某个项目,它会被添加到购物车中。如果用户两次单击同一项,则数量应增加1(当前是硬编码的)。 <_SESSION [&#39; cart&#39;]数组应该从空开始并且是动态的。

当前问题:在测试中,它似乎只循环遍历数组一次,即使参数1是一个数组,array_push也会给出错误,不会删除项目,也不会读取for循环中的数量。它显示&#39; 1&#39;在print_r($_SESSION['cart'] 但是&#39; 0&#39; 0在$_SESSION['cart']['itemID']['quantity'];

Warning: array_push() expects parameter 1 to be array, null given in C:\xampp\htdocs\A06_DictCart\controller\updateCart.php on line 25

我认为有几个不同的问题,但修复一个会帮助我与其他人一起前进,我想他们是半相关的。

viewCart.php

<?php
session_start();

/* Display the itemID and quantity of each item in the shopping cart.
This may be implemented by iterating though the items in the dictionary 
and displaying their keys and values. */
echo ' ** array/ '.print_r($_SESSION['cart']).' ** count/ '.count($_SESSION['cart']);
echo '<br>'.$_SESSION['cart']['itemID']['quantity'];
echo '<center><h2><u>SHOPPING CART</u></h2>';
echo '<br><TABLE border=1 cellPadding=3 cellSpacing=1>
        <TBODY>
        <TR>
          <TD>ItemID</TD>
          <TD>Quantity</TD>
          <TD>Remove from Cart</TD></TR>';

if (isset($_SESSION['cart'])) {
    $c = count($_SESSION['cart']);
    for ($x=0; $x <= $c; $x++){
        echo '<tr><td>'.$_SESSION['cart']['itemID'].'</td>';
        echo '<td>'.$_SESSION['cart']['itemID']['quantity'].'</td>';
        echo "<td><a href='updateCart.php?action=remove&amp;itemID=".$_SESSION['cart']['itemID']."&amp;quantity=".$qty."> Remove from Cart </a></td></tr>";
        $x++;
    }   
}
else {
    $msg = '<i> ** cart is empty ** </i>';
    echo '<tr> <td></td>';
    echo '<td> </td>';
    echo "<td> </td></tr>";
}

echo '</tbody></table>';
echo $msg;
echo '<br><br><a href="../controller/default.php">Back to Catalog</a>';
echo '<br><a href="../controller/updateCart.php?action=clear">Empty Cart</a></center>';
?>

updateCart.php

<?php
/* Read the values of action, itemID, and quantity from the querystring.  
Items will either be added or removed from the shopping cart depending 
on the values of the querystring. Once the quantity is 0 the item should 
be unset from the cart. */

session_start();

$action = $_GET['action'];
$itemID = $_GET['itemID'];
$qty = $_GET['quantity'];
$msg;

if (empty($_SESSION['cart'])) $_SESSION['cart'] = array();
//array(); //('123' => 0, '456' => 0, '789' => 0, '101' => 0);
//$cart = array($_SESSION['cart']);

// ADD TO CART
if ($action == 'add') { 
    if (!in_array($itemID, $_SESSION['cart'])) {    
        $_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty);  // Insert new item
    } else {
        $temp = array($_SESSION['cart']);
        $q += $_SESSION['cart'][$itemID]['qty'];
        $temp = array('itemID' => $itemID, 'quantity' => $q);
        array_push($_SESSION['cart'][$itemID], $temp);// Update existing item's quantity
    }
    $msg = $qty.' of item # '.$itemID.' has been added to your cart.';
}
// REMOVE FROM CART
if ($action == 'remove'){ 
    if (($_SESSION['cart'][$itemID]['quantity'] - 1) <= 0)
        unset ($_SESSION['cart'][$itemID]); // If new value is zero, unset elements
    else
        $_SESSION['cart'][$itemID]['quantity']--;   // Else decrease quantity by one
    $msg = $qty.' of item # '.$itemID.' has been removed to your cart.';
}
// EMPTY CART
if ($action == 'clear') { 
    unset($_SESSION['cart']);   // Unset session
    session_destroy();  
    $msg = 'Your shopping cart has been emptied.';
}

?>


<HTML>
    <HEAD>
    </HEAD>
<BODY>
<center>
    <p> <?php echo $msg; ?><br><br>
    <p><a href="../controller/default.php">Back to Catalog</a></p>
    <p><a href="../controller/viewCart.php">View Cart</a></p>
</center>
</BODY>
</HTML>

由于这是一项正在进行中的工作,因此在语法方面可能存在一些我尚未发现的差异。 &#39;删除购物车中的部分代码&#39;我在另一篇文章中看到的声明。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我没有对此进行测试,但请尝试以下代码:

// ADD TO CART
if ($action == 'add') { 
    if (!isset($_SESSION['cart'][$itemID])) {    
        $_SESSION['cart'][$itemID] = array('itemID' => $itemID, 'quantity' => $qty);  // Insert new item
    } else {
        $_SESSION['cart'][$itemID]['quantity'] += $qty     
    }
    $msg = $qty.' of item # '.$itemID.' has been added to your cart.';
}

这就是我写这个的方式。我想在你的代码中

$_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty);  // Insert new item

应该是

$_SESSION['cart'][$itemID] = array('itemID' => $itemID, 'quantity' => $qty);  // Insert new item

我认为你混淆了数量&#39;用你的数量&#39;键入原始代码。在更新时,您已阅读密钥qty,但您的初始值为quantity为关键:

$q += $_SESSION['cart'][$itemID]['qty'];

可能应该写成

$q += $_SESSION['cart'][$itemID]['quantity'];

编辑:请注意此Image

答案 1 :(得分:0)

在开始编写任何代码之前,您可能想要考虑应用程序的逻辑以及您要实现的目标。

if ($action == 'add') { 
  if (!in_array($itemID, $_SESSION['cart'])) {    
    $_SESSION['cart']= array('itemID' => $itemID, 'quantity' => $qty);  // Insert new item
  } else {
    $temp = array($_SESSION['cart']);
    $q += $_SESSION['cart'][$itemID]['qty'];
    $temp = array('itemID' => $itemID, 'quantity' => $q);
    array_push($_SESSION['cart'][$itemID], $temp);// Update existing item's quantity
  }
}

应该只是:

if ($action == 'add' ) {
   $_SESSION['cart'][$itemID]+=$qty;
}

(注意对数组结构的更改)