Christian Bracke: Formular und Datenbank

Ich habe mich gestern daran gesetzt ein PHP Formular zu schreiben, welches Daten aus einer Datenbank abfragt (in dem Falle MySQL).

Gehen wir davon aus, das ich alles in eine Datei haben möchte.

1ter Schritt :
 Connection zur SQL Datenbank aufbauen
 Okay

2ter Schritt :
 die Abfragen und Definition der Einträge welche ich bearbeiten möchte
 Okay

3ter Schritt :
 Formluar Feld, in dem die Werte aus der Datenbank in einem Textfeld wiedergegeben werden.
 Keine Ahnung wie ^^

Was ich machen möchte ist es, die Daten in einem Textfeld auszugeben, um dann per Browser die Werte in jenem Textfeld zu verändern, um dann wiederrum den neuen Wert im Textfeld zu speichern.

Gesucht hab ich schon bei Google, und auch hier, aber zum Teil sind die Antworten und auch die Threads für mich sehr verwirrend.
Ich habe bisher nur die einfach Abfrage von SQL Daten in echos gepackt und das wars.

PS: per Button Werte in der SQL ändern, hab ich mal geschafft das der Button von 0 auf 1 per Klick springt, und andersherum. Das wars dann mit Änderungen in der SQL per Browser *sich duckt und sich schon mal versteckt*

  1. echo $begrüßung;

    Formluar Feld, in dem die Werte aus der Datenbank in einem Textfeld wiedergegeben werden.
    Keine Ahnung wie

    Wie du so ein Element in HTML erstellst, weißt du? Wie du ein solches Element mit Daten vorbelegst, weißt du? Nun, mit PHP musst du genau solch einen HTML-Code erzeugen. Achte dabei darauf, dass hier ein Kontextwechsel auftritt. Die Daten aus der Datenbank werden nun im Kontext "HTML" ausgegeben. Dazu sind einige Sonderzeichen (<, >, & und ") zu behandeln, damit sie nicht als HTML-Code-Bestandteil interpretiert werden. htmlspecialchars() kümmert sich um die HTML-gerechte Behandlung von Strings.

    Was ich machen möchte ist es, die Daten in einem Textfeld auszugeben, um dann per Browser die Werte in jenem Textfeld zu verändern, um dann wiederrum den neuen Wert im Textfeld zu speichern.

    Für dich sieht das wie ein geschlossener Vorgang aus. Für den Webserver ist es das nicht. Er fragt in einem Vorgang die Daten ab und gibt sie aus und nimmt in einem anderen Vorgang Daten entgegen und schreibt sie in die Datenbank. Zwischendrin kümmert er sich um anderes Zeug und hat beim Ausführen des zweiten Teils schon längst wieder vergessen, dass es je einen ersten gab.

    Du kannst das mit zwei Scripten lösen. Eins erstellt das Formular, das andere nimmt Daten entgegen und schreibt sie weg. Soweit so einfach.

    Nun gibt es jedoch einige Sachen zu beachten. Was ist, wenn der Benutzer ungültige Werte eingibt? Das musst du vor dem Eintrag prüfen. Du musst den Benutzer darauf hinweisen und ihm das Formular noch einmal zu Ändern anbieten (Stichwort: Affenformular). Wenn die Prüfung in Ordnung war, kannst du die Datenbank kontaktieren, das Statement zum Ändern der Daten erstellen und absenden. Beachte auch diesmal wieder einen Kontextwechsel: Eingabedaten werden in den Kontext "SQL-Statement" gebracht. mysql_real_escape_string() kümmert sich um die MySQL-gerechte Behandlung von Strings. (Und dann gibt es noch ein PHP-Feature, das mehr stört als nützt, namens Magic Quotes.)

    Ein weiteres Problem stellt Nebenläufigkeit dar. Während Benutzer A grad dabei ist, sein Formular zu ändern, schickt Benuter B Änderungen am selben Datensatz ab. Nun ist A fertig und überschreibt die Änderungen von B, von denen er nichts mitbekommen hat. Wenn du der einzige Benutzer bist, kannst du dieses Problem vernachlässigen. Wenn nicht, solltest du dich nicht gleich an solch ein komplexes Thema wagen. :-)

    echo "$verabschiedung $name";

    1. Hello,

      Ein weiteres Problem stellt Nebenläufigkeit dar. Während Benutzer A grad dabei ist, sein Formular zu ändern, schickt Benuter B Änderungen am selben Datensatz ab. Nun ist A fertig und überschreibt die Änderungen von B, von denen er nichts mitbekommen hat. Wenn du der einzige Benutzer bist, kannst du dieses Problem vernachlässigen. Wenn nicht, solltest du dich nicht gleich an solch ein komplexes Thema wagen. :-)

      Dabei ist das eine Aufgabe, die man ganz leicht bis auf Satzebene herab (oder wenn es sein muss, sogar bis auf Spaltenebe) über das Spaltenlayout der DB lösen kann...
      Man fügt einfach ein zusätzliches Feld hinzu. Nennen wir es hier mal CONFLICT_COUNT. Dieses Feld wird einfach bei jedem Update des Datensatzes um eins heraufgezählt.

      Beim Holen der Daten liefert man es zusammen mit der ID und den Daten aus (oder besser: speichert es für den User in der Session. Das erzeugt aber ein neues Problem: Reentranzfähigkeit).

      Beim Zurückschreiben der (geänderten) Daten fragt men nicht "where ID = $xyz", sondern "where ID = $yxz and CONFLICT_COUNT = $conflict_count" und darf nun natürlich nicht vergessen

      set CONFLICT_COUNT = CONFLICT_COUNT + 1

      irgendwo im Update-Statement mit unterzubringen.

      Wenn man es noch eleganter lösen will, benutzt man für die Kontrolle und das Hochzählen einen Trigger.

      Da Trigger bei MySQL mWn aber noch keine qualifizierten Exceptions auslösen können, muss man für das Ablehnen der Operation einen schmutzigen Trick verwenden. Man spricht einfach eine nicht vorhandene Dummy-Spalte an. Das führt dann zum Abbruch des Updates.

      BTW: Ich bedaure immer wieder, dass man hier keine Grafiken mit hochladen kann für Erläuterungen. Eine Skizze ist manchmal verständlicher, als 1000 Worte. Das Separate Hosting der Grafiken auf einem eigenen Server führt später meistens zu deren Verlust für den Thread...

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

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

      1. Hello,

        Man fügt einfach ein zusätzliches Feld hinzu. Nennen wir es hier mal CONFLICT_COUNT. Dieses Feld wird einfach bei jedem Update des Datensatzes um eins heraufgezählt.

        NACHTRAG: gleich zur Vorbeugung. Ein Timestamp ist hierfür theoretisch ungeeignet, da er eine Granularität besitzt. In der Praxis ist seine Verwendung aber immer noch besser, als gar keine Kontrolle.

        Der Zähler ist also fachlich die richtige Wahl, der Timestamp meistens gerade noch ausreichend, aber eben nicht sicher.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

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

        1. Ok ich danke für eure Antworte, ich werde mich mal daraufhin schlau machen und mal rumcoden und probieren. Zum Glück hab ich ein paar qualifizierte Mittechniker hinter mir stehen ^^

          Dann werd ich mal mit denen Quatschen und das umsetzen

          mfg
          Christian

          (achja eigtl bin ich eingeloggt und habe auch eine Automatische Begrüßung und einen Abschluss eingeschaltet, funzt aber nicht O_o)