dummer Name: Datenbankzugriff

Beitrag lesen

Guten Morgen!

ich hab eine seite, bei der der user eine auswahl treffen kann, die ich in realtime in der mysql datenbank abspeichern muss/möchte.

Du könntest bei Änderung eines Formularelements (Attribut onChange) mit Javascript ein (unsichtbares) Bild in der Webseite ändern. Die URL dieses Bildes, eigentlich auf ein verarbeitendes Skript zeigend, nicht auf ein Bild, enthält die an den Server zu übermittelnden Daten, in etwa "sql.php?text1=bla;text2=blabla". Mit $_GET["text1"] etc lassen sich die Daten leicht übernehmen, ausgeben braucht das Skript pro forma nur ein vorbereitetes, durchsichtiges 1x1-Minibild (mit readfile() und header("Content-Type: image/png") oder ähnlichem).

Weil das eventuell nicht so leicht zu durchschauen ist, ein Fertigbausatz, hübsch bunt:

Javascript:

  
function änderung() {  
    var p = ""; // in Variable p werden die Formulardaten aufgebaut, p wie URL-Parameter  
    var v, e, i, j;  
    for (i = 0; i < document.formular.elements.length; i++) { // alle Formularelemente des Formulars 'formular' durchlaufen  
        e = document.formular.elements[i]; // Element Nummer i in Variable e schieben, spart Schreibarbeit  
        v = ""; // Wertvariable leeren  
        switch (e.type) { // Abhängig vom Elementtyp:  
        case "radio": // :Radioknöpfe  
            if (e.checked) { // falls angewählt...  
                v = e.value; // ...Wert (aus HTML-Attribut value) in v schreiben  
            }  
            break;  
        case "select-multiple": // :Auswahllisten, mit Mehrfachauswahl  
        case "select-one":      // : " , mit Einfachauswahl  
            for (var j = 0; j < e.options.length; j++) { // alle Optionen durchlaufen  
                if (e.options[j].selected) { // falls Option angewählt...  
                    v = v + ((v.length > 0) ? "," : "") + e.options[j].value; // ...Wert der Option in v schreiben, mit einem Komma vom Vorgänger getrennt, falls schon ein Vorgänger in v steht  
                }  
            }  
            break;  
        default: // :alle anderen Elementtypen  
            v = e.value;  
        }  
        if (v != "") { // Haben wir einen Wert vom Element bekommen?  
            p = p + ((p.length > 0) ? "&" : "?") + escape(e.name) + "=" + escape(v); // Ja, "Elementname gleich Wert" an Variable p anhängen, getrennt entweder mit ? (erster Parameter) oder mit einem & (folgende Parameter). "Unpassende" Zeichen mit escape() entschärfen.  
        }  
    }  
    document.formular.ausgabe.value = p; // nur als Beispiel: Ausgabe  der URL-Parameter in das Textfeld "ausgabe" im Beispiel-Formular  
}  

HTML, als Beispiel angereichert:

  
<form name="formular" method="post">  
<p>  
<input type="text" name="text1" onChange="änderung();">  
</p>  
<p>  
<select name="top5" size="3" onChange="änderung();" multiple>  
<option value="heino">Heino</option>  
<option value="michael">Michael Jackson</option>  
<option value="tom">Tom Waits</option>  
<option value="nina">Nina Hagen</option>  
<option value="bruce">Bruce Springsteen</option>  
</select>  
</p>  
<p>  
<input type="radio" name="Zahlmethode" value="Mastercard" onChange="änderung();" > Mastercard<br>  
<input type="radio" name="Zahlmethode" value="Visa" onChange="änderung();" > Visa<br>  
<input type="radio" name="Zahlmethode" value="AmericanExpress" onChange="änderung();" > American Express  
</p>  
  
<hr>  
  
<p>  
<textarea name="ausgabe" cols="80" rows="5"></textarea>  
</p>  
</form>  

Wenn Du das ganze zusammengebastelt hast, gibt die Seite nach jeder Änderung in unteren Textfeld das fertige Anhängsel für die URL aus. Es erscheinen nur Elemente, die auch Daten haben, die Einträge des Mehrfachfeldes top5 werden durch ein Komma getrennt.

Um Dein Skript aufzurufen, musst Du die Zeile 'document.formular.ausgabe.value = p;' am Ende durch folgendes ersetzen:

var bild = new Image();
bild.src = "sql.php" + p;
delete bild;

Einziger Wermutstropfen: Der IE ist anscheinend nicht in der Lage, Änderungen an Radioknöpfen korrekt zu melden. Dass er grundsätzlich das letzte angewählte Element statt des gerade neu angewählten meldet, ließe sich noch trickreich umgehen, dass er überhaupt nicht reagiert, wenn zuvor ein anderes Formularfeld geändert wurde, leider nicht.
Du kannst auf <select>-Listen ausweichen oder eines der beliebten Bapperl drunterkleben: "Optimiert für alles außer dem IE" ;-)

als ausweichmöglichkeit hatte ich mir gedacht, das man auch beim schliessen des fensters (onClose?) eine php seite aufrufen könnte, in der ich meine ganz normalen standart sql befehle benutzen kann.

Eigentlich äquivalent wie oben, nur dass änderung() beim Schließen aufgerufen werden müsste. Das geht nur leider nicht, es gibt nur ein onUnload, das beim Wechseln auf eine andere Seite aufgerufen wird.

Baust Du ein ein Formularfeld "Fenster schließen" (<input type="submit" value="Fenster schließen">) ein, kannst Du auf die Javascript-Übermittlung auch verzichten und, anstatt das Fenster zu schließen, das Formular einfach abschicken und erst in der Antwortseite das Fenster schließen.

Grüße.