2013-05-21 3 views
0

Я три дня искал свои мозги и до сих пор не могу найти решение проблемы удаления элементов из массива сеансов.Удаление элементов в массиве сеансов

Я изучаю PHP и как построить корзину покупок; Я знаю, что есть рамки, но я действительно хочу изучать программирование, решать проблемы и создавать вещи.

Моя проблема заключается в следующем: Скажем, я разместил три вещи в корзину ...

  1. Печенье
  2. пончики
  3. Кексы

При удалении элемента в корзине , все остальное в списке (ниже этого элемента) также удаляется. При удалении ДОНУС также удаляются кексы. Если я удалю Cookies, весь список удаляется/очищается

Но если я начну со дна (Cookies), идущего вверх по списку, он отлично работает; он удалит только тот, который я нажал.

Вот мой код вместе с другими попытками. Пока еще не в стиле, просто работая над логикой.

<?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>"; 

?> 

Эти версии этой секции выхода кода того же самого результата

А.

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

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

Б.

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; 
     } 

С.

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; 
     } 
    } 
} 

Тот же результат.

+0

Возможный дубликат http://stackoverflow.com/questions/2231332/remove-a-variable-from-a-php-session-array –

+1

я видел это сообщение, и это не дубликат; аналогично в некотором роде, но не то же самое. Я также пробовал ответы на эту должность, и они не работают; некоторые даже имеют те же результаты, что и мои. – Patty

ответ

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/>"; 

    }                
    } 

Вы shuld использовать Еогеасп вместо этого. Зачем? Поскольку ключи были удалены при использовании 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++) тогда второй продукт будет отображаться новый (потому что ключи). Более того, нет строки с индексом 1, поэтому там будет размещена строка empy.

Посмотрите на этой линии:

$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 
    { 
+0

Спасибо за ответ. Я думал, что никто не будет иметь идеи. Я не смог включить в свой пример код, который я попробовал foreach, и получил тот же результат. Это то, что вы имеете в виду ?: если (Исеть ($ удален)) { Еогеасп ($ _SESSION [ 'shop_cart'], как $ cart_line_item => $ пункт) { если ($ PRODID == $ пункта ['prodid']) { unset ($ _ SESSION ['shop_cart'] [$ cart_line_item]); продолжить; } } } – Patty

+0

Я отредактировал свое оригинальное сообщение, чтобы показать foreach, что я пробовал. – Patty

+0

Как я руководствуюсь, если у меня есть три элемента в корзине, и я нажимаю, чтобы удалить второй элемент, это то, что я оставил в var dump: array (1) {[0] => array (3) {["prodid "] => string (2)" 13 "[" quantity "] => string (1)" 1 "[" description "] => NULL}} – Patty

Смежные вопросы