Datensatz klonen (mit Formular), so dass bei Korrekturen (Fehlermeldungen) die bereits erfassten Mutationen nicht verloren gehen

  • Ich habe eine Datei update.php (siehe Code unten), welche anstandslos funktioniert.
    Das Formular wird erst definitiv gespeichert, wenn keine Fehlermeldungen (mehr) vorhanden sind.

    Heisst, es erfolgt eine Zwischenspeicherung falls es Fehlermeldungen hat, damit bei Fehlermeldungen die bereits mutierten Daten nicht verloren gehen und nur wieder der ursprüngliche Datensatz im Formular erscheint und alles wieder neu eingegeben werden muss.

    Nun habe ich versucht eine Datei clone.php zu erstellen (statt einen neuen Datensatz zu erstellen, nehme ich einen bestehenden ähnlichen, mutiere diesen und speichere unter neuer id ab). Aber es ist mir nicht gelungen, das obige System "Zwischenspeicherung" zu implementieren. Ich brauche einen Denkanstoss wie man das am besten macht.


    Meine Ueberlegungen (Datei update.php wie unten zu Datei clone.php abändern):

    1. In Zeile 30 müsste eine neue ID erstellt werden, statt auf die bestehende ID zu speichern.
    2. Bei Fehlermeldungen wird Zeile 30 wiederum durchlaufen und eine neu ID generiert, was nicht sein sollte, sondern auf die neu eröffnete ID abspeichern.
    3. Sobald keine Fehlermeldungen vorhanden sind, müsste in Zeile 44 auch unter der neu bestehenden ID abgespeichert werden (wie definiert man das?).

    Wahrscheinlich gibt es mehrere Möglichkeiten das Problem zu lösen. Ich wäre sehr dankbar für einen Hinweis wie man das am Besten angeht.

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von Markus_Schmid ()

  • Zitat

    unter der neu bestehenden ID abgespeichert werden (wie definiert man das?).

    Ich nehme an, das ist dein Kernproblem: Ein Update mit unveränderter ID ist kein Problem aber Du willst unter neuer ID speichern?

    Das einfachste wäre, das betr. Feld in der Datenbank als autoincrement zu definieren, die DB würde dann bei "INSERT" eine neue ID automatisch fest legen.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von Sempervivum ()

  • Ich nehme an, das ist dein Kernproblem: Ein Update mit unveränderter ID ist kein Problem aber Du willst unter neuer ID speichern?

    Das einfachste wäre, das betr. Feld in der Datenbank als autoincrement zu definieren, die DB würde dann bei "INSERT" eine neue ID automatisch fest legen.

    Das ist genau so, doch in der DB ist das ID-Feld bereits als autoincrement definiert.
    Eine neue ID wird automatisch festgelegt.

    Mein Problem: Das ganze funktioniert wie ein Affenformular, also wird bei einer Fehlermeldung und erneutem Abspeichern nach Korrektur der ganze Code nochmals durchlaufen und eine zweite ID mit einem zweiten Eintrag erstellt.

    Ich dachte schon an eine Variable welche die Durchläufe zählt, damit ich eine if-Abfrage erstellen kann, die je nach Anzahl Durchläufe eine neue iD aufmacht oder auf die bestehende speichert.

    Aber wenn ich diese Variable Anfangs mit 0 definiere, nützt später das Hochzählen nichts, denn weil der ganze Code durchlaufen wird, setzt es mir auch die Variable wieder auf 0 - das ist scheinbar mein Kernproblem und wie weiss nicht, ob und wie man das lösen kann.

  • Verstehe, dann bist Du ja schon weiter als ich dachte :)

    Das müsste sich lösen lassen, indem Du eine Zustandsvariable als Sesssion-Variable führst: Beim ersten Abschicken des Formulars ist diese nicht gesetzt und Du fügst den Datensatz in die Datenbank ein. Sobald das erfolgreich war, setzt Du diese Variable und wenn dann das Formular noch mal abgeschickt wird, machst Du ein Update.

  • Verstehe, dann bist Du ja schon weiter als ich dachte :)

    Das müsste sich lösen lassen, indem Du eine Zustandsvariable als Sesssion-Variable führst: Beim ersten Abschicken des Formulars ist diese nicht gesetzt und Du fügst den Datensatz in die Datenbank ein. Sobald das erfolgreich war, setzt Du diese Variable und wenn dann das Formular noch mal abgeschickt wird, machst Du ein Update.

    Danke für die Antwort, aber ich komme als Anfänger nicht weiter, vielleicht habe ich ein Brett vor dem Kopf - folgende Ueberlegungen:

    1. Ich kann auf Zeile 37 (unterhalb der ersten Speicherung unter einer neuen ID) eine Sessionsvariable setzen: $_SESSION['anzahl_schleifen'] = 1;

    2. Bei der nächsten Schleife sollte Zeile 31 bis 34 übersprungen werden.
    3. Damit diese 4 Zeilen übersprungen werden können, muss ich eine if- (+ evtl. else) Abfrage machen - aber unter Einbezug der Sessionsvariable - die das Programm bei der ersten Schleife bei Zeile 31 noch nicht kennt, weil sie erst in Zeile 37 festgelegt wird.

    Allg. scheint mir ich habe das gleiche Problem, ob die Variable eine Sessionsvariable ist oder nicht.

  • Du hast ganz einfach die falsche Reihenfolge im Script programmiert. Es werden erst die Daten gespeichert und dann überprüft, das ist falsch. Erst prüfen und wenn alles ok ist, in die DB schreiben.


    Und die ID zu updaten, wenn diese auf auto_increment eingestellt ist, ist natürlich völlig unnötig-

  • Ich bin jetzt nichts ins Detail eingestiegen und habe auch keine getestete Lösung, aber folgende Hinweise:

    • Du schriebst: "Allg. scheint mir ich habe das gleiche Problem, ob die Variable eine Sessionsvariable ist oder nicht." Eine Sessionvariable hat den Vorteil, dass dir der Wert beim Neuladen der Seite bzw. dem Abschicken des Formulars erhalten bleibt.
    • Dieses: "Heisst, es erfolgt eine Zwischenspeicherung falls es Fehlermeldungen hat, damit bei Fehlermeldungen die bereits mutierten Daten nicht verloren gehen und nur wieder der ursprüngliche Datensatz im Formular erscheint und alles wieder neu eingegeben werden muss." würde sich wesentlich einfacher gestalten wenn Du die Daten mit Ajax zum Server schicken würdest, dann bleibt das Formular wie es ist und Du brauchst nichts zwischenzuspeichern.
    • Eine clientseitige Validierung zusätzlich zur serverseitigen würde das Ganze für den Benutzer angenehmer gestalten. Mit der HTML5-Formularvalidierung ist das ja heute schnell getan.