Opakovane odosielanie prispevkov

Dobrý den,
mam taky problem s opakovanim odosielanim prispevkov na forum.
Ak odoslem spravu tak ju normalne odosle a zobrazi ale po stisknuti na tlacidlo "refresh" mi spravu odosle este raz , a tak sa to moze opakovat.

Poradte mi prosim na to nejaku fintu :)
da se to overit, sic dost lamersky tak, ze si nechas z databaze porovnat, jestli uz existuje se stejnym nadpisem a textem na poslednich par mistech, a kdyz takovy existovat bude, tak nedelej nic, kdyz nebude tak zapis...
Nejlepší je to řešit přesměrováním stránky. Skript, který zpracovává formulář jen uloží data do databáze (nic nevypisuje na výstup) a pak pomocí hlavičky přesměruje na výpis.

Tahle "finta" je popsána v každé knížce o PHP, takže stačí pozorně číst ;)

viz http://cz2.php.net/manual/en/function.header.php
ještě jsem zapomněl uvést, že to přesměrování se dělá pomocí location

header('Location: http://www.example.com/');
No toto header som pouzil,ale to ma presmeruje na odkaz ihned a este ako spustim stranku.

header('Location: http://www.example.com/'); -- dal som to na koniec skriptu
<HTML>Tak to bude problém v logice vašeho skriptování. Ten header je třeba poslat pouze v případě, že zapisujete data do toho fóra, jindy ne.</HTML>
hmm, takye co mam spravit abz to islo normalne ?
udělat skript třeba PridejPrispevekDoDatabaze.php
v tom bude jen php kód pro vložení příspěvku do databáze a pak ten header
příspěvky bude formluář oidesílat na ten skript PridejPrispevekDoDatabaze.php
a to je celý
normalni podminkou.
<?php
if(isset($_POST['submit'])) {
....vas php script....
header("Location: www.vase.stranka.cz");
}
?>
...stranka...
No mam takyto skript

<?php
$query = mysql_query("SELECT * FROM `spam` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' LIMIT 1");
$spamip = @mysql_num_rows($query);
if($spamip == 0){
if(isset($_POST['submit']) && strlen($_POST['message2']) == 0){

if(strlen($_POST['name']) == 0){
$error['name'] = 'Please enter your name';
}
if(strlen($_POST['email']) == 0){
$error['email'] = 'Please enter an e-mail address';
} else {
if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $_POST['email'])){
$error['email'] = 'Please enter a correct e-mail address';
}
}

if(strlen($_POST['message']) < 2){
$error['message'] = 'Please enter a message';
}

if(!isset($error)){
$postentry = @mysql_query("INSERT INTO `entries` (name, email, website, message, date, ip) VALUES ('".addslashes($_POST['name'])."', '".addslashes($_POST['email'])."', '".addslashes($_POST['website'])."', '".addslashes($_POST['message'])."', now(), '".$_SERVER['REMOTE_ADDR']."')");

$message = "Hey there!\n\r You're popular today!\n Someone gave you a guestbook entry:\n\r";
$message .= "From: ".stripslashes($_POST['name'])."\n";
$message .= "E-mail: ".stripslashes($_POST['email'])."\n";
$message .= "Website: ".stripslashes($_POST['website'])."\n\r";
$message .= "Message:\n".stripslashes($_POST['message'])."\n";
mail($email, 'New GuestBook Entry!', $message);

if($postentry == true){
unset($_POST);
}
}

} else if(isset($_POST['submit']) && strlen($_POST['message2']) > 0){
$spamentry = @mysql_query("INSERT INTO `spam` (ip) VALUES ('".$_SERVER['REMOTE_ADDR']."')");

}
} else {
$error['spam'] = 'Your IP: '.$_SERVER['REMOTE_ADDR'].' is banned!';
}
?>

A neslo to ked som to header daval :(


No a v dalsej knihe mam skript :

<?
require ("./obecne.php");

if ($send && $text != ""): // pokiaľ boli odoslané dáta

// odstránime z príspevku HTML dáta a pripravíme údaje pre vloženie do db
$IP = $_SERVER["REMOTE_ADDR"]; //zistíme si prispievateľovu IP adresu
//HTMLSpecialChars odstráni HTML tagy
$text = HTMLSpecialChars($text);
$email = HTMLSpecialChars($email);
$nazov = HTMLSpecialChars($nazov);
$meno = HTMLSpecialChars($meno);
$cas = date("d-m-Y H:i:s"); //zistíme si čas vloženia príspevku
$captcha = HTMLSpecialChars($captcha); //pole kontrolnej otázky - aj tu odstránime HTML

//antispam ochrana je veľmi dôležitá, keďže spamboti s obľubou pridávajú príspevky do gb :)
if ($captcha == "10") {
// vlozime prispevok do db
@$f = mysql_query ("INSERT INTO guestbook VALUES ('','$meno','$email','$nazov','$text','$cas','$IP')");
if (!@$f) {
//ak nastane chyba:
echo "<span style=\"color:red\">Nepodarilo sa uložiť príspevok! Kontaktujte prosím Admina.<br></span>";
echo Mysql_Error(); //pre lepšiu orientáciu v probléme (ak by nastal) si vypíšeme chybovú hlášku
}
}
else
{
//ak ste odpovedali na kontrolnú otázku nesprávne:
echo "<span style=\"color:red\">Skontrolujte zadanú odpoveď na kontrolnú otázku!</span>";
}
endif;

//začiatok výstupu stránky
?>

A tu neje ani to isset()

Tak kde by som to mohol vlozit aby to slo ?
diki
omg ..

proc proste nedas na konec ulozeni prispevku (misto vysano oznameni, ze se prispevek ulozil) header .. ?

header('Location: '.$_SERVER["PHP_SELF"]);

Tak se to odesle samo na sebe a POST promenne zmizí. Pokud jde o vypsani hlasky muzes pouzit treba alternativu ..

header('Location: '.$_SERVER["SCRIPT_NAME"].'?hotovo=ok');

___
Pochybuji, ze jsem jediny, komu se stovka radku cist opravdu nechce ..
Freeze (dreamer.kvalitne.cz)
komu se stovka radku cist opravdu nechce
jo :)

VLADIS (knr-presov.xf.cz)
Vzdycky muzes do stranky vlozit skryty input s nahodnym cislem a toto cislo ulozit treba do session. A pokud poslane cislo != cislo v session, prispevek zahod. Pokud se == pak prispevek pridej a zmen cislo v session, presmeruj na stranku... (tez moznost obflush) Tez muzes smazat vsechny $_GET / $_POST jednoduchym scriptem nebo pres unset.
a)
unset($_GET);
unset($_POST);
b)
foreach ($_GET as $key=>$value)
{$_GET[$key] = '';}
foreach ($_POST as $key=>$value)
{$_POST[$key] = '';}
peta: "Tez muzes smazat vsechny $_GET / $_POST"
=)))))
dobrej vtip. Je sice hezký, že ze serveru umažeš všechny GETy/POSTy, ale to, že u klienta zůstanou a ten je může vesele posílat dál už tě netrápí, že? ;)

původní autor: zamezení vícenáshobného odesílání formuláře se řeší pomocí PRG metody (Post - Redirect -Get) kdy po úsěšném odeslání formuláře přejdeš na tu samou stránku pomocí hlavičky 303, čímž se ze všech POST proměnnýc hstanou neškodné GET proměnné. A není co řešit... :)
Heh, to je pěkný, to jsem neznal :-)
Tom (manual.wz.cz)
nezkousel jsem, zrejme problem Opery nebo jinych nestandardnich prohlizecu, ktere nespravne kesuji stranky.
Osobne pouzivam obflush a presmerovani pres header(), protoze script zpracujici formular mam ve vedlejsim souboru.