Page 1 of 2
Shopping Cart Array
Posted: Sat Feb 27, 2010 5:51 pm
by Parmenion
Hi guys,
I'm having some problems with a shopping cart array that will hold the items and struggling to get it to work as I want.
It's for a photography site to sell photos in a variety of size prints. I have the photo details stored in one table with the sizes and prices in a separate table.
On the individual photo page I have an add to cart button, which sends the photo id, size and price to a new page.
I've been trying to get the details into an array with some success but it's not working quite like I want and I can't iterate the details into a table as I want to either.
A session is set up for the cart as $_SESSION['cart']. A session is also set up to store the total quantities as $_SESSION['qty'].
Here's my code so far:
Code: Select all
if (isset($_GET['new']))
{
$photo_id = $_POST['id'];
$photo_size = $_POST['size'];
$price = $_POST['price'];
if (isset($_SESSION['cart']))
{
$items = array($_SESSION['cart']);
}
else
{
$items = array();
}
if (isset($_SESSION['qty']))
{
$item_qty = $_SESSION['qty'];
}
else
{
$item_qty = 0;
}
array_push($items, $photo_id, $photo_size, $price);
$_SESSION['cart'] = $items;
$_SESSION['qty'] = ++$item_qty;
header("Location: view_cart.php?cart");
I'm not sure my methods are the best for this and any help would be appreciated. Is there a way to set up a two-dimensional array and give each element a name but also push new items to the array?
Re: Shopping Cart Array
Posted: Sat Feb 27, 2010 10:59 pm
by s.dot
Here's how I would code something like that. I put in comments for you to read.
Code: Select all
<?php
if (isset($_GET['new']))
{
$photo_id = $_POST['id'];
$photo_size = $_POST['size'];
$price = $_POST['price'];
//make sure we have an array for the cart
if (!isset($_SESSION['cart']))
{
$_SESSION['cart'] = array();
}
//now we just add an element to the array
$_SESSION['cart'][] = array('id' => $photo_id, 'size' => $photo_size, 'price' => $price);
//not really sure what you're doing with quanity here?
//is this the quantity of photos they want or the number of
//items in their cart?
$_SESSION['qty'] = ++$_SESSION['qty'];
header("Location: view_cart.php?cart");
}
This way if you were to look at $_SESSION['cart'] it would look like this:
Code: Select all
Array (
Array (
id => photo1_id,
size => photo1_size,
price => photo1_price
),
Array (
id => photo2_id,
size => photo2_size,
price => photo2_price
)
)
This would make viewing the cart extremely easy with sample code like:
Code: Select all
if (!empty($_SESSION['cart']))
{
foreach ($_SESSION['cart'] AS $item)
{
echo 'Photo ID: ' . $item['id'] . '<br />
Size: ' . $item['size'] . '<br />
Price: ' . $item['price'] . '<br /><br />';
}
}
And counting the number of items in the cart would be as easy as:
Code: Select all
$numitems = count($_SESSION['cart']);
echo $numitems;
Also, you may not have posted the full code so you might already have it in there, but just in case - you have to call session_start(); before you can deal with sessions.
Re: Shopping Cart Array
Posted: Sun Feb 28, 2010 9:05 am
by Parmenion
Thanks very much for you help, s.dot.
I've tested it out and it works a lot better now. I had an session array for quantity because the way I had the array setup it wasn't counting the actually number of photos in the cart properly.
I had started a session but just hadn't posted that bit.
The next thing I would like to do is combine any photos of the same size and add a form field with the quantity written next to it like:
Photo Name 1 Size 6"x4" Qty 4
Photo Name 1 Size 7.5"x5" Qty 1
Would I add a quantity value to the cart array and then have an if statement that increases the quantity by 1 if the photo id is already in the array somewhere?
Re: Shopping Cart Array
Posted: Sun Feb 28, 2010 6:30 pm
by s.dot
That would be very easy to do
Have a qty form field
Code: Select all
$qty = $_POST['qty'];
$_SESSION['cart'][] = array('id' => $photo_id, ..................., 'qty' => $qty);
To check if they're adding a photo that's already in the cart use
in_array().
Re: Shopping Cart Array
Posted: Mon Mar 01, 2010 11:32 am
by Parmenion
That's not exactly what I meant, s.dot, although thanks for the reply.
When the customer clicks the shopping cart link I would like to list the items in the cart and have a facility to update the quantities on that page. I'm guessing I'll need to iterate the cart items differently so that I can add a form for the customer to change quantities. I'll need a form next to each order line and will have an update button that when clicked will search the array for the correct item and adjust the quantity accordingly.
Re: Shopping Cart Array
Posted: Tue Mar 02, 2010 9:43 am
by Parmenion
I've made a bit of progress but unsure how to do the next part. My code so far:
Code: Select all
<?php
session_start();
if (isset($_GET['new']))
{
$photo_id = $_POST['photoId'];
$connection = mysql_connect('localhost', 'user', 'password') or die ('Unable to connect!');
mysql_select_db('db') or die ('Unable to select database!');
$result = mysql_query("SELECT * FROM shop_items WHERE id = $photo_id");
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$photo_link = $row['photo_link'];
$photo_name = $row['photo_name'];
}
$size_id = $_POST['sizeId'];
$photo_size = $_POST['size'];
$price = $_POST['price'];
$qty = $_POST['qty'];
//make sure we have an array for the cart
if (!isset($_SESSION['cart']))
{
$_SESSION['cart'] = array();
}
//now we just add an element to the array
$_SESSION['cart'][] = array('photoId' => $photo_id, 'photo' => $photo_link, 'name' => $photo_name, 'sizeId' => $size_id, 'size' => $photo_size, 'price' => $price, 'qty' => $qty);
$_SESSION['qty'] = $_SESSION['qty'] + $qty;
unset ($_GET['new']);
mysql_free_result($result);
mysql_close($connection);
header("Location: view_cart.php");
}
?>
Code: Select all
if (!empty($_SESSION['cart']))
{
echo '<table width="500px" border="1" bordercolor="#999999" cellpadding="5">';
echo '<tr>';
//echo '<th bgcolor="#ff7400"><font color="#ffffff">Photo Id</font></th>';
echo '<th bgcolor="#ff7400"></th>';
echo '<th bgcolor="#ff7400"><font color="#ffffff">Photo Name</font></th>';
echo '<th bgcolor="#ff7400"><font color="#ffffff">Size</font></th>';
echo '<th bgcolor="#ff7400"><font color="#ffffff">Item Price</font></th>';
echo '<th bgcolor="#ff7400"><font color="#ffffff">Qty</font></th>';
echo '<th bgcolor="#ff7400"></th>';
echo '<th bgcolor="#ff7400"></th>';
echo '</tr>';
for ($row = 0; $row < count($_SESSION['cart']); $row++)
{
echo '<tr>';
//echo '<td colspan="1">' .$_SESSION['cart'][$row]['id']. '</td>';
echo "<td colspan='1'><img src='".($_SESSION['cart'][$row]['photo'])."' width='110px' alt='".($_SESSION['cart'][$row]['name'])."' /></td>";
echo '<td colspan="1">' .$_SESSION['cart'][$row]['name']. '</td>';
echo '<td colspan="1">' .$_SESSION['cart'][$row]['size']. '</td>';
echo '<td colspan="1">' .$_SESSION['cart'][$row]['price']. '</td>';
echo '<td colspan="1"><form action="view_cart.php?update" method="post"><input type="text" size="1" name="qty" value="' .($_SESSION['cart'][$row]['qty']). '"></td>';
echo '<td colspan="1"><input type="submit" name="submit" value="Update"></form></td>';
echo '<td colspan="1"><form action="view_cart.php?remove" method="post"><input type="hidden" size="1" name="photoId" value="' .($_SESSION['cart'][$row]['photoId']). '"><input type="hidden" size="1" name="sizeId" value="' .($_SESSION['cart'][$row]['sizeId']). '"><input type="submit" name="submit" value="Remove"></form></td>';
echo '</tr>';
}
echo '</table>';
}
else
{
echo "No items to display";
}
?>
I have an update button and a remove button by each item in the cart. I want to update/delete from the array but how can I select a particular element in the array and change it or remove the row totally?
I think the in_array function would check if that item is in the array but I don't know how to alter the array.
In the array I have a photo id and size id, which I hope to use to identify a particular photo and size.
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 10:16 am
by Parmenion
Anyone know how it can be done?

Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 10:23 am
by Kurby
Perhaps you want array_search instead of in_array?
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 11:19 am
by Parmenion
I've just given array_search a go but it doesn't work.
The code I used:
Code: Select all
$photo_id = $_POST['photoId'];
$array = $_SESSION['cart'];
$key = array_search($photo_id, $array);
echo $key;
It doesn't return any value though. I think it must be because I'm using a two-dimensional array.
I also tried this hoping it would change just a single row but it changes every quantity in the cart:
Code: Select all
$newqty = $_POST['qty'];
for ($row = 0; $row < count($_SESSION['cart']); $row++)
{
$_SESSION['cart'][$row]['qty'] = $newqty;
}
I don't know enough about PHP so just don't know what to do.
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 2:48 pm
by Parmenion
If it helps the array is structured like this:
Array ( [0] => Array ( [photoId] => 1 [photo] => elements/photos/agingface.jpg [name] => Aging Face [sizeId] => 2 [size] => 10x15cm (4" x 6") Print [price] => 5.99 [qty] => 3 ) )
I've spent ages trying things out but nothing works. Am I simply doing it all the wrong way and it won't work regardless? If there's a better way to do a shopping cart I'd love to know.
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 2:56 pm
by Kurby
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 6:31 pm
by Parmenion
Had another play and managed to get it to work. I can now update the quantity and it updates only the one I selected.
I had an include inside the for loop, which was causing problems and by placing it outside the loop it helped things.
For those interested here's my code:
Code: Select all
<?php
if(isset($_GET['update']))
{
$newqty = $_POST['qty'];
$photo_id = $_POST['photoId'];
$size_id = $_POST['sizeId'];
for ($row = 0; $row < count($_SESSION['cart']); $row++)
{
if (($_SESSION['cart'][$row]['photoId'] == $photo_id) && ($_SESSION['cart'][$row]['sizeId'] == $size_id))
{
if ($_SESSION['cart'][$row]['qty'] > $newqty)
{
$difference = $_SESSION['cart'][$row]['qty'] - $newqty;
$_SESSION['qty'] = $_SESSION['qty'] - $difference;
}
elseif ($_SESSION['cart'][$row]['qty'] < $newqty)
{
$difference = $newqty - $_SESSION['cart'][$row]['qty'];
$_SESSION['qty'] = $_SESSION['qty'] + $difference;
}
else
{
$_SESSION['qty'] = $_SESSION['qty'];
}
$_SESSION['cart'][$row]['qty'] = $newqty;
}
}
header("Location: view_cart.php");
}
?>
Haven't had a look at the link yet, Kurby, but thanks for posting it. It may help at a later stage.
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 6:51 pm
by s.dot
I would set the photo id as the array key in the cart when adding items
Code: Select all
$_SESSION['cart'][$photoid] = array('id' => $photoid, 'size' => $size);
Then you could easily set the qty by doing
Code: Select all
$photoid = 3;
$_SESSION['cart'][$photoid]['qty'] = 'x';
Re: Shopping Cart Array
Posted: Wed Mar 03, 2010 7:05 pm
by Parmenion
Removing a row is causing a few issues.
I'm using this code:
Code: Select all
if(isset($_GET['remove']))
{
$photo_id = $_POST['photoId'];
$size_id = $_POST['sizeId'];
for ($row = 0; $row < count($_SESSION['cart']); $row++)
{
if (($_SESSION['cart'][$row]['photoId'] == $photo_id) && ($_SESSION['cart'][$row]['sizeId'] == $size_id))
{
unset($_SESSION['cart'][$row]);
}
}
header("Location: view_cart.php");
}
It deletes the rows fine UNLESS I delete the first item in the array, which it doesn't like. I need to find a way around it.
Re: Shopping Cart Array
Posted: Thu Mar 04, 2010 6:42 am
by Parmenion
Ok, it deletes each row without throwing an error after I added the line below.
Problem is, it now leaves an empty sub array like this:
Code: Select all
Array
(
[0] => Array
(
[photoId] => 1
[photo] => elements/photos/agingface.jpg
[name] => Aging Face
[sizeId] => 1
[size] => 9X13cm (3.5"x5") Print
[price] => 3.99
[qty] => 1
)
[2] => Array
(
[photoId] => 1
[photo] => elements/photos/agingface.jpg
[name] => Aging Face
[sizeId] => 4
[size] => 20x27cm (8" x 10.6") Print
[price] => 9.99
[qty] => 1
)
[1] =>
)
Is there a way to remove the empty sub array?