Geri: Einträge im Formular werden nicht gelöscht!

Hallo Leute,

auf einer Seite lest die DB die Einträge ein und gibt sie wieder auf der selben Seite aus.
Das Problem ist, er löscht mir nicht die Einträge im Formular wenn man auf „OK“ klickt.
Wie soll ich das am besten anstellen?
Der Quelltext:
##############################
<?php

error_reporting(E_ALL ^ E_NOTICE);

include("global.inc.php");

$GBname       = trim( $_POST["GBname"] );
$GBemail      = trim( $_POST["GBemail"] );
$GBwebadresse = trim( $_POST["GBwebadresse"] );
$GBtext       = trim( $_POST["GBtext"] );

$dblink = mysql_connect($datahost,$datauser,$datapass);
mysql_select_db($database, $dblink);

$query = 'INSERT INTO gastbuch
      (
      name,
      email,
      www,
      text
      )
     VALUES
     (
     "'.mysql_real_escape_string ($GBname).'",
     "'.mysql_real_escape_string ($GBemail).'",
     "'.mysql_real_escape_string($GBwebadresse).'",
     "'.mysql_real_escape_string ($GBtext).'"
     )';
mysql_query($query, $dblink);

$sql = "SELECT *
            FROM
     gastbuch
    ORDER BY
                 zeitstempel DESC;";

$result = mysql_query($sql) OR die(mysql_error());

echo mysql_error();
?>
*********************************
<form action="137.php" method="POST">

<input  name="GBname" value="<?php echo $GBname; ?>"
<input type="text" name="GBemail" value="<?php echo $GBemail; ?>"
<input type="text" name="GBwebadresse" value="<?php echo $GBwebadresse; ?>" size="40">
<textarea name="GBtext" value="<?php echo $GBtext; ?>"  cols="39" rows="5"></textarea>
<input type="submit" value="Senden!"> <input type="reset" value="Zur&uuml;cksetzen">

</form>
*******************************
  <?php

echo "<h2>EINTRÄGE IM GÄSTEBUCH</h2><br />\n";
     while($row = mysql_fetch_assoc($result)) {
  echo '<table width="350" align="center" border="1"><tr><td bgcolor="#898989">';
        echo $row['name']. "&nbsp;schrieb am &nbsp;". $row['zeitstempel']." &nbsp; ".$row['www']."</td></tr><tr><td>".$row['text']."</td></tr></table><br>\n";

}

?>
########################################

Danke an alle für die Hilfe

gruß geri

  1. echo $begrüßung;

    auf einer Seite lest die DB die Einträge ein und gibt sie wieder auf der selben Seite aus.
    Das Problem ist, er löscht mir nicht die Einträge im Formular wenn man auf „OK“ klickt.

    Wenn du die Variablen nach der erfolgreichen Datenbankoperation nicht "leer machst", dann wird deren Inhalt selbstverständlich auch angezeigt, wenn man sie später mit echo darum bittet.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      Wenn du die Variablen nach der erfolgreichen Datenbankoperation nicht "leer machst", dann wird deren Inhalt selbstverständlich auch angezeigt, wenn man sie später mit echo darum bittet.

      echo "$verabschiedung $name";

      Hallo $name.

      danke für deinen tipp - echo eh klar  :-)

      gruß geri

  2. Ahoi Geri,

    erstens: ich hoffe du machst eine eingabe überprüfung vor dem INSERT.
    zweitens: ich hoffe du prüfst ob das INSERT erfolgraich war.

    du musst nur zuvor eine Kontrollvariable angeben. diese setzt du auf
    true. ist nun die eingaben nicht korekt setzt du sie auf false. hat
    das insert nicht funktioniert ebenso. ist die variable am ende des scripts immernoch true dann setzt $GBname usw = "";

    <textarea name="GBtext" value="<?php echo $GBtext; ?>"  cols="39" rows="5"></textarea>

    eine Textarea hat AFAIK kein value.

    <textarea name="GBtext" cols="39" rows="5"><?php echo $GBtext; ?></textarea>
    MfG

    --
    Alle Angaben wie immer ohne Gewähr
    PPPS: ich trinke gerne ab und an mal eine tote Tante.
  3. Hello,

    <?php

    error_reporting(E_ALL)  ### zum Testen immer (meistens) alles einschalten! ^ E_NOTICE);

    include("global.inc.php");

    was ist mit get_magic_quotes_gpc() ?

    sind die Magic Quotes bei Dir ausgeschaltet?

    $GBname       = trim( $_POST["GBname"] );
    $GBemail      = trim( $_POST["GBemail"] );
    $GBwebadresse = trim( $_POST["GBwebadresse"] );
    $GBtext       = trim( $_POST["GBtext"] );

    $dblink = mysql_connect($datahost,$datauser,$datapass);
    mysql_select_db($database, $dblink);

    $query = 'INSERT INTO gastbuch
          (
          name,
          email,
          www,
          text
          )
         VALUES
         (
         "'.mysql_real_escape_string ($GBname).'",
         "'.mysql_real_escape_string ($GBemail).'",
         "'.mysql_real_escape_string($GBwebadresse).'",
         "'.mysql_real_escape_string ($GBtext).'"
         )';

    Gut! Richtiges Escapen ist wichtig für das Überleben Deiner DB

    mysql_query($query, $dblink);

    $sql = "SELECT *
                FROM
         gastbuch
        ORDER BY
                     zeitstempel DESC;";

    Wozu _alle_ Datensätze auslesen? reichen nicht z.B. 10 auf einmal ?

    $result = mysql_query($sql) OR die(mysql_error());

    echo mysql_error();
    ?>
    *********************************
    <form action="137.php" method="POST">

    was passiert denn wohl beim Erstaufruf des Scriptes, wenn das Formular noch nicht aufgebaut

    war, also auch noch keine $_POST vorhanden waren? Der Fehler (Notice) tritt dann aber schon

    oben auf

    <input  name="GBname" value="<?php echo $GBname; ?>"
    <input type="text" name="GBemail" value="<?php echo $GBemail; ?>"
    <input type="text" name="GBwebadresse" value="<?php echo $GBwebadresse; ?>" size="40">
    <textarea name="GBtext" value="<?php echo $GBtext; ?>"  cols="39" rows="5"></textarea>
    <input type="submit" value="Senden!"> <input type="reset" value="Zur&uuml;cksetzen">

    </form>
    *******************************
      <?php

    echo "<h2>EINTRÄGE IM GÄSTEBUCH</h2><br />\n";
         while($row = mysql_fetch_assoc($result)) {
      echo '<table width="350" align="center" border="1"><tr><td bgcolor="#898989">';
            echo $row['name']. "&nbsp;schrieb am &nbsp;". $row['zeitstempel']." &nbsp; ".$row['www']."</td></tr><tr><td>".$row['text']."</td></tr></table><br>\n";

    }

    ?>
    ########################################

    Du hast bisher keine Fehlerkontrolle bei den SQL-Statements
    Du hast keine Steuerflußkontrolle
    Du lässt es auf Notices ankommen (siehe $_POST)
    Beim Erstaufruf des Scriptes (über die Adresszeile) wird ein leerer Datensatz eingetragen

    Abhilfe:

    übertrag aus dem Formular einen Button oder ein Hidden-Field.
      Deklariere ein Array mit allen erwarteten Datenfeldern

    $_data = array();
      $_data['GBname']['value'] = '';
      $_data['GBname']['regexp'] = '[0-9a-zA-Z]{2,}';
      $_data['GBname']['required'] = 1;  # 0 für optionale Eingabe,
                                         # 1 für Pflichteingabe,
                                         # 2 für Pflichteingabe nach Muster
      $_data['GBname']['default'] = '';  # default z.B. für Radio, Select und Ckeckboxen

    $_data['GBemail']['value'] = '';
      $_data['GBemail']['regexp'] = '[0-9a-zA-Z]{2,}@[0-9a-zA-Z]{3,}'; ## die musst Du natürlich
      $_data['GBemail']['required'] = 1;                                ## selber aufbauen ;-)
      $_data['GBemail']['default'] = '';

    ...

    Dann kannst Du auf diese Werte zugreifen im Formular.
    Wenn nun das Script aufgerufen wird, kannst Du nachfragen

    if(isset($_POST['btn']['insert']))
      {
        $_error = array();
        foreach($_data as $name => $specs)
        {
          if ($specs['required'] > 0 and !isset($_POST[$name])
          {
            $_error[] = "Feld $name muss ausgefüllt werden";
          }
          elseif($specs['required'] > 0 and isset($_POST[$name] and !check($_POST['data'],$name,$_data)
          {
            $_error[] = "Feld $name enthält falsche Werte";
          }
          ....

    }

    }

    und so weiter.

    Und  die funktion check(Postdaten, Name des Paramters, Kontrollarray ) schreibst Du Dir dann einmal. Die überprüft nur noch den Feldwert mittels der RegExp und gibt false oder true zurück.

    Auf diese Weise bekommst Du Deine Applikation auch relativ wasserdicht

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello,

      Hallo Tom

      <?php

      error_reporting(E_ALL)  ### zum Testen immer (meistens) alles einschalten! ^ E_NOTICE);

      Habe ich weggelassen da ich es jetzt nicht für wichtig gehalten habe error_reporting(E_ALL ^ E_NOTICE);

      include("global.inc.php");

      was ist mit get_magic_quotes_gpc() ?

      sind die Magic Quotes bei Dir ausgeschaltet?

      für was brauche ich die?

      $GBname       = trim( $_POST["GBname"] );
      $GBemail      = trim( $_POST["GBemail"] );
      $GBwebadresse = trim( $_POST["GBwebadresse"] );
      $GBtext       = trim( $_POST["GBtext"] );

      $dblink = mysql_connect($datahost,$datauser,$datapass);
      mysql_select_db($database, $dblink);

      $query = 'INSERT INTO gastbuch
            (
            name,
            email,
            www,
            text
            )
           VALUES
           (
           "'.mysql_real_escape_string ($GBname).'",
           "'.mysql_real_escape_string ($GBemail).'",
           "'.mysql_real_escape_string($GBwebadresse).'",
           "'.mysql_real_escape_string ($GBtext).'"
           )';

      Gut! Richtiges Escapen ist wichtig für das Überleben Deiner DB

      ja aber wenn der Server zu streng eingestellt ist haut es damit auch nicht hin
      Beispiel:
      $stat="SELECT * FROM tabelle WHERE
      nummer='".check_quotes($_REQUEST['nummer'])."'";
      $result = mysql_query($stat);
      $row=mysql_fetch_array($result);
      Das sollte sicherer sein aber für diesen zweck reicht das.

      mysql_query($query, $dblink);

      $sql = "SELECT *
                  FROM
           gastbuch
          ORDER BY
                       zeitstempel DESC;";

      Wozu _alle_ Datensätze auslesen? reichen nicht z.B. 10 auf einmal ?

      meinst du 10 auf einer Seite??

      $result = mysql_query($sql) OR die(mysql_error());

      echo mysql_error();
      ?>
      *********************************
      <form action="137.php" method="POST">

      was passiert denn wohl beim Erstaufruf des Scriptes, wenn das Formular noch nicht aufgebaut

      war, also auch noch keine $_POST vorhanden waren? Der Fehler (Notice) tritt dann aber schon

      oben auf

      Ja wenn ich ihn nicht auschalte!

      <input  name="GBname" value="<?php echo $GBname; ?>"
      <input type="text" name="GBemail" value="<?php echo $GBemail; ?>"
      <input type="text" name="GBwebadresse" value="<?php echo $GBwebadresse; ?>" size="40">
      <textarea name="GBtext" value="<?php echo $GBtext; ?>"  cols="39" rows="5"></textarea>
      <input type="submit" value="Senden!"> <input type="reset" value="Zur&uuml;cksetzen">

      </form>
      *******************************
        <?php

      echo "<h2>EINTRÄGE IM GÄSTEBUCH</h2><br />\n";
           while($row = mysql_fetch_assoc($result)) {
        echo '<table width="350" align="center" border="1"><tr><td bgcolor="#898989">';
              echo $row['name']. "&nbsp;schrieb am &nbsp;". $row['zeitstempel']." &nbsp; ".$row['www']."</td></tr><tr><td>".$row['text']."</td></tr></table><br>\n";

      }

      ?>
      ########################################

      Du hast bisher keine Fehlerkontrolle bei den SQL-Statements

      doch  - aber nicht hier angegeben!

      Du hast keine Steuerflußkontrolle

      wie soll ich das machen?

      Du lässt es auf Notices ankommen (siehe $_POST)
      Beim Erstaufruf des Scriptes (über die Adresszeile) wird ein leerer Datensatz eingetragen

      Abhilfe:

      übertrag aus dem Formular einen Button oder ein Hidden-Field.
        Deklariere ein Array mit allen erwarteten Datenfeldern

      $_data = array();
        $_data['GBname']['value'] = '';
        $_data['GBname']['regexp'] = '[0-9a-zA-Z]{2,}';
        $_data['GBname']['required'] = 1;  # 0 für optionale Eingabe,
                                           # 1 für Pflichteingabe,
                                           # 2 für Pflichteingabe nach Muster
        $_data['GBname']['default'] = '';  # default z.B. für Radio, Select und Ckeckboxen

      $_data['GBemail']['value'] = '';
        $_data['GBemail']['regexp'] = '[0-9a-zA-Z]{2,}@[0-9a-zA-Z]{3,}'; ## die musst Du natürlich
        $_data['GBemail']['required'] = 1;                                ## selber aufbauen ;-)
        $_data['GBemail']['default'] = '';

      ...

      Sollten ja keine Pflichtfelder sein

      Harzliche Grüße vom Berg

      Danke Tom für deine ausführliche Hilfe
      gruß geri

      1. Hello,

        was ist mit get_magic_quotes_gpc() ?

        sind die Magic Quotes bei Dir ausgeschaltet?

        für was brauche ich die?

        Die Einstellung "magic_quotes_gpc = on" ist PHP-Default.
        Die Magic-Quotes sind die Backslashes, die PHP vor einigen Zeichen in Paramtern, die vom Client kommen, selbstständig einfügt. Es ist eine Art "Escaping für Arme", da es leider nicht zur Datenbank passt. Also muss man es entweder ausschalten oder mittels stripslashes()
        http://de3.php.net/manual/de/function.stripslashes.php wieder entfernen.

        Das darf man natürlich nur dann tun, wenn es auch eingeschaltet war.
        Und dann sollte man es rekursiv tun.

        Gut! Richtiges Escapen ist wichtig für das Überleben Deiner DB

        ja aber wenn der Server zu streng eingestellt ist haut es damit auch nicht hin
        Beispiel:

        Das liegt dann ggf. an den PHP-eigenen Escapes, die zusätzlich vorhanden sind

        Wozu _alle_ Datensätze auslesen? reichen nicht z.B. 10 auf einmal ?

        meinst du 10 auf einer Seite??

        Ja, maximal. Und mehr als man benötigt, sollte man aus der DB auch nicht holen lassen.
        Dafür gibt es bei MySQL das wunderbare Feature 'limit $offset $count'

        was passiert denn wohl beim Erstaufruf des Scriptes, wenn das Formular noch nicht aufgebaut

        war, also auch noch keine $_POST vorhanden waren? Der Fehler (Notice) tritt dann aber schon

        oben auf

        Ja wenn ich ihn nicht auschalte!

        Nein! Wenn Du ihn nicht vermeidest.
        Notices sind in PHP bezüglich der Sicherheit die wichtigsten Fehlermeldungen, da sie auf Fehler hinweisen, bei denen das Script weiterläuft, währen bei einem fatal error das Script abgebrochen wird, und keinen Schaden mehr anrichten kann.

        Du hast bisher keine Fehlerkontrolle bei den SQL-Statements
        doch  - aber nicht hier angegeben!

        das ist dumm. Denn darauf achten wir hier doch meistens
        Und bevor jemand die nicht eingebaut hat, bekommt er nur dusselige Antworten :-)

        Du hast keine Steuerflußkontrolle
        wie soll ich das machen?

        Habe ich geschrieben: Ins Formular ein Hidden-Feld einbauen oder einen Button, auf dessen Esistenz geprüft wird. Die Steuerung geschieht ja durch bewusste Nutzerhandlungen und die sollten auch abgefragt werden.

        [...]

        Sollten ja keine Pflichtfelder sein

        War ja auch nur eine Kurzbeschreibung, wie man ein komplexeres Script-Design mit _allgemeingüligen_ Funktionen aufbauen kann. Die entstehenden Funktionen kann man so immer wieder verwenden und muss sie nicht jedes mal neu schreiben.

        Harzliche Grüße vom Berg
        esst mehr http://www.harte-harzer.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. echo $begrüßung;

          Das [stripslashes] darf man natürlich nur dann tun, wenn es [magic quotes] auch eingeschaltet war.
          Und dann sollte man es rekursiv tun.

          Dafür gibt es auf der englischen Handbuchseite zu stripslashes() ein Beispiel (stripslashes_deep).

          Es gibt auch ein eigenes Kapitel zu Sinn, Vor- und Nachteilen der Magic Quotes, ebenfalls mit einem stripslashes_deep-Beispiel, das sogar noch die Anwendung auf $_GET/$_POST/$_COOKIES zeigt.

          echo "$verabschiedung $name";

          1. Hello,

            Dafür gibt es auf der englischen Handbuchseite zu stripslashes() ein Beispiel (stripslashes_deep).

            gibts hier im Forumsarchiv auch schon lange:
            http://forum.de.selfhtml.org/archiv/2003/12/t67457/#m385942

            Harzliche Grüße vom Berg
            esst mehr http://www.harte-harzer.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau