我尝试做的是通过获取它的唯一产品ID来更改我的数组列表中的单个数组的值(我用它来保存会话中的产品)。
我使用以下代码:
function removeProductFromBasket($itemID)
{
// Loop through products
foreach($_SESSION['shopping_cart'] as $arr => $prod) {
// Check if product is already included
if ($prod['productid'] == $itemID) {
echo $itemID;
$_SESSION['shopping_cart'][$arr]['quantity'] = 0;
}
}
}
我的阵列看起来像这样:
Array ( [0] => Array ( [productid] => 18 [quantity] => 0 ) [1] => Array ( [productid] => 2 [quantity] => 0 ) [2] => Array ( [productid] => 4 [quantity] => 4 ) )
目前正在使用
调用该函数href="'.removeProductFromBasket($productID).'"
答案 0 :(得分:0)
我在当前实现中看到的第一个问题是它“神奇地”作用于$_SESSION
变量。通过这样做,您限制了将来修改逻辑的能力,因为逻辑的实现与数据的存储方式紧密相关。您还有可能忘记在代码中的其他地方有一个函数也改变了$_SESSION
的值,从而使removeProductFromBasket
的行为变得不可预测并容易受到错误的攻击。</ p>
要解决此问题,您需要将功能与$_SESSION
分离。您可以通过向函数签名添加参数来实现此目的,该参数将购物车作为数组接收。
function removeProductFromBasket($cart, $itemID)
{
// Loop shopping cart
foreach($cart as $key => $productArr) {
// Check if product is already included
if ($productArr['productid'] == $itemID) {
echo $itemID;
$cart[$key]['quantity'] = 0;
}
}
return cart; // return the updated cart
}
通过以这种方式修改代码,您可以在其他地方处理$_SESSION
,可能在包装器对象或类似的东西中,而不会影响购物车项目删除的逻辑。它还允许您更轻松地更改信息的持久性。假设您想使用Redis或其他一些数据存储,您可以使用更少的行进行修改以进行更改。
我在当前实现中看到的另一个问题是调用函数的方式。从您的示例代码中,我猜测整行重新包含这样的内容:
echo '<a href="'.removeProductFromBasket($productID).'">Remove this</a>
由于PHP是在服务器端执行的,因此在页面加载时调用函数removeProductFromBasket
。这意味着,在客户端呈现和加载页面时,该项目已被删除,并且href看起来像href="12345"
du到函数中的echo
。
相反,您应该回显项目删除逻辑的有效网址,并将项目ID作为参数进行连接。
<强> form.php的强>
foreach($_SESSION['shoppingCart'] as $key => $item) {
echo '<a href="http://www.example.com/path/to/file.php?itemId='.$item['productid'].'">Remove this</a>
}
<强> item_removal.php 强>
<?php
// Make sure the session is started, $_GET is not empty and any other validation
function removeProductFromBasket($cart, $itemID)
{
// Loop shopping cart
foreach($cart as $key => $productArr) {
// Check if product is already included
if ($productArr['productid'] == $itemID) {
// the echo is no longer needed
$cart[$key]['quantity'] = 0;
}
}
return cart; // return the updated cart
}
$_SESSION['shoppingcart'] = removeProductFromBasket($_SESSION['shoppingcart'], $_GET['itemId']);
?>
当然还有改进的余地,例如在ShoppingCart
变量周围创建一个对象Session
和一个包装$_SESSION
,但这应该是一个很好的开始并以此为基础。