12. oktober 2007 - 21:38Der 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:
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
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.
$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??
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'] . "#"; } }
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.
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)
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.