Autor Zpráva
Sobky
Profil
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
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
To s tím nesouvisí.
Sobky
Profil
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
mmm 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
Lenže, keď napíšem hocičo do toho header tak to nič nespraví...
mimochodec
Profil
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
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
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
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
Tak už to ide, veeľká vďaka Vám všetkým :)

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: