Avatar billede jkampmann Nybegynder
12. oktober 2007 - 21:38 Der er 14 kommentarer og
2 løsninger

Viser chat beskeder forkert

Hejsa. Jeg sidder med et problem med min "mini-live-ajax-chat".
Når en bruger skriver en besked, kommer det i databasen, hvor man har sat en "timestamp" som er <?=time();?>.

Jeg laver en opdatering af nye beskeder hvert 4. sekundt, således:

setInterval("spil.AjaxPlatform('getMessages.php?game_id=<?php echo $_GET['game_id']; ?>')", 4000);

-- Men den henter beskederne enten forkert, eller også spammer den stedet hvor beskederne skal være, eller også kommer der slet ikke noget..

Min getMessages.php ser sådan her ud:

$hent = mysql_query("SELECT id, brugernavn, tekst FROM chat_beskeder WHERE game_id = " . base64_decode($_GET['game_id']) . " AND tid < " . (time()+8) . "") or die(mysql_error());
while ( $row = mysql_fetch_assoc ( $hent ) )
{
  echo $row['id'] . "|" . $row['brugernavn'] . "|" . $row['tekst'] . "#";
}

mysql_query("DELETE FROM chat_beskeder WHERE tid < " . (time()-18) . "") or die(mysql_error());

Håber virkelig en kan få det til at fungere. Har slet ikke styr på det med tidstamperne osv længere, da min hjerne p.t er baaaag ud :-)

Her håndterer jeg beskederne osv i ajax(javascript):

spil.HandleChatMessages = function (data)
{
    var data2  = data.split("#");
    var lastone = data2.length;

    for( i = 0;i < data2.length-1; i++ )
    {
          data1  = data2[i].split("|");
          if ( mes[data1[0]] == data1[2])
          {
              /** hmm **/
          } else {
              document.getElementById('chat_messages').innerHTML += "<strong style=\"font-size:12px;\">" + data1[1] + "</strong>: " + data1[2] + "<br />";
              mes[data1[0]] = data1[2];
          }
    }
};

På forhånd tak.
Avatar billede dkfire Nybegynder
12. oktober 2007 - 21:55 #1
Vil du virkelig slette alle beskeder som er ældre end 18 sekunder ??

tid < " . (time()-18)
Avatar billede dkfire Nybegynder
12. oktober 2007 - 21:57 #2
Og hvad mener du lige med at den henter dine beskeder forkert ???
Beskriv i lige flere detajler hvad der sker, hvad skriver den ??
Avatar billede jkampmann Nybegynder
12. oktober 2007 - 22:03 #3
Jamen, enten så viser den slet ikke beskederne. Min ven og jeg har testet det. Nogle gange viser den de beskeder vi skriver til hinanden, og andre gange viser den det kun hos én af os. Eller også spammer den min div med chat beskeder med de samme beskeder.

Kan ikke rigtig forklare det bedre - desværre.

Og ja - vil slette beskederne på en eller anden måde, sådan den ikke bruger så mange mysql-ressourcer.. Håber du svarer tilbage
Avatar billede jkampmann Nybegynder
12. oktober 2007 - 22:44 #4
Jeg er overbevist om at det er med tiden, som skal vise beskederne der er i vejen med.. Men jeg kan somsagt ikke selv rumme det..
Avatar billede dkfire Nybegynder
12. oktober 2007 - 22:45 #5
Altså, tror ikke det er mysql ressourcer du skal tænke på i første omgang.
Du kunne jo bage vælge at hente de 20 sidste beskeder som er skrevet, det kræver ikke særlig meget. Det vil også hjælpe dig med at se hvor fejlen opstår hvis du gemmer alle beskeder i mysql. Så kan i altid gå tilbage og se gamle beskeder.

$hent = mysql_query("SELECT id, brugernavn, tekst FROM chat_beskeder WHERE game_id = " . base64_decode($_GET['game_id']) ." ORDER BY tid DESC LIMIT 0,20) or die(mysql_error());

En anden ting vil være en god ide lige at tjekke som dit javascript virker rigtig.
Det kan du jo gøre ved selv at kigge på getMessages.php
Eller prøve at få javascriptet til at hente data fra en statisk side, over noget tid, så vil du måske kunne se om den henter data ind rigtig hver gang.
Avatar billede jkampmann Nybegynder
12. oktober 2007 - 23:03 #6
$hent = mysql_query("SELECT id, brugernavn, tekst FROM chat_beskeder WHERE game_id = " . base64_decode($_GET['game_id']) ." ORDER BY tid DESC LIMIT 0,20) or die(mysql_error());

-- Det skal jo være efter en bestemt tid - ellers blir´ den ved med at hente de samme beskeder til ajax.. Så skal jeg holde styr på beskederne i javascript - og det kan man jo ikke gøre 'rigtigt', uden det vil fejle på et tidspunkt, hvis der er 20000 beskeder??
Avatar billede dkfire Nybegynder
12. oktober 2007 - 23:18 #7
Det er selvfølgelig rigtig, men så skal du også huske at tjekke for om den har fundet nogle beskeder. Men det vil du alligevel komme til, da du henter nye beskeder hvert 4. sek. og du sletter først beskederne når de er ældre end 18 sek.

$hent = mysql_query("SELECT id, brugernavn, tekst FROM chat_beskeder WHERE game_id = " . base64_decode($_GET['game_id']) . " AND tid < " . (time()+8) . "") or die(mysql_error());
while ( $row = mysql_fetch_assoc ( $hent ) )
{
  echo $row['id'] . "|" . $row['brugernavn'] . "|" . $row['tekst'] . "#";
}

Det vil give fejl hvis der ikke er hentet nogle beskeder.
Dvs du skal gøre noget ala:
$hent = mysql_query("SELECT id, brugernavn, tekst FROM chat_beskeder WHERE game_id = " . base64_decode($_GET['game_id']) . " AND tid < " . (time()+8) . "") or die(mysql_error());
if(mysql_num_rows( $hent ) > 0 )
{
  while ( $row = mysql_fetch_assoc ( $hent ) )
  {
    echo $row['id'] . "|" . $row['brugernavn'] . "|" . $row['tekst'] . "#";
  }
}
Avatar billede jkampmann Nybegynder
12. oktober 2007 - 23:41 #8
Udskriver:
41|Jesper|test test#42|brianforhelvede|ka intet se#39|brianforhelvede|heyz caiz #40|Jesper|lol#

Det virker fint på min computer, kan se alle beskederne. Jegb ruger firefox. Min ven bruger internet explorer, og han kan intet se siger han..

Kan det være fejl i min javascript? I såfald - hvad skal jeg så gøre?
Avatar billede jkampmann Nybegynder
12. oktober 2007 - 23:42 #9
javascript-fil:

var spil = new Object();
var mes = new Array();

spil.AjaxPlatform = function ( o )
{
      var httpRequest;
      /*@cc_on

      @if (@_jscript_version >= 5)

      try
      {
            httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try
      {
            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
            httpRequest = false;
      }
    }

  @else

  httpRequest = false;

  @end @*/

      if ( !httpRequest && typeof XMLHttpRequest != 'undefined' )
      {

        try
        {
            httpRequest = new XMLHttpRequest();
        } catch (e) {
            httpRequest = false;
        }
      }

      if (!httpRequest && window.createRequest)
      {
        try
        {
              httpRequest = window.createRequest();
        } catch (e) {
              httpRequest = false;
        }
      }
 

        httpRequest.onreadystatechange = function()
        {
            new spil.AlertContents( httpRequest );
        };

        httpRequest.open("GET", o, true);
        httpRequest.send( null );
};

spil.AlertContents = function( req )
{
      if ( req )
      {
        if ( req.readyState == 4 )
        {
            if ( req.status == 200)
            {
                  spil.HandleChatMessages(req.responseText);
            } else {
                  return false;
            }
          }
      }
};

spil.HandleChatMessages = function (data)
{
    var data2  = data.split("#");
    var lastone = data2.length;

    for( i = 0;i < data2.length-1; i++ )
    {
          data1  = data2[i].split("|");
          if ( mes[data1[0]] == data1[2])
          {
              /**sdasdasd**/
          } else {
              document.getElementById('chat_messages').innerHTML += "<strong style=\"font-size:12px;\">" + data1[1] + "</strong>: " + data1[2] + "<br />";
              mes[data1[0]] = data1[2];
          }
    }
};
Avatar billede dkfire Nybegynder
12. oktober 2007 - 23:52 #10
Det skal jeg virkelig ikke kunne sige, er desværre ikke nogen javahaj, jeg holder mig til php.
Håber du kan se meningen med den if-løkke jeg lagde ind.
Avatar billede jkampmann Nybegynder
13. oktober 2007 - 00:00 #11
Det er jo det samme hvis den tjekker eller ej - den vil udskrive en blank side uanset hvad..?

if ( mysql_num_rows ( 'noget' ) > 0)
{
    vil udskrive ingenting
}

og hvis jeg henter data fra mysql, uden indhold, vil den også udskrive ingenting, så kan ikke rigtigt se forskellen.
Avatar billede dkfire Nybegynder
13. oktober 2007 - 00:16 #12
Nej den vil komme med en error eller warning hvis du kører en mysql_fetch_assoc på en tom mysql ressource. (Det kommer selvfølgelig an på om du har slået error-beskeder fra eller til)
Avatar billede dkfire Nybegynder
13. oktober 2007 - 00:20 #13
Men jeg tror det vil hjælpe dig rigtig meget hvis du kiggede på xml.
Avatar billede jkampmann Nybegynder
15. oktober 2007 - 13:30 #14
Jeg fik selv løst det. Spørg mig ikke hvordan - smid svar hvis du ønsker.
Avatar billede dkfire Nybegynder
15. oktober 2007 - 15:45 #15
Jamen vi kna da dele.
Men prøv at se om ikke det vil være bedre for dig hvis dit output er xml i stedet for det du har nu.
Avatar billede dkfire Nybegynder
15. oktober 2007 - 15:46 #16
og svaret kommer her ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester