A persistent shopping cart application will be used to preserve the user’s cart item until the user processes checkout or clears the cart over different sessions and also via multiple devices. In a previous tutorial, we have created a session-based shopping cart by storing cart info in user session using PHP SESSION array.
Shopping cart items in the session will be cleared at the time of logout or closing the window once the user closes his session. In this example, I stored the added cart item in a database table to provide persistence shopping cart.
This example contains a database table to store cart information. When the user clicks the ‘Add to Cart’ button, the selected product id, quantity and the logged in member id is stored in the cart table.
The member id is pre-defined at the start of the program where you can integrate your authentication module to get the logged in member id. This shopping cart example contains the functionalities to add items to the cart, remove a single item from the cart and empty the cart table.
The following screenshot shows the output of the persistent shopping cart example program.
This HTML code is used to list the product in a gallery view. It shows the persistent cart items read from the database table until the user clears the cart. In the product gallery, each product tile has an Add to Cart button to insert cart item to the database table. The cart list contains options to remove individual or whole cart items.
<div id="shopping-cart">
<div class="txt-heading">
<div class="txt-heading-label">Shopping Cart</div> <a id="btnEmpty" href="index.php?action=empty"><img src="empty-cart.png" alt="empty-cart" title="Empty Cart" /></a>
</div>
<?php
$cartItem = $shoppingCart->getMemberCartItem($member_id);
if (! empty($cartItem)) {
$item_total = 0;
?>
<table cellpadding="10" cellspacing="1">
<tbody>
<tr>
<th style="text-align: left;"><strong>Name</strong></th>
<th style="text-align: left;"><strong>Code</strong></th>
<th style="text-align: right;"><strong>Quantity</strong></th>
<th style="text-align: right;"><strong>Price</strong></th>
<th style="text-align: center;"><strong>Action</strong></th>
</tr>
<?php
foreach ($cartItem as $item) {
?>
<tr>
<td
style="text-align: left; border-bottom: #F0F0F0 1px solid;"><strong><?php echo $item["name"]; ?></strong></td>
<td
style="text-align: left; border-bottom: #F0F0F0 1px solid;"><?php echo $item["code"]; ?></td>
<td
style="text-align: right; border-bottom: #F0F0F0 1px solid;"><?php echo $item["quantity"]; ?></td>
<td
style="text-align: right; border-bottom: #F0F0F0 1px solid;"><?php echo "$".$item["price"]; ?></td>
<td
style="text-align: center; border-bottom: #F0F0F0 1px solid;"><a
href="index.php?action=remove&id=<?php echo $item["cart_id"]; ?>"
class="btnRemoveAction"><img src="icon-delete.png" alt="icon-delete" title="Remove Item" /></a></td>
</tr>
<?php
$item_total += ($item["price"] * $item["quantity"]);
}
?>
<tr>
<td colspan="3" align=right><strong>Total:</strong></td>
<td align=right><?php echo "$".$item_total; ?></td>
<td></td>
</tr>
</tbody>
</table>
<?php
}
?>
</div>
This PHP code contains a switch case to handle the Add, Remove and Empty cart actions. The ShoppingCart class contains PHP functions to perform these cart actions.
In this functions, I prepare query statements and the query parameters array which will be bind together to make the requested change for the shopping cart.
<?php
require_once "ShoppingCart.php";
$member_id = 2; // you can your integerate authentication module here to get logged in member
$shoppingCart = new ShoppingCart();
if (! empty($_GET["action"])) {
switch ($_GET["action"]) {
case "add":
if (! empty($_POST["quantity"])) {
$productResult = $shoppingCart->getProductByCode($_GET["code"]);
$cartResult = $shoppingCart->getCartItemByProduct($productResult[0]["id"], $member_id);
if (! empty($cartResult)) {
// Update cart item quantity in database
$newQuantity = $cartResult[0]["quantity"] + $_POST["quantity"];
$shoppingCart->updateCartQuantity($newQuantity, $cartResult[0]["id"]);
} else {
// Add to cart table
$shoppingCart->addToCart($productResult[0]["id"], $_POST["quantity"], $member_id);
}
}
break;
case "remove":
// Delete single entry from the cart
$shoppingCart->deleteCartItem($_GET["id"]);
break;
case "empty":
// Empty cart
$shoppingCart->emptyCart($member_id);
break;
}
}
?>
ShoppingCart.php
<?php
require_once "DBController.php";
class ShoppingCart extends DBController
{
function getAllProduct()
{
$query = "SELECT * FROM tbl_product";
$productResult = $this->getDBResult($query);
return $productResult;
}
function getMemberCartItem($member_id)
{
$query = "SELECT tbl_product.*, tbl_cart.id as cart_id,tbl_cart.quantity FROM tbl_product, tbl_cart WHERE
tbl_product.id = tbl_cart.product_id AND tbl_cart.member_id = ?";
$params = array(
array(
"param_type" => "i",
"param_value" => $member_id
)
);
$cartResult = $this->getDBResult($query, $params);
return $cartResult;
}
function getProductByCode($product_code)
{
$query = "SELECT * FROM tbl_product WHERE code=?";
$params = array(
array(
"param_type" => "s",
"param_value" => $product_code
)
);
$productResult = $this->getDBResult($query, $params);
return $productResult;
}
function getCartItemByProduct($product_id, $member_id)
{
$query = "SELECT * FROM tbl_cart WHERE product_id = ? AND member_id = ?";
$params = array(
array(
"param_type" => "i",
"param_value" => $product_id
),
array(
"param_type" => "i",
"param_value" => $member_id
)
);
$cartResult = $this->getDBResult($query, $params);
return $cartResult;
}
function addToCart($product_id, $quantity, $member_id)
{
$query = "INSERT INTO tbl_cart (product_id,quantity,member_id) VALUES (?, ?, ?)";
$params = array(
array(
"param_type" => "i",
"param_value" => $product_id
),
array(
"param_type" => "i",
"param_value" => $quantity
),
array(
"param_type" => "i",
"param_value" => $member_id
)
);
$this->updateDB($query, $params);
}
function updateCartQuantity($quantity, $cart_id)
{
$query = "UPDATE tbl_cart SET quantity = ? WHERE id= ?";
$params = array(
array(
"param_type" => "i",
"param_value" => $quantity
),
array(
"param_type" => "i",
"param_value" => $cart_id
)
);
$this->updateDB($query, $params);
}
function deleteCartItem($cart_id)
{
$query = "DELETE FROM tbl_cart WHERE id = ?";
$params = array(
array(
"param_type" => "i",
"param_value" => $cart_id
)
);
$this->updateDB($query, $params);
}
function emptyCart($member_id)
{
$query = "DELETE FROM tbl_cart WHERE member_id = ?";
$params = array(
array(
"param_type" => "i",
"param_value" => $member_id
)
);
$this->updateDB($query, $params);
}
}