Transacción con bucle (ciclo) con PostgreSQL y PHP-PDO

524 views
Skip to first unread message

guillhermosoftrejo

unread,
Jul 12, 2011, 11:24:47 AM7/12/11
to postgres-pe
Cordial Saludo

Actualmente estoy trabajando con PostgreSQL 8.4.8 conectado a PHP por
medio de PDO, he realizado consultas de inserción (simple de un solo
registro) como transacciones, la cual ha quedado de la siguiente
manera:

[CODE]$consulta = "INSERT INTO \"datosComercialesClientes
\" (\"idCliente\", \"celular\", \"fax\", \"email\", \"diasPlazoCredito
\", \"descuentoProntoPago\", \"descuentoComercial\", \"estadoRegistro
\", \"creadoPor\", \"creadoEn\")
VALUES ($idCliente, NULL, NULL, '', NULL, NULL,
NULL, '1', '$idCreador', 'now'::text::timestamp without time zone)";
$guarda = $this->db->prepare($consulta);
try {
$this->db->beginTransaction();
$guarda->execute();
$this->db->commit();
return true;
} catch (PDOException $e) {
$this->db->rollback();
return false;
}[/CODE]

más el registro que estoy guardando en el mismo formulario tiene
relaciones de uno a muchos con otras entidades, mi pregunta puntual es
¿cómo podría "meter" (en la misma transacción) estas otras inserciones
por medio de un bucle que recorra un array (donde estan los valores de
las otras entidades)?, actualmente esto lo hago por medio de PHP y
genero varias consultas de inserción, pero lo que considero ideal es
que todas las inserciones queden en una misma transacción, para que se
sumpla el primer principio ACID, es decir la atomicidad.

Quedo atento a sus comentarios.

Muchas gracias por su atención.

Santiago Zarate

unread,
Jul 12, 2011, 11:33:14 AM7/12/11
to postg...@googlegroups.com
Revisa esto [1] deberia darte una idea de la forma correcta de hacerlo.

--
******************************
Si quieres conversar con nosotros en vivo ingresa por irc a:
server: irc.freenode.net
canal: #postgresql-pe
******************************
Para visitar la página web del grupo entra en:
http://www.postgresql.org.pe
http://groups-beta.google.com/group/postgres-pe?hl=es
******************************
Para desuscribirte de la lista envia un mensaje sin nada a:
postgres-pe...@googlegroups.com



--
Atentamente
Santiago Zarate
Consultoria de Software
  +(58) 416 911 3678
  sant...@zarate.net.ve

«Dar un nuevo paso, articular una nueva palabra, es lo que la gente mas teme.»
  - Fyodor Mikhaylovich Dostoyevsky

Luis Guillermo Trejo López

unread,
Jul 13, 2011, 12:29:59 PM7/13/11
to postg...@googlegroups.com
Hola Santiago, muchas gracias, el enlace me fue de mucha utilidad, mi código quedo así:

$consulta = "INSERT INTO \"datosComercialesClientes\" (\"idCliente\", \"celular\", \"fax\", \"email\", \"diasPlazoCredito\", \"descuentoProntoPago\", \"descuentoComercial\", \"estadoRegistro\", \"creadoPor\", \"creadoEn\")
                    VALUES ($idCliente, NULL, NULL, '', NULL, NULL, NULL, '1', '$idCreador', 'now'::text::timestamp without time zone)";
        $guarda = $this->db->prepare($consulta);
        try {
            $this->db->beginTransaction();
            $guarda->execute();
            for ($i = 0; $i < count($this->_referenciaComercialCliente); $i++) {                   
                $consulta = "INSERT INTO \"referenciasComercialesClientes\" (\"idCliente\",\"referenciaComercialCliente\",\"montoCredito\",\"anosAntiguedad\",\"telefono\", \"estadoRegistro\", \"creadoPor\", \"creadoEn\")
                            VALUES ($idCliente, ?, ?, ?, ?, '1', '$idCreador', 'now'::text::timestamp without time zone)";
                $guarda = $this->db->prepare($consulta);
                $this->_montoCredito[$i] = str_replace(array(",", "$"), "", $this->_montoCredito[$i]);
                $guarda->execute(array($this->_referenciaComercialCliente[$i], $this->_montoCredito[$i], $this->_anosAntiguedadReferenciaComercial[$i], $this->_telefonoReferenciaComercial[$i]));
            }
            $this->db->commit();
            return true;
        } catch (PDOException $e) {
            $this->db->rollback();
            return false;
        }

Por si alguno tiene la misma duda, quizás le sea útil.

Luis Guillermo Trejo López
Análisis, Diseño y Desarrollo de Software

Reply all
Reply to author
Forward
0 new messages