PHP
Von: Informatontechnik, 25.9.2011 17:06 Uhr
Hallo,

ich habe folgendes Problem und zwar habe ich eine MySQL-Datenbank und ein PHP-Script geschrieben. Das klappt eigentlich auch soweit ganz gut, allerdings liegt das Problem nun dadrin, das jedes mal, wenn die Seite (Formular) neu geladen wird, er automatisch einen neuen leeren Datensatz in der MySQL Datanbank anlegt, was er ja nicht soll. Ich verstehe echt die Welt nicht mehr aber vielleicht ihr....

Ich Danke schon mal im Vorraus - hier der PHP-Script, der sich unter den Formular-Feldern befindet:

<?Php
//aufbau der datenbankverbindung
$host = 'XXXX';
$user = 'XXXX';
$password = 'XXXXX';
$db = 'XXXXX';

//verbindung zur db herstellen
mysql_connect($host, $user, $password);
mysql_select_db($db);

//übergabe der variablen
$datum= $_POST["datum"];
$stichwort= $_POST["Stichwort"];
$strasse= $_POST["Strasse"];
$ort= $_POST["Ort"];
$url= $_POST["URL"];
$alarm= $_POST["Alarm"];
$ende= $_POST["Ende"];


//sql-befehl zum eintragen der daten in die tabelle
$eintrag = "INSERT INTO einsaetze (datum, Stichwort, Strasse, Ort, URL, Alarm, Ende) VALUES ('$datum', '$stichwort', '$strasse', '$ort', '$url', '$alarm', '$ende')";

///nun erfolgt der eintrag in die tabelle
mysql_query($eintrag);

//folgende anweisungen rufen die formularseite wieder auf, um
//weitere daten eingeben zukönnen.

//datenbank wieder schliessen
mysql_close();


?>



  1. Antwort von Foddy 3
    Re: PHP Script legt selber neuen Datensatz an
    Hallo,

    Dein PHP-Programm wird jedes Mal beim Aufruf versuchen, einen neuen Datensatz in Deiner Datenbank zu erstellen. Deshalb sollten wir zunächst mal überprüfen, ob es auch neue Daten bzw. überhaupt Daten zum Sichern gibt. Das machen wir mit einem einfachem "IF"-Befehl. Hier ist die verbesserte Version des PHP-Programms:

    <?PHP
    //aufbau der datenbankverbindung
    $host = 'XXXX';
    $user = 'XXXX';
    $password = 'XXXXX';
    $db = 'XXXXX';

    //verbindung zur db herstellen
    mysql_connect($host, $user, $password);
    mysql_select_db($db);

    //übergabe der variablen
    $datum= $_POST["datum"];
    $stichwort= $_POST["Stichwort"];
    $strasse= $_POST["Strasse"];
    $ort= $_POST["Ort"];
    $url= $_POST["URL"];
    $alarm= $_POST["Alarm"];
    $ende= $_POST["Ende"];

    if($datum && $stichwort && $strasse && $ort && $url && $alarm && $ende)
    {
    //sql-befehl zum eintragen der daten in die tabelle
    $eintrag = "INSERT INTO einsaetze (datum, Stichwort, Strasse, Ort, URL, Alarm, Ende) VALUES ('$datum', '$stichwort', '$strasse', '$ort', '$url', '$alarm', '$ende')";

    ///nun erfolgt der eintrag in die tabelle
    mysql_query($eintrag);

    // Datensatz erfolgreich gesichert --> Ausgeben
    echo "Erfolgreich gesichert!";
    }

    else(
    {
    // Keine Daten erhalten --> Keine Datensätze in die Datenbank geschrieben --> Ausgeben
    echo "Herzlich Willkommen<br>Eine oder mehrere Informationen fehlen. Somit konnte ein Datenbankeintrag nicht erstellt werden.";
    }

    //folgende anweisungen rufen die formularseite wieder auf, um
    //weitere daten eingeben zukönnen.

    //datenbank wieder schliessen
    mysql_close();

    ?>
    1 Kommentare
    • Re^2: PHP Script legt selber neuen Datensatz an
      Danke dir!!! Das ist eine Lösung die Perfekt ist. Es funktioniert. DANKE DANKE DANKE
  2. Antwort von sanguinantis 2
    Re: PHP Script legt selber neuen Datensatz an
    Hallo,

    ich nehme an, dass sich das Script auf der Formularseite befindet. Da das Script dadurch bei jedem Seitenaufruf ausgeführt wird, ist es vollkommen logisch dass jedes mal ein neuer Datensatz angelegt wird.
    Um nur einen Datensatz anzulegen, wenn die Seite nach dem Absenden des Formulars aufgerufen wird, musst du überprüfen, ob die jeweiligen Felder in der $_POST-Variable gesetzt sind, also zum Beispiel so:

    <code>if (isset($_POST["datum"])) {
    $datum= $_POST["datum"];
    $stichwort= $_POST["Stichwort"];
    $strasse= $_POST["Strasse"];
    $ort= $_POST["Ort"];
    $url= $_POST["URL"];
    $alarm= $_POST["Alarm"];
    $ende= $_POST["Ende"];

    $eintrag = "INSERT INTO einsaetze (datum, Stichwort, Strasse, Ort, URL, Alarm, Ende) VALUES ('$datum', '$stichwort', '$strasse', '$ort', '$url', '$alarm', '$ende')";

    mysql_query($eintrag);
    mysql_close();
    }</code>

    Viele Grüße
    Stefan
    • Antwort von bfreek (abgemeldet) 0
      Re: PHP Script legt selber neuen Datensatz an
      du brauchst ein condotional (if/else), die mit einer bedingung prüft, ob nutzer eingaben vorhanden sind.

      ganz einfaches und unsicheres beispiel:

      if (!empty($_POST)) mysql_query(...);

      alles klar?
      (bin am iphone gerade kurz angebunden)
      • Antwort von Markus Seifert 0
        Re: PHP Script legt selber neuen Datensatz an
        Hallo Informatontechniker,

        wenn Du keine Bedingung festlegst, wann er den Eintrag machen soll, dann macht er ihn jedes mal. Er hört nicht auf den PHP-Code auszuführen nur weil das Formular aufhört.

        Dein Formular hat einen Absendeknopf. Ich gehe davon aus, dass er so aussieht:

        <input type="submit" value="Eintragen" name="submit">

        Dann muss VOR dem Eintrag in der Tabelle die Abfrage kommen, ob denn "submit" überhaupt gesetzt ist (sprich ob der Knopf gedrückt wurde):

        if (isset($_POST["submit"])) {
        ///nun erfolgt der eintrag in die tabelle
        mysql_query($eintrag);
        }

        So macht er den Eintrag in die Datenbank nur dann, wenn auch der Knopf als "Gedrückt" erkannt wird.

        Viele Grüße,
        Markus Seifert
        • Antwort von Eike 0
          Re: PHP Script legt selber neuen Datensatz an
          Es wäre zwar besser, wenn du mir den gesamten Quelltext schickst, aber so wie ich das sehe ist die Query mit in dem normalen Seiten-Code. Somit wird jedesmal beim Seitenaufruf, dass Ding durchgedüdelt.

          Ich würde die ganze DB-Schoose in ne if reinmachen. Ca. so:
          <code>if($_POST['datum']!=''){
          /*Hier kommen nun die DB sachen rein, die POST Übergabe, einfach alles, was du da oben rein geschrieben hast*/
          }</code>

          hoffe, ich konnte dir hiermit helfen. Wenn nicht, schicke doch mal den kompletten QT.

          mfg
          • Antwort von ukk 0
            • Antwort von Ralle H 0
              Re: PHP Script legt selber neuen Datensatz an
              Hallo, leider bin ich schon lange aus der Materie draussen, so das ich Dir dabei leider nicht helfen kann. Trotzdem viel Glück
              • Antwort von gorgel 0
                Re: PHP Script legt selber neuen Datensatz an
                Hallo,

                das Problem wird sein, dass du nicht abfragst, ob die Seite per Formular-Auslösung (POST) aufgerufen wurde oder einfach per Ansurfen (GET). Dadurch führt sich das Skript einfach bei jedem Aufruf der Seite aus, auch beim ersten Aufruf, wenn noch keine Daten ins Formular eingetragen wurden.

                Ich würde es lösen, in dem ich den PHP-Code in eine Datei formular.php (Name natürlich egal) auslagern und den Kopf des HTML-Formulars in der Ausgangsdatei folgendermaßen abändern würde:
                -----
                <form name="Formularname" method="post" action="formular.php">
                -----

                Wenn es weiterhin nicht klappt, einfach Bescheid sagen!

                Gruß
                gorgel
                • Antwort von frozen 0
                  Re: PHP Script legt selber neuen Datensatz an
                  Hallo,

                  was du da schreibst erscheint mir unsicher. Es legt nicht nur unerwünscht leere Datenbankeinträge an, sondern es ermöglicht darüber hinaus beliebige Manipulationen der Datenbank..

                  Bitte implementiere unbedingt folgende Dinge:

                  1.: Eine Prüfung darauf, ob die Daten überhaupt Werte enthalten. Unvollständiges Beispiel:
                  if(isset(_POST["datum"] && !empty(_POST["datum"] && strlen(_POST["datum"] > 5)) {
                  if(check_datum(_POST["datum"])) {$datum = _POST["datum"];}
                  } else {
                  $datum = strftime('%x');
                  }

                  2.: Eine Prüfung darauf, ob es einen GÜLTIGEN Wert gibt.
                  Dazu habe ich im obigen Beispiel "check_datum()" vorgesehen. Diese Funktion müsstest du weiter oben in deinem Quelltext definieren. Das ist nicht ganz so leicht, muss aber gemacht werden. Tipp: strtotime gibt false zurück, wenn das Datum nicht als Datum erkannt werden kann, setzt aber bestimmte Formatierungen vorraus..

                  3.: Setze Daten nur escaped in die Datenbank!
                  mysql_real_escape_string($datum) wäre das mindeste.

                  Setze zu guter Letzt vor dein mysql_query() noch eine Abfrage auf immer noch leere Daten oder darauf, ob submit gesetzt ist.
                  if(strlen($datum) > 1 && strlen($name) > 1 ... ) {mysql_query(...)}
                  bzw.
                  if(isset(_POST["submit"])) {mysql_query...}

                  Das ist jetzt alles eher rudimentär und nicht notwendigerweise perfekt richtig (Hab noch nicht genug Kaffee) aber es sollte dich in die richtige Richtung weisen.

                  Kurz zur Erläuterung:
                  Im Moment weist du mysql an, leere Daten in die Datenbank zu schreiben. Du hast nicht als Bedingung formuliert, dass Daten da sein müssen (per NOT NULL) also lässt die Datenbank das zu. Warum sind die Daten leer? Weil beim ersten Aufruf die ganzen _POST-Variablen leer sind. Erst nach dem echten Post könnte da was drin stehen. Beim ersten Aufruf ist also $datum = _POST["datum"]; identisch mit $datum = ""; womit $datum eben leer ist.
                  Unsicher ist das Ganze, weil alles mögliche in den Post-Variablen mitgegeben werden kann. Was passiert zum Beispiel, wenn jemand "x'); DROP TABLE einsaetze; --" als Ende eingibt? Mach eine Kopie deiner Datenbank (!!) und probier es mal aus...

                  Ist das für eine Feuerwehr oder sowas? Da hatte ich auch mal was gemacht.. ;)

                  Meld dich nochmal, wenn noch Fragen sind.

                  Viel Glück und viele Grüße,

                  frozen
                  1 Kommentare
                  • Re^2: PHP Script legt selber neuen Datensatz an
                    Ja es ist für eine Freiwllige Feuerwehr. Deine Idee und Vorschläge werde ich zu hHerzen nehmen uns ausprobieren. Schon mal vielen dank!
                • Antwort von Volker1 (abgemeldet) 0
                  Re: PHP Script legt selber neuen Datensatz an
                  Hallo
                  Ich vermute mal, dass es keine Bedingung zum wegschreiben gibt.
                  Wenn Du alle Variablen eingelesen hast, so muss noch eine Abfrage gemacht werden.
                  Z.B. if (isset $_POST["datum"],..... $_POST["Ort"];
                  und die anderen Variablen. Erst wenn die gesetzt sind kann weggeschrieben werden.

                  Habe mal ein Beispiel wo ich das mache wenn ich lese.

                  if (isset($_GET['id'])) {
                  //
                  $sql = "SELECT * FROM files WHERE id = '".$_GET['id']."' LIMIT 1";
                  $result = mysql_query($sql);
                  $row = mysql_fetch_object($result);
                  $id=$_GET['id'];
                  switch ($row->filetype)
                  {
                  case("text/html"):
                  header("Content-Type: " . $row->filetype);
                  $typ == "t";
                  break;
                  //
                  case("text/htm"):
                  header("Content-Type: " . $row->filetype);
                  $typ == "t";
                  break;
                  //
                  // Dateityp mht
                  case("message/rfc822"):
                  header("Content-Type: " . $row->filetype);
                  break;

                  case("image/pjpeg"):
                  header("Content-Type: " . $row->filetype);
                  break;

                  case("image/jpeg"):
                  header("Content-Type: " . $row->filetype);
                  break;

                  case("image/x-png"):
                  header("Content-Type: " . $row->filetype);
                  break;

                  case("application/pdf"):
                  header("Content-type: " . $row->filetype);
                  header("Content-disposition: attachment; filename=".$row->filename.";");
                  header("Content-length: " . $row->filesize);
                  break;

                  case("application/msword"):
                  header("Content-type: " . $row->filetype);
                  header("Content-disposition: attachment; filename=".$row->filename.";");
                  header("Content-length: " . $row->filesize);
                  break;

                  case("application/vnd.ms-excel"):
                  header("Content-type: " . $row->filetype);
                  header("Content-disposition: attachment; filename=".$row->filename.";");
                  header("Content-length: " . $row->filesize);
                  break;

                  case("text/plain"):
                  header("Content-type: " . $row->filetype);
                  header("Content-disposition: attachment; filename=".$row->filename.";");
                  header("Content-length: " . $row->filesize);
                  break;


                  case("application/vnd.ms-powerpoint"):
                  header("Content-type: " . $row->filetype);
                  header("Content-disposition: attachment; filename=".$row->filename.";");
                  header("Content-length: " . $row->filesize);
                  break;
                  }
                  // Daten dekodieren und an den Browser senden
                  echo base64_decode($row->filecontent);
                  if ($typ == "t") {
                  echo "<a href='http://www.SPD-Rotenburg-Fulda.de'>Zur Homepage des SPD Ortsvereins Rotenburg an der Fulda</a>";
                  }
                  $result = mysql_query("SELECT seitenaufruf FROM files WHERE id='$id'")or die(mysql_error());
                  $row = mysql_fetch_array( $result );
                  $seitenaufruf = $row['seitenaufruf'];
                  $seitenaufruf++;
                  mysql_query("UPDATE files SET seitenaufruf = '$seitenaufruf' WHERE id = '$id'");

                  exit;
                  }




                  //
                  $sql = "SELECT * FROM files WHERE id = '".$_GET['id']."' LIMIT 1";
                  $result = mysql_query($sql);
                  $row = mysql_fetch_object($result);
                  $id=$_GET['id'];
                  switch ($row->filetype)
                  {
                  case("text/html"):
                  header("Content-Type: " . $row->filetype);
                  $typ == "t";
                  break;
                  //

                  Hallo,

                  ich habe folgendes Problem und zwar habe ich eine
                  MySQL-Datenbank und ein PHP-Script geschrieben. Das klappt
                  eigentlich auch soweit ganz gut, allerdings liegt das Problem
                  nun dadrin, das jedes mal, wenn die Seite (Formular) neu
                  geladen wird, er automatisch einen neuen leeren Datensatz in
                  der MySQL Datanbank anlegt, was er ja nicht soll. Ich verstehe
                  echt die Welt nicht mehr aber vielleicht ihr....

                  Ich Danke schon mal im Vorraus - hier der PHP-Script, der sich
                  unter den Formular-Feldern befindet:

                  <?Php
                  //aufbau der datenbankverbindung
                  $host = 'XXXX';
                  $user = 'XXXX';
                  $password = 'XXXXX';
                  $db = 'XXXXX';

                  //verbindung zur db herstellen
                  mysql_connect($host, $user, $password);
                  mysql_select_db($db);

                  //übergabe der variablen
                  $datum= $_POST["datum"];
                  $stichwort= $_POST["Stichwort"];
                  $strasse= $_POST["Strasse"];
                  $ort= $_POST["Ort"];
                  $url= $_POST["URL"];
                  $alarm= $_POST["Alarm"];
                  $ende= $_POST["Ende"];


                  //sql-befehl zum eintragen der daten in die tabelle
                  $eintrag = "INSERT INTO einsaetze (datum, Stichwort, Strasse,
                  Ort, URL, Alarm, Ende) VALUES ('$datum', '$stichwort',
                  '$strasse', '$ort', '$url', '$alarm', '$ende')";

                  ///nun erfolgt der eintrag in die tabelle
                  mysql_query($eintrag);

                  //folgende anweisungen rufen die formularseite wieder auf, um
                  //weitere daten eingeben zukönnen.

                  //datenbank wieder schliessen
                  mysql_close();


                  1 Kommentare
                  • Re^2: PHP Script legt selber neuen Datensatz an
                    Danke für den Hinweis. Werde ich probieren