0

私は 3 日間頭を悩ませてきましたが、セッション配列からアイテムを削除するという問題の解決策をまだ見つけられません。

PHP とショッピング カートの作成方法を学んでいます。フレームワークがあることは知っていますが、プログラミングを学び、問題を解決し、ものを作りたいと思っています。

私の問題はこれです:カートに3つのアイテムを入れたとしましょう...

  1. クッキー
  2. ドーナツ
  3. カップケーキ

ショッピング カート内のアイテムを削除すると、リストの下 (そのアイテムの下) の他のアイテムもすべて削除されます。DONUTS を削除すると、Cupcakes も削除されます。Cookie を削除すると、リスト全体が削除/消去されます

しかし、リストの一番下 (Cookie) から開始すると、問題なく動作します。クリックしたものだけが削除されます。

これが私のコードと他の試みです。スタイルはまだ設定されておらず、ロジックに取り組んでいます。

 <?php

session_start();

$prodid = $_POST['prodid'];
$quantity = $_POST['quantity'];
$empty= $_POST['empty']; 
$removed = $_POST['remove'];

   if (isset($empty ))
    {
    unset($_SESSION['shop_cart']);
    }


if (!isset($_SESSION['shop_cart']))//Checking if Session is Set or empty
   {
      unset($_SESSION['shop_cart']);
      echo "Cart is empty";
   } else
   {
      if(count($_SESSION['shop_cart'])==NULL || count($_SESSION['shop_cart'])==0 )
      {
         echo "Cart is empty";
      }
   }



/////// THIS IS THE SECTION THAT I'VE BEEN FIDDLING WITH --Am I on the right track
    if (isset($removed))  
    {
    foreach ($_SESSION['shop_cart'] as $cart_line_item => $item)
       {
        if($prodid==$item['prodid'])
            {
            unset($_SESSION['shop_cart'][$cart_line_item]); ///9:47pm May 20, 2013 
            break;
            }   
        }
    }
///////////////////////////////////////////////////////////////////////////////////


//Check if item is already in cart 
foreach ($_SESSION['shop_cart'] as $cart_line_item => $item)
    {
    if ($item['prodid']==$prodid)
        {
        $quantity=0;
    echo "In Cart Already <br/>";
        break;           
        }
    }

$cap=count($_SESSION['shop_cart']);
$_SESSION['shop_cart'][$cap]['prodid']=$prodid;
$_SESSION['shop_cart'][$cap]['quantity']=$quantity;
$_SESSION['shop_cart'][$cap]['description']=$description;

//Prevent Items with zero quantity
foreach ($_SESSION['shop_cart'] as $cart_line_item => $item)
    {
    if ($item['quantity'] == 0 || $item['quantity'] == NULL)
        {
        unset($_SESSION['shop_cart'][$cart_line_item]);
        break;
        }
    }    


$total=0; //For Price

 if (isset($_SESSION['shop_cart']))  
  {
    for($i=0;$i<count($_SESSION['shop_cart']);$i++)
    {
        $prodid=$_SESSION['shop_cart'][$i]['prodid'];
        $quantity=$_SESSION['shop_cart'][$i]['quantity'];
        $description=$_SESSION['shop_cart'][$i]['description'];

        $query = "SELECT prodid, description, price FROM products WHERE prodid = $prodid";
        $result = mysqli_query($hook, $query);
        $row = mysqli_fetch_assoc($result);

        $prodid = $row['prodid'];
        $price = $row['price'];
        $description= $row['description'];

        $subtotal = $price * $quantity;
                    $total += $subtotal;

echo "$description($prodid)---Quantity: $quantity--- $$price";      

echo "<form action=\"$_SERVER[SCRIPT_NAME]\" method=\"post\" >";
echo "<INPUT TYPE=\"submit\" name=\"remove\" VALUE=\"Remove\">";
echo "<input type=\"hidden\" name=\"prodid\" value=$prodid />\n";
echo "<input type=\"hidden\" name=\"counter\" value=\"$i\"/>\n"; 
echo "</FORM>";

echo "--------------------------<br/><br/>";

    }                                                             
  }

echo "TOTAL $total <br/><br/>";

echo '<pre>'. var_dump( $_SESSION['shop_cart']).'<pre/>';

echo "<br/>";

echo "<form action=\"$_SERVER[SCRIPT_NAME]\" method=\"post\" >";
echo "<INPUT TYPE=\"submit\" name=\"empty\" VALUE=\"Empty Cart \">";
echo "</FORM>";

?> 

コードのそのセクションのこれらのバージョンは、同じ結果をもたらします

A.

$counter= $_POST['counter'];
echo "COUNTER $counter";

    if (isset($removed))
    {   
    unset($_SESSION['shop_cart'][$counter]);  
    continue;
    }

B.

if (isset($removed))
for($i=0;$i<count($_SESSION['shop_cart']);$i++)
    if($prodid==$_SESSION['shop_cart'][$i]['prodid'])
        {
         $_SESSION['shop_cart'][$i]=$quantity==0; 
          continue;
        }

C.

if (isset($removed))
for($i=0;$i<count($_SESSION['shop_cart']);$i++)
    if($prodid==$_SESSION['shop_cart'][$i]['prodid'])
      {
        unset($_SESSION['shop_cart'][$i]['prodid']); 
    //OR
        //unset($_SESSION['shop_cart'][$i]);  
        continue;
        }

これはまったく機能しません

if (isset($removed))
{
foreach ($_SESSION['shop_cart'] as $cart_line_item => $item)
       {

        if($prodid==$item['prodid'])
            {
            unset($_SESSION['shop_cart']['prodid']);
            unset($_SESSION['shop_cart']['quantity']);
            unset($_SESSION['shop_cart']['description']);           
            continue;
            }    
}
}

@Soyaleの場合:

これはどういう意味ですか?:

if (isset($removed))  
{
foreach ($_SESSION['shop_cart'] as $cart_line_item => $item)
   {
    if($prodid==$item['prodid'])
        {
        unset($_SESSION['shop_cart'][$cart_line_item]);
        continue;
        }   
    }
}

同じ結果です。

4

1 に答える 1

0

あなたの問題はここにあります:

    for($i=0;$i<count($_SESSION['shop_cart']);$i++)
    {
        $prodid=$_SESSION['shop_cart'][$i]['prodid'];
        $quantity=$_SESSION['shop_cart'][$i]['quantity'];
        $description=$_SESSION['shop_cart'][$i]['description'];

        $query = "SELECT prodid, description, price FROM products WHERE prodid = $prodid";
        $result = mysqli_query($hook, $query);
        $row = mysqli_fetch_assoc($result);

        $prodid = $row['prodid'];
        $price = $row['price'];
        $description= $row['description'];

        $subtotal = $price * $quantity;
                    $total += $subtotal;

echo "$description($prodid)---Quantity: $quantity--- $$price";      

echo "<form action=\"$_SERVER[SCRIPT_NAME]\" method=\"post\" >";
echo "<INPUT TYPE=\"submit\" name=\"remove\" VALUE=\"Remove\">";
echo "<input type=\"hidden\" name=\"prodid\" value=$prodid />\n";
echo "<input type=\"hidden\" name=\"counter\" value=\"$i\"/>\n"; 
echo "</FORM>";

echo "--------------------------<br/><br/>";

    }                                                             
  }

for の代わりに foreach を使用する必要があります。なんで?unset を使用するとキーが削除されたためです。基本配列すなわち

array (size=2)
  0 => 
    array (size=3)
      'prodid' => string '1' (length=1)
      'quantity' => string '2' (length=1)
      'description' => null
  1 => 
    array (size=3)
      'prodid' => string '2' (length=1)
      'quantity' => string '2' (length=1)
      'description' => null
  2 => 
    array (size=3)
      'prodid' => string '3' (length=1)
      'quantity' => string '2' (length=1)
      'description' => null

製品を削除すると、prodid=2次のようになります。

array (size=2)
  0 => 
    array (size=3)
      'prodid' => string '1' (length=1)
      'quantity' => string '2' (length=1)
      'description' => null
  2 => 
    array (size=3)
      'prodid' => string '3' (length=1)
      'quantity' => string '2' (length=1)
      'description' => null

最終テーブルの長さは 2 です。このようなものを使用するとfor($i=0;$i<count($_SESSION['shop_cart']);$i++)、2 番目の製品がより新しく表示されます (キーのため)。さらに、インデックス 1 の行がないため、空の行がそこに配置されます。

この行を見てください:

$total=0; //For Price

 if (isset($_SESSION['shop_cart']))  
  {
    for($i=0;$i<count($_SESSION['shop_cart']);$i++) //-> this is a bad idea please change this to foreach
    {
于 2013-05-21T20:27:44.393 に答える