seaweed Posted May 1, 2009 Share Posted May 1, 2009 What's the best way to store shopping cart items in a session? Figure it has an sku, a color and a size... how would you store that in a session and then pull it back out to it can be dropped into the db once paid for? Quote Link to comment Share on other sites More sharing options...
chetanrakesh Posted May 1, 2009 Share Posted May 1, 2009 Hi, Try to store all values into single session. You can use any seprator to feed cart values. For example "SKU===COLOR===SIZE". You can either store it separately or store it all into one field. Thanks, Rakesh. Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 1, 2009 Author Share Posted May 1, 2009 Okay, so a user clicks add to cart, I POST these to a script and put them into a session... how do I separate out multiple items... say they ordered this: Qty 3 Medium Red Shirts, SKU #5001 Qty 2 Large Blue Shirts, SKU #5001 Qty 4 Large Green Pants (sexy), SKU #5005 Qty 1 Small Purple Hats (goes great with green pants), SKU #5007 Two of them have the same SKU, but they will be separate cart items, same sku but different size/color. The plan is to have an "orders" table that has a unique orderID and userid... And then an orderItems table with one row per item ordered, which also has the same unique orderID so to view the order it queries all orders where orderID = $orderID... I got that down. The user table has all their shipping info, connected with userid. Forget all that for a minute. Before they finalize the order, while it is still in the session, how do I store them? Not how to use $_SESSION but what variables to use? Can I create this with a session? $_SESSION['item1'] = array(SKU5001,Large,Blue,Qty3); $_SESSION['item2'] = array(SKU5005,Medium,Green,Qty4); etc... If it were just SKU numbers I would build a comma delimited string and use explode, but it has three variables: SKU, size, color... Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 1, 2009 Share Posted May 1, 2009 The best way to do this is use an associative array like this: $_SESSION['CART']['ITEMS'][] = array( 'product_id' => $product_id, 'product_name' => $product_name, 'color' => $color ); You could then access your cart items easily, for example loop through them: foreach($_SESSION['CART']['ITEMS'] as $item) { echo "product_name: " . $item['product_name']; echo "color: " . $item['color']; } Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 2, 2009 Author Share Posted May 2, 2009 Okay, perfect. I tested it and it works: (I know, I need to sanitize my input)... <?php session_start(); if (! $_SESSION[active]) { $_SESSION[active] = 1; } $id = $_POST['id']; $qty = $_POST['qty']; $size = $_POST['size']; $color = $_POST['color']; $_SESSION['CART']['ITEMS'][] = array( 'product_id' => $id, 'product_qty' => $qty, 'product_size' => $size, 'product_color' => $color ); header("Location: shoppingcart.php"); ?> <?php foreach($_SESSION['CART']['ITEMS'] as $item) { echo "product_id: " . $item['product_id'] . " "; echo "qty: " . $item['product_qty'] . " "; echo "size: " . $item['product_size'] . " "; echo "color: " . $item['product_color'] . " "; echo "<br /><br />"; } ?> This outputs: product_id: 31 qty: 21 size: Small color: Blue product_id: 32 qty: 17 size: Medium color: Red product_id: 33 qty: 5 size: Medium color: Blue product_id: 34 qty: 7 size: X-Large color: White So, I can place an SQL insert statement in the foreach loop to insert a new row in my orderItems table for each product, correct? If it's that simple, I'm done! Echoing the cart to the user is easy as pie. Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 2, 2009 Share Posted May 2, 2009 Yes that's correct Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 2, 2009 Author Share Posted May 2, 2009 Awesome, thanks 182 dude. Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 Few more quick questions... 1. What's the best way to initiate the session for this application? Currently all of my pages use this in a header include file: session_start(); if (! $_SESSION[active]) { $_SESSION[active] = 1; } I just creates the dummy variable $active. When you get the the addtocart.php script though, it doesn't have a header as there's no html, should I just use this same session check, or actually check for the array like this? if (!isset($_SESSION['CART']['ITEMS']) || (!is_array($_SESSION['CART']['ITEMS']))) { $_SESSION['CART']['ITEMS'] = array(); I'm not sure on the way to do this or syntax... 2. What's the best way to check if the item already exists in the cart and increment it, or decrease it if they want to remove it or subtract one? Maybe use in_array()? Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 1. Unless you need to do something with $_SESSION['active'], then you don't need to use it on your addtocart.php page. By the way, use quotes when referencing an array element unless the key is an integer, so use $_SESSION['active'] not $_SESSION[active] 2. A foreach loop will be fine. //product id $product_to_change = 3; //you would get this from somewhere, not hard code it foreach($_SESSION['CART']['ITEMS'] as $cart_item_id => $item) { if($item['product_id'] == $product_to_change) { //product exists! increment the quantity $_SESSION['CART']['ITEMS'][$cart_item_id]['product_qty']++; break; } } If you want to decrease the quantity, then check if the quantity of the item is 1, is so then use: unset($_SESSION['CART']['ITEMS'][$cart_item_id]); If the quantity of the item is greater than 1, then just use: $_SESSION['CART']['ITEMS'][$cart_item_id]['product_qty']--; Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 Okay here's what I have: addtocart.php $prod_id = $_POST['prod_id']; $prod_qty = $_POST['prod_qty']; $prod_size = $_POST['prod_size']; $prod_color = $_POST['prod_color']; foreach($_SESSION['CART']['ITEMS'] as $cart_item_id => $item) { if($item['prod_id'] == $prod_id) { $_SESSION['CART']['ITEMS'][$cart_item_id]['prod_qty']++; break; } else { $_SESSION['CART']['ITEMS'][] = array( 'prod_id' => $prod_id, 'prod_qty' => $prod_qty, 'prod_size' => $prod_size, 'prod_color' => $prod_color ); } } header("Location: cart.php"); exit; cart.php foreach($_SESSION['CART']['ITEMS'] as $item) { echo " <div class=\"cartrow\"> <div class=\"cartrow_id\">$item[prod_id]</div> <div class=\"cartrow_desc\">$item[prod_color] $item[prod_size]</div> <div class=\"cartrow_qty\">$item[prod_qty]</div> <div class=\"cartrow_price\">xxx</div> <div class=\"cartrow_subtotal\">xxx</div> <div class=\"cartrow_update\">+ / -</div> </div> "; } The error I get, assuming it's a logic problem with the array? Warning: Invalid argument supplied for foreach() in cart.php on line 17 Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 What else is in cart.php? Can you post all of it? It looks to me like $_SESSION['CART']['ITEMS'] doesn't exist. Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 <?php include ('header.php') ?> <div class="main"> <?php include ('leftcol.php') ?> <div class="catbody"> <div class="cart"> <div class="cartheaderrow"> <div class="cartheaderrow_id">ID</div> <div class="cartheaderrow_desc">Description</div> <div class="cartheaderrow_qty">Qty</div> <div class="cartheaderrow_price">Price</div> <div class="cartheaderrow_subtotal">Subtotal</div> <div class="cartheaderrow_update"></div> </div> <?php foreach($_SESSION['CART']['ITEMS'] as $item) { echo " <div class=\"cartrow\"> <div class=\"cartrow_id\">$item[prod_id]</div> <div class=\"cartrow_desc\">$item[prod_color] $item[prod_size]</div> <div class=\"cartrow_qty\">$item[prod_qty]</div> <div class=\"cartrow_price\">xxx</div> <div class=\"cartrow_subtotal\">xxx</div> <div class=\"cartrow_update\">+ / -</div> </div> "; } ?> </div> </div> </div> <?php include ('footer.php') ?> </div> </BODY> </HTML> Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 header.php starts with... <?php session_start(); if (! $_SESSION[active]) { $_SESSION[active] = 1; } ?> Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 The error is saying $_SESSION['CART']['ITEMS'] does not exist. Is there any code in header.php or leftcol.php that could be unsetting that array, or killing the entire session? Have you used unset() anywhere? Also.... this error will occur if you haven't actually created that array. You might need to put if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS'] == false) { $_SESSION['CART']['ITEMS'] = array(); } in your header.php just under session_start() Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 Okay, brb... let me finish killing this quessadilla and I'll try that. Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 That throws a parse error: Parse error: syntax error, unexpected T_IS_EQUAL, expecting ',' or ')' in header.php on line 3 line 3 is: if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS'] == false) I tried moving the parens around with no luck. Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 Change it to: if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS']) == false) Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 I tried that too, befor eyou posted, but I still get the error. It's weird... The header is like this: <?php session_start(); if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS'] == false)) { $_SESSION['CART']['ITEMS'] = array(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 It should be if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS']) == false) Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 Okay, error fixed. Now, it isn't echoing anything to the cart. Here's the various parts: header.php <?php session_start(); if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS']) == false) { $_SESSION['CART']['ITEMS'] = array(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> addtocart.php <?php session_start(); if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS']) == false) { $_SESSION['CART']['ITEMS'] = array(); } // This data needs cleaned before it goes to SQL!!!!! // $prod_id = $_POST['prod_id']; $prod_qty = $_POST['prod_qty']; $prod_size = $_POST['prod_size']; $prod_color = $_POST['prod_color']; foreach($_SESSION['CART']['ITEMS'] as $cart_item_id => $item) { if($item['prod_id'] == $prod_id) { $_SESSION['CART']['ITEMS'][$cart_item_id]['prod_qty']++; } else { $_SESSION['CART']['ITEMS'][] = array( 'prod_id' => $prod_id, 'prod_qty' => $prod_qty, 'prod_size' => $prod_size, 'prod_color' => $prod_color ); } } header("Location: cart.php"); exit; ?> cart.php <?php include ('header.php') ?> <div class="main"> <?php include ('leftcol.php') ?> <div class="catbody"> <div class="cart"> <div class="cartheaderrow"> <div class="cartheaderrow_id">ID</div> <div class="cartheaderrow_desc">Description</div> <div class="cartheaderrow_qty">Qty</div> <div class="cartheaderrow_price">Price</div> <div class="cartheaderrow_subtotal">Subtotal</div> <div class="cartheaderrow_update"></div> </div> <?php foreach($_SESSION['CART']['ITEMS'] as $item) { echo " <div class=\"cartrow\"> <div class=\"cartrow_id\">$item[prod_id]</div> <div class=\"cartrow_desc\">$item[prod_color] $item[prod_size]</div> <div class=\"cartrow_qty\">$item[prod_qty]</div> <div class=\"cartrow_price\">xxx</div> <div class=\"cartrow_subtotal\">xxx</div> <div class=\"cartrow_update\">+ / -</div> </div> "; } ?> </div> </div> </div> <?php include ('footer.php') ?> </div> </BODY> </HTML> Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 You can't have the code like that on the addtocart.php page. What it's saying is foreach item in the cart, if the product id matches, increment, but if not add it. The interpreter is not getting inside the foreach() because the cart is empty. Try this for your addtocart.php $prod_id = $_POST['prod_id']; $prod_qty = $_POST['prod_qty']; $prod_size = $_POST['prod_size']; $prod_color = $_POST['prod_color']; $found = false; foreach($_SESSION['CART']['ITEMS'] as $cart_item_id => $item) { if($item['prod_id'] == $prod_id) { $_SESSION['CART']['ITEMS'][$cart_item_id]['prod_qty']++; $found = true; break; } } if(!$found) { $_SESSION['CART']['ITEMS'][] = array( 'prod_id' => $prod_id, 'prod_qty' => $prod_qty, 'prod_size' => $prod_size, 'prod_color' => $prod_color ); } Obviously that is not all of adtocart.php, you need to retain your code before and after that section. Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 That makes sense, thank you. it worked and now I know. Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 4, 2009 Author Share Posted May 4, 2009 BTW, whenever I sit down to start a new project, I ALWAYS start by jamming to some old Blink 182 tunes, stuff from Dude ranch or Cheshire cat, it reminds me of the dotcom era when we all had jobs! Every time I get started, I open up Aliens Exist or Dammit and get in the mood. Quote Link to comment Share on other sites More sharing options...
the182guy Posted May 4, 2009 Share Posted May 4, 2009 Haha sounds good. Yea some good songs on the old albums Quote Link to comment Share on other sites More sharing options...
seaweed Posted May 5, 2009 Author Share Posted May 5, 2009 Here's what I ended up with for the updatecart script, it works flawlessly so far. Do you see anything wrong that I'm missing? I need to account for items w/o a color or size etc. still, I can see that. It's got more nests than a birdhouse but it works great - think/hope/pray! <?php session_start(); if(isset($_SESSION['CART']) == false || isset($_SESSION['CART']['ITEMS']) == false) { $_SESSION['CART']['ITEMS'] = array(); } $do = $_POST['do']; // this is like add, subtract or remove $prod_id = $_POST['prod_id']; $prod_color = $_POST['prod_color']; $prod_size = $_POST['prod_size']; if (($prod_id == "") || ($prod_id == "0") || ($prod_id == NULL)) { echo "prod_id left blank"; // this verbiage is just for development, I'll change it later } elseif (is_numeric($prod_id) == false) { echo "is_numeric failed on prod_id"; // this verbiage is just for development, I'll change it later } else { $found = false; foreach($_SESSION['CART']['ITEMS'] as $cart_item_id => $item) { if(($item['prod_id'] == $prod_id) && ($item['prod_color'] == $prod_color) && ($item['prod_size'] == $prod_size)) { switch ($do) { case "add": $_SESSION['CART']['ITEMS'][$cart_item_id]['prod_qty']++; $found = true; break; case "sub": if($_SESSION['CART']['ITEMS'][$cart_item_id]['prod_qty'] <= 1) { unset($_SESSION['CART']['ITEMS'][$cart_item_id]); $found = true; break; } else { $_SESSION['CART']['ITEMS'][$cart_item_id]['prod_qty']--; $found = true; break; } // closes inner else case "rem": unset($_SESSION['CART']['ITEMS'][$cart_item_id]); $found = true; break; } // closes switch $found = true; } // Closes if } // closes foreach } // closes outter else header("Location: cart.php"); exit; ?> ?> Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.