Avatar billede baitianlong Nybegynder
19. oktober 2004 - 23:50 Der er 55 kommentarer og
1 løsning

Der er SÅ mange brugere på chatten

Jeg har lige kodet en chat og den er meget køn :)

Så tænkte jeg på at man jo ikke skulle sidde der helt alene og snakke med sig selv, så jeg vil lave sådan en "antal folk online" ting... Det ved jeg dog ikke helt hvordan jeg skal gribe an... Hvis folk gider klikke på en "log af" knap er det jo nemt nok, men hvis de bare lukker browseren, er det lidt sværere... Så havde jeg tænkt mig at hvis man ikke havde skrevet noget i et minut var man offline.

Hvad siger i til det problem ?!
Avatar billede Jman Praktikant
19. oktober 2004 - 23:57 #1
Avatar billede strcoder Nybegynder
19. oktober 2004 - 23:59 #2
LoL :>
Avatar billede baitianlong Nybegynder
20. oktober 2004 - 00:00 #3
Det er ganske smukt, men dette er et spørgsmål i PHP kategorien :)
Avatar billede Jman Praktikant
20. oktober 2004 - 00:00 #4
Avatar billede Jman Praktikant
20. oktober 2004 - 00:00 #5
doh !
Det havde jeg sgu ikke set :o|
Avatar billede baitianlong Nybegynder
20. oktober 2004 - 00:01 #6
Det kan ske... :)
Avatar billede sostack Nybegynder
20. oktober 2004 - 00:14 #7
1 minut er ikke ret længe på en chat, hvad med 3?

//sostack
Avatar billede sostack Nybegynder
20. oktober 2004 - 00:17 #8
ellers skal du vel over i noget javascript med onClose eller onExit eller hvad ved jeg om javascript?

//sostack
Avatar billede baitianlong Nybegynder
20. oktober 2004 - 00:18 #9
Man kan jo ikke afvikle php/databasekode onClose !! Det er jo det !! ;)
Avatar billede sostack Nybegynder
20. oktober 2004 - 00:22 #10
<BODY onUnload="submit(document.form1)">
<form action="./logoff.php" method="post" name="form1">
</form>

//sostack
Avatar billede Slettet bruger
20. oktober 2004 - 00:23 #11
Du kan da godt lave en onClose="document.getElementById('min_hemmelige_iframe').location.href='hanloggedesguafdensatan.php';"
Avatar billede Slettet bruger
20. oktober 2004 - 00:24 #12
Ja det skal jo være onunload (go'nat) :D

Men husk at tage højde for at man bare lukker vinduet råt og brutalt.
Avatar billede sostack Nybegynder
20. oktober 2004 - 00:25 #13
Hvor logoff.php ikke laver noget output ??

//sostack
Avatar billede Slettet bruger
20. oktober 2004 - 01:52 #14
Da du jo havde noget "autoopdatering" kunne du lade serverdelen dertil vedligeholde en databasetabel med et brugerid og et timestamp. SQLen kunne være noget i stil med

INSERT REPLACE INTO tabelnavn (id) VALUES ('{$brugerid}')
Avatar billede baitianlong Nybegynder
20. oktober 2004 - 23:50 #15
Jeg har nu rodet med det...

1)Jeg prøvede at bruge window.location.reload(true) i stedet for window.location.href=window.location , for at undgå klik lyden, men siden bliver blank i et øjeblik, hver gang den reloader, og det gør den ikke med location.href.

2)Jeg skriver nu i en tabel når en bruger logger på eller sender en besked:

Når man logger på:

$sex = $_POST['gender'] == "male" ? "m" : "f";
$tid = date("Y-m-d H:i:s");
mysql_connect("localhost", "xxxxxxxx", "xxxxxxxx");
mysql_select_db("xxxxxxx");
mysql_query("INSERT INTO chatbrugere(brugernavn, sex, sidsteinput) VALUES('$brugernavn', '$sex', '$tid')") or die(mysql_error());
header("Location: chatframes.php");

Når man skriver noget:

mysql_query("INSERT INTO chat(bruger, tid, kommentar) VALUES('$bruger', '$tid', '$besked')");
mysql_query("UPDATE chatbrugere SET sidsteinput='$tid' WHERE brugernavn='$bruger'");
...
if($funktion == "logoff") {
    mysql_connect("localhost", "xxxxxxx", "xxxxxx");
    mysql_select_db("xxxxx");
    mysql_query("DELETE FROM chatbrugere WHERE brugernavn='$bruger'");
    unset($_SESSION['bruger'], $_SESSION['gender']);
    header("Location: chatlogin.php");

Nu skal jeg så have kodet således at man automatisk ikke er "bruger" hvis man ikke har skrevet noget i f.eks 2 minutter :) Ser frem til hjælpen sandbox eller andre :)
Avatar billede Slettet bruger
20. oktober 2004 - 23:59 #16
Hvilken type er feltet sidsteinput i din tabel?
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:00 #17
DATETIME med "yyyy-mm-dd hh:mm:ss" :)
Avatar billede Slettet bruger
21. oktober 2004 - 00:05 #18
Du kan bruge

DELETE FROM chatbrugere WHERE sidsteinput < DATE_SUB(NOW(), INTERVAL 2 MINUTE)
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:07 #19
virkelig ?!

Altså i min side, der updater chat'en. Der kan jeg blot skrive den SQL ting ?

Er now() god i PHP, jeg troede det var en ASP ting ?!
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:10 #20
Samtidig skal denne bruger, der smides ud af listen, jo så sendes til chatlogin.php (hvis han/hun nu stadig er online, men bare stener)

Kan jeg således efter din sql sætning sige noget hen ad "if chatbrugere ikke contains $bruger location=chatlogin.php"
Avatar billede Slettet bruger
21. oktober 2004 - 00:14 #21
Nej, der skal naturligvis det sædvanlige mysql_query(""); om. NOW() er en funktion i MySQL.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:17 #22
Den virker fint. Man forsvinder fra listen, hvis man tier stille, men så mangler der bare det med at man bliver "smidt af" samtidig :)
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:19 #23
Men den kan jeg jo fikse med:

if(mysql_num_rows("SELECT * FROM chatbrugere WHERE brugernavn='$bruger'") < 1)
Smid ham/hende af !!!

:)

Regner jeg med... -en kommentar ???
Avatar billede Slettet bruger
21. oktober 2004 - 00:36 #24
Nok nærmere

if(mysql_num_rows(mysql_query("SELECT * FROM chatbrugere WHERE brugernavn='$bruger'")) < 1)
Smid ham/hende af !!!

men ja.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:41 #25
Det fandt jeg også ud af (den manglende parantes), men dette bliver ikke afviklet:

if(mysql_num_rows(mysql_query("SELECT * FROM chatbrugere WHERE brugernavn='$bruger1'")) < 1) {
    unset($_SESSION['bruger'], $_SESSION['gender']);
    print "<script type=\"text/javascript\">";
    print "alert(\"You've been logged off automaticly\n-Because you didn't say anything for one minute !!\")";
    print "parent.location.href='chatlogin.php';";
    print "</script>";
}

Har du et bud på hvorfor ?
Avatar billede Slettet bruger
21. oktober 2004 - 00:47 #26
Eventuelt:

$_SESSION['bruger']='';
unset($_SESSION['bruger']);
$_SESSION['gender']='';
unset($_SESSION['gender']);

og så teste med empty(), der hvor du tester for om sessionsvariablerne er sat
Avatar billede Slettet bruger
21. oktober 2004 - 00:47 #27
Og et minut er virkeligt ikke lang tid - men det er til gengæld også træls at skulle vente længere, når man tester.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:50 #28
Ja, det er fordi jeg tester :)

Når jeg vælger view source på den efter man er "smidt af" siger den fint nok:

<script type="text/javascript">alert("You've been logged off automaticly
-Because you didn't say anything for one minute !!");
parent.location.href='chatlogin.php';</script>

Det er da sært at det ikke bliver afviklet ?!
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:53 #29
Jeg fjernede \n i alerten, men nu siger den det med det samme når man har logget på ?!
Avatar billede Slettet bruger
21. oktober 2004 - 00:55 #30
Skal der stå WHERE brugernavn='$bruger1' i den query? (Jeg tænker på 1-tallet.)
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 00:57 #31
Ja, fordi:

$bruger1 = $_SESSION['bruger'];

lidt højere oppe :)

...Det sidste problem her er noget med tid. Den når simpelthen ikke at skrive i databasen, får næste side hentes ind (tror jeg)
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:00 #32
Kan jeg kopiere koden til den side herind, så du kan kigge på den, eller er det for meget ? Den er ikke så vild (49 linier) ? :)
Avatar billede Slettet bruger
21. oktober 2004 - 01:00 #33
Kopier bare løs.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:02 #34
Ok :)
here goes:

<?php
print "<html>";
print "<head>";
print "<link href=\"chatstyles.css\" rel=\"stylesheet\" type=\"text/css\">";
print "</head>";
print "<body>";
print "<table width=\"95%\" align=\"center\">";
print "<tr><td width=\80%\">";
print "<table align=\"center\" width=\"95%\">";
mysql_connect("localhost", "xxxxx", "xxxxx");
mysql_select_db("xxxxx");
mysql_query("DELETE FROM chatbrugere WHERE sidsteinput < DATE_SUB(NOW(), INTERVAL 1 MINUTE)");
$tyveraekker = mysql_query("SELECT * FROM chat ORDER BY tid DESC LIMIT 0, 20");
while($row = mysql_fetch_assoc($tyveraekker)) {
    $bruger = $row['bruger'];
    $tid = $row['tid'];
    $kommentar = $row['kommentar'];
    print "<tr>
            <td class=\"tid\" width=\"20%\" bgcolor=\"#eeeeee\">".$tid."</td>
            <td class=\"bruger\" width=\"20%\" bgcolor=\"#eeeeee\">".$bruger."</td>
            <td class=\"kommentar\" bgcolor=\"#eeeeee\">".$kommentar."</td>
          </tr>";
}
print "</table>";
print "</td><td width=\"20%\" valign=\"top\" class=\"kommentar\" align=\"center\"><b>Brugere online</b>";
print "<table width=\"95%\" align=\"center\" border=\"1\">";
$brugereonline = mysql_query("SELECT * FROM chatbrugere");
while($brugerrow = mysql_fetch_assoc($brugereonline)) {
    if($brugerrow['sex'] == "m") {
        print "<tr><td class=\"malename\">".$brugerrow['brugernavn']."</td></tr>";
    } else {
        print "<tr><td class=\"femalename\">".$brugerrow['brugernavn']."</td></tr>";
    }
}
print "</table>";
print "<script type=\"text/javascript\">";
print "setTimeout(\"window.location.href=window.location\", 5000);";
print "</script>";
$bruger1 = $_SESSION['bruger'];
if(mysql_num_rows(mysql_query("SELECT * FROM chatbrugere WHERE brugernavn='$bruger1'")) < 1) {
    unset($_SESSION['bruger'], $_SESSION['gender']);
    print "<script type=\"text/javascript\">";
    print "alert(\"You've been logged off automaticly -Because you didn't say anything for one minute !!\");\n";
    print "parent.location.href='chatlogin.php';";
    print "</script>";
}
print "</body>";
print "</html>";
?>
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:04 #35
login siden skriver i databasen, sådan her:

if(isset($_POST['brugernavn']) && isset($_POST['gender'])) {
    $_SESSION['bruger'] = $_POST['brugernavn'];
    $_SESSION['gender'] = $_POST['gender'];
    $brugernavn = $_POST['brugernavn'];
    $sex = $_POST['gender'] == "male" ? "m" : "f";
    $tid = date("Y-m-d H:i:s");
    mysql_connect("localhost", "xxxxxx", "xxxxx");
    mysql_select_db("xxxx");
    mysql_query("INSERT INTO chatbrugere(brugernavn, sex, sidsteinput) VALUES('$brugernavn', '$sex', '$tid')") or die(mysql_error());
    header("Location: chatframes.php");
}
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:09 #36
...og som sagt er problemet nu at den alerter og relocater lige så snart man logger på :)
Avatar billede mcgoat Nybegynder
21. oktober 2004 - 01:12 #37
Kan man ikke lave noget php som sender en streng ca hvert 10 sec til en server side php. Og hvis den server side så ikke har hørt noget fra den bruger i 11 sec så er han nok ikke på mere?
Avatar billede diggerx Nybegynder
21. oktober 2004 - 01:15 #38
Kan du ikke lave et eller andet javascript onleave der åbner en popup der logger af og lukker sig selv igen med det samme??
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:16 #39
Det kan man måske, men vorfor ændre mit nuværende system?...

Den updater sidsteinput når man skriver noget, og alt det virker fint ! Der er bare en eller anden fejl i det, som gør at:

mysql_num_rows(mysql_query("SELECT * FROM chatbrugere WHERE brugernavn='$bruger1'")) < 1

bliver true selv om den er false
Avatar billede mcgoat Nybegynder
21. oktober 2004 - 01:16 #40
nej.. hvad hvis du slukker på din POWER knap.. så kommer den jo aldrig.. der skal være noget i den anden ende "SERVER" til at tjekke
Avatar billede Slettet bruger
21. oktober 2004 - 01:17 #41
Kunne det være, at PHP og MySQL måske har forskellige opfattelser af hvad klokken er - måske pga GMT i PHP eller lignende.

Prøv at rette til

mysql_query("INSERT INTO chatbrugere(brugernavn, sex, sidsteinput) VALUES('$brugernavn', '$sex', 'NOW()')") or die(mysql_error());
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:19 #42
Desværre stadig det samme resultat :(
Avatar billede Slettet bruger
21. oktober 2004 - 01:24 #43
Det skulle nu også have været

mysql_query("INSERT INTO chatbrugere(brugernavn, sex, sidsteinput) VALUES('$brugernavn', '$sex', NOW())") or die(mysql_error());

for ellers ser MySQL bare tid-feltet som en ugyldig værdi og skriver 0000-00-00 00:00:00 ind som tidspunkt og det er i hvert fald mindre end nu - 1 min
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:24 #44
..der bliver ikke engang skrevet i databasen med den kode
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:29 #45
Nu skriver den ok i databasen :) Men javascriptet med alert osv. Bliver stadig afviklet og man sendes til login siden.
Avatar billede Slettet bruger
21. oktober 2004 - 01:38 #46
Ok, så folder vi den one-liner ud:

$res=mysql_query("SELECT * FROM chatbrugere WHERE brugernavn='$bruger1'");
$tal=mysql_num_rows($res);

if($tal < 1) {
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:42 #47
Jeg HAR fundet fejlen :) Det er så plat at man ikke tror det...

Der manglede session_start() i toppen af siden. Det virker fint nu, man bliver smidt af hvis man tier stille i et minut. Den kunne jo ikke finde $_SESSION['bruger']

:)

Du har dog slidt så smukt i det at du skal have points'ne alligevel, så smid et svar, og tak for gejsten :)
Avatar billede Slettet bruger
21. oktober 2004 - 01:47 #48
Og uden session, så ender queryen med at blive mysql_query("SELECT * FROM chatbrugere WHERE brugernavn=''") og der er naturligvis ikke nogen rækker der passer dertil...

Har du overvejet at sætte error_reporting(E_ALL); det kan lette med at finde fejl.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:51 #49
Det må jeg vist lige se på :) Det var da den mest åndssvage fejl !!! :) Men det kan jo ske !!
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:56 #50
Hey måske kan du lige hjælpe mig med en anden ting (så'n)

Den skal en gang imellem slette alt i databasen, undtagen de 20 poster, der er de nyeste, og som vises (ellers bliver databasen for stor)... Hvordan gør jeg det ?

$tyveraekker = mysql_query("SELECT * FROM chat ORDER BY tid DESC LIMIT 0, 20");
mysql_query("FJERN ALLE RÆKKER SOM IKKE ER DE TYVE DER");
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 01:58 #51
DELETE * FROM chat ORDER BY tid LIMIT 21, *

Sådan noget der i den stil :)
Avatar billede Slettet bruger
21. oktober 2004 - 02:02 #52
Jeg ville nok bare slette alle rækker, der var ældre end et eller andet stykke tid (lige som med chatbrugerne).

Mon ikke 1-2 timer er rigeligt?

DELETE FROM chat WHERE tid < DATE_SUB(NOW(), INTERVAL 1 HOUR)

Og den kan du jo så køre på en side, der ikke er så travl. Den behøver jo ikke slette hele tiden.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 02:05 #53
Måske på siden hvor man skriver sin input ? Eller simpelthen på siden hvor logoet er :) Der aldrig reloades..
Avatar billede Slettet bruger
21. oktober 2004 - 02:14 #54
Ja, eller login-siden måske. Der er mange muligheder. Og det gør jo ikke noget, hvis der går et par timer mellem den får slettet gamle beskeder - med mindre der er rigtig mange brugere eller det kniber gevaldigt med diskplads.
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 02:15 #55
Der kommer nok en million på min chat hver dag, men jeg har smidt det på topbillede-siden ;)

www.legende.dk/chat/chatlogin.php

:) Mange tak !
Avatar billede baitianlong Nybegynder
21. oktober 2004 - 02:19 #56
Prøv lige at logge på, så jeg kan se at det virker med mere end een :)
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