PDA

Visualizza la versione completa : [*] Trasformare un errore di un database in un messaggio per l'utente


anx721
01-12-2005, 14:44
Salve, la domanda è questa, data un'applicazione che lavora con un database, qual è la pratica migliore per trasformare l'errore ottenuto ad esempio con un'operazione di insert in una tabella in un messaggio descrittivo per l'utente?

Ad esempio, ho una tabella che mantiene gli utenti registrati con nome unico, ed un utente prova a registrarsi con un nome già esistente, ad esempio 'pincopallinno'. Eseguedo la query avrò un errore, ad esempio mysql restituirà qualcosa del tipo:

duplicate entry 'pincopallino'


io però all'utente voglio mostrare un messaggio più "comprensibile" tipo:

"L'utente pincopallino già esiste"


Se c'è il vincolo che non solo i nomi siano univoci, ma anche le email, mysql mi restituirà lo stesso codice di errore anche se inserisco un valore email gia presente, perchè entrambi sono violazioni di vincoli di chiave.

Il problema emerge anche nel caso in cui voglia rendere l'applicazione indipendente dalla lingua.

L'unico escamotage che mi è venuto in mente è di eseguire 'manualmente' dei controlli sulle tabelle prima di effettuare le operazioni. Ad esempio potrei verificare se esiste un utente con quel nome e in tal caso ritornare subito un mio messaggio d'errore significativo; in questo modo riuscirei a risolvere un certo numero di errori comuni dovuti a vincli di integrità sulle tabelle.

Vorrei sapere se ci sono altri approcci standard al problema.

Fox82
01-12-2005, 23:02
Originariamente inviato da anx721
Salve, la domanda è questa, data un'applicazione che lavora con un database, qual è la pratica migliore per trasformare l'errore ottenuto ad esempio con un'operazione di insert in una tabella in un messaggio descrittivo per l'utente?

Ad esempio, ho una tabella che mantiene gli utenti registrati con nome unico, ed un utente prova a registrarsi con un nome già esistente, ad esempio 'pincopallinno'. Eseguedo la query avrò un errore, ad esempio mysql restituirà qualcosa del tipo:

duplicate entry 'pincopallino'


io però all'utente voglio mostrare un messaggio più "comprensibile" tipo:

"L'utente pincopallino già esiste"


Se c'è il vincolo che non solo i nomi siano univoci, ma anche le email, mysql mi restituirà lo stesso codice di errore anche se inserisco un valore email gia presente, perchè entrambi sono violazioni di vincoli di chiave.

Il problema emerge anche nel caso in cui voglia rendere l'applicazione indipendente dalla lingua.

L'unico escamotage che mi è venuto in mente è di eseguire 'manualmente' dei controlli sulle tabelle prima di effettuare le operazioni. Ad esempio potrei verificare se esiste un utente con quel nome e in tal caso ritornare subito un mio messaggio d'errore significativo; in questo modo riuscirei a risolvere un certo numero di errori comuni dovuti a vincli di integrità sulle tabelle.

Vorrei sapere se ci sono altri approcci standard al problema.


E' un problema che mi sono sempre posto anch'io...

Il preventivo forse è il metodo più efficace, perchè ti permette di dare all'utente informazioni dettagliate su ciò che sta immettendo.
Però è anche il meno efficiente (devi comunque accedere due volte al db, mentre interpretando gli errori del dbms devi accedere due volte solo nel caso peggiore).

Ovviamente un accesso in più non ha (generalmente) un grosso impatto sulle prestazioni, però si potrebbe comunque risparmiare.

Come sempre, il meglio è forse un approccio misto: se riesci ad associare ad ogni errore che il db ti fornisce un errore nei dati di input in maniera univoca, puoi risparmiarti i controlli preliminari, associando ad ogni codice di errore la relativa procedura di gestione; altrimenti segui l'altro approccio.

Un'altra soluzione, relativa soltanto al caso di chiavi duplicate, potrebbe essere la creazione di una cache con i dati sensibili, in modo da accelerare i controlli. In questo caso però, presterei attenzione anche alla quantità dei dati di cui fare cache.

Queste sono le mie idee, spero di sentirne altre...

:ciauz:

Loading