You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Tuesday, June 30th 2009, 11:33am

Wie verarbeite ich Inhalte die durch einen Ajax Request kommen ohne zu wissen wie diese aussehen?

Hallo,

ich habe in einem Projekt eine Suche mit welcher ich über ein Formular mit 5 Feldern innerhalb einer Datenbank suche. Nun würde ich gerne die Suche so umbauen, dass bereits beim Eintippen in ein Feld die möglichen Treffer gefiltert werden. Hier mal ein Beispiel das klar wird was ich meine.

Feld 1: Name
Inhalt in der Datenbank: Andreas, Annette, Berbel, Dora, Gustav, Heinrich, Thomas, Tabea, Ulli

In das Feld "Name" wird vom Anwender nun ein A getippt. Unter dem Feld soll nun ein Div erscheinen (ähnlich bei der Google Suche) wo alle Treffer passend dazu angezeigt werden. Der Anwender sieht nun die beiden möglichen Einträge Andreas und Annette. Er wählt mir der Maus Annette und bekommt daraufhin das fertige Suchergebnis in einem Div unter dem Formular angezeigt.
Nun könnte es ja sein, dass es 5000 Namen alleine mit einem A gibt oder wegen mir auch 20 mal den Andreas. Das heißt er geht nun in das Feld Straße und tipt dort ein H wie Hauptstraße ein. Da die 20 Andreas die gefunden wurde alle in einer anderen Straße wohnen und es aber nur einen gibt der in der Hauptstraße wohnt wird in dem Div unter dem Feld Straße nun die Hauptstraße angezeigt. Der Anwender hat somit durch Eingabe weniger Buchstaben und durch wenige Klicks bereits den gewünschten Eintrag gefunden.

Ich hätte nun in dem Feld Name ein Event "onChange" verwendet um den Inhalt des Feldes mittels Ajax an ein PHP Skript zu schicken. Dieses flitzt in die Datenbank und sucht die passenden Ergebnisse. Rückgabe ist dann eben der Inhalt aus der einen Spalte aufbereitet in einer Tabelle welche ich per innerHTML in das Div packe was ich unter dem Feld platziere und bei der Rückgabe auf Visible setze. Das Feld Straße verhält sich nun ähnlich mit dem Unterschied, dass das Event schon vorher wissen muss, dass der Name bereits ausgewählt wurde. Das heißt gibt es einen Namen muss dieser mit zu der Suche übergeben werden damit nach dem Tippen auf H auch nur die Straßen von den Einträgen berücksichtigt werden wo der Name auch passt. Mir ist absolut unklar wie ich das bewerkstelligen soll da ich ja schlecht den Quellcode dynamisch ändern kann abhängig von den Suchergebnissen. Ist so eine Suche nur möglich wenn man lediglich ein Suchfeld hat oder wie läuft sowas ab?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

xundy

Beginner

Posts: 37

  • Send private message

2

Thursday, July 30th 2009, 2:36pm

So ne Suche ist zwar schick aber ne echte Performancebremse, da du ja nach jeder Eingabe ein Query an die Datenbank senden musst.
Das Ergebnis was zurückkommt muß dir bekannt sein, da du es ja per query ausliest, kann ja nur ein false kommen oder eben entsprechende Rückgabewerte die sich nach den abgefragten Tabellen und Feldern richten.
Und bedenke du kannst keine Ajax-Requests innerhalb eines Ajax-Requests machen, also so ne Art Schleife wie in php z.B. ist nicht möglich, du musst also einen request komplett abarbeiten bevor du einen neuen starten kannst.

Desweiteren solltest Du Ergebnisse in deiner Suche frühestens nach einer Anzahl X an Zeichen überhaupt erst eine Suche starten, nach dem ersten Zeichen ist nicht wirklich sinnvoll, um eben weit besser gefilterte Ergbnisse zu erlangen, um in der Folge mit entsprechend weniger Datensätzen arbeiten zu müssen.

Aber wie gesagt die Rückgabewerte sind dir bekannt da Du ja auf jeden Fall die notwendigen abfrage-queries selbst erstellst und somit sind zumindest die Feldnamen der Rückgabewerte bekannt.

mfg

bauser

Intermediate

Posts: 384

Occupation: Senior Software Engineer

  • Send private message

3

Tuesday, August 11th 2009, 3:39pm

ich denke, dabei hilft es sehr teile der datenbank in dein ajax zu kriegen.

zum beispiel könntest du alle 24h nachts um 4 mal deine datenbank mit namen und straßen in ein xmlfile schreiben lassen und beim aufruf der seite liest du dieses xml file aus. dann hast du in deinem javascript größtenteils die daten, die auch in der datenbank sind und musst kein einziges query an php/db abschicken um diese googleliketippsuche zu realisieren.
I'm Tony Menthanar! You fuck wit me, you fuckin' wit da best!

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

4

Tuesday, August 11th 2009, 4:56pm

Die Idee ist grundsätzlich nicht schlecht. Da sich die Daten aber irgendwann im Sekundentakt ändern und erweitern könnten wird es damit etwas problematisch. Ich denke mal ich werd wirklich einfach das herkömmliche Prinziep nutzen und gecachete Querys nutzen für die Suche denn im Moment kann ich sicher sehr viele Spielereien realisieren und das ganze schön machen aber was wenn wirklich da mal die Post abgeht. Dann fang ich wieder an klamotten auszubauen weil ich sonst 10 Server brauche um das ganze noch halbwegs performant zu betreiben.

Grundsätzlich ist die Idee aber durchaus brauchbar für viele andere Zwecke. Nur mal als Beispiel die Suche hier im Forum. Wär doch klasse wenn man die Thementitel auf die der grade getippte Begriff passt schon in einer Liste sieht beim tippen. Und so viel Fluktuation ist hier ja nicht das man alle 3 Sekunden andere Daten hat.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

ShaoKhan

www.Spiegelwelt.com

Posts: 393

Location: 127.0.0.1

Occupation: EDV Dienstleister

  • Send private message

5

Monday, October 12th 2009, 9:56am

Also ich selbst nutz ja nun viel und gern das Scriptaculous JS Framework.
Ein Beispiel für dich findest du hier:

http://www.ajaxdaddy.com/scriptaculous-autocomplete.html

in der dort stehenden "response.php" sendest du einen query an die db.
Aber wie oben bereits geschrieben, leidet bei großen DB's die Performance drunter.
Abhilfe schafft vielleicht das indizieren der Felder und alternativ, könnte man die Live Suche auch erst nach Eingabe des dritten Buchstaben starten.

Grüße, ShaoKhan
Leben heisst - Narben tragen.

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

6

Tuesday, October 13th 2009, 11:57am

Naja solange ich das Projekt wo ich das einbauen wollte nur zum Spaß betreibe und da auch nicht viel los ist kann man so sachen ja machen aber was wenn da mal 5000 Leute auf einen Schlag los legen. Ich schaue lieber das ich das ganze so performant halte wie möglich denke ich. Aber testen werd ich das trotzdem mal mit dem Skriptakolodingsbums :D
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.