RE: Transactions and PDO

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Why not create a Stored Procedure to handle the second table?

-----Original Message-----
From: Vandegrift, Ken [mailto:kvandegrift@xxxxxxxxxx] 
Sent: Wednesday, June 21, 2006 7:20 PM
To: php-windows@xxxxxxxxxxxxx
Subject:  Transactions and PDO

Just wanted to throw this out there to see if anyone may be able to help
with a PDO transaction that does not appear to be working.  I want to
update an order record in the database and also insert giftcard numbers
associated with this same order into another table.  So I am trying to
do one update in the customer order table and possibly several inserts
into a giftcard record table.  I purposely use the same giftcard number
to trigger a primary key violation and attempt to rollback the
transaction if this occurs.  I know users of the system will likely
enter the same giftcard numer at some point (although I will have
validation schemes in place to prevent db errors)
 
Running Windows 2003 Server IIS6 and PHP 5.1.2
 
Code example:
 
/**
  * Updates order information in the database.
  * Called from Order::dbSaveOrder
  * @return boolean true on success
  * @access protected
  */
 protected function dbUpdateOrder() {
 
  // VARIABLES TO TRACK PROPER SQL FORMATTING
  $count = count($this->attributes);
  $i = 1;
 
  // BUILD ORDER TABLE UPDATE QUERY
  $sql = "UPDATE " . ORDER_TABLE . " SET ";
  foreach ($this->attributes as $attribute => $value) {
   $attribute = strtoupper($attribute);
   $sql      .= (is_string($value) || is_null($value)) ? "{$attribute} =
'{$value}'" : "{$attribute} = {$value}";
   if ($i < $count) {
    $i++;
    $sql .= ", ";
   }
  }
  $sql .= " WHERE " . ORDER_TABLE_ID . " = :orderid;";
 
  try {
   $this->db->beginTransaction();
   $stmt = $this->db->prepare($sql);
   $stmt->execute(array(':orderid' => $this->attributes['order_id']));
   $stmt = null;
   // SAVE GIFT CARD NUMBERS RECORDED FOR THIS ORDER
   if (!empty($this->gcnums)) {
    $sql = null;
    foreach ($this->gcnums as $itemid => $gcnumbers) {
      foreach ($gcnumbers as $gcnum) {
        $sql .= "INSERT INTO GIFTCARD_RECORD " .
                "(" .
                "ORDER_ID, " .
                "ITEM_ID, " .
                "GC_NUM " .
                ") " .
                "VALUES" .
                "(" .
                "{$this->__get('order_id')}, " .
                "{$itemid}, " .
                "'{$gcnum}'" .
                ");";
      } // End Inner FOREACH
       } // End Outer FOREACH
     $stmt = $this->db->prepare($sql);
     $stmt->execute();
   }
   $this->db->commit();
   return true;
  }catch (PDOException $e) {
   $this->db->rollBack();
   Log::write(LOG_DIR, 'order',
     "\r******** Order::dbUpdateOrder ********\r" .
     "[UPDATE SQL] => " . $sql . "\r" .
     "[DB ERROR] => " . $e->getMessage() . "\r" .
     "**************************************"
   );
   $this->error = 'The system has encountered an error and is unable to
update this order. ' .
     'Please contact the system administrator.';
   $stmt = null;
   return false;
  }
 }
 
Ken Vandegrift
 

-- 
PHP Windows Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [PHP Users]     [PHP Database Programming]     [PHP Install]     [Kernel Newbies]     [Yosemite Forum]     [PHP Books]

  Powered by Linux