Aktualisierung der Seite nach Änderungen an Datenbank

  • Aktualisierung der Seite nach Änderungen an Datenbank

    Hallo liebe Forumler.

    Es geht um folgende Seite: easy-coding.de/wiki/html-ajax-…ispiel-mit-php-mysql.html
    Ich bin vor kurzem darauf gestoßen und fand es eigentlich eine gute realiserung.
    Nun häng ich aber an folgendem Problem:
    Die User können zwar schreiben was und soviel sie wollen allerdings gefällt mir das nicht so.
    Ich wollte das ganze so umcoden dass wenn bspw. ein User ein Badword postet (F***) oder im allgemeinen wenn ein User etwas Postet was mir nicht passt dass ich auf ein X klicken kann welches es mir ermöglicht dass der eingegebe Text direkt aus der Datenbank verschwindet und der Text sofort (!!!) bei allen anderen auch verschwindet und nicht durch F5 drücken.

    Da der Chat allerdings so funktioniert um nur aktualisierungen durchzuführen wenn eine neue Eingabe erfolgt jedoch nicht wenn alte Eingaben bearbeitet oder gelöscht wird stellt sich das als Herrausforderung

    Ich hab das X zum entfernen schon eingefügt und es verschwindet auch von der Datenbank jedoch wird die Seite nicht im allgemeinen neu geladen sondern der Text bleibt weiterhin bestehen..
    Gleiches Problem hab ich übrigens auch mit der User-Leiste.
    Ich habe eine Userleiste erstellt welche es mir ermöglicht durch neue Logins die User aufzulisten und automatisch zu aktualisieren wenn ein User den Chat betreten hat. Jedoch ist es (für mich) unmöglich das ganze so umzusetzen dass wenn ein User sich ausloggt und er von der Datenbank entfernt wird für alle anwesenden User zeitgleich auszugeben dass der User nicht mehr online ist.
    Das ist irritierend wenn bspw. ein User offline geht und die anderen ihn noch als online sehen aber er nicht antwortet..

    Könnte mir jemand helfen wäre gut zu wissen was verändert werden muss dass das ganze so läuft wie ich es gerne haben würde.. X( bin schon seit 1 Monat verzweifelt an diesem Problem..
  • Hi,

    zum Problem das die Einträge bei den Leuten im Chat nicht ohne F5 zu drücken verschwinden, liegt daran das der Browser der User nicht weis das der Eintrag nicht mehr existiert.
    Du müsstest ein (ajax) request (alle 2-5 sekunden oder so) einbauen der quasi das php script aufruft und die ergebnisse (die sonst nur per F5 nur gekommen wären) anzeigt.

    Bei der Userliste würde ich das so machen, das beim aktualisieren des chats, der username oder eine id mitgesendet wird, diese wird dann in der user tabelle aktualisiert -> neuer timestamp, dann könntest du im selben script noch eine lösch routine einbauen die alle einträge löscht deren, Zeitliche differenz (die zeit in der tabelle zur aktuellen zeit) größer als z.b. 3600s ist (1h) ... danach lässt du die ganze tabelle abfragen und zeigst sie dem user an ... da sind dann nurnoch User enthalten die in den letzten 3600 sekunden eine anfrage zur Aktualisierung des chats gesendet haben.

    Ist vllt nicht ganz optimal .. aber so könnte es funktionieren ... Es gibt aber auch zig viele php chats die genau das machen was du willst, damit will ich aber nicht sagen das du ein fertiges script nutzen sollst, sondern das du dir auch bei fertigen scripten anregungen holen kannst wie es die gemacht/gelöst haben...

    BTW. das Zauberwort heist ajax (jQuery) ....
  • der_robert schrieb:

    Hi,

    zum Problem das die Einträge bei den Leuten im Chat nicht ohne F5 zu drücken verschwinden, liegt daran das der Browser der User nicht weis das der Eintrag nicht mehr existiert.
    Du müsstest ein (ajax) request (alle 2-5 sekunden oder so) einbauen der quasi das php script aufruft und die ergebnisse (die sonst nur per F5 nur gekommen wären) anzeigt.

    Bei der Userliste würde ich das so machen, das beim aktualisieren des chats, der username oder eine id mitgesendet wird, diese wird dann in der user tabelle aktualisiert -> neuer timestamp, dann könntest du im selben script noch eine lösch routine einbauen die alle einträge löscht deren, Zeitliche differenz (die zeit in der tabelle zur aktuellen zeit) größer als z.b. 3600s ist (1h) ... danach lässt du die ganze tabelle abfragen und zeigst sie dem user an ... da sind dann nurnoch User enthalten die in den letzten 3600 sekunden eine anfrage zur Aktualisierung des chats gesendet haben.

    Ist vllt nicht ganz optimal .. aber so könnte es funktionieren ... Es gibt aber auch zig viele php chats die genau das machen was du willst, damit will ich aber nicht sagen das du ein fertiges script nutzen sollst, sondern das du dir auch bei fertigen scripten anregungen holen kannst wie es die gemacht/gelöst haben...

    BTW. das Zauberwort heist ajax (jQuery) ....


    Erst ein mal ein dickes dankeschön für deine Hilfe.
    Klar will ich keine fertigen Chats nutzen das ist auch der Grund warum ich diesen Chat nutze eben weil er nur die 'basics' die ich haben wollte hat.
    Alles andere kann man ja selbst hinzufügen.
    Ich schau mal ob das so funktioniert wie du das beschreibst - wovon ich aber ausgehe und meld mich dann nochmal.
    Danke jedenfalls schon mal für deine Hilfe!

    Edit:
    Ich hab' nun nach einer Stunde erfolglosen Googeln den Kopf hängen gelassen.
    Es funktioniert einfach kein Script welches ich selber schreibe bzw. welche an Vorlage in anderen Foren gepostet wird.

    Hier der Quellcode der dafür sorgt dass die Nachrichten ausgegeben werden (text.php)

    Quellcode

    1. <html>
    2. <head>
    3. <title></title>
    4. <link rel="stylesheet" type="text/css" href="../format.css">
    5. <script language="JavaScript">
    6. <!--
    7. function AutomatischScrollen()
    8. {
    9. window.scrollBy(0,1);
    10. Scrollen();
    11. }
    12. function Scrollen()
    13. {
    14. GescrollteZeit = window.setTimeout("AutomatischScrollen()", 10);
    15. }
    16. //-->
    17. </script>
    18. <script type="text/javascript" src="ajax.js"></script>
    19. <script type="text/javascript">
    20. function Chat(div, url, lastupdate) {
    21. this.div = div;
    22. this.url = url;
    23. this.lastupdate = lastupdate || null;
    24. this.start = function(lastupdate) {
    25. this.lastupdate = lastupdate || this.lastupdate;
    26. ajaxPost(this.url, 'lastupdate='+ this.lastupdate, function(up) {
    27. return function() {
    28. if (this.readyState == 4) {
    29. if(this.status == 200) {
    30. var data = eval('(' + this.responseText + ')');
    31. up.start(data.lastupdate || up.lastupdate);
    32. if(data.html) {
    33. document.getElementById(up.div).innerHTML += data.html;
    34. }
    35. }
    36. else {
    37. setTimeout(function(){
    38. up.start(up.lastupdate);
    39. }, 5000);
    40. }
    41. }
    42. };
    43. }(this));
    44. };
    45. }
    46. var chat = new Chat('chat', 'ausgabe.php', -1);
    47. </script>
    48. </head>
    49. <body onload="AutomatischScrollen();">
    50. <div id="chat"></div>
    51. <script type="text/javascript">chat.start();</script>
    52. </body>
    53. </html>
    Alles anzeigen

    Die Texte landen (logischerweiße) in der <div> am Ende des Scripts.
    Ich bekomm es einfach nicht gebacken ein AJAX Script zu schreiben welches dafür sorgt, dass dieses DIV alle X - Sekunden neu geladen wird ohne dabei komplett zu verschwinden.

    Ich hatte ein Script welches zwar die Seite alle 5 Sekunden neu läd aber da kam dann irgendwie garkeine Ausgabe mehr von den Nachrichten.
    Es soll auch nicht großartig am Browser erkennbar sein dass da gerade ein Refresh stattfindet es soll einfach unbemerkt verschwinden.
    Ich weiß nicht, bei AJAX sind meine Nerven gleich viel schneller blank als bei anderen programmiersprachen ;(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Zerdux ()

  • Also der Chat ist ja so konzipiert, dass er immer nur neue Einträge ergänzt.. das siehst du hier

    Quellcode

    1. document.getElementById(up.div).innerHTML += data.html;


    Du könntest im JavaScript zwei Varianten erlauben. Append und Replace.

    Quellcode

    1. if (data.replace) {
    2. document.getElementById(up.div).innerHTML = data.replace;
    3. }
    4. if (data.append) {
    5. document.getElementById(up.div).innerHTML += data.append;
    6. }


    Im PHP Backend musst du natürlich auch beide Varianten auslösen.