Newsgroup: it.comp.www.php
Titolo: inserimento record e caricamento file: eseguire o annullare tutto!

Io dovrei fare l'inserimento di un record in una tabella mysql e
caricare un file in una cartella sul server.
Volevo sapere se c'è un metodo per annullare tutto se una delle 2
operazioni non va a buon fine, ossia annullare l'inserimento del record
se il file non viene caricato, oppure annullare il caricamento del file
se l'inserimento del record non va a buon fine.
C'è un metodo che effettua le operazioni se tutto va bene, o annulla
tutto se anche una sola operazione non può essere effettuata?
Thanks



Devi usare MySQL 5 e le transazioni. Oppure tieni traccia a mano della
insert ed eventualmente effettui una delete se il caricamento del file non
va a buon fine.
Non ci sono funzioni base del linguaggio che lo fanno.
Bye.

 Bye.
Si, ho sentito spesso parlare delle transazioni, ma non le ho mai
utilizzate.
Spero che non sia difficile usarle, appena posso ci provo.
Grazie per i suggerimenti.
Thanks

 Devi usare MySQL 5 e le transazioni. Oppure tieni traccia a mano della
Ok per l'insert ma con le transazioni non è certo facile rimuovere il 
file che ha caricato :-)
Visto che sono due semplici operazioni atomiche, basta fare un controllo 
sull'esito (per esempio è più probabile un problema al caricamento del 
file, rispetto ad un insert, ovviamente se non si parla di 
fileserver/dbms remoti)
	Francesco

 fileserver/dbms remoti)
Con le transazioni, se lo script si interrompe per qualunque motivo (anche
un kill di root) durante la copia del file, viene effettuato un rollback
automatico. Senza le transazioni, ti trovi con la riga nel DB ma manca il
file.
Bye.



SE non hai a disposizione le transazioni, puoi simularle in questo modo:
inserisci il record con un campo illegale (per es., una data del 1970, o
simili). Poi lo riselezioni. Se non lo trovi, l'operazione e' fallita, e
il file uploadato lo lasci dov'e' in modo che sia cancellato.
Se lo trovi, copi il file con una estensione illegale (che so: .DEL). Se
non ci riesci, cancelli il record dal database.
A questo punto le probabilita' che tu non riesca a rinominare il file da
.DEL a quel che deve essere sono bassissime, e cosi' la possibilita' che
il record inserito non possa essere modificato.
Per cui rinomini il file e aggiorni il record; ci metterai pochissimo, e
il sistema si incasina solo se vieni interrotto fra le due operazioni.
Senza transazioni, il rischio non e' zero, pero' e' piccolo.
Ogni tanto controlli i record con data del 1970; se il nome del file sta
nel record, meglio ancora, cosi' puoi controllare se c'e' un file spurio
sul disco. Controlli anche se esistono file *.DEL, e *forse* puoi vedere
se ci sono record corrispondenti.
Se trovi l'una o l'altra anomalia, pulisci.
Mi ripeto: questa NON E' una bella soluzione; e' una soluzione se non e'
possibile usare le transazioni.
Un altro sistema e' quello di loggare la transazione: prima registri sia
l'esistenza del file sia il record che vuoi avere; poi provi a sistemare
l'uno e l'altro; se tutto va bene cancelli il record di transazione.
Se trovi un record di transazione aperto, provi a eliminare il file e il
record li' descritti. Selezioni, ecc., sul database le farai ignorando i
record in stato transiente, in modo esplicito (avere dei record in stato
non valido ti consente di effettuare l'esclusione in modo implicito).
Anche questo sistema non e' tutto 'sto granche', ovviamente.
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?

 Thanks
io avevo fatto cosi' per un problema simile:
- aggiunto un campo blob in tabella
- il file inizialmente lo caricavo nel campo blob
- poi scrivevo il contenuto del blob su file system, se la scrittura
andava a buon fine cancellavo il blob, altrimenti il file lo lasciavo
ancora su blob (fino ad un successivo tentativo andato a buon fine)

 se l'inserimento del record non va a buon fine.
non capisco di preciso il senso...
le due operazioni non possono essere eseguite contemporaneamente, per
cui inizi sempre con una, se questa va a buon fine prosegui con
l'altra, altrimenti no. se la seconda non va a buon fine annulli la
prima operazione. quindi e' solo una l'operazione da annullare, l'altra
semplicemente non viene nemmeno fatta.
a questo punto la domanda e': "qual e' l'operazione piu' semplice da
annullare?"
il caricamento del file: per cui basta cancellarlo
per cui tu inizia caricando il file, se non ci riesci non hai nemmeno
bisogno di inserire nulla del db, se invece ci riesci ma fallisce
l'inserimento cancelli il file (vedi 
www.php.net/unlink
)