Avatar billede akyhne Nybegynder
25. august 2008 - 22:37 Der er 56 kommentarer og
1 løsning

Hvordan kan jeg lave en simpel chat

Jeg mangler lidt hjælp til at komme i gang med at bygge en simpel chat.
Php, flash, javascript?
Avatar billede akyhne Nybegynder
25. august 2008 - 22:39 #1
Jeg er ikke interesseret i noget hvor man hører et klik ved en evt. reload af en side.
Avatar billede jakobdo Ekspert
26. august 2008 - 08:05 #2
Avatar billede akyhne Nybegynder
26. august 2008 - 08:17 #3
Tak, men det ene link er beskyttet.
Avatar billede akyhne Nybegynder
26. august 2008 - 08:24 #4
fandt ud af det. Men alt slettes hvis man trykker enter ved indsættelse!
Avatar billede jakobdo Ekspert
26. august 2008 - 08:31 #5
Ja, det er jo noget som må rettes.
Logout knappen trigges af ENTER, derfor.
Avatar billede akyhne Nybegynder
26. august 2008 - 08:36 #6
Ok. Det har jeg heller ikke behov for - log af.
Avatar billede akyhne Nybegynder
26. august 2008 - 08:38 #7
Hvordan kommer jeg så videre?
Avatar billede akyhne Nybegynder
26. august 2008 - 08:42 #8
Man bliver ikke logget af, selvom man klikker log af (IE7).
Avatar billede jakobdo Ekspert
26. august 2008 - 09:02 #9
Her logges jeg fint ud både i IE7 og FF3.
Avatar billede akyhne Nybegynder
26. august 2008 - 09:38 #10
Nu ved jeg ikke hvad der skal ske, men det eneste der sker ved logout er at vinduet tømmes for beskeder. Har også lige prøvet fra mit arbejde. Jeg kan stadig skrive videre, men gamle beskeder er væk.
Avatar billede jakobdo Ekspert
26. august 2008 - 10:07 #11
Det er da mærkeligt...
Måske jeg har en fejl. :o)
Avatar billede akyhne Nybegynder
26. august 2008 - 10:12 #12
Tja, situationen er den samme fra arbejde og hjemme fra. Begge bruger IE7.
Hvis jeg lukker vinduet og åbner igen, er situationen den samme. Selvom cache og cookies slettes når siden er lukket, er jeg stadig logget ind. Hvordan gemmes login?
Avatar billede jakobdo Ekspert
26. august 2008 - 10:23 #13
Det gemmes i session.
Avatar billede akyhne Nybegynder
26. august 2008 - 10:38 #14
Ok. Bruger du Ajax til at loade en side hvert sekund eller...?
Vil du af med koden?
Avatar billede jakobdo Ekspert
26. august 2008 - 10:41 #15
Jaja.

<?php
//http://www.eksperten.dk/spm/835426
session_start();

//Forbinder til databasen
require_once('connect.php');

//Indstillinger
$md5_salt = 'XXX'; // Tilføj noget tekst...

if(isset($_POST['action'])){
    switch(strtolower($_POST['action'])){
        case 'login':
            sleep(1);
            if(isset($_POST['username']) && isset($_POST['password'])){
                $username = mysql_real_escape_string($_POST['username']);
                $password = md5($md5_salt . $_POST['password'] . $md5_salt);
                $query = mysql_query("SELECT id FROM tbl_835426_user WHERE username = '".$username."' AND password = '".$password."' AND active = 1 LIMIT 1;");
                if(mysql_num_rows($query) == 1){
                    $row = mysql_fetch_assoc($query);
                    $_SESSION['chat_logged_in'] = true;
                    $_SESSION['chat_user_id']  = $row['id'];
                    $_SESSION['chat_username']  = $username;
                }
            }
            break;
        case 'logout':
            $_SESSION = array();
            session_destroy();
            break;
        case 'update':
            $response = array();
            if(isset($_SESSION['chat_logged_in']) && $_SESSION['chat_logged_in']){
                $response['authorized'] = true;
                if(isset($_SESSION['chat_last_updated'])){
                    $query = mysql_query("SELECT u.username, c.message, c.added FROM tbl_835426_user u INNER JOIN tbl_835426_chat c ON u.id = c.user WHERE UNIX_TIMESTAMP(c.added) > '".$_SESSION['chat_last_updated']."' ORDER BY c.added DESC LIMIT 50") or die(mysql_error());
                }else{
                    $query = mysql_query("SELECT u.username, c.message, c.added FROM tbl_835426_user u INNER JOIN tbl_835426_chat c ON u.id = c.user ORDER BY c.added DESC LIMIT 10") or die(mysql_error());
                }
                $messages = array();
                if(mysql_num_rows($query) > 0){
                    while($row = mysql_fetch_assoc($query)){
                        $messages[] = array('user' => $row['username'], 'time' => $row['added'], 'message' => $row['message']);
                    }
                    $response['messages'] = array_reverse($messages);
                    $_SESSION['chat_last_updated'] = time();
                }
            }else{
                $response['authorized'] = false;
            }
            echo json_encode($response);
            exit();
            break;
        case 'insert':
            $response = array();
            if(isset($_SESSION['chat_logged_in']) && $_SESSION['chat_logged_in']){
                $response['authorized'] = true;
                $message = mysql_real_escape_string($_POST['message']);
                $query = mysql_query("INSERT INTO tbl_835426_chat(user,message,added) VALUES('".$_SESSION['chat_user_id']."','".$message."',NOW())");
                if(mysql_affected_rows() == 1){
                    $response['inserted'] = true;
                }else{
                    $response['inserted'] = false;
                }
            }else{
                $response['authorized'] = false;
            }
            echo json_encode($response);
            exit();
            break;
        default:
            $_SESSION['status'] = 'Wrong Action, FOOL...';
    }
    header('Location: 835426exp.php');
    exit();
}

//Er vi logget ind ?
if($_SESSION['chat_logged_in']){
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
    echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">';
    echo '<head>';
    echo '<title>Jakobdo Chat v0.1</title>';
    echo '<script type="text/JavaScript" src="835426exp.js"></script>';
    echo '<style type="text/css">';
    echo 'div#content {background-color: #cc9; border: 1px dotted #333; padding: 2px; margin: 0px auto;}';
    echo 'div#content form {margin:0px; padding:0px;}';
    echo 'div#chatWindow {width: 500px; height: 300px; background-color: white; color: black; border: 2px solid black;overflow: auto;}';
    echo 'div.row {clear: both;}';
    echo 'div.row span.label {float: left; width: 100px; text-align: right;}';
    echo 'div.row span.formw {float: right; width: 235px; text-align: left;}';
    echo 'div.spacer {clear: both;}';
    echo '</style>';
    echo '</head>';
    echo '<body onload="startUpdate();">';
    echo '<div id="content">';
    echo '<form action="835426exp.php" method="post">';
    echo '<div class="row">';
    echo '<span>Jakobdo Chat v0.1</span>';
    echo '</div>';
    echo '<div class="row">';
    echo '<div id="chatWindow"></div>';
    echo '</div>';
    echo '<div class="row">';
    echo '<div id="chatText"><input type="text" id="message" /> <input id="insert" type="button" accesskey="s" onclick="insertMessage()" value="Send" size="25" /></div>';
    echo '</div>';
    echo '<div class="row">';
    echo '<input type="submit" name="action" value="Logout" size="25" />';
    echo '</div>';
    echo '<div class="spacer">&nbsp;</div>';
    echo '</form>';
    echo '</div>';
    echo '</body>';
    echo '</html>';
}else{
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
    echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">';
    echo '<head>';
    echo '<title>Jakobdo Chat v0.1</title>';
    echo '<style type="text/css">';
    echo 'div#content {width: 350px; background-color: #cc9; border: 1px dotted #333; padding: 5px; margin: 0px auto;}';
    echo 'div.row {clear: both; padding-top: 10px;}';
    echo 'div.row span.label {float: left; width: 100px; text-align: right;}';
    echo 'div.row span.formw {float: right; width: 235px; text-align: left;}';
    echo 'div.spacer {clear: both;}';
    echo '</style>';
    echo '</head>';
    echo '<body>';
    echo '<div id="content">';
    echo '<form action="835426exp.php" method="post">';
    echo '<div class="row">';
    echo '<span class="label">Username:</span>';
    echo '<span class="formw"><input type="text" name="username" size="25" /></span>';
    echo '</div>';
    echo '<div class="row">';
    echo '<span class="label">Password:</span>';
    echo '<span class="formw"><input type="password" name="password" size="25" /></span>';
    echo '</div>';
    echo '<div class="row">';
    echo '<span class="label">&nbsp;</span>';
    echo '<span class="formw"><input type="submit" name="action" value="Login" size="25" /></span>';
    echo '</div>';
    echo '<div class="spacer">&nbsp;</div>';
    echo '</form>';
    echo '</div>';
    echo '</body>';
    echo '</html>';
}
?>
Avatar billede akyhne Nybegynder
26. august 2008 - 10:49 #16
Super, super. Tak :)
Avatar billede jakobdo Ekspert
26. august 2008 - 10:51 #17
Og javascript og css må du lige trække fra siden.
Avatar billede akyhne Nybegynder
26. august 2008 - 10:56 #18
Og tak til olebole. Jeg kan se han har lavet js scriptet. jeg sender de varmeste hilsener lol.
Point?
Avatar billede jakobdo Ekspert
26. august 2008 - 11:18 #19
Svar!
Avatar billede jakobdo Ekspert
26. august 2008 - 11:48 #20
Takker for point.
Avatar billede olebole Juniormester
26. august 2008 - 22:01 #21
<ole>

Selvtak, men det er nu kun JavaScriptet, jeg har del i. Jeg ville ikke selv have valgt at lade PHP udskrive markup koden med echo - og havde jeg endelig gjort det, havde jeg konkateneret en streng og udskrevet den ét sted  =)

/mvh
</bole>
Avatar billede olebole Juniormester
26. august 2008 - 22:02 #22
PS: og så havde jeg i øvrigt også brugt HTML 4.01 Strict ... ikke XHTML 1.0  ;o)
Avatar billede jakobdo Ekspert
26. august 2008 - 22:14 #23
Jaja, brokke brokke brokke... :o)
Avatar billede akyhne Nybegynder
26. august 2008 - 23:49 #24
Jeg har kigget lidt på det og prøvet at sætte det op.

Der er som jeg ser det tale om to tabeller tbl_835426_user(id, username, password, active), og tbl_835426_chat(user,message,added).

Hvor kommer så navnene u.username, c.message, c.added fra?
Avatar billede olebole Juniormester
26. august 2008 - 23:55 #25
jakobdo >> ja, ellers ville du jo ikke kunne kende mig  ;D

akyhne >> Du skal nok bruge tbl_835426_user.username - tbl_835426_chat.message - etc  ;o)
Avatar billede akyhne Nybegynder
27. august 2008 - 00:02 #26
Ja, de må jo være defineret til det på en eller anden måde.
Avatar billede olebole Juniormester
27. august 2008 - 00:05 #27
Jeg tror bare, det er en tankefisk fra jakobdo ... ikke for at brokke, altså  ;D
Avatar billede akyhne Nybegynder
27. august 2008 - 00:09 #28
Det giver bare en gang sludder:
SELECT smf_members.username, Where_Chat.message, Where_Chat.added FROM Where_Chat smf_members INNER JOIN FROM Where_Chat Where_Chat ON smf_members.ID_MEMBER = Where_Chat.user ORDER BY Where_Chat.added DESC LIMIT 10

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM Where_Chat ON smf_members.ID_MEMBER = Where_Chat.user ORDER BY Where_Chat.a' at line 1
Avatar billede akyhne Nybegynder
27. august 2008 - 00:16 #29
Jeg har aldrig brugt INNER JOIN, men det burde vel være noget lignende:
SELECT username, message, added FROM Where_Chat INNER JOIN FROM smf_members ON smf_members.ID_MEMBER = Where_Chat.user ORDER BY Where_Chat.added DESC LIMIT 10
Avatar billede akyhne Nybegynder
27. august 2008 - 01:03 #30
Fik det til at virke.
Avatar billede jakobdo Ekspert
27. august 2008 - 08:03 #31
SQLKoden virker fint fint.

SELECT u.username, c.message, c.added FROM tbl_835426_user u INNER JOIN tbl_835426_chat c ON u.id = c.user ORDER BY c.added DESC LIMIT 10

Se: tbl_835426_user u og tbl_835426_chat c

Det er alias'er for de lange navne.
Avatar billede akyhne Nybegynder
27. august 2008 - 09:21 #32
Det er ok, jeg fik det til at virke med mit SMF forums navnedatabase.

Dog ville phpMyAdmin (MySql 5.0.32) ikke acceptere FROM i koden.
Avatar billede jakobdo Ekspert
27. august 2008 - 09:42 #33
Hvad mener du med FROM ?
Det skal den da.
Avatar billede akyhne Nybegynder
27. august 2008 - 12:48 #34
Det virker nu fint uden. Hvad nu hvis jeg vil skrive til innerHTML for at få smileys/html kode med?
Avatar billede jakobdo Ekspert
27. august 2008 - 13:01 #35
Så bliver det uden olebole's support.
innerHTML er forbudt. :o)
Avatar billede akyhne Nybegynder
27. august 2008 - 13:13 #36
Det ved jeg, det har han fortalt engang. Er der ikke en "lovlig" metode?
Avatar billede akyhne Nybegynder
27. august 2008 - 13:15 #37
Jeg ville gerne kunne bruge smileys samt konvertere links til html links.

Og er det ellers blot
div.appendChild(divText);

som skal laves til

div.innerHTML?(divText);

Jeg fatter nada af JavaScripts.
Avatar billede jakobdo Ekspert
27. august 2008 - 13:18 #38
Er det så ikke på tide at lære det ?
Avatar billede akyhne Nybegynder
27. august 2008 - 13:23 #39
Hah, det har jeg forsøgt i 2-3 år. Nogen siger det minder om php, det kan jeg ski ikke se det gør.
Jo simple ting som for løkker..
Avatar billede jakobdo Ekspert
27. august 2008 - 14:12 #40
Du bør jo bygge videre på dom-modellen.

var divText = cT(oRespons.messages[i].time + ' - ' + oRespons.messages[i].user + ' : ' + oRespons.messages[i].message);
                div.appendChild(divText);

Og appende billeder og lign. så det er korrekt opbygget.
Avatar billede akyhne Nybegynder
27. august 2008 - 14:23 #41
Det er jeg klar over, men jeg vil gerne først have metoden til at skrive til innerHTML til at virke.
Avatar billede jakobdo Ekspert
27. august 2008 - 14:30 #42
Den må du desværre selv rode lidt med... :o)
Avatar billede olebole Juniormester
27. august 2008 - 17:36 #43
Det tager _dramatisk_ længere tid at formatere HTML på serveren i forhold til, hvad det tager at formatere data som XML eller JSON. Alene af dén grund er innerHTML aldeles uinteressant. Serveren er jo somregel hårdt belastet i forvejen  ;o)
Avatar billede akyhne Nybegynder
27. august 2008 - 17:41 #44
Det vil jeg søreme heller ikke, olebole. Det vil jeg gøre med javascript i outputtet til div'en.
Avatar billede akyhne Nybegynder
03. september 2008 - 00:56 #45
Det var ærgeligt du fjernede chatten. Den virker nemlig ikke i Opera.

Et par "småting" hvis I har lyst til at hjælpe:
myInterval=self.setInterval("updateChat()",tidsopdatering);
sætter tidsintervallet. Problemet er at der en gang imellem går 15-25 sekunder før der kommer svar. Det skyldes min host. Men kan man ikke stoppe tællingen i starten af updateOnlinelist() og starten den igen i slutingen. Ideen var at den så ikke ville fortsætte med at kalde indtil den var færdig med forrige kald.

Hvor meget ville skulle ændres i js scriptet hvis det skulle gøres HTML 4.01 compliant? Og hvorfor "HTML 4.01 Strict"?
Avatar billede jakobdo Ekspert
03. september 2008 - 08:14 #46
Mit nye system virker ikke helt optimalt desværre.
Men der skal jo også være lidt at arbejde på. :o)
Du kan jo evt. smide koden online og lege videre selv.
Hvis du mangler noget, siger du bare til.
Avatar billede akyhne Nybegynder
03. september 2008 - 09:17 #47
Jeg har lavet så meget om at der ikke er ret meget tilbage af af den originale php fil og der er også lavet om på js scriptet så jeg kan skrive html til chatten.

Det ser ud som om chatten virker på alle områder i Opera på nær den vigtigste: Hente nye beskeder. Men når man så skriver en besked, opdaterer den de nyankomne beskeder. Mærkeligt, for jeg henter i et andet kald hvem der er online, og det gør Opera godt nok.

Hvad jeg har lavet indtil videre:
Fjernet alt login, da man skal logge ind i et SMF forum for at bruge chatten.
Om man er logget ind, checkes ved hjælp af en fil i SMF der hedder SSI.php.
Aut. skrive navn på personer der åbner eller lukker chatten som en chatbesked. Logget ind står som grøn, logget ud med rødt.
Ens egne beskeder står med lilla, andres beskeder med en standard farve. På den måde er det nemt at se andre skrive på chatten.
3 forskellige lyde, en for beskeder, en når folk logger ind, en anden når de logger af.
Indsættelse af smileys. Dette foregår ikke som indsættelse i db'en, men bliver fortolket når teksten sættes ind på chatten.
Online liste - der skrives til db hvert 10. sekund om man er online.

Så generelt er det hele lavet så der ikke skrives mere end før til og fra db'en men alt fortolkes af brugerens computer via js.

Det næste jeg skal have kigget på er at checke beskeder hvert 10. sekund i stedet for at checke hvert 2. sekund. Hvis så folk skriver, skiftes ned til hvert andet sekund.

Desværre er chatten ikke w3 html validated, da mange af de ting jeg bruger såsom lydafspilning ikke understøttes af dokumenttypen. Det ærger mig noget, da jeg nornmalt altid sørger for at det er tilfældet.
Avatar billede akyhne Nybegynder
22. marts 2009 - 13:46 #48
Hvad gør denne præcis i oleboles script:
var oRespons = eval('(' + oHttp.responseText + ')');

Den giver mig en gang imellem en javascript fejl.
Avatar billede jakobdo Ekspert
23. marts 2009 - 20:17 #49
Den konvertere responsetext til et javascript objekt. (som jeg forstår det)
Avatar billede akyhne Nybegynder
24. marts 2009 - 10:35 #50
Ja, jeg har læst lidt om funktionen. Men hvad kan det skyldes den nogen gange laver en javascript error?
Avatar billede jakobdo Ekspert
24. marts 2009 - 10:55 #51
Fordi der måske er fejl i det som sendes retur. :o) At det ikke er korrekt javascript.
Avatar billede akyhne Nybegynder
24. marts 2009 - 11:01 #52
Problemet er at chatten bare står og kører uden der er nogen der skriver. Uden grund går den så i fejl.
Nogen gange går der 10 sekunder, andre gange minutter. Chatten virker stadig, men det er jo ikke hensigtsmæssigt med en sådan fejl.
Avatar billede jakobdo Ekspert
24. marts 2009 - 11:13 #53
Jeg er helt enig.
Men du må jo forsøge med noget debug.
F.eks. alert(oHttp.responseText)
Eller kig på javascript debug ala FireBug
Avatar billede akyhne Nybegynder
24. marts 2009 - 11:25 #54
Det er jo et array. Kan man udskrive det med JS funktionen alert()?
Avatar billede jakobdo Ekspert
24. marts 2009 - 11:41 #55
Sagtens
Avatar billede akyhne Nybegynder
24. marts 2009 - 12:16 #56
Mit problem i øjeblikket er at FF ikke melder nogen fejl, så Firebug er ikke til megen hjælp :-\
Avatar billede jakobdo Ekspert
24. marts 2009 - 21:29 #57
Så må du prøve at lave noget debug på din IE. :o)
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