Autor Zpráva
mirio
Profil
Ahoj,

vím, že už se to tady řešilo vícekrát a já si ty odkazy tady prošel, ale čím více toho čtu, tím více jsem z toho zmatený.

Mám skript "diskuze.php", který po odeslání dat metodou POST odkazuje sám na sebe. Vše funguje, ale po stisknutí F5 nebo kliknutí na "Aktualizaci stránky" se mi (pochopitelně) data znova zapíšou do databáze, což samozřejmě nechci.

Zkoušel jsem to ošetřit pomocí "header: Location", ale bezúspěšně.

Pomůžete mi s tím, prosím? Pokud potřebujete více informací, ptejte se.

Dík moc.
okolojdouci
Profil *
http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=125838
mirio
Profil
Ok, chápu to teda správně tak, že vemu celý skript, který se stará o vyhodnocení, ošetření a zapsání dat z formuláře, dám ho do nějakého jiného skriptu (např. zapis.php"), kde všechno proběhne, ten pak ukončím pomocí header("Location: diskuze.php"); a ukončím exitem?

Toť vše?
okolojdouci
Profil *
mirio:
Jen bych dodal, že před přesměrováním nesmí být žádné echo.
mirio
Profil
Heh, tak mi to píše to, čeho jsem se obával - Headers already sent..., přitom tam žádný výstup nevidím, i když tam určitě nějaký je. :-)

<?php 

require ("constants.php");
// 1. Připojení k databázi
$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
if (!$connection) {
	die ("Připojení k databázi selhalo: " . mysql_error() );
}
// 2. Výběr databáze
$db_select = mysql_select_db(DB_NAME, $connection);
if (!$db_select) {
	die ("Nepodařilo se vybrat požadovanou databázi: " . mysql_error() );
}
mysql_set_charset("utf8");

if (!empty ($_POST["form_nick"])&&($_POST["form_prispevek"])&&($_POST["robot"]*1==6)) {
$ip = $_SERVER["REMOTE_ADDR"];
$hostname = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
$vytvoreno = time();
$_POST["form_nick"] = Trim($_POST["form_nick"]); //odstranění prázdných znaků
$_POST["form_prispevek"] = Trim($_POST["form_prispevek"]); //odstranění prázdných znaků
$_POST["form_nick"] = htmlspecialchars($_POST["form_nick"]); //odstranění tagů
$_POST["form_prispevek"] = htmlspecialchars($_POST["form_prispevek"]); //odstranění tagů

// zde je podmínka pro rozdělení příliš dlouhých slov
foreach(explode(" ", strip_tags($_POST["form_prispevek"])) as $key => $line) {
  if (strlen($line) > 35) $_POST["form_prispevek"] = str_replace($line, wordwrap($line, 45, " ", 1), $_POST["form_prispevek"]);
}

$nick = $_POST["form_nick"];
$prispevek = $_POST["form_prispevek"];

$diskuze_zapis = mysql_query("INSERT INTO diskuze (diskuze_id, nick, prispevek, vytvoreno, ip, hostname, aktivni) VALUES (NULL, \"$nick\", \"$prispevek\", \"$vytvoreno\", \"$ip\", \"$hostname\", \"1\") ", $connection);
header("Location: diskuze.php");
exit;
}

?>


Constants.php pak vypadá takto...

<?php 
// Databázové konstanty
define ("DB_SERVER", "xxxxxxx");
define ("DB_USER", "xxxx");
define ("DB_PASSWORD", "xxxxxxxxx");
define ("DB_NAME", "xxxxxxxxxxx");
?>
mirio
Profil
Tak vyřešeno, byl tam někde skrytý znak, který se tvářil jako výstup. Díky za pomoc.
motik
Profil
mirio:
Vše funguje, ale po stisknutí F5 nebo kliknutí na "Aktualizaci stránky" se mi (pochopitelně) data znova zapíšou do databáze, což samozřejmě nechci.

možná by se to dalo ještě řešit
if (isset($_SERVER['HTTP_CACHE_CONTROL'])) $_POST = array(); 

(pokud se teda proměná vyskytuje jen při refresh stránky) ale nevím, jak moc je to spolehlivé..
mirio
Profil
Možná ano, ale postup, viz. výše, je jednoduchý a spolehlivě funguje. Je třeba si jen dát pozor na ty výstupy, aby nedošlo na "Headers already sent...", protože pak se to blbě hledá.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0