Hamburger: Datenbankzugriff

Hiho....

bin leider kein js experte und hab nun natürlich probleme.... °°

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

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... (da kann ich wenigstens nen bisschen was)

kann mir da einer helfen?

vielen dank im vorwege....
gruss
horst

  1. Hallo,

    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... (da kann ich wenigstens nen bisschen was)

    was natürlich bei deaktiviertem JavaScript nicht helfen würde.

    Du kannst ja mal "onUnload" in SelfHTML /JavaScript nachschauen, dann in einer Funktion
    der Seitenaufruf über "location", also z.B. window.location.href =, oder vielleicht per
    "replace", und dann mal schauen ob das auch so von allen Browsern ausgeführt wird.
    (Und wenns klappt die neu aufgerufene Seite wieder schliessen)

    Grüsse

    Cyx23

  2. 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.

    1. Ein Nachtrag:

      Einziger Wermutstropfen: Der IE ist anscheinend nicht in der Lage, Änderungen an Radioknöpfen [mit onChange] 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.

      Verwendet man bei <input type="radio"> statt onChange das Attribut onClick, funktioniert's auch mit dem IE.

      1. Hi,

        Verwendet man bei <input type="radio"> statt onChange das Attribut onClick, funktioniert's auch mit dem IE.

        Dies funktioniert eigentlich nur im Opera richtig.
        Ich habe für diese Seite drei verschiedene Event-Handler passend für IE, Opera und andere Browser angegeben:

          
              if(!window.navigator.language) f.elements[i].onactivate=BewertungIE;  
              else if(window.opera) f.elements[i].onclick=Bewertung;  
              else f.elements[i].onchange=Bewertung;  
        
        

        freundliche Grüße
        Ingo

        1. Guten Tag!

          Verwendet man bei <input type="radio"> statt onChange das Attribut onClick, funktioniert's auch mit dem IE.

          Dies funktioniert eigentlich nur im Opera richtig.

          Deine Erfahrungswerte unbeschadet möchte ich doch anfügen, dass ich diesen korrigierenden Nachtrag, gerade einen korrigierenden!, nicht verfasst hätte, wenn der Test mit meinem IE 6 sowie meinem Firefox fehlgeschlagen wäre. So schwachsinnig bin ich nun auch nicht.

          Ich interpretiere Dein "eigentlich" denn auch so, dass Du meine Aussage nicht, wie es den ersten Eindruck hinterlässt, als gänzlich falsch darstellen, sondern nur auf eine andere Beobachtung hinweisen wolltest.

          Grüße und nichts für ungut.

    2. Hallo,

      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.

      escape() hat keinen »i18n support«, sprich, es kodiert Zeichen außerhalb des Zeichenvorrats von ISO 8859-1 mit einer schwachsinnigen Unicode-Escape-Schreibweise und Zeichen darin mit der ISO-8859-1-Kodierung.
      encodeURIComponent() mit UTF-8-Kodierung ist schon brauchbarer.

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

      Das wird knapp. Das Laden der HTTP-Ressource nach Änderung von bild.src wird im Hintergrund ausgeführt. Wenn man direkt im Anschluss delete bild durchführt, könnte das möglicherweise unschöne Resultate haben.

      Mathias

      1. Guten Abend!

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

        Das wird knapp. Das Laden der HTTP-Ressource nach Änderung von bild.src wird im Hintergrund ausgeführt. Wenn man direkt im Anschluss delete bild durchführt, könnte das möglicherweise unschöne Resultate haben.

        In welcher Form? "Unschön" hört sich so nach Browserabsturz an, was ich aber mit Firefox und dem IE 6 in Verbindung mit einem mit zehnsekündiger Verzögerung antwortenden Test-"Bild" (Skript) nicht nachvollziehen konnte. Funktionierte im Gegenteil einwandfrei wie beschrieben, auch wenn innerhalb der zehn Sekunden diese drei Zeilen mehrere Male durchlaufen wurden.

        Ich denke auch, dass das eine oder andere Vorladen von Grafiken dann ebenfalls "unschön" enden müsste, auch wenn dort die Grafikobjekte statt mit delete mit dem Wechsel zu einer neuen Seite abgewürgt werden. Bei der Beliebtheit solcher Aktionen hätte es doch längst auffallen müssen, würden Browser das nicht vertragen.

        Nichtsdestotrotz kann man natürlich die delete-Zeile und das Wörtchen var rausnehmen, dann bleibt das Objekt wenigstens bis zur nächsten Änderung stehen.

        1. Hallo,

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

          Das wird knapp. Das Laden der HTTP-Ressource nach Änderung von bild.src wird im Hintergrund ausgeführt. Wenn man direkt im Anschluss delete bild durchführt, könnte das möglicherweise unschöne Resultate haben.

          In welcher Form?

          Der Browser könnte, sofern die Anfrage zum Server noch nicht gesendet wurde, die Anfrage gar nicht senden.
          Ist aber nur eine allgemeine Befürchtung.

          "Unschön" hört sich so nach Browserabsturz an, was ich aber mit Firefox und dem IE 6 in Verbindung mit einem mit zehnsekündiger Verzögerung antwortenden Test-"Bild" (Skript) nicht nachvollziehen konnte.

          Wann der Server antwortet, ist eigentlich irrelevant. Hauptsache, die Anfrage dringt zum Server durch.
          Allerdings könnte der Browser die TCP-Verbindung schließen, wenn man das Objekt, für das momentan eine Anfrage läuft, gelöscht wird. Soweit ich weiß, schießt z.B. der PHP-Interpreter laufende PHP-Scripte ab, sobald das geschieht (Quelle).

          Funktionierte im Gegenteil einwandfrei wie beschrieben

          Wie gesagt, war nur eine Vermutung. Ich würde das Objekt erst nach dem fertigen Laden freigeben, auch wenn ich keine Tests durchgeführt habe, die die praktische Nachteiligkeit deiner Methode belegen.

          Ich denke auch, dass das eine oder andere Vorladen von Grafiken dann ebenfalls "unschön" enden müsste, auch wenn dort die Grafikobjekte statt mit delete mit dem Wechsel zu einer neuen Seite abgewürgt werden.

          Vorladescripte wechseln deshalb i.d.R. auch erst die Seite, wenn für alle vorgeladenen Grafiken load-Events gefeuert wurden bzw. die complete-Eigenschaft stimmt.

          Nichtsdestotrotz kann man natürlich die delete-Zeile und das Wörtchen var rausnehmen, dann bleibt das Objekt wenigstens bis zur nächsten Änderung stehen.

          var kann man ruhig verwenden.
          Ein Objekt bleibt m.W. weiterhin im Speicher, auch wenn es in einer lokalen Funktion definiert wurde, die bereits abgelaufen ist. Das Abräumen besorgt erst der Garbage Collector, der m.W. nicht (notwendigerweise) direkt nach Ausführen der Funktion anspringt.

          Mathias

  3. Hallo,

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

    Dann brauchst du JavaScript-Kommunikation mit dem Server. new Image() wurde genannt, es geht auch mit unsichtbaren iframes oder dem besagten XMLHttpRequest.

    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... (da kann ich wenigstens nen bisschen was)

    onclose gibt es nicht, aber onunload.
    Irgendwelche Aktionen beim unload durchzuführen, ist allerdings nicht erfolgsversprechend. Insbesondere das Öffnen von Fenstern wird von Popup-Blockern gerne (zurecht) verhindert.

    Siehe mein Beispiel mit onbeforeonload und XMLHttpRequest. Das ähnelt vom Aufbau her dummer Names Beispiel, ist aber auf darauf ausgerichtet, die (POST-)Formulardaten auf jeden Fall zum Server zu übertragen.
    Bei GET-Formulardaten nimmt man wie gesagt einfacher new Image() statt XMLHttpRequest.

    Mathias

    1. Siehe mein Beispiel mit onbeforeonload und XMLHttpRequest.

      Korrektur, ich meinte das dort verlinkte Posting http://forum.de.selfhtml.org/archiv/2005/8/t114087/#m726346. Aber lasse dich nicht von der Funktion dort beeindrucken, die escape() für ASCII-Zeichen verwendet. encodeURIComponent() reicht meines Wissens für application/x-www-form-urlencoded.