pagina indietro ritrovando gli stessi dati nei campi input

Ciao

Prima di caricare i dati nel db effettuo dei controlli sugli input dell'utente e se c'è qualche problema segnalo

l'errore con una cosa del tipo:

echo "<center><b>la data non è valida.</b> &nbsp;&nbsp;

      <input type=\"button\" value=\"Indietro\" onclick=\"history.back(1)\"></center>";                        

   }

Cliccando sul bottone indietro si ritorna alla pagina del form ritrovando gli stessi dati nei campi inputi precedentemente compilati (in questo modo si modifica solo l'input con il dato sbagliato).

Ok.

In una pagina funziona tutto a dovere, in un'altra (con un codice complessivo molto simile e una struttura praticamente identica, utilizzo lo stesso codice sopra per segnare l'eventuale errore solo che ritornando indietro alla stessa pagina i dati dei campi input del form vengono cancellati e l'utente è costretto a reinserirli da capo.

Sto spulciando il codice riga per riga delle 2 pagina ma non riesco a capire perchè una si comporta in un modo e l'altra diversamente.

Nell'una e nell'altra pagina, dicevo, la struttura è identica.

Una funzione che  visualizza il form e nella stessa pagina un'altra funzione in cui vengono controllati i dati + il codice sopra col bottone indietro.

Avete qualche idea voi?

Grazie

inviato 5 anni fa
frankphp
modificato 5 anni fa
X 0 X

Cambia approccio: il submit del form dovrebbe essere sulla stessa pagina, in modo da mostrare i campi riempiti con i relativi valori immessi (e filtrati, mi raccomando!).

Se il form è valido, allora puoi eseguire le operazioni necessarie (salvataggi di dati, ecc.) e rimandare l'utente su un'altra pagina.

risposto 5 anni fa
Massimiliano Arione
X 0 X

HTTP non ha la persistenza dei dati quindi se vai da una pagina all'altra perdi i dati contenuti nella cache del protocollo (non quella del browser).

Se invece fai click su pagina indietro (tramite la tua funzione javascript o il tasto indietro del browser è la stessa cosa) ogni volta vengono ricaricati i dati dalla cache del browser (non in IE6 non so 7, 8 e 9 ma non mi pare).

Il trucco è quello di richiamare la sessione così:

session_start();
header("Cache-control: private");

ma solo e soltanto per star sicuri che il browser ricordi i dati della sua cache.

Come ti ha detto garak per poter mantenere i dati da una pagina all'altra devi fare un approccio diverso, solitamente un form si rimand alla stessa pagina che l'ha generato proprio per evitare simili problemi.

Puoi così gestire facilmente i dati dato che rimangono in HTTP.

Per esempio una pagina chiamata mio_form.php con un form semplicissimo:

<form method="post" action="mio_form.php">
<?php if ($errore == true) echo '<p>Errore! Controlla cosa hai inserito.</p>'; ?>
  <input type="text" name="cerca" value="<?php echo $stringaRicerca; ?>" />
  <input type="submit" name="invia" value="cerca" />
</form>

Vedi già tre cose: la prima che in action porta il nome della pagina stessa e che in "text" una sezioncina in PHP riporta la stringa che è stata inserita dall'utente la volta precedente, quando cioè aveva inserito una richiesta e poi premuto il tasto "cerca".

Infine un'altra sezione in PHP che riporta in caso di errore una stringa esplicativa.

Un ipotetica sezione di controllo di tale form su mio_form.php può essere gestita in questo modo:

if (isset($_POST['invia']) && $_POST['invia'] == 'cerca') {
  $stringaRicerca = $_POST['cerca']; // va be evito i controlli XSS eccetera è solo uno squallido esempio.
  if ($stringaRicerca = '') $errore = true; else $errore = false;
} else $stringaRicerca = '';

nota che se non si preme il tatso di ricerca la stringa $stringaRicerca viene posta a blank (0, campo vuoto, non c'è nulla :P)

Tutto il file mio_form.php diventa:

<?php
session_start();
header("Cache-control: private");
if (isset($_POST['invia']) && $_POST['invia'] == 'cerca') {
  $stringaRicerca = $_POST['cerca']; // va be evito i controlli XSS eccetera è solo uno squallido esempio.
  if ($stringaRicerca = '') $errore = true; else $errore = false;
} else $stringaRicerca = '';
?>
<html><body>
<form method="post" action="mio_form.php">
<?php if ($errore == true) echo '<p>Errore! Controlla cosa hai inserito.</p>'; ?>
  <input type="text" name="cerca" value="<?php echo $stringaRicerca; ?>" />
  <input type="submit" name="invia" value="cerca" />
</form>
</body></html>

Ovvio è un esempio semplice ma il concetto è quello, va solo sviluppato in base alle tue esigenze.

risposto 5 anni fa
Marco Grazia
X 0 X

Al di la' delle soluzione tutte valide sopra proposte,

la mia perplessità era dovuta al fatto che 2 pagine con codice simile (apparentemente poi..) e bottone indietro uguale (cioè stesso codice) una mi conservava i dati e un altra no.

Ovviamente una causa tecnica ci sarà sicuramente, ma non sono riuscito ad individuarla.

Grazie

risposto 5 anni fa
frankphp
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda