PHP [MySQL] eigenes Gästebuch, Probleme bei Refresh

capilano

Lt. Junior Grade
Registriert
Juli 2009
Beiträge
377
Hallo zusammen,
ich habe mir vor einiger Zeit ein eigenes Gästebuch geschrieben, nun habe ich jedoch damit ein Problem. Das Problem ist folgendes:
Wenn ich einen Eintrag mache, lande ich nun (gewollt) auf der 'startseite', jedoch kann ich durch Aktualisieren der Seite x-beliebige Einträge generieren. Ich habe es bereits mit diesem Header-Befehl unter PHP getestet, jedoch wirkt dieser nicht.

hier mein Code:
PHP:
<?php
  $lang['back'] = "Back";
  $lang['title'] = "Commentbox";
  $lang['new_entry'] = "New Entry";
  $lang['no_name'] = "Please insert a Name!";
  $lang['no_text'] = "Please insert a Text!";
 
  $lang_de['back'] = "Zru&uml;ck";
  $lang_de['title'] = "Schreibkiste";
  $lang_de['new_entry'] = "Neuer Eintrag";
  $lang_de['no_name'] = "Bitte einen Namen eintragen!";
  
   if(isset($_REQUEST['action']))
  {
   $action = $_REQUEST['action'];
  }

  function add()
  {
   echo "<a class='gb_link' href='";
                  echo basename($_SERVER["PHP_SELF"]);
                  echo "'>&laquo;&nbsp;Zur&uuml;ck</a>";
    $zufall['zahl1'] = rand(1,10);
    $zufall['zahl2'] = rand(1,10);
    $zufall['zahl3'] = $zufall['zahl1'] + $zufall['zahl2'];
      echo "<br/>";
       echo "<div class='topic'> <br/>";
       echo "<form method='post' action='".$_SERVER["PHP_SELF"]."'>";
        echo "<table>";
         echo "<tr>";
          echo "<td> <span class='m_f_c'>*</span> Name: </td>";
          echo "<td> <input type='text' name='name' value='".$_POST['name']."'></input> </td>";
         echo "</tr>";
         echo "<tr>";
          echo "<td> E-Mail:  </td>";
          echo "<td> <input type='text' name='email' value='".$_POST['email']."'></input></td>";
         echo "</tr>";
         echo "<tr>";
          echo "<td> Homepage:  </td>";
          echo "<td> http://www.<input type='text' name='webseite' value='".$_POST['webseite']."'></input></td>";
         echo "</tr>";
         echo "<tr>";
          echo "<td> <span class='m_f_c'>*</span> Input:  </td>";
          echo "<td colspan='2' ><textarea name='beitrag' rows='8' cols='45'>".$_POST['beitrag']."</textarea> </td>";
         echo "</tr>";
         echo "<tr>";
          echo "<td><span class='m_f_c'>*</span> Captcha: </td>";
          echo "<td><input disabled='disabled' size='1' value='".$zufall['zahl1']."'></input> + <input disabled='disabled' size='1' value='".$zufall['zahl2']."'></input> = <input name='captcha' size='5'></input></td>";
         echo "</tr>";
        echo "</table><br/>";
       echo "<input type='submit' value='Submit Query' name='entry'></input>";
       echo "<input type='hidden' name='action' value='submit'></input>";
       echo "<input type='hidden' name='captcha_erg' value='".$zufall['zahl3']."'></input>";
      echo "</form>";
      echo "<span class='m_f'>* mandatory field</span>";
     echo "</div>";
  }
    
  function insert()
  {
   $captcha=htmlspecialchars($_POST['captcha']);
   $captcha_erg=htmlspecialchars($_POST['captcha_erg']);
   $name = htmlspecialchars($_POST['name']);
   $email = htmlspecialchars($_POST['email']);
   $webseite = htmlspecialchars($_POST['webseite']);
   $beitrag = htmlspecialchars($_POST['beitrag']);

   if($name=='')
   {
    echo "<div class='gberror'>Please insert a Name!</div><br/>";
    add();
    }elseif($beitrag=='')
   {
    echo "<div class='gberror'>Please insert a Text!</div><br/>";
    add();
    }elseif($captcha != $captcha_erg)
   {
    echo "<div class='gberror'>The Captcha are wrong or forget</div><br/>";
    add();
    }else
   {
     $umlaute = Array("/ä/","/ö/","/ü/","/Ä/","/Ö/","/Ü/","/ß/","/</","/>/");
     $replace = Array("&auml;","&ouml;","&uuml;","&Auml;","&Ouml;","&Uuml;","&szlig;","&laquo;", "&raquo;");
     $beitrag = preg_replace($umlaute, $replace, $beitrag);
     $name = preg_replace($umlaute, $replace, $name);
     $sql = "INSERT INTO gaestebuch (`id` ,`name` , `homepage` ,`email` , `beitrag`, `date`, `ip` )  VALUES ( NULL , '".mysql_real_escape_string($name)."','".mysql_real_escape_string($webseite)."', '".mysql_real_escape_string($email)."', '".mysql_real_escape_string($beitrag)."', NOW(),'".$_SERVER['REMOTE_ADDR']."')";
     mysql_query($sql);
   }
}

function show()
{
    $sql = "SELECT * FROM gaestebuch ORDER BY id DESC";
    $result = mysql_query($sql) OR die(mysql_error());
    $eintraege = mysql_num_rows($result);
    if($eintraege > 0)
    {
        // Einträge pro Seite
        $limit = 4;
        //Bestimmen der seiten Anzahl
        $seiten_zahl = $eintraege/$limit;
        $seiten_zahl = ceil($seiten_zahl);
        //Ausgabe der Seiten
        $start = 1;
        
        if($seiten_zahl > 1)
        {
            echo "Seite:&nbsp;";
            for($i=1 ; $i <= $seiten_zahl ; $i++)
            {
                if($i == $_GET['page'])
                {
                    echo '<a style="font-size: 12px; color: #000000; margin:1px;"  href="?page='.$i.'"><b>['.$i.']</b></a>';
                }else
                    {
                        echo '<a style="font-size: 12px; color: #000000; margin:1px;"  href="?page='.$i.'">['.$i.']</a>';
                    }
            }
            echo "<br/><br/>";
        }

        // aktuelle Seite
        if(isset($_GET['page']))
        {
            $page = intval($_GET['page']);
        }else
            {
                $page = 1;
            }
        
        $start = ($page - 1) * $limit;

        $result = mysql_query("SELECT * FROM gaestebuch ORDER BY id DESC LIMIT $start,$limit");
        
        while($row = mysql_fetch_assoc($result))
        {
            echo "<table style='margin-left:5px;' border='0' cellspacing='0' cellpadding='0' width='450px'>";
            echo "<tr><td>";
            echo "#".$row['id'];
            echo "&nbsp;<b>".$row['name']."</b>";
            echo "<div style='float:right;'>";
            
            if($row['homepage'] != "")
                echo "<a rel='external' href='http://www.".$row['homepage']."'><img title='http://www.".$row['homepage']."' width='15' height='15' src='images/icon_homepage.png' alt='hp'></img></a>";
            if($row['email'] != "")
                echo "&nbsp;<a href='mailto:".$row['email']."'><img title='".$row['email']."' width='15' height='15' src='images/icon_email.png' alt='email'></img></a>";
            echo "</div></td></tr><tr>";
            echo "<td class='topic'>";
            echo nl2br($row['beitrag']);
            echo "</td></tr><tr>";
            echo "<td class='topic'>";
            echo "<div style='text-align: right;'><div style='font-size: 0.7em;'>".$row['date']."</div></div>";
            echo "</td></tr></table>";
        }
    }else
        {
            echo "No Entries in this Guestbook";
        }
}
?>
PHP:
<?php
            switch($action)
            {
            case 'entry':      add();
                            break;
            case 'submit':  insert();
                            if($_REQUEST['error']==1) { break; }
            default:        echo "<a class='gb_link' href='";
                            echo basename($_SERVER["PHP_SELF"]);
                            echo "?action=entry'>&raquo;&nbsp;";
                            echo $lang['new_entry'];
                            echo "</a><br/><br/>";
                            show();
            }
          ?>

Ich hoffe ihr könnt mir helfen, bin irgendwie mit meinem Latein am Ende. Danke im vorraus.

cap

edit:
Ich habe auch schon mir Abfragen ala if(!eintrag) {insert; eintrag=true}, jedoch ohne erfolg

edit2:
MySQL Tabelle
CREATE TABLE IF NOT EXISTS `gaestebuch` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`homepage` text NOT NULL,
`email` varchar(75) NOT NULL,
`beitrag` text NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip` varchar(15) NOT NULL,
PRIMARY KEY (`id`)
)
 
Zuletzt bearbeitet:
ist ja klar... du sendest die post-daten an deine startseite... entsprechend wird dort der eintrag generiert. die post-daten sind gespeichert. wenn du jetzt aktualsiert werden diese nochmal eingetragen. dein broser warnt dich aber davor.... es kommt nen kleinen popup.
besser wäre es wenn du das formular an eine andere seite sendest... dort lässt du dein eintrag in der datenbank machen und lässt dann den browser an die startseite weiterleiten. dann kannst du so oft f5 drücken wie du willst und es gibt keine doppelten einträge mehr
 
Wenn du es so haben willst wie bei deinem aufgezeigten Beispiel, dann mach einfach mit CSS display:none/block in der Form und beim absenden rufst du die selbe Seite wieder auf, übergibst dabei eine Variable in der unterschieden wird ob die Form display:none bekommt oder block.
 
dann leite dich automatisch nach dem eintrag in die datenbank zur startseite weiter.... dann sind die postdaten gelöscht.
Ergänzung ()

Wenn du es so haben willst wie bei deinem aufgezeigten Beispiel, dann mach einfach mit CSS display:none/block in der Form und beim absenden rufst du die selbe Seite wieder auf, übergibst dabei eine Variable in der unterschieden wird ob die Form display:none bekommt oder block.
das behebt nicht das problem mit dem doppelte eintrag beim refresh.

dann eher so wie ich es erwähnt hab
 
Zuletzt bearbeitet:
Das dieses Popup kommen würde, wäre mir egal. Vielen Dank für diesen HInweis mit dem Token, versuche es grade damit. Das session_start() will aber noch nicht ganz...
 
habe es nun mit dem session_start hinbekommen. (doofes BOM)

Ich danke euch für eure bemühungen!

*thread can be closed*
 
Zurück
Oben