在PHP中的数组列表中更改单个数组的值

时间:2018-01-23 19:58:01

标签: php arrays

我尝试做的是通过获取它的唯一产品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).'"

1 个答案:

答案 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,但这应该是一个很好的开始并以此为基础。