PHP Script legt selber neuen Datensatz an

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(); ?\>

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 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(); ?\>

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:

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();
}

Viele Grüße
Stefan

Danke dir!!! Das ist eine Lösung die Perfekt ist. Es funktioniert. DANKE DANKE DANKE

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)

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:

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

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:
if($_POST[‚datum‘]!=’’){
/*Hier kommen nun die DB sachen rein, die POST Übergabe, einfach alles, was du da oben rein geschrieben hast*/
}

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

mfg

Hallo,
ich glaube Du solltest die Anweisung Update und nicht Insert beim ändern von Daten benutzen,

Die INSERT-Anweisung fügt neue Datensätze in eine Tabelle ein. Eingefügt wird immer nur komplette Datensätze ……………………
http://dev.mysql.com/doc/refman/5.1/de/insert.html

Update ändert den Inhalt vorhandener (bereits gespeicherter) Datensätze. …………
http://dev.mysql.com/doc/refman/5.1/de/update.html
MfG
ukk

Hallo, leider bin ich schon lange aus der Materie draussen, so das ich Dir dabei leider nicht helfen kann. Trotzdem viel Glück

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:


Wenn es weiterhin nicht klappt, einfach Bescheid sagen!

Gruß
gorgel

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… :wink:

Meld dich nochmal, wenn noch Fragen sind.

Viel Glück und viele Grüße,

frozen

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 „Zur Homepage des SPD Ortsvereins Rotenburg an der Fulda“;
}
$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:

Ja es ist für eine Freiwllige Feuerwehr. Deine Idee und Vorschläge werde ich zu hHerzen nehmen uns ausprobieren. Schon mal vielen dank!

Danke für den Hinweis. Werde ich probieren