2013-03-26 11 views
6

Ho un modulo di accesso sul mio sito Web che controlla i nomi utente/password inviati. Se non c'è corrispondenza, l'utente viene rinviato alla pagina di accesso e viene visualizzato un messaggio di errore appropriato. L'invito a questo reindirizzamento è questo:Messaggi di errore in PHP

header("location:../login.php?error_message=$error_message"); 

Questo funziona bene, ma ha un aspetto disordinato nella barra degli indirizzi del browser (in particolare con i messaggi di errore descrittivi). C'è un modo per fare questo reindirizzamento automatico senza utilizzare la variabile $ _GET? Avevo preso in considerazione l'utilizzo della variabile $ _SESSION, ma non mi sembra la migliore pratica di codifica.

Grazie per la lettura.

+0

Personalmente uso la variabile '$ _SESSION'. –

+0

Utilizzare '$ _SESSION' È una buona pratica. – Voitcus

+0

Sono relativamente nuovo a PHP ed ero stato riluttante a usare '$ _SESSION', poiché assomiglia alle semplici ma pericolose statistiche di altri linguaggi ... ma sono felice di rivalutare. Grazie! – Rogare

risposta

4

Cosa ne dite di una variabile GET più semplice?

// something.php 
header ("Location: foo.php?err=1"); 

E poi nella gestione degli errori pagina:

// foo.php 
$errors = array (
    1 => "Hello, world!", 
    2 => "My house is on fire!" 
); 

$error_id = isset($_GET['err']) ? (int)$_GET['err'] : 0; 
if ($error_id != 0 && in_array($error_id, $errors)) { 
    echo $errors[$error_id]; 
} 

Spero che questo aiuti.

+0

Grande, e grazie per aver incluso i moduli brevi per l'array e se la dichiarazione è stata utile! – Rogare

+0

in_array ($ error_id, $ errori) dovrebbe essere array_key_exists ($ error_id, $ errori) – mcriecken

-3

L'utilizzo della sessione è una buona opzione. È possibile cancellare il valore della sessione non appena viene visualizzato l'errore. Ma se non vuoi usare la sessione puoi modificare il tuo URL come segue.

// login failed 
header("location:../login.php?status=0"); 

Preferisco utilizzare la sessione.

1

Se non si desidera utilizzare le sessioni, è possibile utilizzare i codici di errore invece:

header('Location: ../login.php?error=' . urlencode($error_code)); 

Poi, all'interno login.php:

if (isset($_GET['error'])) { 
    switch ($_GET['error']) { 
     case 123: // ... 
      break; 
    } 
} 

Invece di un interruttore ingombranti, è possibile utilizzare un array di ricerca per i messaggi di errore (può essere dipendente dalla lingua).

Btw, l'uso di URI relativi nei reindirizzamenti dell'header non è consigliato, è preferibile un URI assoluto (ad esempio) o URI completo (ad esempio http://example.org/login.php).

+0

Grazie per il puntatore re: URL relativi. Li usavo per spostare facilmente il sito tra test offline e online, ma sembra che il prefisso '/' dovrebbe fare il trucco. Grazie! – Rogare

1

Per la validazione dei form avete 3 opzioni:

  1. Usa AJAX per convalidare - così, non ci sarà alcun bisogno di reindirizzare a tutti.
  2. Utilizzare reindirizzamento e sessione per memorizzare il messaggio di errore lungo con i dati immessi.
  3. Usa reindirizzamento come parte del POST/Redirect/GET patterm

Personalmente vorrei implementare (1) e (3) per le mie forme. (1) per la comodità dell'utente ordinario e (3) per compatibilità con i paranoici come me.

L'utilizzo delle sessioni è davvero un metodo più pulito per le convalide basate su redirec, in quanto non lascerà alcuna pagina POST nella cronologia in nessuna circostanza.Tuttavia, in presenza di una convalida basata su AJAX sembra un po 'eccessivo.

+0

Benvenuti nel canale downvote ... a quanto pare: -/ –

+1

La maggior parte delle risposte a questa domanda sono completamente valide ... Cosa dà. – vanneto

Problemi correlati