Il modello per il caso di successo:
- Leggi la richiesta POST
- Convalida i dati POST
- Pre-process dati POST
- Conservare
- Redirect
- Leggi la richiesta GET
- Visualizza messaggio di successo
E nel caso di fallimento:
- Leggi la richiesta POST
- Convalida i dati POST (in caso di esito negativo, vai a 5.)
- Pre-processare i dati POST (se fallito, vai a 5.)
- Store (fallisce)
- Visualizza messaggio di errore
Nel tuo codice, questa struttura sembra un po 'così (pseudocodice, ovviamente):
if (is_post_request) {
data = empty_data()
try {
data = read_post_data()
validate(data)
preprocess(data)
store(data)
redirect()
exit
}
catch (ex) {
display_form(data, error_message = ex)
}
}
else {
data = empty_data()
display_form(data, error_message = NULL)
}
Il motivo per cui stai reindirizzando è che vuoi evitare un secondo aggiornamento del database quando l'utente si ricarica. Per questo motivo, è necessario il primo store e then reindirizzamento. In effetti, ti consiglio di prendere l'abitudine di chiamare exit
immediatamente dopo ogni reindirizzamento. Non ha senso fare qualsiasi cosa nella richiesta corrente una volta reindirizzato (tranne la pulizia, come la chiusura degli handle di file aperti).
Il motivo per cui non reindirizza nel caso di errore è perché nulla è stato ancora archiviato - se l'utente ricarica, si ripeterà nuovamente lo stesso errore. Se dovessi reindirizzare nel caso di errore, dovresti portare i messaggi di errore sul reindirizzamento, il che è possibile ma non proprio carino, e avresti un viaggio di andata e ritorno non necessario.