Avatar billede Slettet bruger
27. august 2012 - 21:50 Der er 12 kommentarer og
1 løsning

gmail/facebook chat - problemer med connect databasen

Hej eksperter.

Jeg bruger en chat på mit site, men kan ikke få den til at sætte noget som helst op i databasen.

Her er linket til den simple chat jeg bruger/har hentet:
http://anantgarg.com/2009/05/13/gmail-facebook-style-jquery-chat/

Jeg har placeret chat.php og .js filerne i samme location + en index.php med brugernavne som kommer fra tabellen 'bruger' hvor jeg har tilføjet lidt javascript på <a> som får chatten frem ved onclick.

Det virker fint med at de popper op, men der kommer intet op i tabellen 'chat' ? Hmm Kan I hjælpe mig med at finde fejlen.

chat.php

<?php

include 'databasen.php';

if ($_GET['action'] == "chatheartbeat") { chatHeartbeat(); }
if ($_GET['action'] == "sendchat") { sendChat(); }
if ($_GET['action'] == "closechat") { closeChat(); }
if ($_GET['action'] == "startchatsession") { startChatSession(); }


if (!isset($_SESSION['chatHistory'])) {
    $_SESSION['chatHistory'] = array();   
}

if (!isset($_SESSION['openChatBoxes'])) {
    $_SESSION['openChatBoxes'] = array();   
}

function chatHeartbeat() {
   
    $sql = "select * from true_life_chat where (chat.to = '".mysql_real_escape_string($_SESSION['bruger_navn'])."' AND recd = 0) order by id ASC";
    $query = mysql_query($sql);
    $items = '';

    $chatBoxes = array();

    while ($chat = mysql_fetch_array($query)) {

        if (!isset($_SESSION['openChatBoxes'][$chat['from']]) && isset($_SESSION['chatHistory'][$chat['from']])) {
            $items = $_SESSION['chatHistory'][$chat['from']];
        }

        $chat['message'] = sanitize($chat['message']);

        $items .= <<<EOD
                      {
            "s": "0",
            "f": "{$chat['from']}",
            "m": "{$chat['message']}"
      },
EOD;

    if (!isset($_SESSION['chatHistory'][$chat['from']])) {
        $_SESSION['chatHistory'][$chat['from']] = '';
    }

    $_SESSION['chatHistory'][$chat['from']] .= <<<EOD
                          {
            "s": "0",
            "f": "{$chat['from']}",
            "m": "{$chat['message']}"
      },
EOD;
       
        unset($_SESSION['tsChatBoxes'][$chat['from']]);
        $_SESSION['openChatBoxes'][$chat['from']] = $chat['sent'];
    }

    if (!empty($_SESSION['openChatBoxes'])) {
    foreach ($_SESSION['openChatBoxes'] as $chatbox => $time) {
        if (!isset($_SESSION['tsChatBoxes'][$chatbox])) {
            $now = time()-strtotime($time);
            $time = date('g:iA M dS', strtotime($time));

            $message = "Sent at $time";
            if ($now > 180) {
                $items .= <<<EOD
{
"s": "2",
"f": "$chatbox",
"m": "{$message}"
},
EOD;

    if (!isset($_SESSION['chatHistory'][$chatbox])) {
        $_SESSION['chatHistory'][$chatbox] = '';
    }

    $_SESSION['chatHistory'][$chatbox] .= <<<EOD
        {
"s": "2",
"f": "$chatbox",
"m": "{$message}"
},
EOD;
            $_SESSION['tsChatBoxes'][$chatbox] = 1;
        }
        }
    }
}

    $sql = "update true_life_chat set recd = 1 where chat.to = '".mysql_real_escape_string($_SESSION['bruger_navn'])."' and recd = 0";
    $query = mysql_query($sql);
   
    if ($items != '') {
        $items = substr($items, 0, -1);
    }
header('Content-type: application/json');
?>
{
        "items": [
            <?php echo $items;?>
        ]
}

<?php
            exit(0);
}

function chatBoxSession($chatbox) {
   
    $items = '';
   
    if (isset($_SESSION['chatHistory'][$chatbox])) {
        $items = $_SESSION['chatHistory'][$chatbox];
    }

    return $items;
}

function startChatSession() {
    $items = '';
    if (!empty($_SESSION['openChatBoxes'])) {
        foreach ($_SESSION['openChatBoxes'] as $chatbox => $void) {
            $items .= chatBoxSession($chatbox);
        }
    }


    if ($items != '') {
        $items = substr($items, 0, -1);
    }

header('Content-type: application/json');
?>
{
        "username": "<?php echo $_SESSION['bruger_navn'];?>",
        "items": [
            <?php echo $items;?>
        ]
}

<?php


    exit(0);
}

function sendChat() {
    $from = $_SESSION['bruger_navn'];
    $to = $_POST['to'];
    $message = $_POST['message'];

    $_SESSION['openChatBoxes'][$_POST['to']] = date('Y-m-d H:i:s', time());
   
    $messagesan = sanitize($message);

    if (!isset($_SESSION['chatHistory'][$_POST['to']])) {
        $_SESSION['chatHistory'][$_POST['to']] = '';
    }

    $_SESSION['chatHistory'][$_POST['to']] .= <<<EOD
                      {
            "s": "1",
            "f": "{$to}",
            "m": "{$messagesan}"
      },
EOD;


    unset($_SESSION['tsChatBoxes'][$_POST['to']]);

    $sql = "insert into true_life_chat (chat.from,chat.to,message,sent) values ('".mysql_real_escape_string($from)."', '".mysql_real_escape_string($to)."','".mysql_real_escape_string($message)."',NOW())";
    $query = mysql_query($sql);
    echo "1";
    exit(0);
}

function closeChat() {

    unset($_SESSION['openChatBoxes'][$_POST['chatbox']]);
   
    echo "1";
    exit(0);
}

function sanitize($text) {
    $text = htmlspecialchars($text, ENT_QUOTES);
    $text = str_replace("\n\r","\n",$text);
    $text = str_replace("\r\n","\n",$text);
    $text = str_replace("\n","<br>",$text);
    return $text;
}
?>
Avatar billede olebole Juniormester
27. august 2012 - 22:44 #1
<ole>

Det kan skyldes alt muligt, vi ikke kan vide noget om. Prøv at skrive en funktion som denne øverst i dit dokument:

function doLog($sStr) {
    $fp = fopen('log.txt', 'a');
    fwrite($fp, $sStr);
    fclose($fp);
}

Den giver dig mulighed for at udskrive variabelværdier, m.m. i et log-dokument. Hvergang, du kalder funktionen med en streng, skrives en linje til i logfilen.

Da du ikke kan se PHP-dokumentet, når det modtager data, er du nødt til at have en anden mulighed for at fejlfinde i dokumentet. Det giver funktionen mulighed for  =)

/mvh
</bole>
Avatar billede vagnk Juniormester
28. august 2012 - 02:38 #2
Det kunne lyde som et sql-problem. Prøv at sætte en tilføjelse til dine queries:
$query = mysql_query($sql) or die(mysql_error());

Så vil programmet dø hvis der er det mindste i vejen.
Avatar billede olebole Juniormester
28. august 2012 - 03:07 #3
@vagnk: Han ser aldrig outputtet, og derfor heller ikke en MySQL-fejl. Derfor foreslog jeg logfunktionen  =)
Avatar billede olebole Juniormester
28. august 2012 - 03:09 #4
- men den kan han naturligvis også logge MySQL-fejl med:

$query = mysql_query($sql);
if (mysql_errno()) doLog(mysql_error());
Avatar billede Slettet bruger
28. august 2012 - 13:43 #5
Hej igen.

ole - jeg prøvede din:
function doLog($sStr) {
    $fp = fopen('log.txt', 'a');
    fwrite($fp, $sStr);
    fclose($fp);
}

men kunne vidst ikke rigtig få det til at virke.

Derefter prøvede jeg:
ini_set('display_errors',1);
error_reporting(E_ALL);

og der fik jeg fejlen:
Notice: Undefined index: action in .... line 17.

det er der hvor dette starter:
if ($_GET['action'] == "chatheartbeat") { chatHeartbeat(); }
if ($_GET['action'] == "sendchat") { sendChat(); }
if ($_GET['action'] == "closechat") { closeChat(); }
if ($_GET['action'] == "startchatsession") { startChatSession(); }

Jeg har nu også implementeret dette istedet for include 'databasen.php';

define ('DBPATH','localhost');
define ('DBUSER','root');
define ('DBPASS','password');
define ('DBNAME','chat');

session_start();

global $dbh;
$dbh = mysql_connect(DBPATH,DBUSER,DBPASS);
mysql_selectdb(DBNAME,$dbh);
Avatar billede olebole Juniormester
28. august 2012 - 14:41 #6
Det er ikke en fejl, men en Notice, som gør dig opmærksom på uhensigtsmæssig kodestil, som potentielt kan blive skyld i alvorligere fejl.

Du skriver ikke, hvad du gjorde, da du fik den nævnte notice. Variablen $_GET['action'] har tydeligvis ikke været sat - men mon ikke den altid er det, når dokumentet virker i chatten?

Hvis du bare kalder dokumentet uden passende $_GET-variabler, vil den notice altid komme, men det er næppe heller realistisk at gøre.

Ellers undgår du den med:

if (isset($_GET['action'])) {
    if ($_GET['action'] == "chatheartbeat") { chatHeartbeat(); }
    if ($_GET['action'] == "sendchat") { sendChat(); }
    if ($_GET['action'] == "closechat") { closeChat(); }
    if ($_GET['action'] == "startchatsession") { startChatSession(); }
}

- så du ikke prøver at bruge variabler, som ikke er sat.

Hvad log-funktionen angår, er der ikke noget hokus pokus. Du bruger den blot der, hvor du ellers ville echo'e variabler eller fejlmeddelelser, når du fejlfinder - f.eks. som vist i #4
Avatar billede Slettet bruger
28. august 2012 - 15:54 #7
okay, tak .-)

Den siger ingen fejl, så der er ingen problemer med forbindelsen, men hvad kan det så være ?

hvis I gider at læse lidt så er linket jo i #1 til den chat jeg bruger, den burde være ret simpel for sådan nogle eksperter som jer :-)
Avatar billede olebole Juniormester
28. august 2012 - 16:02 #8
Vi sidder ikke med applikationen, så det er ikke til at sige, hvad du måtte gøre galt. Det kommer vi heller ikke tættere på ved at læse om den.

Den eneste måde, vi kommer videre på, er, at du begynder at fejlfinde. Du har fået et værktøj til at logge dine variablers tilstande. Hvad fik du ud af at bruge det?
Avatar billede Slettet bruger
28. august 2012 - 16:09 #9
Den udskrev intet, så enten har jeg gjort det forkert og ellers er der ingen fejl :-)

men kan du prøve at skrive det ind i koden fra #1 hvordan jeg skal gøre, og jeg skal vel oprette en log.txt og ligge i samme folder.
Avatar billede olebole Juniormester
28. august 2012 - 21:58 #10
Filen bliver oprettet automatisk, så det behøver du ikke tænke på.

Du begynder i toppen af scriptet og logger én variabel ad gangen. Indeholder en variabel, hvad du forventer, logger du den næste - og så fremdeles. På et tidspunkt møder du en variabel, som ikke indeholder det forventede ... så er du ved fejlen. Ganske almindelig fejlfinding  =)
Avatar billede Slettet bruger
30. august 2012 - 16:01 #11
Okay, men jeg forstår stadig ikke hvad du mener. Så tror bare vi lader den ligge her ole, men tak.
Avatar billede olebole Juniormester
30. august 2012 - 16:12 #12
Hvis du ikke forstår, hvad jeg mener, bør du sætte dig lidt bedre ind i grundlæggende PHP, inden du kaster dig ud i mere komplekse applikationer.

Ajax applikationer er noget ret kompliceret noget at rode med - dels fordi de suger ressourcer som bare pokker og derfor skal skrives ekstremt effektivt - og dels fordi du ikke umiddelbart kan se, hvad der sker i PHP-dokumentet.

Det allerførste, man bør lære efter udskrivning af "Hello World" fra en variabel, er fejlfinding. Det eneste, jeg har opfordret til i denne tråd, er ganske elementær fejlfinding. Det bør du som det første få styr på  =)
Avatar billede Slettet bruger
10. oktober 2012 - 00:01 #13
Fandt et andet script :-)
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