PHP - Transacciones a la BD

 
Vista:

Transacciones a la BD

Publicado por David (6 intervenciones) el 12/06/2007 23:25:18
Tengo el caso de que un usuario registrado entra en el sistema y tiene que rellenar varios formularios bastante grandes en varias páginas..por lo que la opcion de irlo guardando en la sesion no es valida.De tal manera que se deberia esperar la transacion hasta que se terminen los "x" formularios.Es decir que no se guarden en la BD hasta que se termine el ultimo correctamente.Como se hace eso correctamente..porque si pongo en todos autocomit 0 y solo en el ultimo el commit pues supongo que seria asi..pero claro y si se produce un commit por otro lado y se guarda eso y lo que quedo pendiente por el otro lado.No se exactamente mu bien como va.aver si me podeis echar una manita..Bueno ya termine el quijote jeje.
Saludos ;)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Transacciones a la BD

Publicado por Giacomo Orizzonte (12 intervenciones) el 13/06/2007 05:55:39
Uhmm No se

talvez tienes un par de opciones, ya pensaste en hacer updates por cada tanda si eso no resuelve el embrollo deberias crearte un tabla de vigencia donde vayas rellenando los datos con updates parciales y mantener en la sesion el numero de registro en tu tabla vigencia asi cuando todo este ok, lo que haces es un select de ese registro y con esos valores el update o insert necesitado.

otra opcion un poco mas elegante seria que trabajes el formulario con todos los datos en una sola pagina web con un <div> por cada tanda de datos y disenes algun tipo de pestanas manejadas con javascript asi puedes mostrar de a poco los datos a llenar. hay varios ejemplos por ahi en el web.

Son un par de ideas que espero te ayuden .

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por Gonzalo (84 intervenciones) el 13/06/2007 07:54:53
1. ¿Por qué dices que no se pueden guardar en la sesión?

2. Lo que comentas del commit y el autocommit no sirve en absoluto.

3. Solución chapuza: Puedes ir pasando los datos por las diferentes páginas en campos ocultos y en la última recibirlos todos.

4. Solución menos chapuza: La que te han comentado de utilizar una única página pero meter el formulario en varios <div> y usar Javascript para manejarlo y enviar todo al final.


5. ¿Has pensado que quizá el problema es que tienes un formulario demasiado grande? ¿No se podría dividir en tareas más pequeñas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por Alejadro (63 intervenciones) el 13/06/2007 09:26:27
David,
Te comento que alguna vez he tenido que realizar un formulario inmenso para una empresa de RRHH. Ellos deseaban que la inscripción fuera siendo por pasos.

Lo que realice es ir grabando cada paso correspondiente en las tablas que requeria y almacenando un PIN, pin que meiba llevando por session, en el ultimo paso de todos lo que hice es hacer un update de las tablas para el PIN correspondiente y cambiar el estado de ese registro.

Creo que algo así es lo que te plantea también como solución Giacomo.

Espero puedas solucionar el inconveniente y en todo caso para poder ayudar a alguien más a darte una solución podrías especificar con que base de datos estas trabajando asi se podrá referenciar lo del commit y autocommit sobre cual.

Salu2 y Éxitos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por David (6 intervenciones) el 13/06/2007 09:51:53
Gracias de antemano por contestar a todos.Os explico un poco más.Es un formulario de autoevaluación y son pues varias páginas.El volcado a la base de datos(MYSQL ) debe ser atómico es decir o todo o nada de tal manera que si el usuario se cae o cierra en la tercera ventana no se guarde nada.Había pensado que quizás se pudiera resolver con lo de transacciones(commit usandolo de alguna manera, sería lo ideal).Guardarlo todo en la sesión me supondría guardar muchísimos datos por lo que no lo veo muy práctico.Alejandro respecto a tu solución te refieres a añadir un campo estado en cada tabla..de tal manera que estén a cero hasta que se complete el último paso??El pin ese que sería realmente?Si se realizaran varios accesos inútiles como identificaría cual de todos ellos es el correcto en una determinada tabla?
Saludos y gracias otra vez.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por Alejandro (63 intervenciones) el 13/06/2007 10:13:17
Exacto David me refiero a dejar un campo estado en 0 todo el tiempo y a pin me refiero a algo tipo: $pin=md5( date("Ymdhis")); que lo generas la primera vez y lo registras en la session.

De forma tal que ese PIN lo vas guardando en cada lugar que corresponda.
En el ultimo paso haces el update para poner el estado en 1 de las tablas para PIN=(al pin)

Lo que tengo tambien corriendo es un CRON con un php que lo que hace es limpiar los registros con 2 dias de antiguedad que esten en estado 0 de forma tal que tengas todo "limpio"

se entiende?

Espero te sirva y salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por David (6 intervenciones) el 13/06/2007 11:11:27
Si lo entiendo, muchas gracias.Me parece una buena solución.A efectos metodológicos se puede considerar correcta o es un poco chapucilla(tengo que presentar un proyecto y tendré que documentarlo)?

Me puedes explicar un poco más lo del CRON: código y como usarlo si puede ser.Usa si quieres el correo o contesta por aquí que quizás también le interese a alguien aunque se desvíe del tema principal.

Muchísimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por basnek (63 intervenciones) el 13/06/2007 12:03:28
A ver...
Este tema depende mucho del trato con tu ISP. Si tienes un panel de control puedes buscar si tienes una opción llamada CRON ó Tareas Programadas ó algo similar.

En este caso ya depende del panel como son los pasos pero por lo general son siempre similares :)

En sintesis el asistente lo unico que hace es pedirte, amigablemente, los campos a completar y luego genera el CRON correspondiente.

(hay mucha info sobre crontab en la red googlea php +crontab)

También si tienes acceso SSH puedes acceder y configurarlo a mano

El resultado final sera algo así

Se ha programado la tarea 21,22,23,24,25 * * * 7 /usr/bin/php -q /tu-ruta/cron.php

En este caso le puse que lo ejecute en los minutos 21 al 25

Obviamente en el file.php lo programas como estas acostumbrado haciendo los delete o updates que creas convenientes para el caso este que necesitas.

Espero te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones a la BD

Publicado por jose (14 intervenciones) el 15/06/2007 01:59:49
hola, mira te tiro una idea que me parece mas practica y mucho mas sencilla hacete una tabla de retardo de informacion, a que me refiero hace una tabla sola con todos los campos que tienen todos los formularios esos que van llenando de a paso, osea la 1| vez es uninsert, con algunos campos, y de ahi en adelante vas haciendo updates sobre el resto cuando se terminen de llenar todos los form vas a tener esa tabla intermedia que create llena de ahi vas te podes hacer un store y pasar los datos de la tabla intermedia a el resto de ellas.y listo ahi vas atener toda la info completa y lo haces de una, ves asi podes chequear si no tenes todos los campos en la tabla intermedia no haces el inset en las tablas originales
espero te sirviera y un saludo grande suerte hermano.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar