0

ショッピング カートを作成しています。セッションに保存されている多次元配列に注文を保存します。$_SESSION['cart']

製品は次のようなもので表されます

$product_array=array($id,$description,$price);

多次元配列は、$product_array.s

$id'sユニークです。

問題は、IDに基づいて多次元$_SESSION['cart'] 配列から製品を削除したい場合、カート内のアイテムが1つだけの場合は機能しますが、複数の場合は機能せず、アイテムが削除されたように見えますが、それは「ゴースト」がカートに取り残されました。コードは次のようなものです:

//get $id, $count is elements in array  

for ($r = 0; $r <= $count-1; $r++) 
{
   if($_SESSION['cart'][$r][0]=="$id")
   {
 unset($_SESSION['cart'][$r]); 

 echo "<div class=success>The item has been removed from your shopping cart.</div>";
 break;
   }
}
4

4 に答える 4

1

この1つの機能を試してみてください。それは私のために働いています

function remove_product($id){
$id=intval($id);
$max=count($_SESSION['cart']);
for($i=0;$i<$max;$i++){
if($id==$_SESSION['cart'][$i]['id']){
unset($_SESSION['cart'][$i]);
break;
}
}
$_SESSION['cart']=array_values($_SESSION['cart']);

if($_REQUEST['command']=='delete' && $_REQUEST['id']>0){
remove_product($_REQUEST['id']);
}
else if($_REQUEST['command']=='clear'){
unset($_SESSION['cart']);
}
else if($_REQUEST['command']=='update'){
$max=count($_SESSION['cart']);
for($i=0;$i<$max;$i++){
$id=$_SESSION['cart'][$i]['id'];
$q=intval($_REQUEST['qty'.$id]);
if($q>0 && $q<=999){
$_SESSION['cart'][$i]['qty']=$q;
}
else{
$msg='Some proudcts not updated!, quantity must be a number between 1 and 999';
}
}
}
于 2013-03-11T14:51:52.860 に答える
0

次のコードは機能します。おそらくそれはあなたがあなたの何が悪いのかを見つけるのに役立つでしょう:

session_start();

$i=0;
$_SESSION['cart'][]=array($i++,'sds',99);
$_SESSION['cart'][]=array($i++,'sds',100);
$_SESSION['cart'][]=array($i++,'sds',20);
$_SESSION['cart'][]=array($i++,'sds',10);

$id = 2;
$count = count($_SESSION['cart']);
for ($r=0;$r<$count;$r++)
{
    echo "num=$r<br>";
    if(isset($_SESSION['cart'][$r]) && $_SESSION['cart'][$r][0]==$id)
    {
        unset($_SESSION['cart'][$r]);
        echo "The item has been removed from your shopping cart.<br>";
        break;
    }
}

session_write_close();
于 2013-03-11T12:41:50.733 に答える
0

述べたように、問題は配列のレイアウトと、forループまたはおそらくPHP設定でチェックしようとしているものに関係していると思います。たとえば、セッションを開始しましたか?私はおそらく、製品参照の配列を使用するように移動します。プレーン配列での作業は、警告などなしに誤って間違ったオブジェクトを参照するという悪夢になる可能性があります。整形式の関数名でフェッチされたカプセル化されたオブジェクトは、これを回避するのに役立ちます。何かのようなもの

$cart = array($productId => $quantity, $productId2 => $quantityOfSecondProduct);

そして、すべての製品情報データを含むアレイを作成します

$products = array($product1...);

ここで、各製品は次のタイプです。

class Product
{
  $productId;
  $productName;
  $productDescription;
  ... etc
}

次に、すべてのデータを分離しますが、簡単にアクセスできます。製品IDに基づいてカート内の1つ以上のエントリを簡単に削除できますが、それを参照して数量が0の場合は削除するだけです。

if(($cart[$productId] - $quantityToRemove) <= 0)
  unset($cart[$productId]);
else
  $cart[$productId] -= $quantityToRemove;

製品などの入力は、できれば何らかのデータソースから行う必要があることに注意してください。また、カート全体を優れた機能を備えたクラスとして配置し、もう少しエラーチェックを行う必要があります;)

于 2013-03-11T12:42:07.570 に答える
0

php.conf で register_global がオンになっているかどうかを確認します。両方の設定を解除するには、次の構文を使用してみてください。

   if($_SESSION['cart'][$r][0]=="$id") {
     $_SESSION['cart'][$r] = NULL;// this is just to be sure =)
     unset($_SESSION['cart'][$r], $cart[$r]); 

     echo "<div class=success>The item has been removed from your shopping cart.</div>";
     break;
   }
于 2013-03-11T12:35:32.857 に答える