Source of: example.cart.3.php

<?
/*
Source code example for Web Database Applications

Unless otherwise stated, the source code distributed with this book can be
redistributed in source or binary form so long as an acknowledgment appears
in derived source files.
The citation should list that the code comes from Hugh E.
Williams and David Lane, "Web Database Application with PHP and MySQL"
published by O'Reilly & Associates.
This code is under copyright and cannot be included in any other book,
publication, or educational product without permission from O'Reilly &
Associates.
No warranty is attached; we cannot take responsibility for errors or fitness
for use.
*/
?>
<?php
   
// This script adds an item to the shopping cart
   // It expects a WineId of the item to add and a 
   // quantity (qty) of the wine to be added

   
include 'include.inc';

   
set_error_handler("errorHandler");

   
// Have the correct parameters been provided?
   
if (empty($wineId) && empty($qty))
   {
      
session_register("message");

      
$message "Incorrect parameters to example.cart.3.php";

      
// Redirect the browser back to the calling page,
      // using the HTTP response header "Location:"
      // and the PHP environment variable $HTTP_REFERER
      
header("Location: $HTTP_REFERER");
      exit;
   }   

   
// Re-establish the existing session
   
session_start();    

   
$wineId clean($wineId5);
   
$qty clean($qty3);

   
$update false;

   
// Open a connection to the DBMS
   
if (!($connection = @ mysql_pconnect($hostName
                                     
$username
                                     
$password)))
      
showerror();

   if (!
mysql_select_db($databaseName$connection))
      
showerror();

   
// If the user has added items to their cart, then
   // the variable order_no will be registered

   // First, decide on which tables to lock
   // We don't touch orders if the cart already exists
   
if (session_is_registered("order_no")) 
      
$query "LOCK TABLES inventory READ, items WRITE";
   else
      
$query "LOCK TABLES inventory READ, orders WRITE, items WRITE";

   
// LOCK the tables
   
if (!(@ mysql_query ($query$connection)))
      
showerror();   

   
// Second, create a cart if we don't have one yet
   // or investigate the cart if we do
   
if (!session_is_registered("order_no")) 
   {
      
// Find out the maximum order_id, then
      // register a session variable for the new order_id
      // A cart is an order for the customer with cust_id = -1
      
$query "SELECT max(order_id) FROM orders
                WHERE cust_id = -1"
;

      if (!(
$result = @ mysql_query ($query$connection)))
         
showerror();

      
// Save the cart number as order_no
      // This is used in all cart scripts to access the cart
      
session_register("order_no");
      
$row = @ mysql_fetch_array($result);
      
$order_no $row["max(order_id)"] + 1;

      
// Now, create the shopping cart
      
$query "INSERT INTO orders
                SET cust_id = -1,
                    order_id = 
$order_no";

      if (!(@ 
mysql_query ($query$connection)))
         
showerror();   
            
      
// Default the item_id to 1
      
$item_id 1;
   }
   else
   {
      
// We already have a cart. Check if the customer already
      // has this item in their cart
      
$query "SELECT item_id, qty FROM items
                WHERE cust_id = -1
                AND order_id = 
$order_no
                AND wine_id = 
$wineId";

      if (!(
$result = @ mysql_query ($query$connection)))
         
showerror();

      
// Is the item in the cart already?
      
if (mysql_num_rows($result) > 0)
      {
         
$update true;
         
$row = @ mysql_fetch_array($result);

         
// Save the item number
         
$item_id $row["item_id"];
      }
         
      
// If this is not an update, find the next available item_id
      
if ($update == false)
      {
         
// We already have a cart, find the maximum item_id
         
$query "SELECT max(item_id) FROM items
                   WHERE cust_id = -1
                   AND order_id = 
$order_no";

         if (!(
$result = @ mysql_query ($query$connection)))
            
showerror();

         
$row = @ mysql_fetch_array($result);

         
// Save the item number of the new item
         
$item_id $row["max(item_id)"] + 1;
      }   
   }
      
   
// Third, add the item to the cart or update the cart
   
if ($update == false)
   {
      
// Get the cost of the wine
      // The cost comes from the cheapest inventory
      
$query "SELECT count(*), min(cost) FROM inventory 
                WHERE wine_id = 
$wineId";
     
      if (!(
$result = @ mysql_query ($query$connection)))
         
showerror();

      
$row = @ mysql_fetch_array($result);
      
      
// This wine could have just sold out - check this
      // (this happens if another user buys the last bottle
      //  before this user clicks "add to cart")
      
if ($row["count(*)"] == 0)
      {
         
// Register the error as a session variable
         // This message will then be displayed back on 
         // page where the user adds wines to their cart
         
session_register("message");
         
$message "Sorry! We just sold out of this great wine!";
      }
      else
      { 
         
// We still have some of this wine, so save the
         // cheapest available price
         
$cost $row["min(cost)"];
         
$query "INSERT INTO items
                   SET cust_id = -1,
                       order_id = 
$order_no,
                       item_id = 
$item_id,
                       wine_id = 
$wineId,
                       qty = 
$qty,
                       price = 
$cost";
      }
   }
   else
      
$query "UPDATE items
                SET qty = qty + 
$qty
                WHERE cust_id = -1
                AND order_id = 
$order_no
                AND item_id = 
$item_id";


   if (
$item_id 20)
   {
      
session_register("message");
      
$message "Sorry! Only 20 different wines can be purchased per shipment";
   }

   
// Either UPDATE or INSERT the item
   // (Only do this if there wasn't an error)
   
if (empty($message) && (!(@ mysql_query ($query$connection))))
     
showerror();

   
// Last, UNLOCK the tables
   
$query "UNLOCK TABLES";
   if (!(@ 
mysql_query ($query$connection)))
     
showerror();

   
// Redirect the browser back to the calling page,
   // using the HTTP response header "Location:"
   // and the PHP environment variable $HTTP_REFERER
   
header("Location: $HTTP_REFERER");
?>


© 2000--2001 Hugh E. Williams and David Lane.
Valid HTML 4.01!