Autor | Zpráva | ||
---|---|---|---|
Sobky Profil |
#1 · Zasláno: 23. 3. 2015, 16:36:23
Zdravím, vytváram komentáre k dannej stránke. Všetko ide v pohode, len keď dá uživaťeľ F5/reload stránky, tak vyhodí alert. Niečo si novu načítaním údajov zadaných v inputoch. Keď dá pokračovať, tak sa ten komentár znovu uloží do databázy. Dá sa tomu nejak zabrániť?
Prikladám aj code: <form method="POST" id="comment"> <a class="comment-headname">Pridať komentár!</a><br> <textarea name="comment" class="comment" placeholder="Sem napíšte komentár"></textarea><br> <input name="comment-submit" class="login-submit" value="Komentovať" type="submit"> </form> <?php if($_POST['comment-submit']) { if(!empty($_POST['comment'])){ session_start(); include 'options/options.php'; $comment = $_POST['comment']; $url = $_GET['page']; $date = date("Y-m-d H:i:s"); $autor = $_SESSION['nick']; $adminmysqli = new mysqli($databasewebserver, $databasewebuser, $databasewebpass, $databasewebname); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $sql="INSERT INTO comments (forpage, author, date, content) VALUES ('$url', '$autor', '$date', '$comment')"; if (!mysqli_query($adminmysqli,$sql)) { die('Error: ' . mysqli_error($adminmysqli)); } header("Location: /"); mysqli_close($adminmysqli); }else{ $badanswer = "Komentár musí byť vyplnený!"; } } ?> |
||
Keeehi Profil |
Ano dá. Pomocí toho přesměrování header location. Ovšem asi ti nefunguje. Tady je proč Nejčastější potíže s PHP (FAQ) » headers already sent…
Taky mám pocit, že ta adresa má být absolutní. http://... |
||
Sobky Profil |
#3 · Zasláno: 23. 3. 2015, 16:47:34
Hmm toto nefunguje...
Asi pretože, že v .htaccess mám toto #pokud je to zanorene v nejakem adresari, uvedte ho za / RewriteBase / #ignoruj vsechny opravdove adresare RewriteCond %{REQUEST_FILENAME} !-d #ignoruj vsechy opravdove soubory (php skripty, obrazky, styly) RewriteCond %{REQUEST_FILENAME} !-f #vsechno ostatni necha vygenerovat index.php (ten se musi rozhodnout podle promenne url, zda stranka existuje a jaky ma mit obsah) RewriteRule ^(.*)$ index.php?page=$1 [QSA,L] |
||
Keeehi Profil |
#4 · Zasláno: 23. 3. 2015, 16:48:31
To s tím nesouvisí.
|
||
Sobky Profil |
#5 · Zasláno: 23. 3. 2015, 17:09:23
Tak čo potom tam mám dať? Inak to session.start() tam nemusí byť, už som ho aj vymazal...
|
||
Tomáš123 Profil |
Sobky:
Príkazom na riadku 28 akurát reštartuješ spracúvajúci skript. Namiesto lomítka odkáž na súbor, v ktorom sa zobrazujú komentáre. Po riadku 18 by som pridal exit() .
ÚPRAVA: Ešte som chcel pripísať, že som asi zle pochopil problém, keď vravíš, že sa to opraví po stlačení F5-ky. mimochodec to ale vyriešil. Každopádne máš na môj vkus divne rozkúskovaný kód. Obaľuj kód do blokov if (ak je splnená podmienka) a else (v ostatných prípadoch). Napríklad na tom riadku 18 sa vypíše chyba, ale skript pokračuje. Celkovo je to ale v tomto skripte iba dekorácia, žiadny problém to pravdepodobne nespôsobuje.
Moderátor juriad: Změna číslování řádků.
|
||
mimochodec Profil |
m>mm duplicita
Moderátor juriad: Přesunuto; duplicitu smažu
Sobky: Vyřeš si problém v tom prvním vláknu. Princip je jednoduchý - po odeslání formuláře ho zpracuješ a následně použiješ header location, jak ti tam někdo radil. Přesměruješ na adresu bez parametrů. |
||
Sobky Profil |
#8 · Zasláno: 23. 3. 2015, 20:32:27
Lenže, keď napíšem hocičo do toho header tak to nič nespraví...
|
||
mimochodec Profil |
#9 · Zasláno: 23. 3. 2015, 20:39:26
Sobky:
http://php.net/manual/en/function.header.php - tady máš příklady. Důležité je, že to musí proběhnout předtím, než cokoliv odejde do prohlížeče, tzn. před prvním echem. V opačném případě to zahlásí chybu. |
||
Sobky Profil |
#10 · Zasláno: 23. 3. 2015, 21:02:04 · Upravil/a: Sobky
Toto je celý výpis komentárov z db.
<div class="new"> <div class="title-headname"><a>Komentáre</a></div> <div class="title-core"><?php $comquery = "SELECT * FROM comments WHERE forpage ='". mysqli_real_escape_string($webmysqli, $page)."' ORDER by date ASC"; $comresult = mysqli_query($webmysqli, $comquery); while($comment = mysqli_fetch_array($comresult)) { ?> <div class="comment-area"> <img class="comment-photo" src="http://minotar.net/avatar/<?php echo $comment['author'] ?>"/> <div class="comment-comment"> <a class="comment-info"><strong><?php echo $comment['author'] ?> |</strong> <?php echo date('d.m. Y H:i:s', strtotime($comment['date'])) ?></a><br> <a class="comment-text"><?php echo $comment['content'] ?></a> </div> </div> <?php }?> <div class="comment-area"> <?php if($_SESSION["logged"]){ ?> <?php include 'script/writecomment.php';?> <a class="comment-headname">Pridať komentár!</a><br> <form method="POST" id="comment"> <textarea name="comment" class="comment"></textarea><br> <input name="comment-submit" class="login-submit" value="Komentovať" type="submit"> </form> <?php }else{ ?> <a class="comment-headname">Pridať komentár!</a><br><br> <a>Pri vkladaní komentáru musíš byť prihlásený!</a> <?php } ?> </div> </div> </div> A toto je script na vloženie komentára: Ale kd edať to header potom? if(isset($_POST['comment-submit'])) { if(!empty($_POST['comment'])){ include 'options/options.php'; $comment = $_POST['comment']; $url = $_GET['page']; $date = date("Y-m-d H:i:s"); $autor = $_SESSION['nick']; $adminmysqli = new mysqli($databasewebserver, $databasewebuser, $databasewebpass, $databasewebname); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); }else{ $sql="INSERT INTO comments (forpage, author, date, content) VALUES ('$url', '$autor', '$date', '$comment')"; if (!mysqli_query($adminmysqli,$sql)) { die('Error: ' . mysqli_error($adminmysqli)); } mysqli_close($adminmysqli); } }else{ $badanswer = "Komentár musí byť vyplnený!"; } } To header som skúsil dať tu: if(isset($_POST['comment-submit'])) { header("Location: #"); if(!empty($_POST['comment'])){ Ono to funguje ale len dovtedy, pokým to bude vidieť na stránke (nemôže byť pod tým ako sa roluje) |
||
Tomáš123 Profil |
#11 · Zasláno: 23. 3. 2015, 21:38:01 · Upravil/a: Moderátor (editace znemožněna) 25. 3. 2015, 13:55:37
Sobky:
„Ale kd edať to header potom?“ Vôbec nemusíš meniť pozíciu príkazu. Môžeš napríklad výpis echom neuskutočniť a uložiť si hlášku do premennej, ktorú vypíšeš neskôr. Problém je ale v tom, že je skript zle navrhnutý. Mal by byť rozdelený do dvoch častí: $v_poriadku = false; if(hodnoty_su_v_poriadku) { //pripojenie do databázy if(pripojenie) { //zápis do databázy if(databaza) { $v_poriadku = true; header('Location: ./'); } else { $hlaska = "Pri ukladaní do databázy nastala chyba."; } } else { $hlaska = "Nepodarilo sa pripojiť do databázy."; } } else { $hlaska = "Hodnoty nie sú v poriadku"; } //keď niekde nastala chyba if($v_poriadku !== true) { echo (!empty($hlaska) ? $hlaska : "Niekde sa stala chyba"; } Moderátor juriad: Vyměněn původní zdroják na Tomášovu žádost.
|
||
mimochodec Profil |
#12 · Zasláno: 23. 3. 2015, 22:10:55
Sobky:
Nejjednodušší cesta: <form method="POST" id="comment" action="zpracovani_formu.php"> Ve zpracovani_formu.php bude toto: <?php //.. připojení k databázi .. // tvůj skript pro vložení formulára // přesměrování na stránku, která se má zobrazit ?> Ještě jednou: před tím přesměrováním nesmí být žádné echo. Jestli chceš echovat nějakou zprávu, přidej si parametr do té adresy, kam přesměrováváš, tam ho GETem načti a zobraz případnou hlášku. |
||
Sobky Profil |
#13 · Zasláno: 24. 3. 2015, 19:25:56
Tak už to ide, veeľká vďaka Vám všetkým :)
|
||
Časová prodleva: 9 let
|
0