Mantenere dati form in memoria

Scar991

Utente Attivo
30 Apr 2012
167
0
0
Salve a tutti!
Sto provando a realizzare un form di contatti e ho bisogno di aiuto: dopo aver cliccato sul submit, infatti, i dati mi vengono cancellati, e io vorrei che rimanessero in memoria.
Non sono praticissimo di PHP quindi ho fatto qualche ricerca in rete, e questo è il mio risultato, tuttavia non funzionante: ho provato a settare con delle variabili le varie voci dell'array di sessione, in modo da utilizzarle come value per i campi, ma non funziona. Qui sotto c'è il mio codice, chi può darmi una mano?

Nella prima riga della pagina imposto la sessione

PHP:
<?php

session_start();

	 $SID = session_id();
	 
	  $sname = $_SESSION['NOME'];
	  $ssurname = $_SESSION['COGNOME'];
	  $smail = $_SESSION['EMAIL'];
	  $smsg = $_SESSION['MESSAGGIO'];
	  
	  ?>

HTML del form

HTML:
<form id="CONTATTI" name="CONTATTI" method="post">
		 <fieldset>
		 <legend>Contattaci!</legend>
         <p>Hai un consiglio per noi?
         <br />
         Vuoi chiederci qualcosa ma vuoi farlo privatamente? <br />
         Cerchi un contatto diretto?<br />
         Sei nella sezione giusta! Scrivici, e ti risponderemo appena possibile!</p>	
   
         <p>
		 <label for="NOME">Nome</label>
		 <input type="text" name="NOME" id="NOME" value="<?php echo $sname;?>"/>
		 </p>
		 <p>
		 <label for="COGNOME">Cognome</label>
		 <input type="text" name="COGNOME" id="COGNOME" value="<?php echo $ssurname;?>" />
		 </p>
		 <p>
		 <label for="EMAIL">eMail</label>
		 <input type="text" name="EMAIL" id="EMAIL" value="<?php echo $smail;?>" />
		 </p>
		 <p>
		 <label for="MESSAGGIO">Messaggio</label>
		 <textarea name="MESSAGGIO" id="MESSAGGIO" cols="45" rows="5"><?php echo $smsg;?></textarea>
		 </p>
		 <div class="button">
		 <input type="submit" name="send" id="send" value="Invia" />
		 </div>
		 </fieldset>

In questo punto c'è il codice PHP che deve comparire qui sotto. Volevo separare la pagina di action ma non sapevo come far ritornare nella pagina del form il messaggio con gli errori... (qualcuno sa come si può fare? tramite header("location: miosito.it?Variabile); non mi riesce...)

PHP:
<div id="ST_MESS">
         <?php
		 		 
	 	  if (isset($_POST["send"]) && $_POST["send"] == "Invia") { 
		  
		  	if ($_POST['NOME'] == "" or $_POST['EMAIL'] == "" or $_POST['MESSAGGIO'] == "" or strlen($_POST['MESSAGGIO']) < 10) {
				
				$errori = "<p>Campi mancanti o messaggio troppo corto!</p>";
				
				echo $errori;
				echo "<br />";			
				
			} else {
	  
	  // Destinatario  
		  $to = "indirizzo@mail.it"; 
	  
	  // Oggetto  
		  $subject = "Modulo dal sito xxx.it"; 

  	  // Messaggio  
		  $msg = "Contenuto del modulo:\n\n"; 
		  $msg .= "Nome: " . trim(stripslashes($_POST["NOME"])) . "\n"; 
		  $msg .= "Cognome: " . trim(stripslashes($_POST["COGNOME"])) . "\n"; 
		  $msg .= "Email: " . trim(stripslashes($_POST["EMAIL"])) . "\n"; 
		  $msg .= "Messaggio: " . trim(stripslashes($_POST["MESSAGGIO"])) . "\n\n"; 
		  $msg .= "IP: {$_SERVER['REMOTE_ADDR']}. \n";
		  	  
	  // Invio  
		  if (@mail($to, $subject, $msg)) { 
	  
	  // Inoltro corretto  
	  
			  $send_msg = "<p>Il tuo messaggio è stato inviato con successo, ti risponderemo il prima possibile!</p>"; 
			session_unset();
			session_destroy();
		  } else { 
	  
	  // Inoltro fallito 
	  
			  $send_msg = "<p>Si sono verificati dei problemi nell'inviare il tuo messaggio</p>"; 
		  } 
		  echo $send_msg;
		  echo "<br />";
	  } 
		  }
?>
</div>

Chiusura del Form

HTML:
</form>
 
Ho letto il tread e l'ho trovato molto utile: ho solo un problema.

Quando faccio il test di errori la prima volta è tutto ok, setto tutti i campi correttamente per vedere cosa funziona e a quanto pare, sebbene faccia gli invii, i campi vengono settati di nuovo come nel momento dell'errore e il messaggio di conferma non viene visualizzato.

Ti spiego meglio con un esempio:

Nome: John
Cognome: Doe
Email: johndoe non è corretta volontariamente
Messaggio: ABC Deve essere di almeno 10 caratteri

INVIO

Refresh della pagina:

Nome: John
Cognome: Doe
Email: johndoe
Messaggio: ABC

Campi mancanti o messaggio troppo corto!

Correzione:

Nome: John
Cognome: Doe
Email: johndoe@mail.it
Messaggio: Questo messaggio è più lungo di dieci caratteri

INVIO

Refresh della pagina:

Nome: John
Cognome: Doe
Email: johndoe
Messaggio: ABC

Campi mancanti o messaggio troppo corto!

Ma il messaggio viene inviato ugualmente!

Ti posto il codice della mia action:

PHP:
<?php 
session_start();

if (isset($_POST["send"]) && $_POST["send"] == "Invia") { 

	if ($_POST['NOME'] == "" or $_POST['EMAIL'] == "" or $_POST['MESSAGGIO'] == "" or strlen($_POST['MESSAGGIO']) < 10 or (!filter_var($_POST['EMAIL'], FILTER_VALIDATE_EMAIL))) {
				
	$_SESSION['ERRORI'] = "<p>Campi mancanti o messaggio troppo corto!<br /></p>";
	
	$_SESSION['CONT'] = serialize($_POST);
	echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";

	} else {
	  
	  // Destinatario  
		  $to = "mail@example.it"; 
	  
	  // Oggetto  
		  $subject = "Modulo dal sito example.org"; 

  	  // Messaggio  
		  $msg = "Contenuto del modulo:\n\n"; 
		  $msg .= "Nome: " . trim(stripslashes($_POST["NOME"])) . "\n"; 
		  $msg .= "Cognome: " . trim(stripslashes($_POST["COGNOME"])) . "\n"; 
		  $msg .= "Email: " . trim(stripslashes($_POST["EMAIL"])) . "\n"; 
		  $msg .= "Messaggio: " . trim(stripslashes($_POST["MESSAGGIO"])) . "\n\n"; 
		  $msg .= "IP: {$_SERVER['REMOTE_ADDR']}. \n";
		  	  
	  // Invio  
		  if (@mail($to, $subject, $msg)) { 	  
	  // Inoltro corretto  
	  
			  $_SESSION['MSG_OK'] = "<p>Il tuo messaggio è stato inviato con successo, ti risponderemo il prima possibile!</p>"; 
			echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";
		  } else { 
	  
	  // Inoltro fallito 
	  
			  $_SESSION['MSG_KO'] = "<p>Si sono verificati dei problemi nell'inviare il tuo messaggio</p>"; 
		  } 
	  	} 
	}
?>

Questo invece si trova nella pagina HTML

PHP:
<?php

session_start();
if (isset($_SESSION['ERRORI'])) {
	$errori = $_SESSION['ERRORI'];
} else {
	$errori = "";
}

if (isset($_SESSION['MSG_OK'])) {
	$status_ok = $_SESSION['MSG_OK'];
} else {
	$status_ok ="";
}

if (isset($_SESSION['MSG_KO'])) {
	$status_ko = $_SESSION['MSG_KO'];
} else {
	$status_ko = "";
}

if (isset($_SESSION['CONT'])) {
	$cont = unserialize($_SESSION['CONT']);
} else {
	$cont = array();
}

?>

// [...]

<form id="CONTATTI" name="CONTATTI" method="post" action="/check_contatti.php">
		 <fieldset>
		 <legend>Contattaci!</legend>
         <p>Hai un consiglio per noi?
         <br />
         Vuoi chiederci qualcosa ma vuoi farlo privatamente? <br />
         Cerchi un contatto diretto?<br />
         Sei nella sezione giusta! Scrivici, e ti risponderemo appena possibile!</p>	
   
         <p>
		 <label for="NOME">Nome</label>
		 <input type="text" name="NOME" id="NOME" value="<?php echo $cont['NOME'];?>"/>
		 </p>
		 <p>
		 <label for="COGNOME">Cognome</label>
		 <input type="text" name="COGNOME" id="COGNOME" value="<?php echo $cont['COGNOME'];?>" />
		 </p>
		 <p>
		 <label for="EMAIL">eMail</label>
		 <input type="text" name="EMAIL" id="EMAIL" value="<?php echo $cont['EMAIL'];?>" />
		 </p>
		 <p>
		 <label for="MESSAGGIO">Messaggio</label>
		 <textarea name="MESSAGGIO" id="MESSAGGIO" cols="45" rows="5"><?php echo $cont['MESSAGGIO'];?></textarea>
		 </p>
		 <div class="button">
		 <input type="submit" name="send" id="send" value="Invia" />
		 </div>
		 </fieldset>
         <div id="ST_MESS">
         <?php
		 if ($errori != "") {
			 echo $errori;
			 echo "<br />";
		 } elseif ($status_ok != "") {
			 echo $status_ok;
			 echo "<br />";
			 session_destroy();
		 } elseif ($status_ko != "") {
			 echo $status_ko;
			 echo "<br />";
		 }
		 ?>
</div>
		 </form>

Come mai non funge?
 
Il messaggio è inviato ma compare il messaggio d'errore con i vecchi dati, quelli sbagliati
 
ciao
prova ad aggiungere la riga
PHP:
<?php
//.....
		if (@mail($to, $subject, $msg)) {       
			if(isset($_SESSION)){unset($_SESSION);}//prova ad aggiungere questa riga
			// Inoltro corretto  
			$_SESSION['MSG_OK'] = "<p>Il tuo messaggio è stato inviato con successo, ti risponderemo il prima possibile!</p>"; 
            echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";
		} else { 
			// Inoltro fallito //e forse conviene anche qui
			$_SESSION['MSG_KO'] = "<p>Si sono verificati dei problemi nell'inviare il tuo messaggio</p>"; 
		} 
//....
?>
poi mi sai dire
 
A quanto pare funziona tutto tranne che il campo email.

Ho inserito alcuni valori nei campi, ho cliccato su "invia" e mi ha dato l'errore.
Giusto, perché avevo saltato la mail.

Inserisco un valore nella mail, del tipo "example". Mi ha dato l'errore, perché non è un indirizzo mail.

Provo "example@mail.it", mi dà errore nuovamente, e il campo mail ritorna ad essere "example"...

Gli altri invece (nome, cognome e testo) si aggiornano correttamente, sia se aggiungo sia se tolgo parole dal campo...
 
ciao
questa non la capisco, i vari post in caso di errore vanni a valorizzare
PHP:
$_SESSION['CONT'] = serialize($_POST);
che conterra quindi nome cognome email messaggio
in caso di invio corretto o cancella tutta la sessione o non la cancella non può cancellarla "parzialmente"
 
Sì appunto anche io non capisco per lo stesso motivo, eppure è così! Ti riposto il codice... Magari ho fatto ca*ate io...

contattaci.php

PHP:
<?php

session_start();
if (isset($_SESSION['ERRORI'])) {
	$errori = $_SESSION['ERRORI'];
} else {
	$errori = "";
}

if (isset($_SESSION['MSG_OK'])) {
	$status_ok = $_SESSION['MSG_OK'];
} else {
	$status_ok ="";
}

if (isset($_SESSION['MSG_KO'])) {
	$status_ko = $_SESSION['MSG_KO'];
} else {
	$status_ko = "";
}

if (isset($_SESSION['CONT'])) {
	$cont = unserialize($_SESSION['CONT']);
} else {
	$cont = array();
}

?>

//[...]

    <h1>Contattaci!</h1>
        <form id="CONTATTI" name="CONTATTI" method="post" action="/check_contatti.php">
		 <fieldset>
		 <legend>Contattaci!</legend>
         <p>Hai un consiglio per noi?
         <br />
         Vuoi chiederci qualcosa ma vuoi farlo privatamente? <br />
         Cerchi un contatto diretto?<br />
         Sei nella sezione giusta! Scrivici, e ti risponderemo appena possibile!</p>	
   
         <p>
		 <label for="NOME">Nome</label>
		 <input type="text" name="NOME" id="NOME" value="<?php echo $cont['NOME'];?>"/>
		 </p>
		 <p>
		 <label for="COGNOME">Cognome</label>
		 <input type="text" name="COGNOME" id="COGNOME" value="<?php echo $cont['COGNOME'];?>" />
		 </p>
		 <p>
		 <label for="EMAIL">eMail</label>
		 <input type="text" name="EMAIL" id="EMAIL" value="<?php echo $cont['EMAIL'];?>" />
		 </p>
		 <p>
		 <label for="MESSAGGIO">Messaggio</label>
		 <textarea name="MESSAGGIO" id="MESSAGGIO" cols="45" rows="5"><?php echo $cont['MESSAGGIO'];?></textarea>
		 </p>
		 <div class="button">
		 <input type="submit" name="send" id="send" value="Invia" />
		 </div>
		 </fieldset>
         <div id="ST_MESS">
         <?php
		 if ($errori != "") {
			 echo $errori;
			 echo "<br />";
		 } elseif ($status_ok != "") {
			 echo $status_ok;
			 echo "<br />";
			 session_destroy();
		 } elseif ($status_ko != "") {
			 echo $status_ko;
			 echo "<br />";
		 }
		 ?>
	 </div>
	 </form>

check_contatti.php

PHP:
<?php 
session_start();

if (isset($_POST["send"]) && $_POST["send"] == "Invia") { 

	if ($_POST['NOME'] == "" or $_POST['EMAIL'] == "" or $_POST['MESSAGGIO'] == "" or strlen($_POST['MESSAGGIO']) < 10 or (!filter_var($_POST['EMAIL'], FILTER_VALIDATE_EMAIL))) {
				
	$_SESSION['ERRORI'] = "<p>Campi mancanti o messaggio troppo corto!<br /></p>";
	
	$_SESSION['CONT'] = serialize($_POST);
	echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";

	} else {
	  
	  // Destinatario  
		  $to = "example@mail.com"; 
	  
	  // Oggetto  
		  $subject = "Modulo dal sito example.org"; 

  	  // Messaggio  
		  $msg = "Contenuto del modulo:\n\n"; 
		  $msg .= "Nome: " . trim(stripslashes($_POST["NOME"])) . "\n"; 
		  $msg .= "Cognome: " . trim(stripslashes($_POST["COGNOME"])) . "\n"; 
		  $msg .= "Email: " . trim(stripslashes($_POST["EMAIL"])) . "\n"; 
		  $msg .= "Messaggio: " . trim(stripslashes($_POST["MESSAGGIO"])) . "\n\n"; 
		  $msg .= "IP: {$_SERVER['REMOTE_ADDR']}. \n";
		  	  
	  // Invio  
		  if (@mail($to, $subject, $msg)) {
			  if(isset($_SESSION)){unset($_SESSION);} 	  
	  // Inoltro corretto  
	  
			  $_SESSION['MSG_OK'] = "<p>Il tuo messaggio è stato inviato con successo, ti risponderemo il prima possibile!</p>"; 
			echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";
		  } else { 
	  
	  // Inoltro fallito 
	  		  if(isset($_SESSION)){unset($_SESSION);}
			  $_SESSION['MSG_KO'] = "<p>Si sono verificati dei problemi nell'inviare il tuo messaggio</p>"; 
		  } 
	  	} 
	}
?>

Noti qualcosa che a me sfugge?
 
ciao
prova a mettere un var_dump
PHP:
<?php
//......
      // Invio  
          if (@mail($to, $subject, $msg)) {
              if(isset($_SESSION)){unset($_SESSION);}
              var_dump($_SESSION);//aggiungi questa riga che poi toglierai
      // Inoltro corretto  
//.....
?>
poi prova a fare un form errato, quando torni indietro lo fai giusto.
dimmi cosa risulta al var_dump nei due casi
 
Non mi risulta nulla perché il punto in cui mi hai chiesto di inserirlo è in una action a parte e sebbene abbia passato con la Session il valore, non riesco a visualizzare nulla :S
 
ciao
prova a fare queste correzioni
PHP:
<?php 
session_start();
if (isset($_POST["send"]) && $_POST["send"] == "Invia") { 
	if (trim($_POST['NOME']) == "" || strlen(trim($_POST['MESSAGGIO'])) < 10 || (!filter_var($_POST['EMAIL'], FILTER_VALIDATE_EMAIL))) { 
		$_SESSION['ERRORI'] = "<p>Campi mancanti o messaggio troppo corto!<br /></p>";
    	//$_SESSION['CONT'] = serialize($_POST);
		unset($_POST["send"]);
		$_SESSION['CONT'] = $_POST;
    	//echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";
	}else{
		// Destinatario  
		$to = "example@mail.com"; 
		// Oggetto  
		$subject = "Modulo dal sito example.org"; 
        // Messaggio  
		$msg = "Contenuto del modulo:\n\n"; 
		$msg .= "Nome: " . trim(stripslashes($_POST["NOME"])) . "\n"; 
		$msg .= "Cognome: " . trim(stripslashes($_POST["COGNOME"])) . "\n"; 
		$msg .= "Email: " . trim(stripslashes($_POST["EMAIL"])) . "\n"; 
		$msg .= "Messaggio: " . trim(stripslashes($_POST["MESSAGGIO"])) . "\n\n"; 
		$msg .= "IP: {$_SERVER['REMOTE_ADDR']}. \n";
		// Invio  
		if (mail($to, $subject, $msg)) {
			if(isset($_SESSION)){$_SESSION=array();}       
			// Inoltro corretto  
			$_SESSION['MSG_OK_KO'] = "<p>Il tuo messaggio è stato inviato con successo, ti risponderemo il prima possibile!</p>"; 
			//echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";
		}else{ 
			// Inoltro fallito 
            if(isset($_SESSION)){$_SESSION=array();}
			$_SESSION['MSG_OK_KO'] = "<p>Si sono verificati dei problemi nell'inviare il tuo messaggio</p>"; 
		} 
	}
	echo "<meta http-equiv='Refresh' content='0; URL=/contattaci.php'>";
}
?>

PHP:
<?php
session_start();
if (isset($_SESSION['ERRORI'])) {
    $errori = $_SESSION['ERRORI'];
} else {
    $errori = "";
}
if (isset($_SESSION['MSG_OK_KO'])) {
    $status_ok_ko = $_SESSION['MSG_OK_KO'];//quindi o uno o l'altro
} else {
    $status_ok_ko = "";
}
if (isset($_SESSION['CONT'])) {
    $cont = $_SESSION['CONT'];
} else {
    $cont = array();
}
?>

//[...]

    <h1>Contattaci!</h1>
        <form id="CONTATTI" name="CONTATTI" method="post" action="/check_contatti.php">
         <fieldset>
         <legend>Contattaci!</legend>
         <p>Hai un consiglio per noi?
         <br />
         Vuoi chiederci qualcosa ma vuoi farlo privatamente? <br />
         Cerchi un contatto diretto?<br />
         Sei nella sezione giusta! Scrivici, e ti risponderemo appena possibile!</p>    
   
         <p>
         <label for="NOME">Nome</label>
         <input type="text" name="NOME" id="NOME" value="<?php echo $cont['NOME'];?>"/>
         </p>
         <p>
         <label for="COGNOME">Cognome</label>
         <input type="text" name="COGNOME" id="COGNOME" value="<?php echo $cont['COGNOME'];?>" />
         </p>
         <p>
         <label for="EMAIL">eMail</label>
         <input type="text" name="EMAIL" id="EMAIL" value="<?php echo $cont['EMAIL'];?>" />
         </p>
         <p>
         <label for="MESSAGGIO">Messaggio</label>
         <textarea name="MESSAGGIO" id="MESSAGGIO" cols="45" rows="5"><?php echo $cont['MESSAGGIO'];?></textarea>
         </p>
         <div class="button">
         <input type="submit" name="send" id="send" value="Invia" />
         </div>
         </fieldset>
         <div id="ST_MESS">
<?php
if ($errori != "" || $status_ok_ko != ""){
	echo $errori;
	echo "<br />";
	echo $status_ok_ko;
	echo "<br />";
	$_SESSION=array();
}
?>
     </div>
     </form>

p.s.
non metti nelle verifiche anche il cognome? oppure è opzionale?
 
Funziona tutto tranne il messaggio.
Ho provato a scriverlo più corto, mi da errore e NON invia il messaggio (corretto).

Lo cambio: lo inserisco più lungo di 10 caratteri, invio.
Mi da il vecchio messaggio (corto) e l'errore, ma invia il messaggio ugualmente...
Che gli prende???!

P.S. Il cognome è opzionale ;)
 
Se tutto va bene e avviene anche l'invio devi mettere un valore NULL alle sessioni di errore. Altrimenti rimangono anche al ritorno al form :)
 
Borgo si fida solo di te. Prova a cambiare con il suggerimento che ho appena postato :)
 
Ahahah! Nono, assolutamente! Appena potrò (gennaio = periodo d'esami) testerò il tuo consiglio, mi aspettavo la review di Borgo, tutto qua ;) Ti faccio sapere appena faccio il controllo :D
 

Discussioni simili