Daten nach Speicherung laden oder in Form lassen

Hallo zusammen,

allgemeine Frage.

In einer Form wurden die Felder ausgefüllt. Nach Klick auf den Submitbutton werden diese in eine DB geschrieben (Prüfung der Daten etc. lassen wir mal beiseite)

Wie würdet Ihr dann weitermachen?

Nach der Speicherung werden die Daten aus der DB geladen und dann in die Felder eingesetzt. Die angezeigten Werte in den Feldern sind also Werte aus der DB.

Oder

Nach Speicherung der Daten werden diese nicht aus der DB geladen. Die Werte in den Feldern sind die $_POST - Variablen, welche beim Absenden den Formulars generiert worden sind und keine Werte aus der DB.

Für welche Variante würdet Ihr Euch entscheiden?

Gruß

Das hängt davon ab was du mit deiner Anwendung erreichen willst:

  1. Bestätigung der gespeichenten Daten, dann den Satz aus der DB wieder holen und anzeigen.
  2. bei einer reinen Daten Erfassung und Fehler beim überschreiben zu vermeinden und speichern erfolgreich, die Felder leeren.
    Gruß
    Bruno

Hallo Alex,

Wie würdet Ihr dann weitermachen?

Nach der Speicherung werden die Daten aus der DB geladen und
dann in die Felder eingesetzt. Die angezeigten Werte in den
Feldern sind also Werte aus der DB.

Oder

Nach Speicherung der Daten werden diese nicht aus der DB
geladen. Die Werte in den Feldern sind die $_POST - Variablen,
welche beim Absenden den Formulars generiert worden sind und
keine Werte aus der DB.

Ich würde Vorschlag 2 bevorzugen, wobei ich aber auch schon Methode 1 benutzt habe, ist halt abhängig vom Code und in wieviel Tabellen geschrieben wird. Das Prinzip was hinter Methode 2 liegt nennt sich Affenformular: http://de.wikipedia.org/wiki/Affenformular

Jedoch musst du bei dieser Methode sicherstellen, dass der Benutzer nicht das Formular 2 mal absendet (bei Erfolg) oder per reload (Browser-Button) mehrmals das gleiche Formular in die DB schreibt, das kannst du mit einem Session-Token (md5-hash aus der aktuellen Zeit z.B.), welcher in ein hidden-Feld geschrieben und wieder ausgelesen wird und bei einem erfolgreichen versenden des Formulars gelöscht (token=’ ') wird.

Gruß XXD

Hallo und danke für Eure Antworten!

Also ich habe bisher die erste Methode angewandt. Die Formulare schreiben in eine maximal zwei Tabellen, weshalb ich lieber die zweite Methode anwenden würde.

Die Eingabefelder bleiben wie gesagt auch bei erfolgreichem Speichern gefüllt, aber die Speicherung der Daten in die DB könnte man ja dennoch überprüfen und einen Fehler ausgeben, wenn die Formulare fehlerhaft ausgefüllt wurden.

Der Primärschlüssel wird eh in einer SESSION-Variable gespeichert. Bei einem Reload über Browser-Button oder zweiten Absenden der Form wird überprüft, ob der Eintrag schon vorhanden ist und nur geupdatet und nicht neu angelegt.

Ist das so in Ordnung?

Gruß und Dank!

Hi Alex,

Also ich habe bisher die erste Methode angewandt. Die
Formulare schreiben in eine maximal zwei Tabellen, weshalb ich
lieber die zweite Methode anwenden würde.

Die 2 Methode ist besser!

Die Eingabefelder bleiben wie gesagt auch bei erfolgreichem
Speichern gefüllt, aber die Speicherung der Daten in die DB
könnte man ja dennoch überprüfen und einen Fehler ausgeben,
wenn die Formulare fehlerhaft ausgefüllt wurden.

Prinzipiel sollte man sich fragen inwieweit es Sinn macht überhaupt noch die alten Daten anzuzeigen, wenn der Eintrag erfolgreich war. Wirklich sinnvoll ist das ja nur bei Fehleingaben bzw. eine DB-Error, damit der User nicht alles neu einzugeben braucht und auch hier ist ein weiteres Vorgehen abhängig davon, wie du allgemein deine Anwendung aufgebaut hast, benutzt du für jede Seite bzw. deren Subpages ein eigenes Script (nicht schön) oder hast du ein Script für die Subpages in „switch case“ unterteilt (schöner)?

Der Primärschlüssel wird eh in einer SESSION-Variable
gespeichert. Bei einem Reload über Browser-Button oder zweiten
Absenden der Form wird überprüft, ob der Eintrag schon
vorhanden ist und nur geupdatet und nicht neu angelegt.

Kann man machen, hier ist die Frage, inwieweit möchte man DB-Zugriffe gering halten (ist halt abhängig von den Userzahlen), möchte man die Zugriffe gering halten, ist ein Session-Token eine schöne Alternative, denn dein Vorgehen funktioniert ja nur, wenn du den Primärschlüssel nicht auf autoincrement hast, (der Primärschlüssel sollte bevorzugt ein INT-Wert sein und kein String).

Ist das so in Ordnung?

Wie schon oben gefragt, ist das abhängig, wie du deine Anwendung aufgebaut hast. Grob, ohne deinen Aufbau zukennen, sage ich mal: Am besten ist, bei Erfolg rufst du eine neue Seite auf, mit der Erfolgsmeldung und evtl. den Daten die eingetragen wurden. Und sicherst noch ein 2mal versenden mit einem Token ab (Benutzerverhalten ist immer schwierig vorraus zusehen) Ein Bsp. dazu:

HTML:

PHP:

$\_SESSION['token'] = md5(session\_id().time());
$html= $this-\>getTemplate(DEIN\_FORM);
$html = str\_replace('{token}', $\_SESSION['token'], $html);

PHP-Formular senden:

if(isset($\_POST['token'])){
 if(isset($\_SESSION['token']) AND ($\_POST['token']) == $\_SESSION['token']){
 Führe transaction in DB aus....
 if($success){
 $\_SESSION['token'] = ''";
 zeige Erfolgsmeldung...
 else{
 zeige Fehlermeldung.....Token bleibt erhalten
 }
 .....
 }
}

Gruß XXD

Hallo,

leider bin ich noch zu sehr Anfänger, als dass ich ein Gesamtscript für alle Seiten mache. Ich habe alle SQL-Befehle in einer Seite zusammengefasst, die bei Aufruf der Seite geladen wird.

Leider behersche ich nur unzureichend die objektorientierte Programmierung, um Befehle wie

$this-\>getTemplate(DEIN\_FORM);

nachvollziehen zu können geschweige denn zu programmieren.

Mein derzeitiger Entwurf sieht so aus.

if($_POST[‚speichern‘])
{
list($fehler, $hinweis)=eingabe($_POST[‚feld1‘], $_POST[‚feld2‘], $_POST[‚feld3‘], $_POST[‚feld4‘], $_POST[‚feld5‘], $_POST[‚feld6‘]);
if(empty($_POST[‚vertrag‘]) AND empty($fehler))
{
$mysqli->query($insertdb);
echo $mysqli->error;
$_POST[‚vertrag‘]=$mysqli->insert_id;
echo „“. $hinweis . " Daten wurden gespeichert! " . „“;
}
elseif (!empty($_POST[‚vertrag‘]) AND empty($fehler))
{
$mysqli->query($updatedb);
echo $mysqli->error;
echo „“. $hinweis . " Daten wurden gespeichert! " . „“;
}
else
{
echo „“ . $fehler . " Daten wurden nicht gespeichert! " ."";
}
}

Ich habe mich im vorherigen Beitrag vertan. Der Primärschlüssel des Vertrages wird nicht in einer SESSION-Variable, sondern in einem Hiddenfeld festgehalten.

Aber das Vorgehen geht auch mit einer Autoincrement Spalte in der DB. Wenn der Vertrag schon vorhanden ist, ist das Hiddenfeld gefüllt und der Eintrag in der DB wird überschrieben. Wenn das Feld leer ist, wird ein neuer Eintrag mit neuem Primärschlüssel erzeugt.

Gruß

Hi Alex,

dann solltest du dich vielleicht allgemein erst in die Programmierung (vor Allem Objekt Orientiert) einlesen, bevor du solche Projekte startest?

Generell kann man sagen:
Eine Klasse ist der Bauplan eines Objektes und beschreibt alle Eigenschaften und Methoden dieses Objektes:
z. B. der Bauplan eines Fahrzeugs mit den Eingeschaften:
$anzRaeder, $hoechstgeschw, $leistung, $kilometerstand, $gestartet
und den Methoden:

starte(){
 //this verweist immer auf das Objekt in dem ich mich befinde.
 $this-\>gestartet = true;
}
schalteAb{
 &this-\>gestartet = false
}
fahre($\_kilometer){
 $this-\>starte();
 $this-\>kilometerstand += $\_kilometer;
 $this-\>schalteAb();
}

Wenn du ein Objekt Instanzierst, erzeugst du ein Objekt aus einer Klasse und gibst den Eigenschaften Werte.

$auto = new fahrzeug();
$auto-\>anzRaeder = 4;
$auto-\>leistung = 150;

//Aufruf einer Methode in dem Objekt:
$auto-\>fahre(30);

Aber wie gesagt. Vielleicht ließt du dich in die Programmierung allgemein mal ein. Welche Paradigmen gibt es z. B. Oder Lösungsansätze, Pattern, Philosophien der Programmierung.

Klar kann man auch einfach anfangen. Aber ich persönlich rate dazu mich erstmal mit dem Thema „Programmierung“ auseinander zu setzen. Und nebenbei immer üben.

lg

Artur

Hallo Alex,

leider bin ich noch zu sehr Anfänger…

…leider, zum leittragenden der Anfänger gibt es im www eigentlich auch kein vernünftiges Tutorial zu php(zumindest kenne ich keins) auch die meisten Bücher verfahren nach dem Motto: „Schaut so einfach ist php“ und zeigen Praktiken, um eher Anfänger zu ködern, anstatt es „richtig“ beizubringen, dabei ist „richtig“ gar nicht mal so schwer. Das einzigste im Web was ich dir empfehlen kann, ist das php-manual.

Und als Buch: http://www.buecher.de/shop/sqlmysql/php-5-4-und-mysq…
bei ebay ist momentan die Vorgängerversion Buch 5.3 und Mysql für 3€ (Gebot läuft noch 3 Tage), kann ich echt empfehlen. Wobei ich mir gar nicht mehr sicher bin, ob es das oder das war : http://www.buecher.de/shop/fachbuecher/besser-php-pr…

Sehen beide gleich aus…ich schau nochmal nach (Montag) in unserer Bibliothek.

Ich habe mich im vorherigen Beitrag vertan. Der
Primärschlüssel des Vertrages wird nicht in einer
SESSION-Variable, sondern in einem Hiddenfeld festgehalten.

Aber das Vorgehen geht auch mit einer Autoincrement Spalte in
der DB. Wenn der Vertrag schon vorhanden ist, ist das
Hiddenfeld gefüllt und der Eintrag in der DB wird
überschrieben. Wenn das Feld leer ist, wird ein neuer Eintrag
mit neuem Primärschlüssel erzeugt.

Dein Prinzip ist ja meinem Vorschlag ähnlich, ob das jetzt aus einem Sicherheitsaspekt so wirklich gut ist, bin ich mir nicht sicher (zumindest aus dem Aspekt der Mehreinträge)! Ein Autoincrement ist leicht zu erraten, also ich würde dir schon zu einem Session-token raten…das Prinzip hast du ja schon, bau einfach meinen Code in deinen ein (ohne das $this)…

Gruß XXD

Hallo nochmal,

hattest du nochmal in der Bibliothek nachgesehen, welches Buch nun das richtige ist?

Gruß

Alex

Hi,

Ja, dass ist das Buch PHP5.4 und Mysql 5.5 http://www.galileocomputing.de/katalog/buecher/titel…

Ab Kapitel 14 wird Schritt für Schritt ein Basissystem entwickelt, was soweit alles abdeckt.

Viel Erfolg!

Danke!
Schon bestellt!