Jump to content
Larry Ullman's Book Forums

Recommended Posts

I have gone over this again and again and cannot understand the problem. From Chapter 17 I created all the pages. They all work except for view_cart.php and checkout.php. I can upload prints, browse prints, add a print to my cart, but when I am on the view_cart.php page it will not update the quantity when I change it to 0 or any quantity. When I hit refresh the original quantity returns. I did look at the errata page, nothing that helps me there. I also downloaded the code from the website and mine is the same. What am I missing here? No error messages.

 

<?php # Script 17.9 - view_cart.php - woodsie - 12-7-11

 

// This page displays the contents of the shopping cart

// This page also lets the user update the contents of the cart

// Set the page title and include the HTML header:

$page_title = 'View Your Shopping Cart';

include ('includes/header.html');

// Check if the form has been submitted (to update the cart):

if (isset($_POST['submitted'])) {

// Change any quantities:

foreach ($_POST['qty'] as $k => $v) {

// Must be integers!

$pid = (int) $k;

$qty = (int) $v;

 

if ( $qty == 0 ) { // Delete

unset ($_SESSION['cart'][$pid]);

} elseif ( $qty > 0 ) { // Change quantity

$_SESSION['cart'][$pid]['quantity'] = $qty;

}

 

} // End of FOREACH

} // End of SUBMITTED IF

// Display the cart if it's not empty

if (!empty($_SESSION['cart'])) {

// Retrieve all of the information for the prints in the cart:

require_once ('../../mysqli_connect.php');

$q = "SELECT print_id, CONCAT_WS(' ', first_name, middle_name, last_name) AS artist, print_name

FROM artists, prints

WHERE artists.artist_id = prints.artist_id AND prints.print_id IN (";

foreach ($_SESSION['cart'] as $pid => $value) {

$q .= $pid . ',';

}

$q = substr($q, 0, -1) . ') ORDER BY artists.last_name ASC';

$r = mysqli_query ($dbc, $q);

 

// Create a form and a table:

echo '<form action="view_cart.php" method"post">

<table border="0" width="90%" cellspacing="3" cellpadding="3" align="center">

<tr>

<td align="left" width="30%"><b>Artist</b></td>

<td align="left" width="30%"><b>Print Name</b></td>

<td align="right" width="10%"><b>Price</b></td>

<td align="center" width="10%"><b>Qty</b></td>

<td align="right" width="10%"><b>Total Price</b></td>

</tr>

';

// Print each item

$total = 0; // Total cost of the order

while ($row = mysqli_fetch_array ($r, MYSQLI_ASSOC)) {

 

// Calculate the total and sub-totals

$subtotal = $_SESSION['cart'][$row['print_id']]['quantity'] * $_SESSION['cart'][$row['print_id']]['price'];

$total += $subtotal;

 

// Print the row

echo "\t<tr>

<td align=\"left\">{$row['artist']}</td>

<td align=\"left\">{$row['print_name']}</td>

<td align=\"right\">\${$_SESSION['cart'][$row['print_id']]['price']}</td>

<td align=\"center\"><input type=\"text\" size=\"3\" name=\"qty[{$row['print_id']}]\" value=\"{$_SESSION['cart'][$row['print_id']]['quantity']}\" /></td>

<td align=\"right\">$" . number_format ($subtotal, 2) . "</td>

</tr>\n";

 

} // End of the WHILE loop

 

mysqli_close($dbc); // Close the database connection

// Print the footer, close the table, and the form

echo '<tr>

<td colspan="4" align="right"><b>Total:</b></td>

<td align="right">$' . number_format ($total, 2) . '</td>

</tr>

</table>

<div align="center"><input type="submit" name="submit" value="Update My Cart" /></div>

<input type="hidden" name="submitted" value="TRUE" />

</form><p align="center">Enter a quantity of 0 to remove an item.

<br /><br /><a href="checkout.php">Checkout</a></p>';

} else {

echo '<p>Your cart is currently empty.</p>';

}

include ('includes/footer.html');

?>

 

and here is checkout.php

<?php # Script 17.10 - checkout.php - woodsie - 12-4-11

 

// This page inserts the order information into the table

// This page would come after the billing process

// This page assumes that the billing process worked (the money has been taken)

 

// Set the page title and include the HTML header

$page_title = 'Order Confirmation';

include ('includes/header.html');

// Assume that the customer is logged in and that this page has access to the customer's ID

$customer = 2; // Temporary

// Assume that this page receives the order total

$total = 200.93; // Temporary

require_once ('../../mysqli_connect.php'); // Connect to the database

// Turn autocommit off

mysqli_autocommit($dbc, FALSE);

// Add the order to the orders table

$q = "INSERT INTO orders (customer_id, total) VALUES ($customer, $total)";

$r = mysqli_query($dbc, $q);

if (mysqli_affected_rows($dbc) == 1) {

// Need the order ID

$oid = mysqli_insert_id($dbc);

 

// Insert the specific order contents into the database

 

// Prepare the query

$q = "INSERT INTO order_contents (order_id, print_id, quantity, price) VALUES (?, ?, ?, ?)";

$stmt = mysqli_prepare($dbc, $q);

mysqli_stmt_bind_param($stmt, 'iiid', $oid, $pid, $qty, $price);

 

// Execute each query, count the total affected

$affected = 0;

 

foreach ($_SESSION['cart'] as $pid => $item) {

$qty = $item['quantity'];

$price = $item['price'];

mysqli_stmt_execute($stmt);

$affected += mysqli_stmt_affected_rows($stmt);

}

// Close this prepared statement

mysqli_stmt_close($stmt);

// Report on the success

if ($affected == count($_SESSION['cart'])) { // Whohoo!

 

// Commit the transaction

mysqli_commit($dbc);

 

// Clear the cart

unset($_SESSION['cart']);

 

// Message to the customer

echo '<p>Thank you for your order. You will be notified when the items ship.</p>';

 

// Send emails and do whatever else

 

} else { // Rollback and report the problem

 

mysqli_rollback($dbc);

 

echo '<p>Your order could not be processed due to a system error.

You will be contacted in order to have the problem fixed. We apologize for the inconvenience.</p>';

 

// Send the order information to the administrator

 

}

} else { // Rollback and report the problem

mysqli_rollback($dbc);

echo '<p>Your order could not be processed due to a system error.

You will be contacted in order to have the problem fixed. We apologize for the inconvenience.</p>';

 

// Send the order information to the administrator

 

}

mysqli_close($dbc);

include ('includes/footer.html');

?>

Share this post


Link to post
Share on other sites

Per the forum guidelines, what version of PHP are you using? What version of MySQL? What debugging steps have you take and what were the results?

Share this post


Link to post
Share on other sites

Great! But also per the forum rules, could you go ahead and report what the problem/solution was so that others might benefit?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×