anfänger: Ajax

Hallo,

ich versuche mich gerade in Ajax einzuarbeiten.
Wie die Sache auf der Clientseite mit dem XMLHttpRequest -Objekt geht, glaube ich begriffen zu haben.
Was ich nicht verstehe ist, wie PHP das Ergebniss am Ende wieder zurücksendet.

Ein kleines Beispiel.

Im Client gibt der User eine Postleitzahl ein.
Nach jeder Zifferneingabe sendet der Client eine Request an das PHP Skript mit den bisher eingegebenen Ziffern.
Das PHP Skript sucht die passenden Orte in einer mysql Tabelle und übergibt die gesamte Postleitzahl und den Ortsnamen aller gefundenen Orte.

Wie sieht das dann auf der PHP Seite aus?

Vielen Dank schonmal

PS: ich hoffe Ihr seit nicht alle abgesoffen :-)

  1. Hi!

    Wie die Sache auf der Clientseite mit dem XMLHttpRequest -Objekt geht, glaube ich begriffen zu haben.

    Zumindest das Senden, wie es scheint.

    Was ich nicht verstehe ist, wie PHP das Ergebniss am Ende wieder zurücksendet.

    So dass es der Client weiterverarbeiten kann. Das kann schlichter Text sein oder Daten verpackt in XML, JSON oder sonstwas.

    Im Client gibt der User eine Postleitzahl ein.
    Nach jeder Zifferneingabe sendet der Client eine Request an das PHP Skript mit den bisher eingegebenen Ziffern.
    Das PHP Skript sucht die passenden Orte in einer mysql Tabelle und übergibt die gesamte Postleitzahl und den Ortsnamen aller gefundenen Orte.
    Wie sieht das dann auf der PHP Seite aus?

    PHP unterscheidet nicht zwischen Ajax- und anderen Requests. Es arbeitet wie beim Erzeugen einer Webseite auch, nur dass eben keine ganze Webseite als Ergebnis entsteht, sondern lediglich die vom Client benötigten Daten, die in eine geeignete Form verpackt werden müssen.

    Lo!

    1. PHP unterscheidet nicht zwischen Ajax- und anderen Requests. Es arbeitet wie beim Erzeugen einer Webseite auch, nur dass eben keine ganze Webseite als Ergebnis entsteht, sondern lediglich die vom Client benötigten Daten, die in eine geeignete Form verpackt werden müssen.

      Erfolgt dann die Übergabe einfach mit echo?

      1. Hi!

        PHP unterscheidet nicht zwischen Ajax- und anderen Requests. Es arbeitet wie beim Erzeugen einer Webseite auch, nur dass eben keine ganze Webseite als Ergebnis entsteht, sondern lediglich die vom Client benötigten Daten, die in eine geeignete Form verpackt werden müssen.
        Erfolgt dann die Übergabe einfach mit echo?

        Alles was ein PHP-Script ausgibt, wird an den Client überliefert. Ob das zwischen ?> und <?php steht oder mit einem der anderen Ausgabebefehle neben echo geschieht, ist dabei egal. Auch wenn PHP eine Fehlermeldung wirft, die nicht davon abgehalten wurde, in die Ausgabe zu gelangen, landet beim Client.

        Lo!

        1. OK, soweit klar.
          Trotzdem noch eine Frage.

          Wenn die Seite auf dem Client einen request sendet.
          Wie kann ich dann mein php Skript testen, ob z.B. die Übergabe vom Client zum PHP-Skript klappt, wenn ich doch mit dem php-skript keine Ausgabe im Browser machen kann, der ist ja durch das sendete skript belegt.

          1. hi,

            Wenn die Seite auf dem Client einen request sendet.
            Wie kann ich dann mein php Skript testen, ob z.B. die Übergabe vom Client zum PHP-Skript klappt, wenn ich doch mit dem php-skript keine Ausgabe im Browser machen kann, der ist ja durch das sendete skript belegt.

            Im Request sendest Du einen Parameter mit, die Auswertung erfolgt in einer entsprechenden PHP-Kontrollstruktur. So kannst Du z.B. unterscheiden, ob eine Response auf ein Submit erfolgen soll (sende eine komplette Seite) oder die Response auf einen x-Request (sende nur ein Objekt).

            Hotti

            --
            Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
          2. Hi!

            Wenn die Seite auf dem Client einen request sendet. Wie kann ich dann mein php Skript testen, ob z.B. die Übergabe vom Client zum PHP-Skript klappt, wenn ich doch mit dem php-skript keine Ausgabe im Browser machen kann, der ist ja durch das sendete skript belegt.

            Du könntest etwas in eine Datei schreiben. Es ist auch möglich, den Request zu simulieren, ihn also direkt und ohne Ajax abzusenden. Wenn du wissen willst, wie er aussieht, helfen dir Tools wie die Livehttpheader-Extension für den Firefox, die dir alle Requests detailliert anzeigt. Außerdem kannst du mit den Eigenschaften des XHR-Objekts sowohl Status als auch den empfangenen Text abfragen, die zum Beispiel mit alert() ausgegeben werden können. Oder du nimmst dir die mittlerweile in jedem Browser erhältlichen oder eingebauten Tools à la FireBug für Firefox, um die Eigenschaften des XHR-Objekts zu untersuchen.

            Lo!

  2. hi,

    Das PHP Skript sucht die passenden Orte in einer mysql Tabelle und übergibt die gesamte Postleitzahl und den Ortsnamen aller gefundenen Orte.

    Also nicht nur einen sondern mehrere "Werte".

    Wie sieht das dann auf der PHP Seite aus?

    Es muss ein header gesendet werden mit dem entsprechenden Content-Type und Zeichenkodierung, z.B.

    Content-type: text/html; charset=UTF-8

    Der Content-Type ist abhängig von dem, was Du überträgst, sofern das nur ein Textstring ist, genügt dazu text/html oder text/plain.

    Sind es mehrere Werte, muss eine Struktur gesendet werden, das kann z.B. XML sein, dazu ist der Content-Type: text/xml. Die JS-Engine im Browser kann mit XML umgehen und daraus Objekte oder Arrays erstellen. Eine andere Möglichkeit besteht darin, eine Text-Struktur zu senden, die genauso aussieht wie ein Objekt in JavaScript, JSON:

      
    // Objekt in JS erstellen  
    var location = {  
      ort: "Erfurt",  
      plz: 99091,  
    };  
    
    

    Serverseitig sendest Du nach dem header dann das, was in den {} steht als response, im DOM wird aus einer solchen response mit eval(response) ein Objekt erstellt.

    Tipp: Teste anstelle der geschweiften Klammern [eckige], eval() erstellt ein Array!

    Hotti

    PS: ich hoffe Ihr seit nicht alle abgesoffen :-)

    Naja, es regnet bischen rein. Ich muss mich mal drum kümmern...

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  3. Hallo,

    habe interessiert mitgelesen und auch ein konzeptionelles Problem.

    In einer Adressverwaltung habe ich eine Liste mit n (ein paar hundert) Adressen. Wenn ich zum Bearbeiten auf eine klicke (oder auf "NEU"), geht ein neues Fenster auf mit dem Adressformular. Wenn ich dieses als Neu / Änderung / Kopie / Löschung abschicke, wird die Liste nicht aktualisiert.

    Und beim Klick auf die nächste zu bearbeitende Adresse kommt ggf. das vorhandene Formular im anderen Fenster nicht in den Vordergrund, trotz
    self.focus();
    am Ende der HTML-Seite. Beides irritiert Anwender gewaltig und ich möchte eine Lösung innerhalb einer Seite.

    Oben ist die Liste, ggf. mit Scrollbalken, unten das Formular, auch mit Scrollbalken.

    Nun klicke eine Adresse in der Liste an. Per Ajax werden die Datenfelder geholt und ins Formular eingefüllt.

    Das Abschicken des Formulars geschieht auch per Ajax, damit die HTML- Seite stehen bleibt.

    Nun das Problem:
    Die neu eingefügte / geänderte Adresse möchte ich oben anzeigen. Kann sein, dass nur ein Datenfeld zu ändern ist, kann sein, dass eine Adresse einzufügen oder zu löschen ist.
    Im Moment habe ich keinen Plan, wo eine neue Adresse einzufügen wäre. Oder wo eine geänderte ihren neuen Platz bekommt. Ist die Sortierfolge von UTF-8 Strings bei PHP und Javascript identisch?

    Deshalb werde ich wohl erstmal die ganze Liste per Ajax anfordern und ersetzen. Ist immer noch besser als die alte Lösung, bei der die Liste nach einer Änderung nicht mehr aktuell war.
    Das würde ich mit <table>...</table> machen.

    Aber wie wäre der Ansatz, wenn ich nur den bearbeiteten Satz woanders einsortieren muss? PHP müsste mir sagen: Hinter Zeile 57.

    Aber wenn gleichzeitig ein anderer Benutzer ändert, stimmt die Reihenfolge meiner "alten" Listeneinträge nicht mehr.

    Gast

    1. Hallo,

      habe interessiert mitgelesen und auch ein konzeptionelles Problem.

      Ohne im Einzelnen auf Deine Fragen einzugehen... also Du hast ein Webfrontend zum Bearbeiten einer 'großen' Tabelle. Hierzu habe ich in einer ähnlichen Aufgabenstellung ersteinmal alles Mögliche eingebaut, was die Navigation über die Tabelle ermöglicht, also Filter auf Spalten, Suchfunktion, Sortierfunktion usw. like Excel.

      Diese Einstellungen zur Navigation werden in einem Cookie gespeichert, so dass der Bearbeiter nach einem Browserneustart genau das vorfindet, was er zuletzt gesehen hat (es sei denn, es wurde was gelöscht). Ebenfalls im Cookie ist der Filter und ein etwiger Suchstring gespeichert.

      Zum Bearbeiten eines Eintrags wird dazu ein entsprechendes Formular in den Browser geholt und nach dem Submit kommt der Bearbeiter auf seine ursprüngliche Auswahl zurück, die auch sortiert sein kann.

      Evntl. sind obenstehende Ausführungen eine kleine Hilfe.

      Horst Helfer

      --
      Brühwürfel sind keine Bonbons!!!
    2. Hi!

      Im Moment habe ich keinen Plan, wo eine neue Adresse einzufügen wäre. Oder wo eine geänderte ihren neuen Platz bekommt. Ist die Sortierfolge von UTF-8 Strings bei PHP und Javascript identisch?

      In PHP brauchst du keine Stringverarbeitung vorzunehmen, denn du kannst dir die Daten vom DBMS sortiert liefern lassen. Es kommt dann also auf die Sortierung vom DBMS versus der von JavaScript an. Wie die Sortierung erfolgen soll, muss erst einmal geklärt werden. Es gibt da ja nicht nur eine Regel, wie bestimmte Zeichen beim Sortieren behandelt werden. MySQL kennt schon zwei Sortierregeln, die für Deutsch und UTF-8 relevant sind. Wie es Javascript mit Sortierregeln hält, ist mir nicht bekannt. Jedenfalls ist schonmal ä > u, was darauf schließen lässt, dass nur die Codeposition berücksichtigt wird.

      Deshalb werde ich wohl erstmal die ganze Liste per Ajax anfordern und ersetzen. Ist immer noch besser als die alte Lösung, bei der die Liste nach einer Änderung nicht mehr aktuell war.

      Ich denke, es wird mindestens ein fertiges Grid-Element in einem oder für eines der Javascript-Frameworks geben, das auch Sortierung beherrscht (nach welchen Regeln auch immer) und das auch nach vom Anwender individuell ausgesuchten Spalten.

      Aber wie wäre der Ansatz, wenn ich nur den bearbeiteten Satz woanders einsortieren muss? PHP müsste mir sagen: Hinter Zeile 57.

      Durchlaufen und vor dem Eintrag einfügen, der der erste größere ist.

      Aber wenn gleichzeitig ein anderer Benutzer ändert, stimmt die Reihenfolge meiner "alten" Listeneinträge nicht mehr.

      Es ist ein generelles Problem, die Änderungen eines Bearbeiters den anderen bekanntzugeben. Ein Push vom Server aus gibt es nicht. Da kannst du nur regelmäßig pollen und die geänderten Daten an passender Position einfügen. Ich als Anwender würde mich aber bedanken, wenn dabei die Liste hin- und herhüpft.

      Lo!