I had the same problem. No-cache header directives helped, but some users went through the pain of forcing a refresh despite the warnings.
Here's how I manage it now:
I create a table that delivers a uniqueid called postingflag;
CREATE TABLE postingflag (
id int(11) unsigned NOT NULL auto_increment,
PRIMARY KEY (id)
) TYPE=MyISAM
I created this function:
function postingflag(){
mysql_query("INSERT INTO postingflag VALUES(0)");
return mysql_insert_id();
}
I make my form:
<form action=sumbit.php method=post>
<? $postingflag=postingflag();
echo "
<input type=hidden name=postingflag value=$postingflag>";?>
..and then the rest of the form:
in the submit method I use this code:
<?
$result=mysql_query("SELECT id FROM postingflag WHERE id=$postingflag");
$row=mysql_fetch_array($result);
if($row[0]){
//manage the submit database stuff here;
//once it's done:
mysql_query("DELETE FROM postingflag WHERE id=$postingflag");
}
else{
//the postingflag was deleted, don't repost this data:
die("This form has already been saved");
}