I am trying to make an e-commerce website and I can’t quite figure out how to get the cart to function. I am able to add amounts to the cart before purchase but I want it to delete the item from the cart when the quantity is set to 0.
if (isset($_POST['update'])) { for ($i = 0; $i < sizeof($_SESSION['quantity']); $i++) { $postID = 'qty' . $i; $_SESSION['quantity'][$i] = $_POST[$postID]; if ($_SESSION['quantity'][$i] == 0) { unset($_SESSION['shoppingcart'][$i]); unset($_SESSION['quantity'][$i]); unset($_SESSION['name'][$i]); unset($_SESSION['price'][$i]); } } }
Here is the cart variable that creates a table of all the products added
<form method="post"> <?php if (!empty($_SESSION['shoppingcart'])) { for ($i = 0; $i < sizeof($_SESSION['shoppingcart']); $i++) { $cart .= '<tr>'; $cart .= '<td>' . $_SESSION['name'][$i] . '</td>'; $cart .= '<td><input type="text" id="quantity"name="qty' . $i . '"value="' . $_SESSION['quantity'][$i] . '" onkeyup="checkInput()"></td>'; $cart .= '<td>$' . $_SESSION['price'][$i] . '</td'; $cart .= '<td>$' . $_SESSION['quantity'][$i] * $_SESSION['price'][$i] . '</td>'; $cart .= '</tr>'; $total += ($_SESSION['quantity'][$i] * $_SESSION['price'][$i]); $totalDiscounted += ($_SESSION['quantity'][$i] * $_SESSION['price'][$i]) / 100 * 30; } </form>
This works when I delete things going from the last piece in the array, going to the first thing added in the array in that order, but when I try to delete the first element or anything out of order first, it gives me an error. “Warning: Undefined array key 0″. What am I doing wrong?
Advertisement
Answer
The undefined index come from the use of unset()
. The indexes of the array will not be re-ordered after unset() call.
Exemple:
$array = [1, 2, 3]; unset($array[1]); print_r($array); // indexes : 0 and 2.
You could:
use
array_values()
to re-index arrays.unset($_SESSION['shoppingcart'][$i]); $_SESSION['shoppingcart'] = array_values($_SESSION['shoppingcart']);
or, check the presence of the data in the loop :
for ($i = 0; $i < sizeof($_SESSION['shoppingcart']); $i++) { if (!isset($_SESSION['name'][$i])) { continue; } $cart .= '<tr>'; //... }
Another way is to use a data structure for the order:
// add $_SESSION['shoppingcart'][] = [ 'quantity' => 1, 'name' => 'item', 'price' => 1.00, ]; // to update an index $_SESSION['shoppingcart'][$index]['quantity'] = 2; // to remove an index unset($_SESSION['shoppingcart'][$index]);
then, use a foreach()
to list
foreach ($_SESSION['shoppingcart'] => $data) { // display item }