4343l4.text

Listing 4. Adding Items to a Cart

<?php

function cart_add_item($item_id,$quantity=1) {
     global $customer_id, $feedback, $conn;

     //no need to start a transaction, as only one query
     //will be updating the database

     //query postgres for the next value in our sequence
     $res=query("SELECT * FROM item_inventory WHERE part_number='$item_id'");

     //check for errors
     if (!$res || pg_numrows($res)<1) {
           $feedback .= pg_errormessage($conn);
           $feedback .= ' Error - item not found ';
           return false;
     } else {
           //item was legit - see if already in cart. If so, increment quantity
           //start a transaction so we can lock the rows if they are found
           query("BEGIN WORK");

           $res=query("SELECT * FROM cart_items ".
                  "WHERE part_number='$item_id' AND customer_id='$customer_id' FOR UPDATE");

           //check for errors
           if (!$res || pg_numrows($res)<1) {
                  //insert it into the cart

                  $res=query("INSERT INTO cart_items ".
                        "(customer_id,part_number,quantity)".
                        "VALUES ($customer_id,$item_id,$quantity)");

                  //check for errors on insert
                  if (!$res || pg_cmdtuples($res) < 1) {
                        $feedback .= pg_errormessage($conn);
                        $feedback .= ' Error - couldn't insert into cart ';
                        //nothing was changed but it's good form to cancel the transaction
                        query("ROLLBACK");
                        return false;
                   } else {
                        'query("COMMIT");
                        return true;
                   }
            } else {
                   //item already in cart - increment quantity
                   $res=query("UPDATE cart_items SET quantity = quantity + $quantity ".
                         "WHERE part_number='$item_id' AND
customer_id='$customer_id'");
                   if (!$res || pg_cmdtuples($res) < 1) {
                         $feedback .= pg_errormessage($conn);
                         $feedback .= ' Error - couldn't increment quantity in cart ';
                         //again nothing was changed
                         query("ROLLBACK");
                         return false;
                   } else {
                         //commit the updated quantity to the database
                         query("COMMIT");
                         return true;
                   }
            }
      }
}

?>

