Ajax und Datenbank

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ajax und Datenbank

    Hallo,

    habe zb. ein mail system wo in der DB alles gespeichert wird so wie eine spalte "gelesen" (1 = ja, 0 = nein).
    nun habe ich es so das ich ein Div habe der sich alle 5 sek aktualisiert mit funktion und setinterval. Nun würde es mich aber interessieren ob es möglich ist mit Ajax nur dann zu aktualisieren wenn zb.: eine neue mail kommt sprich neuer eintrag mit gelesen = 0 dann aktualisiert 1 mal.

    Hoffe man weis was ich meine und kann mir einige beispiele geben und bisschen erklären. Immerhin möchte ich ja noch was lernen =)
  • Hi,
    wenn eine neu Mail kommt, dann weiß das nur der Server.
    Aber um die Information darzustellen, muss es der Client wissen.

    Du kannst also nur pollen. Eine Server zu Client Information gibt es nicht.
    Wenn du eine hochfrequentierte Seite hast, bei der Polling wegen der hohen Last nicht in Frage kommst, kann man darüber nachdenken das mit Timeouts und Comet auszuweiten.
    Sichtwort Comet. Auf diese Art funktioniert zum Beispiel auch der Chat bei Facebook.
    Es handelt sich um eine Mischung auf langen HTTP Requests (so lange die Verbindung nicht geschlossen wird kann man Inhalte nachliefern) und AJAX Requests.

    [wikipedia]http://en.wikipedia.org/wiki/Comet_(programming)[/wikipedia]

    UPDATE: Hier unser Tutorial: [wiki]AJAX / Comet Chat Tutorial[/wiki]
  • Hey,

    du musst natürlich ständig deine Datenbank abfragen (z.B. alle 5 sec). Wenn du dann eine 0 bekommst kannst du deinen div entsprechend aktualisieren.


    Ich würde wie folgt vorgehen:
    - Mit onloadEvent o.Ä. die schleife starten, welche nachfrägt, ob sich etwas geändert hat.
    - Daten via json an JS übergeben (wird von php 5.3 auf alle fälle unterstützt (json_encode & json_decode).
    - Diese Daten dann mit JS untersuchen
    - - if(!1) aktualisiere div
    - - else mach was anderes oder auch nicht...

    Ich glaube Donut hat auch schon ein Tutorial zu AJAX verfasst.


    Ich selber würde via JSON einen verschachtelten Array aus PHP an JS übergeben.

    ARRAY:
    - action = aktionscode (0 für nichts tun, 1 für aktualisieren, 2 für löschen, und so weiter)
    - daten (0 = keine daten drinnen, 1 = die daten, die aktualisert werden müssen, 2, die id, welche gelöscht werden soll, und so weiter)

    Damit bist du sehr flexibel was das nachrüsten angeht. So hatte ich das vor kurzem in einem Projekt gemacht, in dem ich ein Uploadmanager mit PHP+APC geschrieben habe und viele verschiedene Status und errorcodes übergeben musste.

    Code habe ich jetzt mal absichtlich keinen geschrieben, weil ich nicht weis was du kannst und was du nicht kannst. Ein bischen Code von dir währe am Anfang nicht schlecht... AJAX-Tuts gibts ja wie Sand im Meer...


    Hoffe, ich konnte ein wenig helfen,
    Erasel
    My lovely mister singing club...
  • also zurzeit habe ich es so (Grob):

    seite1:

    Quellcode

    1. <div id="ausweis">'; @include 'menu/ausweis.php'; echo'</div>


    dort wird die seite inludiert (ist noch paar andere abfragen drinne aber nicht relevant für das was ich brauche):

    Quellcode

    1. $neuenachrichten = mysql_query('Select COUNT(id) from mail where empfaenger_id=\''.$user['id'].'\' and gelesen=\'0\' and empfgeloescht=\'0\'');
    2. $neuenachrichten = mysql_result($neuenachrichten,0);
    3. if($neuenachrichten>0){$nachrichten_anzeige='<img src="'.$gameurl.'images/icon/mail_blink.gif" border="0" height="25" width="25" titel="Nachrichten" onmouseover="Tip(\'Du hast '.$neuenachrichten.' ungelesene Nachricht/en\', TITLE, \'Nachrichten\')" onmouseout="UnTip()">';}else{$nachrichten_anzeige='<img src="'.$gameurl.'images/icon/email.png" border="0" height="20" width="20" titel="Nachrichten" onmouseover="Tip(\'Deine Nachrichtenzentrale\', TITLE, \'Nachrichten\')" onmouseout="UnTip()">';}
    4. echo''.$nachrichten_anzeige.'';

    Nun zeigt er mir an wenn ich die seite aktualisiere bei gelesen=0 "Keine neuen nachrichten. bei gelesen=1 würde er das images wechseln und zeigen 1 mail erhalten. soweit kein problem solange ich die seite aktualisiere.

    Nun wollte ich aber nicht das ich selber die seite aktualisieren muss sondern das es automatisch geht. meine nächst beste idee die mir einfiel war mit js:

    Quellcode

    1. function loadData_ausweis()
    2. {
    3. if (xmlHttp) {
    4. xmlHttp.open('GET','../menu/ausweis.php', true);
    5. xmlHttp.onreadystatechange = function () {
    6. if (xmlHttp.readyState == 4) {
    7. document.getElementById("ausweis").innerHTML = xmlHttp.responseText;
    8. }
    9. };
    10. xmlHttp.send(null);
    11. }
    12. }
    13. // aktuelle Daten laden
    14. loadData_ausweis();
    15. // alle 5 Sekunden neue Daten holen
    16. setInterval("loadData_ausweis()",5000);
    Alles anzeigen


    jetzt läd er den div normal alle 5 sek geht auch wunderbar nur scheint es enorm an den ressourcen zu haun. Nun wollte ich halt wissen wie ich das mache das ich nicht alle 5 sek das script fragen muss und das durchlaufen muss. sondern nur diesen einen bereich. um möglichst wenig ressourcen zu fressen. den zurzeit passiert es da ich mehrere Ajax scripte und funktionen habe das er etwas brauch beim laden was hässlich aussieht da der div solange leer ist
  • Hey,

    für solche Fälle habe ich mir immer eine eigene Datei geschrieben, welche mein ajax übernehmen kann. Die Datei ist dafür dann spezialisiert und entsprechend optimiert (wozu z.B. eine TPL-Engine wie Smarty laden und Rechenzeit vergeuden.)

    Ich hab dann via URL übergeben, was abzuarbeiten ist. (ajax.php?action=newmail&weiterer=schnickschnack). Wichtig ist natürlich, das du da genauso Sicherheitsabfragen und dergleichen brauchst.
    Dadurch läuft der Request schon einiges schneller.

    Wenn du dann auch nur deine 0 oder 1 übergibst, ist das ruckzuck geladen...
    Ich würde dein Ergebnis aber erst in eine Variable unter JS speichern und wenn du die hast, kannst du damit bequem weiter arbeiten. Den div würde ich erst mit ändern/berühren, wenn du die neuen Daten definitiv hast. Solange das nicht der Fall ist, würde ich einfach alles, was da rein soll in einer Variable speichern und dann weiter arbeiten...


    Zur Verschönerung kann man dann noch eine Funktion zum Einblenden von Elementen erstellen. Dann kommt das nicht so abrupt. Dein Freund ist in diesem fall auf alle fälle jQuery. Ich hab mir entsprechendem Code im Internet aber selber gesucht und angepasst um nicht so viel Overhead zu produzieren...

    Gruß und gute Nacht,
    Erasel
    My lovely mister singing club...
  • Muss gestehn bin kein Profi. ich kann zwar was mit codes anfangen im bereich ajax und verstehe vorgänge aberdas ist mir gerade doch irgendwie zu hoch sry -g-

    kann ich nicht machen das, das js. DB fragt alle 10 sek. für user XY ob tabelle "mail" ein eintrag enthält "gelesen =1 und mir dann im Div einfach den gewünschten link ausgibt?

    sry wenn ich mich zu doof anstelle. will sicherlich keine fertigen scripts aber so beispiel wäre villt nett ^^