Newsgroup: it.comp.www.php
Titolo: Request For Comment - validazione di file uploadati

Problema: ricevere un file via HTTP upload contenente una collection di 
record (ad esempio, le righe di un DDT), controllarne la validità (non 
solo formale, ma anche effettiva: ad esempio, il campo data consegna 
deve essere >= del campo data spedizione, il campo quantità deve essere 
maggiore di zero, il campo codice articolo deve essere FK della tabella 
anagrafica ecc.), in caso di controllo superato caricare nel DB le 
righe, in caso di controllo non superato avvertire l'utente.
Aspetti da considerare:
Il tutto deve essere efficiente: la risposta "ok" o "ko" va data entro 
il MAX_ESECUTION_TIME, ovviamente.
L'effettivo inserimento nel DB pero' potrebbe anche essere non 
istantaneo, se introduce una criticità (ma non credo).
Il formato del file può essere vario. Usare XML potrebbe semplificare il 
controllo formale, ma non so se dà vantaggi per le altre operazioni.
Se qualcuno ha voglia e tempo di discutere un po' di possibili modi di 
implementare tutto quanto (ovviamente in PHP eh, è un post IT ;-)) mi 
farebbe un gran piacere parlarne per chiarirmi le idee...
Danke, ciao!
-- 
Fabrizio "Hermooz" Ermini

 l'utente.
La scelta di XML probabilmente e' la migliore dal punto di vista della
portabilita'.
Per quello che riguarda il controllo formale penso possa essere
sufficiente la validazione per mezzo di DTD o XML Schema.
Per il controllo delle valorizzazioni puoi utilizzare le varie funzioni
is_, le reg exp e, ovviamente gli operatori di confronto.
Se il DDT ha una dimensione ridotta (<100 record) e non e' necessario
validare i dati con quelli presenti nel DB non dovresti avere problemi
di execution time.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Cerchi un programmatore PHP/MySQL? 
http://url.repository.biz/go/1Y
L'uomo, conscio di sbagliare, persevera.

 di execution time.
Yep, la cosa che più mi preoccupa è la validazione contro DB. Ritornando 
all'esempio che ho fatto (che poi in pratica è anche il problema vero 
che devo affrontare) se ho un campo "codice articolo" che mi deve andare 
in una tabella dove c'e' una FK, per rispondere all'utente che il suo 
upload è andato a buon fine io devo in qualche modo "anticipare" il test 
di integrità referenziale che farà il DB: se mi becco un errore su un 
costraint dopo che ho accettato l'upload sono nella cacca :-)
Per fare questo vedo possibili tre strade:
- tentare effettivamente un insert e leggere il risultato (ovviamente in 
questo caso il tutto deve essere rollbaccabile)
- fare una select per ogni FK per validare l'esistenza della chiave
- fare all'inizio del ciclo una unica select che mi carica in memoria un 
array di chiavi "legali" e controllare la validità delle stesse a 
livello PHP invece che SQL.
(c'e' anche il problema che nel tempo fra quando faccio la select di 
validazione e quando faro' effettivamente la insert potrebbe cambiare 
qualcosa, ma per semplicità per il momento consideriamo le chiavi 
"immutabili").
Care to elaborate? :-)
-- 
Fabrizio "Hermooz" Ermini

 consideriamo le chiavi "immutabili").  
Per ovviare puoi utilizzare le transazioni.
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Votami! 
http://www.phpclasses.org/vote.html


 Per ovviare puoi utilizzare le transazioni.
Certo, se faccio tutto in una volta. Ma come dicevo una delle 
possibilità è anche quella di fare solo la validazione del file 
contestualmente all'upload e poi in un secondo momento fare l'insert (o 
il COPY) effettivo del file in modalità batch. Ma forse non vale la pena 
di mettere in piedi una struttura del genere...
Grazie e ciao!
-- 
Fabrizio "Hermooz" Ermini

 degli schemi "standard"?
Che io sappia no, ma non mi sono mai interessato alla cosa.
-- 
I am what I am, I do what I can
