2017-12-30 41 views
1

私は多次元配列を製品に持っています。ユーザーが数量を変更したときに新しいものを追加するのではなく、既存のものを更新したいと思います。私はマージしようとしていますが、何らかの理由で多次元配列の名前が変わってしまい、なぜそれが見えません。マージの代わりに多次元に配列を追加

それは以下のようになります。 https://i.imgur.com/zEZVDXX.png

if(!empty($_POST["addquantity"])) { 
      $add_id = $_GET['add']; 
      $add_quantity = $_POST['addquantity']; 
      $sqlOrd = "SELECT * FROM products WHERE id_product = '$add_id'"; 
      $result = mysqli_query($conn, $sqlOrd); 
      while($row=mysqli_fetch_assoc($result)) { 
       $productByCode[] = $row; 
      } 

      $itemArray = array(
         $productByCode[0]["id_product"] => array(
          'name' => $productByCode[0]["name"], 
          'id_product' => $productByCode[0]["id_product"], 
          'quantity' => $_POST["addquantity"], 
          'price' => $productByCode[0]["price"] 
         ) 
        ); 

      if(!empty($_SESSION["cart_item"])) { 
       if(in_array($productByCode[0]["id_product"],$_SESSION["cart_item"])) { 
        foreach($_SESSION["cart_item"] as $k => $v) { 
          if($productByCode[0]["id_product"] == $k) 
           $_SESSION["cart_item"][$k]["quantity"] = $_POST["addquantity"]; 
        } 
       } else { 
        $_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray); 
       } 
      } else { 
       $_SESSION["cart_item"] = $itemArray; 
      } 
     } 
+0

http://idownvotedbecau.se/imageofcode – theFunkyEngineer

+1

@theFunkyEngineerコードのない画像がありません - VARSコンテンツの画像には、いくつかの説明を含む、あり..あなたが文句を言うことができる唯一の事はそれということであり、インラインではありません。 – Philipp

+1

コードを分割する必要があります。あなたは1か所であまりにも多くのことをやっています。また、SQLインジェクションに対しても非常に脆弱です。 –

答えて

0

問題がin_arrayであるが、あなたはarray_key_existsを使用したいようです。

この$_SESSION["cart_item"]には、そのような値が存在しないため、ステートメントはif(in_array($productByCode[0]["id_product"],$_SESSION["cart_item"])) ELSEに直接進む場合、同じ整数キーを持つ2つの項目があるので、その後array_mergeこのコード$_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);のキーをリセットします。

だから、私のクイックフィックス提案:

if(array_key_exists($productByCode[0]["id_product"],$_SESSION["cart_item"])) { 
... rest of the code ... 
+0

これで動作します。ありがとうございました。 in_arrayの定義を誤読したように見える –

1

あなたは全体のコードをたくさん簡素化することができます。ループは必要ありません。カートアイテムのキー/ IDを知っているので、直接アクセスすることができます。それに加えて、SQLインジェクションの世話をし、準備されたステートメントを使用する必要があります。

if (!empty($_POST["addquantity"])) { 
    // cast some vars around to prevent sql injection - better use prepared statements 
    $add_id = (int)$_GET['add']; 
    $add_quantity = (float)$_POST['addquantity']; 
    $sqlOrd = "SELECT * FROM products WHERE id_product = '$add_id' LIMIT 1"; 
    $result = mysqli_query($conn, $sqlOrd); 
    $product = mysqli_fetch_assoc($result); 
    if (!$product) { 
     // some error handling.. 
    } 

    $item = [ 
     'name' => $product["name"], 
     'id_product' => $add_id, 
     'quantity' => $add_quantity, 
     'price' => $product["price"] 
    ]; 

    if (!isset($_SESSION["cart_item"])) { 
     $_SESSION["cart_item"] = []; 
    } 

    if (isset($_SESSION["cart_item"][$add_id])) { 
     $_SESSION["cart_item"][$add_id]["quantity"] += $add_quantity; 
    } else { 
     $_SESSION["cart_item"][$add_id] = $item; 
    } 
}