2017-01-06 10 views
0

バスケットを作成していますが、すでにバスケットに入っているアイテムが再び追加された場合、元のアイテムの数量に1が加算されます。バスケットアイテムに数量を追加すると新しいアイテムが追加されます

代わりに、既にバスケットに入っているアイテムを追加すると、新しいアイテムが追加され、元のアイテムの+1をクリックするとこの新しいアイテムの数量を追加できます。

<?php 
    foreach ($_SESSION["basket"] as $basketItemArray) {     
?> 

<form role="form" action="includes/functions/create_shopping_cart.php" method="post"> 
    <button type="submit" name="basket-button" class="btn btn-default" value="<?php echo $basketItemArray["item_id"]; ?>"><i class="fa fa-plus" aria-hidden="true"></i></button> 
    <? echo $basketItemArray["quantity"]; ?> 
    <button class="btn btn-default"><i class="fa fa-minus" aria-hidden="true"></i></button> 
</form> 

basket.phpは、上記のフォームは、+ボタンの値を介してITEM_IDを送信します。

create_shopping_cart.php

$product_id = $_POST['basket-button']; 
$sql = "SELECT * FROM menu WHERE product_id='".$product_id."'"; 

$result = $connection->query($sql); 
$row = $result->fetch_assoc(); 

if (empty($_SESSION["basket"])) { 
    $_SESSION["basket"] = array( 

    array("item_id"=>$row['product_id'], "item_name"=>$row['name'],"quantity"=>1 , "price"=>$row['price'])); 

} else { 
    // There is already a basket to append to 
    $current_basket = $_SESSION["basket"]; 

    $found = false; 
    foreach($_SESSION['basket'] as $product) 
    { 
     if($product_id == $product['item_id']) { 
      $found = true; 
      break; 
     } 
    } 

    if($found) 
    { 
     $_SESSION['basket'][$product_id]['quantity'] ++;    
    } else { 
     $new_basket = array( 

     array("item_id"=>$row['product_id'], "item_name"=>$row['name'],"quantity"=>1 , "price"=>$row['price'])); 

     $_SESSION['basket'] = array_merge($current_basket, $new_basket);  
    } 
} 

結果 This is what the result of clicking the + button on the original item twice

+0

'$ found'が' true'に設定されているかどうかチェックしましたか? – RST

+0

はい、これを試してみると$ foundがtrueに設定されています –

+0

++の前のスペースを削除するとどうなりますか? – RST

答えて

1

あなたはバスケット内の製品のインデックスを使用して/ターゲットにされていません。 これを試してみてください:

$product_id = $_POST['basket-button']; 
$sql = "SELECT * FROM menu WHERE product_id='".$product_id."'"; 

$result = $connection->query($sql); 
$row = $result->fetch_assoc(); 

if (empty($_SESSION["basket"])) { 
    $_SESSION["basket"] = array( 

    array("item_id"=>$row['product_id'], "item_name"=>$row['name'],"quantity"=>1 , "price"=>$row['price'])); 

} else { 
    // There is already a basket to append to 
    $current_basket = $_SESSION["basket"]; 

    $found = false; 
    $id = ''; 
    foreach($_SESSION['basket'] as $key=>$product) 
    { 
     if($product_id == $product['item_id']) { 
      $found = true; 
      $id = $key; 
      break; 
     } 
    } 

    if($found) 
    { 
     $_SESSION['basket'][$id]['quantity']++;    
    } else { 
     $new_basket = array( 

     array("item_id"=>$row['product_id'], "item_name"=>$row['name'],"quantity"=>1 , "price"=>$row['price'])); 

     $_SESSION['basket'] = array_merge($current_basket, $new_basket);  
    } 
} 

あなたのコードは、いくつかのより最適化することができますが、今のところは、それが正常に動作させるために、より重要です。

+0

ありがとうございましたが、唯一必要なのは、数量をバスケットに追加する際に必要な唯一の引数が[$ id] - [$ product_id]であったためです。 –

+1

さて、コードでそれを変更しました。このシステム全体を処理し、foreachを取り除くより良い方法は、product_idをバスケットのインデックスとして使用することです。あなたが '$ _SESSION [' basket '] [$ product_id] = $ new_basketを' array_merge 'を使用する代わりに 'if(isset $ _SESSION [' basket '] [$ product_id])'をチェックすることで、 ' – RST

関連する問題