Autor | Zpráva | ||
---|---|---|---|
mirio Profil |
#1 · Zasláno: 5. 9. 2011, 15:58:28
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 * |
#2 · Zasláno: 5. 9. 2011, 16:00:08
|
||
mirio Profil |
#3 · Zasláno: 5. 9. 2011, 16:18:06
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 * |
#4 · Zasláno: 5. 9. 2011, 16:24:07
mirio:
Jen bych dodal, že před přesměrováním nesmí být žádné echo. |
||
mirio Profil |
#5 · Zasláno: 5. 9. 2011, 16:35:00 · Upravil/a: mirio
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 |
#6 · Zasláno: 5. 9. 2011, 19:21:05
Tak vyřešeno, byl tam někde skrytý znak, který se tvářil jako výstup. Díky za pomoc.
|
||
motik Profil |
#7 · Zasláno: 5. 9. 2011, 20:07:58
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 |
#8 · Zasláno: 6. 9. 2011, 11:37:14
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á.
|
||
Časová prodleva: 13 let
|
0