Foros del Web » Programando para Internet » PHP »

"Transacciones" PHP

Estas en el tema de "Transacciones" PHP en el foro de PHP en Foros del Web. Hola, Bueno, las transacciones creo que un término exclusivo de las bases de datos, pero lo que busco es similar. Tengo un conjunto de instrucciones ...
  #1 (permalink)  
Antiguo 12/11/2013, 08:14
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
"Transacciones" PHP

Hola,

Bueno, las transacciones creo que un término exclusivo de las bases de datos, pero lo que busco es similar. Tengo un conjunto de instrucciones y funciones. Quiero que se ejecuten todas o ninguna, es decir, si alguna falla quiero que las que ya se han ejecutado vuelvan a su estado anterior. Creo que no se puede hacer esto en PHP, pero pregunto por si acaso...

Saludos!
  #2 (permalink)  
Antiguo 12/11/2013, 09:20
 
Fecha de Ingreso: octubre-2012
Mensajes: 135
Antigüedad: 11 años, 6 meses
Puntos: 8
Respuesta: "Transacciones" PHP

Depende de la función, podrías hacer otra que sea inversa. Si nos das un poco más de información te podremos ayudar mejor.
  #3 (permalink)  
Antiguo 12/11/2013, 13:53
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: "Transacciones" PHP

Os lo explico con código:

Código PHP:
 // Si la petición es correcta y segura
            
if (strcasecmp($peticion->firma$firma) == 0) {
                
                if (
$peticion->coderror == '000' || ($peticion->coderror == '002' && $peticion->deserror 'IdTransaccion repetido. (03010000017)' )) {
                    
$bookings = array();
                    
// Update bookings
                    
$transaccionesToBookings Admin_Model_TransaccionToBooking::getByTransaccionId($peticion->idtransaccion);
                    foreach (
$transaccionesToBookings as $transaccionToBooking) {
                        
$booking Admin_Model_Booking::getById($transaccionToBooking->bookingId);
                        
$booking->depositIsPaid 1;
                        
$booking->isConfirmed 1;
                        
$booking->update();
                        
$bookings[] = $booking;
                    }

                    
// Update transaccion
                    
$transaccion Admin_Model_Transaccion::getByTransaccionId($peticion->idtransaccion);
                    
$transaccion->isPaid 1;
                    
$transaccion->update();
                    
                    
// Send Email Confirmation
                    
$this->_sendBookingEmail($bookings$booking->getCustomer(), $transaccion);
                }
                
                
$paymentData = array();
                
$paymentData['amount'] = $transaccion->amount;
                
$paymentData['concept'] = $peticion->coderror ' - ' $peticion->deserror;
                
$paymentData['transaction'] = $peticion->idtransaccion;
                
$paymentData['payment_method'] = 'TPV';
                
Admin_Model_Payment::createNewPayment($paymentData); 
Todo viene a raíz de un problema que tuve hoy. La funcion $this->_sendBookingEmail() falló. Entonces se ejecutaron todas las instrucciones hasta ahí, actualizando la base de datos. Pero al detenerse en esa línea debido al fallo el script no continuó, luego en la base de datos faltaba la información que proporciona la última instrucción:
Admin_Model_Payment::createNewPayment($paymentData )
Esa instrucción añade una nueva fila con los datos del pago.

El código anterior en resumidas cuentas haría:

- comprueba que la petición viene del TPV
- marca las reservas como pagadas
- envía email de confirmación
- añade el resultado de la operación a la base de datos (puede ser una operación fallida o no).
  #4 (permalink)  
Antiguo 13/11/2013, 12:25
 
Fecha de Ingreso: octubre-2012
Mensajes: 135
Antigüedad: 11 años, 6 meses
Puntos: 8
Respuesta: "Transacciones" PHP

Como mandar un correo no se puede retirar, intenta cambiar el orden, y poner el mail al final, y si algo falla, hacer una función que elimine todo. Es lo único que se me ocurre

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:06.