invio multiplo e refresh pagina come evitare?

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
43
Massa, Italy
Salve, mi sapete dire come fare per evitare se io premo f5 e mi rinvia i dati dal form al database ?
ecco il codice che uso io (e solo un pezzo poi ci sono delle classi dietro).

PHP:
<?php

require_once(dirname(__FILE__) . '/../../inc.php');


if(isset($_POST["submit"]))
{
	 if($_POST["titolo"]=="")
		{ 
		  $error =  "Inserire il titolo.";
			
		}
		
		elseif($_POST["_text"]=="")
		{ 
		  $error =  "Inserire testo.";
			
		}
	
		elseif($_POST["data"]=="")
		{ 
		  $error =  "Inserire la data";
			
		}
		elseif($_POST["stato"]=="")
		{ 
		  $error =  "Inserire lo stato.";
			
		}else
		
		{
	
			
				$query = "INSERT INTO note(";
				$query.="_userid,";
				$query.="_user,";
				$query.="_titolo,";
				$query.="_text,";
				$query.="_stato,";
				$query.="_data)VALUES('".$_POST["userid"]."',";
				$query.="".$db->qstr($_POST["Name"]).",";
				$query.="".$db->qstr($_POST["titolo"]).",";
				$query.="".$db->qstr($_POST["_text"]).",";
				$query.="".$db->qstr($_POST["stato"]).",";
				$query.="".$db->qstr($_POST["data"]).")";
			
				$result = $db->query($query);
				
				$num = mysql_affected_rows();
				
				 if($num == 1)  {
                      $msg =  "Aggiungta : <a href=\"index.php\">Torna alla pagina</a><br><br><br><br><br>";
					  
						
                    
                       }
                            else  {
                                  $msg =  "<br />Dati NON inseriti - Riprova";
                              
                                   }
				
				
				
			}
			
}

 require_once(dirname(__FILE__) . '/../../template/admin/header.php');  ?>

<?php	if ( isset ( $error ) )	{ echo '			<p style="error">' . $error . '</p>' . "\n";	}	?>
<?php	if ( isset ( $msg ) )	{ echo '			<p class="msg">' . $msg . '</p>' . "\n";	} else {//if we have a mesage we don't need this form again.?>
<p class="titolo">Note - Aggiungi</p>
 
<form id="form" method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<input type = "hidden" name = "check" value ="1">
<table width="100%">
<tr>
	<td></td>
	<td><input type="hidden" name="userid"   value="<?php echo $_SESSION['user_id']?>" readonly /></td>
</tr>
<tr>
	<td>Nome</td>
	<td><input type="text" name="Name"  size="40" value="<?php echo get_username($_SESSION['user_id'])?>" readonly /></td>
</tr>
<tr>
	<td>Data</td>
	<td><input type="text" name="data" size="40"  value="<?php echo date("m-d-Y"); ?>" /></td>
</tr>
<tr>
	<td>Titolo</td>
	<td><input type="text" name="titolo"  size="80" value="<?php if($_POST['titolo']){echo "".$_POST['titolo']."";}?>" /></td>
</tr>
<tr>
	<td>Nota:</td>
	<td><textarea name="_text" rows="10" cols="80"><?php if($_POST['_text']){echo "".$_POST['_text']."";}?></textarea>
 </td>
</tr>

<tr>
	<td>Stato</td>
	<td>  <select name="stato">
        <option selected="selected" value="">SELEZIONA</option>
        <option value="0">Disattivo</option>
        <option value="1">Attivo</option>
        </select></td>
</tr>
</table>
<input class="submit" type="submit" name="submit" value="Aggiungi NOTA" />
</form>
<?php

}
require_once(dirname(__FILE__) . '/../../template/admin/footer.php'); 
?>

grazie aspetto soluzione.
 
1) Inizializza una sessione
2) crea un valore qualsiasi per la sessione, ad esempio una stringa alfanumerica
3) passa il valore all'applicazione che inserisce i dati nel db tramite campo hidden
4) confronta il valore di sessione con quello passato per post
4) una volta effettuato l'inserimento distruggi la sessione

A questo punto il confronto tra valore di sessione e il valore inviato per post restituirà FALSE e lo stesso record non potrà essere inserito nuovamente.
 
1) Inizializza una sessione
2) crea un valore qualsiasi per la sessione, ad esempio una stringa alfanumerica
3) passa il valore all'applicazione che inserisce i dati nel db tramite campo hidden
4) confronta il valore di sessione con quello passato per post
4) una volta effettuato l'inserimento distruggi la sessione

A questo punto il confronto tra valore di sessione e il valore inviato per post restituirà FALSE e lo stesso record non potrà essere inserito nuovamente.

hai un esempio di codice?

grazie mille per la risposta.
 
La struttura è più o meno la seguente:
PHP:
<?php
session_start();

if (isset($_POST['submit'])) {
    if (!isset($_SESSION['code']) || !isset($_POST['code']) || $_POST['code'] != $_SESSION['code']) {
        // sessione non impostata, visualizza un errore
    }

    unset($_SESSION['code']);
    
    // esegui le normali operazioni
}
else {
    $_SESSION['code'] = uniqid();

    echo <<<EOF
<form action="{$_SERVER['REQUEST_URI']}" method="post">
EOF;

    // visualizza i campi del form

echo <<<EOF
    <input type="hidden" name="code" value="{$_SESSION['code']}" />
    <input type="submit" name="submit" value="Invia" />
</form>
EOF;
}
?>
 

Discussioni simili