php guestbook / habe ein problem!

bobbydigital

Mitglied
hallo,

also mein problem ist folgendes:
habe ein simples guestbook programmiert und jetzt gemerkt, dass wenn ich einen eintrag schreibe und er eingetragen wird, bis dahin haut alles hin,
aber wenn ich dann die seite neu lade schreibt er mir den letzten gb_eintrag dazu, aber nur wenn ich die seite bereits geöffnet hab und gerade einen eintrag gemacht habe.
vieleicht findet einer den fehler oder hat einen tip....


PHP:
<?php
if(!empty($_POST['senden'])){
  if(!empty($_POST['nam'])&&!empty($_POST['nach'])){
$name = $_POST['nam'];
$mail = $_POST['mail'];
$nach = $_POST['nach'];
mysql_connect('localhost','root','')or die("<h1>OPFER</h1>");
mysql_select_db('bobbydick79_01');
$SQL="INSERT INTO guestbook VALUES(NULL,'".$mail."','".$name."','".$nach."','".date("y-m-d")."','".date("H:i")."')";
mysql_query($SQL);

}else{
$error = 'Bitte alle Felder ausfüllen!';
}
}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>www.leise.de</title>
<meta name="author" content="Robert Klepsch">
<link rel="stylesheet" type="text/css" href="style.css">



</head>
<body onLoad="MM_preloadImages('images/rambo2.JPG','images/ice%20t%20electro%20rap2.JPG','images/hubschrauber2.JPG','images/breakin%20n%20entren2.JPG')">
<table  bgcolor="#000000" border="0" cellpadding="0" cellspacing="0" align="left" width="100%" height="100%" >
    <tr><td  rowspan="4" width="39%" height="100%"><img src="images/versuch_grau.jpg" alt="" width="100%" height="100%"   border="0"></td>
        <td style="background-image:url(images/head.jpg); margin:0; padding:0" align="center" width="61%" height="130" colspan="3"></td>
    </tr>
    <tr>
      <td height="5%" ><div class="ueberschrift">Navigation</div></td>
      <td align="center"><div class="ueberschrift">&nbsp;</div></td>
    </tr>
    <tr>
      <td  bgcolor="#363636" valign="top" align="left" width="135">
        <ul class="menue">
          <li><a href="index.html">Startseite</a></li>
          <li><a href="ich.php">über mich</a></li>
          <li><a href="bilder_gallery_test/album/index.html">Bilder</a></li>
          <li><a href="gb_rene.php">» Gästebuch</a></li><br><br><br><br><br><br><br><br><br>
        </ul>

      </td>
      <td valign="top" align="center" width="617" height="450"><h2>&nbsp;</h2>
         <table   width="95%"  border="1" height="530">
          <tr>
              <td valign="top" >




              <form action="gb_rene.php" method="POST">
       <table align="right" border="1"  width="90%" cellpadding="5">
       <tr >
       <td id="gastform" width="70" ><b><font face="Arial">Email:</font></td>
       <td><input type="text" name="mail" size="20" id="form" value="<?php if (!empty($error)) echo $_POST['mail'];?>"></td>

       </tr>
       <td id="gastform"><b><font face="Arial">Name:</font></td>
       <td><input type="text" name="nam" size="20" id="form" value="<?php if (!empty($error)) echo $_POST['nam'];?>"</td></tr>
       <td id="gastform"><b><font face="Arial">Nachricht:</font></td>
       <td><textarea name="nach" cols="23" rows"5" id="form"><?php if (!empty($error)) echo $_POST['nach'];?></textarea></td>
        <br>
       <td valign="bottom" ><input type="Submit" name="senden" value="Eintragen" style="width:151px;"></td>
       </form></tr>
       <tr><td colspan="3"><br>

       <?php
       echo '<h5 id="gastform">'.$error.'</h5>';
       mysql_connect('localhost','root','')or die("<h1>OPFER</h1>");
       mysql_select_db('bobbydick79_01');
       $SQL2   = "SELECT * FROM guestbook ORDER BY id DESC";
       $ergtab = mysql_query($SQL2);

       while ($data = mysql_fetch_array($ergtab)) {

         echo'
         <table border="1" align="center"  width="65%">
          <tr>
           <td bgcolor="#3C3C3C" valign="top" width="70%"><i>Name:</i>&nbsp;
             <font face="@Arial Unicode MS">'.$data[name].'</font>
           </td>
           <td  width="45" align="right" bgcolor="#3C3C3C">'.substr($data['datum'],8,2).'.'.substr($data['datum'],5,2).'.'.substr($data['datum'],0,4).'
           <br>'.$data[uhrzeit].'&nbsp;
           </td>
        </tr>
        <tr>
         <td colspan="2" valign="top"><br>'.$data[nachricht].'
         </td>
        </tr>

       ';
       }
      ?>
        </table>
 
Hallo bobbydigital,
es handelt sich also um das alt bekannte "Doppel-Post" Problem. :)

Wenn der Benutzer die Seite aktualisiert nach dem er einen Eintrag verfasst hat, dann wird der POST natürlich noch einmal abgesendet und eingetragen. Ein Lösungsweg unter vielen wäre:

1. Füge deinem Formular ein "HIDDEN" Feld hinzu.
Code:
<input type="hidden" name="entrydate" value="<?php date(); ?>">
Dieses Datum wird dann auch in die Datenbank eingefügt.

2. Bevor du das Datum nun in die Datenbank einfügst, musst du überprüfen ob es bereits vorhanden ist. Wenn dem so ist, kannst du davon ausgehen das der Benutzer die Seite nur aktualisiert hat und der Eintrag nicht erneut hinzugefügt werden soll.

Natürlich ist der Nachteil dieser Variante, dass wenn zwei Benutzer EXAKT gleichzeitig auf die Seite gehen, dass einer keinen Eintrag hinzufügen kann. Nur.. wie hoch ist die wahrscheinlichkeit :P

Ansonsten gäbe es auch die Möglichkeit, dass du das einpflegen in die Datenbank auf einer Seite machst die keine Ausgabe hat und sofort nach dem einfügen an die Gästebuch Übersicht weiterleitet. => header( "Location: xda.lala" );

Gruß
Manuel Freiholz
 
kannst du mir das bitte genauer erklären! wie überprüfe ich das und muss ich noch ein feld in meine mysql-tabelle hinzufügen.

bin grad überfragt, weil anfänger....
 
Hi, also ich würde es auch machen wie mein Vorposter schon sagte. Die Eintragung auf eine andere Seite und per Location() wieder zurück wenn es erfolgreich eingetragen wurde.

dann hätte ich noch ein paar Verbesserungen:

PHP:
if(!empty($_POST['senden'])){ 
  if(!empty($_POST['nam'])&&!empty($_POST['nach'])){

würde ich ändern in:

PHP:
if(isset($_POST['senden'])){
  if($_POST['nam'] != "" && $_POST['nach'] !=""){

dann dein SQL-Statement stimmt auch nicht ganz. Die richtige Syntax wäre, auch die Datenbankfelder mitanzugeben.

anstatt:

PHP:
$SQL="INSERT INTO guestbook VALUES(NULL,'".$mail."','".$name."','".$nach."','".date("y-m-d")."','".date("H:i")."')";

so:

PHP:
$SQL="INSERT INTO guestbook (ID, email, Name, Nach, Datum, Uhrzeit) VALUES (NULL,'".$mail."','".$name."','".$nach."','".date("y-m-d")."','".date("H:i")."')";
 
Hallo,

also ich habs jetzt mal ohne die Verbesserungen von Maniac, die sollten aber auch noch übernommen werden.

Ich hab dir den oberen Teil bearbeitet und die Überprüfung eingebaut:

PHP:
<?php
if(!empty($_POST['senden'])){
  if(!empty($_POST['nam'])&&!empty($_POST['nach'])){
$name = $_POST['nam'];
$mail = $_POST['mail'];
$nach = $_POST['nach'];
$entry_datum = $_POST['entrydate'];

mysql_connect('localhost','root','')or die("<h1>OPFER</h1>");
mysql_select_db('bobbydick79_01');

// @Mafr: Ueberpruefen ob bereits ein Eintrag mit dem gleichen datum vorhanden ist.
$sqlDateCheck = "SELECT COUNT(*) FROM guestbook WHERE datumsspalte=".mysql_real_escape($entry_datum);
$query = mysql_query( $sqlDateCheck );
$fetch = mysql_fetch_row( $query );
if( $fetch[0] > 0 )
{
  // Neuer Eintrag.
  $SQL="INSERT INTO guestbook VALUES(NULL,'".$mail."','".$name."','".$nach."','".date("y-m-d")."','".date("H:i")."')";
  mysql_query($SQL);  
}
else
{
  // Benutzer hat aktualisieren gedrueckt.
}

}else{
$error = 'Bitte alle Felder ausfüllen!';
}
}
?>

In dein Formular hab ich noch das hidden Feld eingebaut:

HTML:
              <form action="gb_rene.php" method="POST">
              
              <!-- @Mafr: Zeitstempel -->
              <input type="hidden" name="entrydate" value="<?php date() ?>">


Hier noch einmal die Datei im kompletten:

PHP:
<?php
if(!empty($_POST['senden'])){
  if(!empty($_POST['nam'])&&!empty($_POST['nach'])){
$name = $_POST['nam'];
$mail = $_POST['mail'];
$nach = $_POST['nach'];
$entry_datum = $_POST['entrydate'];

mysql_connect('localhost','root','')or die("<h1>OPFER</h1>");
mysql_select_db('bobbydick79_01');

// @Mafr: Ueberpruefen ob bereits ein Eintrag mit dem gleichen datum vorhanden ist.
$sqlDateCheck = "SELECT COUNT(*) FROM guestbook WHERE datumsspalte=".mysql_real_escape($entry_datum);
$query = mysql_query( $sqlDateCheck );
$fetch = mysql_fetch_row( $query );
if( $fetch[0] > 0 )
{
  // Neuer Eintrag.
  $SQL="INSERT INTO guestbook VALUES(NULL,'".$mail."','".$name."','".$nach."','".date("y-m-d")."','".date("H:i")."')";
  mysql_query($SQL);  
}
else
{
  // Benutzer hat aktualisieren gedrueckt.
}

}else{
$error = 'Bitte alle Felder ausfüllen!';
}
}
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>www.leise.de</title>
<meta name="author" content="Robert Klepsch">
<link rel="stylesheet" type="text/css" href="style.css">



</head>
<body onLoad="MM_preloadImages('images/rambo2.JPG','images/ice%20t%20electro%20rap2.JPG','images/hubschrauber2.JPG','images/breakin%20n%20entren2.JPG')">
<table  bgcolor="#000000" border="0" cellpadding="0" cellspacing="0" align="left" width="100%" height="100%" >
    <tr><td  rowspan="4" width="39%" height="100%"><img src="http://www.tutorials.de/forum/images/versuch_grau.jpg" alt="" width="100%" height="100%"   border="0"></td>
        <td style="background-image:url(images/head.jpg); margin:0; padding:0" align="center" width="61%" height="130" colspan="3"></td>
    </tr>
    <tr>
      <td height="5%" ><div class="ueberschrift">Navigation</div></td>
      <td align="center"><div class="ueberschrift">&nbsp;</div></td>
    </tr>
    <tr>
      <td  bgcolor="#363636" valign="top" align="left" width="135">
        <ul class="menue">
          <li><a href="index.html">Startseite</a></li>
          <li><a href="ich.php">über mich</a></li>
          <li><a href="bilder_gallery_test/album/index.html">Bilder</a></li>
          <li><a href="gb_rene.php">» Gästebuch</a></li><br><br><br><br><br><br><br><br><br>
        </ul>

      </td>
      <td valign="top" align="center" width="617" height="450"><h2>&nbsp;</h2>
         <table   width="95%"  border="1" height="530">
          <tr>
              <td valign="top" >




              <form action="gb_rene.php" method="POST">
              
              <!-- @Mafr: Zeitstempel -->
              <input type="hidden" name="entrydate" value="<?php date() ?>">
              
       <table align="right" border="1"  width="90%" cellpadding="5">
       <tr >
       <td id="gastform" width="70" ><b><font face="Arial">Email:</font></td>
       <td><input type="text" name="mail" size="20" id="form" value="<?php if (!empty($error)) echo $_POST['mail'];?>"></td>

       </tr>
       <td id="gastform"><b><font face="Arial">Name:</font></td>
       <td><input type="text" name="nam" size="20" id="form" value="<?php if (!empty($error)) echo $_POST['nam'];?>"</td></tr>
       <td id="gastform"><b><font face="Arial">Nachricht:</font></td>
       <td><textarea name="nach" cols="23" rows"5" id="form"><?php if (!empty($error)) echo $_POST['nach'];?></textarea></td>
        <br>
       <td valign="bottom" ><input type="Submit" name="senden" value="Eintragen" style="width:151px;"></td>
       </form></tr>
       <tr><td colspan="3"><br>

       <?php
       echo '<h5 id="gastform">'.$error.'</h5>';
       mysql_connect('localhost','root','')or die("<h1>OPFER</h1>");
       mysql_select_db('bobbydick79_01');
       $SQL2   = "SELECT * FROM guestbook ORDER BY id DESC";
       $ergtab = mysql_query($SQL2);

       while ($data = mysql_fetch_array($ergtab)) {

         echo'
         <table border="1" align="center"  width="65%">
          <tr>
           <td bgcolor="#3C3C3C" valign="top" width="70%"><i>Name:</i>&nbsp;
             <font face="@Arial Unicode MS">'.$data[name].'</font>
           </td>
           <td  width="45" align="right" bgcolor="#3C3C3C">'.substr($data['datum'],8,2).'.'.substr($data['datum'],5,2).'.'.substr($data['datum'],0,4).'
           <br>'.$data[uhrzeit].'&nbsp;
           </td>
        </tr>
        <tr>
         <td colspan="2" valign="top"><br>'.$data[nachricht].'
         </td>
        </tr>

       ';
       }
      ?>
        </table>

Leider kann ich dir nicht garantieren das der Code Syntaktisch korrekt ist, weil ich nichts testen konnte und seit laaaanger Zeit kein PHP mehr gemacht habe :)

Gruß
Manuel Freiholz
 
Zuletzt bearbeitet:
hallo gainwar;

danke für deine mühe.
datumsspalte muss ich doch sicher noch ümändern in was anderes oder

bekomme folgenden fehler:


Fatal error: Call to undefined function mysql_real_escape() in C:\xampp\htdocs\website_data\gb_rene.php on line 13
 
Zuletzt bearbeitet:
Hallo

änder die Zeile in folgende:

PHP:
$sqlDateCheck = "SELECT COUNT(*) FROM guestbook WHERE datumsspalte=".$entry_datum;

und "datumsspalte" musst du natürlich in deinen Spaltennamen ändern.

Update
Du kannst aber auch die den Funktionsnamen von mysql_real_escape in mysql_real_escape_string ändern.
Wusste den nicht mehr so genau auswendig und der erstere existiert nicht :-)
 
Zuletzt bearbeitet:
jetzt hab ich folgenden fehler: :confused:

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\website_data\gb_rene.php on line 16
 
ich würde anstatt mysql_fetch_row, mysql_num_rows verwenden.

das hier:
PHP:
$fetch = mysql_fetch_row( $query );
if( $fetch[0] > 0 )

in:
PHP:
$fetch = mysql_num_rows( $query );
if( $fetch > 0 )
 
Hallo,

ich hab aus Performancegründen Extra einen "SELECT COUNT(*)" gemacht, denn durch einen "mysql_num_rows()" wird ein zusätzlich Zähldurchlauf gestartet, soweit ich weis.

Gruß
Manuel Freiholz
 
Zurück