Eva: Methode zur Parameterübergabe

Hallo,
ich gestalte im Moment eine Seite, auf der ich einen Button "zu Favoriten speichern" habe.
Wenn man darauf klickt soll eine Eingabe in die Datenbank geschrieben werden, anschließend soll der Nutzer ganz normal die Seite weiter benutzen können.
Das heißt, sie soll nicht neu geladen werden.

Ich habe zwar gehört, dass es mit javascript irgend wie auch gehen soll, da ich mich damit aber nicht auskenne habe ich es unschön umgesetzt: Ich habe ein iframe mit d er Höhe und Breite von jeweils 0px eingefügt und wenn man nun auf den Button klickt, werden die Daten erst mit Javascript geprüft (ja da nehme ich Javascript her, dafür reichen meine Kenntnisse :-) ) und anschließend mit dem Befehl
document.getElementById("iFrameID").contentWindow.location.href
auf die php-Seite verschickt, die das speichern in die Datenbank übernimmt. Die Übergabeparameter habe ich mit ?par1=x&par2=y angehängt.

So, alles wunderbar, nun sollte aber noch ein Name übergeben werden, die der bookmark tragen soll. Dieser Name sollte möglichst keine Einschränkungen in den Zeichen haben, vorallem sollen aber auch Leerzeichen erlaubt sein. Da gibt es aber nun Probleme mit den Übergabeparameter. Ich könnte alle Leerzeichen mit einem Zeichen ersetzen, das selten ist - aber dann wird es da wieder eingeschränkt. Ich weiß gar nicht, auf welche Zeichen ich alles aufpassen muss.

Nun wollte ich fragen, ob ihr eine gute Alternative kennt, mit dem ich dieses Problem lösen kann.

Danke

  1. Hi,

    Wenn man darauf klickt soll eine Eingabe in die Datenbank geschrieben werden, anschließend soll der Nutzer ganz normal die Seite weiter benutzen können.
    Das heißt, sie soll nicht neu geladen werden.
    Ich habe zwar gehört, dass es mit javascript irgend wie auch gehen soll, ...

    ja, mit einem AJAX-Request.

    da ich mich damit aber nicht auskenne habe ich es unschön umgesetzt: Ich habe ein iframe mit d er Höhe und Breite von jeweils 0px eingefügt und wenn man nun auf den Button klickt, werden die Daten erst mit Javascript geprüft (ja da nehme ich Javascript her, dafür reichen meine Kenntnisse :-) ) und anschließend mit dem Befehl
    document.getElementById("iFrameID").contentWindow.location.href
    auf die php-Seite verschickt, die das speichern in die Datenbank übernimmt. Die Übergabeparameter habe ich mit ?par1=x&par2=y angehängt.

    Warum *so* aufwendig?
    Ein normaler Link würde genügen - die aufgerufene Ressource verarbeitet die als URL-Parameter übergebenen Daten, trägt sie in die DB ein und antwortet dann mit Status 204 No Content, damit das aktuell geladene Dokument erhalten bleibt.

    So, alles wunderbar, nun sollte aber noch ein Name übergeben werden, die der bookmark tragen soll. Dieser Name sollte möglichst keine Einschränkungen in den Zeichen haben, vorallem sollen aber auch Leerzeichen erlaubt sein. Da gibt es aber nun Probleme mit den Übergabeparameter.

    Nein. Er muss nur korrekt als URL-Parameter codiert sein. In Javascript beispielsweise mit encodeURIComponent().

    So long,
     Martin

    --
    Liebet eure Feinde - vielleicht schadet das ihrem Ruf.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo,
      vielen Dank für die Antwort.

      encodeURIComponent() funktioniert wunderbar. Danke!!!

      Warum so kompliziert, das ist eine gute Frage. Weil ichs nicht besser wusste :-)

      Das mit der Rückgabe, dass es keinen Content gibt, ist eine gute Idee. Da ich das noch nie gemacht habe, habe ich mal danach gegoogelt und nun meine php Seite mit einer zusätzlichen Zeile am Ende versehen:

      header("HTTP/1.1 204  No Content");

      Auf der Seite steht nun
      location.href = url;

      Nun ruft er schön die Datenbankseite auf, führt die Datenbank-Anfrage durch. Er kehrt danach auch auf die Ursprungsseite zurück aber er läd sie neu. Das will ich nicht, da der Nutzer schon mehr Einstellungen vorgenommen hat, die nicht weg sein sollen.
      Außerdem hängt er an die Adresse der Zeile nun einen Parameter an, den ich der Datenbankseite gegeben habe (komischerweise aber nur der letzte und nicht alle).

      Nun weiß ich nicht, was ich falsch mache. Das ist im Moment eh mehr trial and error, da ich das noch nie machte.

      Falls es doch so geht wie ich es mir vorstelle: Kann ich irgend wie eine Antwort geben? Falls irgend was beim Datenbankzugriff fehlgeschlagen ist wäre es sinnvoll, wenn der Nutzer die Antwort bekommt, dass der Bookmark nicht gespeichert wurde.

      Vielen Dank

      1. Hallo,

        Das mit der Rückgabe, dass es keinen Content gibt, ist eine gute Idee.

        Finde ich nicht. Wenn der Besucher sehen soll, ob Erfolg/KeinErfolg sollte schon ein gewisser Content geliefert werden ;)

        Sende eine 200 Response, definiere im Dokument einen Tag mit ID für die Antwort und schreibe da das Ergebnis (1) rein. Da wird die Seite auch nicht neu geladen.

        (1) DB-Errors bitte benutzerfreundlich aufarbeiten, mit "ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that..." (Beispiel) kann keiner was anfangen.

        Hotti

        1. hallo,
          tut mir leid, dass ich mir jetzt erst wieder melde.

          vielen dank für die antworten.

          leider habe ich das mit dem verschicken von response 200 nicht ganz hinbekommen. Leider fand ich über google auch nichts hilfreiches (oder ich habe nach den falschen stichwörtern gesucht).

          habt ihr ein beispiel, bei dem ein response 200 mit verschiedenen antworten (erfolg / nicht erfolg) geschickt und ausgelesen wird?

          das wäre nett

          danke

          1. Hello,

            leider habe ich das mit dem verschicken von response 200 nicht ganz hinbekommen. Leider fand ich über google auch nichts hilfreiches (oder ich habe nach den falschen stichwörtern gesucht).

            habt ihr ein beispiel, bei dem ein response 200 mit verschiedenen antworten (erfolg / nicht erfolg) geschickt und ausgelesen wird?

            Status 200 bedeutet immer "Erfolg" und auch einen Response-Inhalt, der dann im Browser zur Neudarstellung dieses Inhaltes führen soll.

            Wenn Du keine Neudarstellung wünschst, musst Du bei Erfolg den Status 204 als Antwort senden.

            Schau dir die Funktion header() an http://de2.php.net/manual/de/function.header.php

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
    2. Hello,

      Warum *so* aufwendig?
      Ein normaler Link würde genügen - die aufgerufene Ressource verarbeitet die als URL-Parameter übergebenen Daten, trägt sie in die DB ein und antwortet dann mit Status 204 No Content, damit das aktuell geladene Dokument erhalten bleibt.

      Daran habe ich eben auch gedacht. Allerdings haben sich die User, die derartig gebaute Seiten benutzen sollten, meistens beschwert, dass sie keine Rückmeldung für ihre Aktion bekommen. Sie haben also mehrfach geklickt, weil sie der Meinung waren, ihr Request wäre nicht verarbeitet worden.

      Das muss man dann wieder in der DB berücksichtigen, wenn man es so bauen will. Ich plädiere für ein ganz normales Request-Response-Verhalten. Wenn nur der Button dann ausgegraut wird und daneben ein grüner Haken gesetzt wird, sollte das doch nicht zuviel Traffic geben - vorausgesetzt, das Caching für die Folgerequests (Bilder usw.) ist vernünftig gebaut.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi,

        Status 204 No Content
        Daran habe ich eben auch gedacht. Allerdings haben sich die User, die derartig gebaute Seiten benutzen sollten, meistens beschwert, dass sie keine Rückmeldung für ihre Aktion bekommen.

        hmm, ich finde die Möglichkeit genial, und verwende sie hier im Forum mit Begeisterung, um Threads auszublenden oder als gelesen zu markieren: Ein Klick, am Mauszeiger blitzt kurz die Eieruhr auf, und das war's schon. Und beim nächsten Reload ist der Thread weg.

        Sie haben also mehrfach geklickt, weil sie der Meinung waren, ihr Request wäre nicht verarbeitet worden.

        Das ist natürlich nicht Sinn der Sache.

        Ich plädiere für ein ganz normales Request-Response-Verhalten. Wenn nur der Button dann ausgegraut wird und daneben ein grüner Haken gesetzt wird, ...

        ... oder für ein paar Sekunden ein "Overlay" mit einer kurzen Textmeldung eingeblendet wird. Zumal Eva für die Ermittlung/Codierung der URL-Parameter sowieso schon Javascript verwenden muss.

        Das ändert aber nichts daran, dass mir die 204er-Response *für meine Belange* immer noch am besten gefällt.

        So long,
         Martin

        --
        Husten kann böse Folgen haben.
        Besonders im Kleiderschrank.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hello,

          Das ändert aber nichts daran, dass mir die 204er-Response *für meine Belange* immer noch am besten gefällt.

          Für geübte User ist sie sicherlich auch optimal. Die achten auch auf ihre Statusleiste.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
        2. Hallo

          Status 204 No Content
          Daran habe ich eben auch gedacht. Allerdings haben sich die User, die derartig gebaute Seiten benutzen sollten, meistens beschwert, dass sie keine Rückmeldung für ihre Aktion bekommen.

          hmm, ich finde die Möglichkeit genial, und verwende sie hier im Forum mit Begeisterung, um Threads auszublenden oder als gelesen zu markieren: Ein Klick, am Mauszeiger blitzt kurz die Eieruhr auf, und das war's schon. Und beim nächsten Reload ist der Thread weg.

          Häh? Warum erst beim nächsten Reload? Achja, du warst doch in Sachen Browser bewusst mit Museumsstücken unterwegs, oder? ;-)

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
          Veranstaltungsdatenbank Vdb 0.3
          1. Hi,

            hmm, ich finde die Möglichkeit genial, und verwende sie hier im Forum mit Begeisterung, um Threads auszublenden oder als gelesen zu markieren: Ein Klick, am Mauszeiger blitzt kurz die Eieruhr auf, und das war's schon. Und beim nächsten Reload ist der Thread weg.
            Häh? Warum erst beim nächsten Reload? Achja, du warst doch in Sachen Browser bewusst mit Museumsstücken unterwegs, oder? ;-)

            wenn Opera 11 ein Museumsstück ist, ja. :-)
            Okay, zugegeben: Den alten IE5.5 benutze ich auch noch vereinzelt. Aber nur noch selten, seit ich den 8er als Alternative habe. Dennoch macht Opera bei mir wohl etwa 80..90% aus.

            Ciao,
             Martin

            --
            Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo

              hmm, ich finde die Möglichkeit genial, und verwende sie hier im Forum mit Begeisterung, um Threads auszublenden oder als gelesen zu markieren: Ein Klick, am Mauszeiger blitzt kurz die Eieruhr auf, und das war's schon. Und beim nächsten Reload ist der Thread weg.

              Häh? Warum erst beim nächsten Reload? Achja, du warst doch in Sachen Browser bewusst mit Museumsstücken unterwegs, oder? ;-)

              wenn Opera 11 ein Museumsstück ist, ja. :-)

              Ich wundere mich nur über das beschriebene Verhalten. Wenn ich den Link zum ausblenden eines Threads anklicke, verschwindet dieser, sobald die Antwort des Ajax-Schnipsels bei mir angekommen ist. So, wie von dir beschrieben (Ausblenden erst beim Neuladen der Seite), kenne ich das nur von alten, museumsreifen Browsern.

              Tschö, Auge

              --
              Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
              Terry Pratchett, "Wachen! Wachen!"
              ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
              Veranstaltungsdatenbank Vdb 0.3
              1. Hi,

                Achja, du warst doch in Sachen Browser bewusst mit Museumsstücken unterwegs, oder? ;-)
                wenn Opera 11 ein Museumsstück ist, ja. :-)
                Ich wundere mich nur über das beschriebene Verhalten. Wenn ich den Link zum ausblenden eines Threads anklicke, verschwindet dieser, sobald die Antwort des Ajax-Schnipsels bei mir angekommen ist. So, wie von dir beschrieben (Ausblenden erst beim Neuladen der Seite), kenne ich das nur von alten, museumsreifen Browsern.

                nein, das hat nichts mit dem Browser zu tun, sondern damit, dass ich Javascript nur in begründeten Ausnahmefällen zulasse - egal ob IE, Opera oder ausnahmsweise sogar mal Firefox. Ohne JS fühle ich mich im Surfalltag einfach wohler, man muss sich nicht dauernd über irgendwelche lästigen Effekte ärgern.
                Klar, es gibt ab und zu ein paar Sites, wo ohne JS "nichts geht". Aber dann ist es halt eine Gewissensentscheidung, ob ich für diese Site JS zulassen will, oder lieber wieder verschwinde. Meistens läuft es auf Letzteres hinaus.

                Ciao,
                 Martin

                --
                Der Afrika-Forscher wird gefragt: "Stimmt es, dass man nicht von Löwen angefallen wird, wenn man eine Fackel trägt?" - "Kommt drauf an. Man muss die Fackel sehr schnell tragen."
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(