Toon posts:

[PHP/JS] Chatbox probleempje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben met PHP/JavaScript een chatboxje aan het maken. Hiervoor laad ik in m'n pagina twee iframe's. De eerste geeft de inhoud van de chatbox weer (de informatie hiervoor wordt uit een database gehaald). Dit deel werkt gewoon goed. Het tweede iframe bevat een verzend-veld dat een opmerking invoegt in diezelfde database. Dit toevoegen gaat echter niet goed.
Ik heb de volgende code:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html>
<head>

<script language="JavaScript">
function stringPlus(string) {
    var result = "";
    var c;
    for (var j=0; j < string.length; j++) {
        if ((c = string.charAt(j)) == "+")
            result += "%2b";
        else 
            result += c;
    }
    return result;
}

function doPost() {
    parent.reload.window.location=
        "reload.php?"
        + "nick="
        + stringPlus(escape(document.textform.nick.value))
        + "&post=" 
        + stringPlus(escape(document.textform.text.value));
    document.textform.text.value="";
    return false;
}
</script>
</head>

<body topmargin="0" marginheight="0" marginwidth="0" leftmargin="0" bgcolor="#eeeeee">
    <form onsubmit="return doPost();" name="textform">
        <input type="hidden" name="nick" value="<? echo $_SESSION['un']; ?>"/>
        Bericht: <input type="text" size="70" name="text" value=""/>
        <input type="submit" value="Verzend"/>
    </form>
</body>
</html>

Als ik op Verzend klik, wordt het tekstveld leeggehaald, dus hij komt wel in doPost(). Die sessiebariabele is overigens de nickname van de persoon die chat (chatbox wordt geïntegreerd in een forum). M'n reload.php ziet er zo uit:

PHP:
1
2
3
4
5
6
<?
    require "../lib/auth.php";
    require "../lib/inc.php";

    mysql_query("INSERT INTO forum_chatbox (nickname, message) VALUES ('$nick', '$post')", $db);
?>
Ik krijg dus geen foutmeldingen, maar er wordt ook niks nieuws ingevoegd. Iemand een idee wat er fout gaat :?

P.S.: $db wordt gemaakt in ../lib/inc.php

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 07-04 13:41
PHP:
1
mysql_query("INSERT INTO forum_chatbox (nickname, message) VALUES ('$nick', '$post')", $db);

veranderen in
PHP:
1
mysql_query("INSERT INTO forum_chatbox (nickname, message) VALUES ('$nick', '$post')", $db) or die (mysql_error());


dit hoort hier eigenlijk niet

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 25-05 19:01
En je mag je variabelen ook altijd aan mekaar concatten. Het wordt dan
PHP:
1
mysql_query("INSERT INTO forum_chatbox (nickname, message) VALUES ('" . $nick . "', '" . $post . "')", $db) or die (mysql_error());
en dat is een pak netter :).

Je geeft trouwens geen method aan je form en in je query lees je gewoon $nick en $post uit, maak hiervan dus get, en lees het dan uit dmv $_GET. De hele JavaScript-submitting is imho ook overbodig, als je nu 1 iframe maakt met daarin én de form én de uitkomst is alles netter en simpeler :).

[ Voor 59% gewijzigd door coubertin119 op 25-12-2003 10:51 ]

Skat! Skat! Skat!


Verwijderd

Topicstarter
PrisonerOfPain --> Dat had ik natuurlijk al wel geprobeerd ;)
Hij geeft geen SQL-fout ofzo, op zich lijkt me met de query ook weinig mis (als ik hem draai in PHPMyAdmin werkt het gewoon).
Ik heb het idee dat het in het JS-stukje zit, vandaar ook dat ik hem hier heb geplaatst...

[ Voor 4% gewijzigd door Verwijderd op 25-12-2003 10:49 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 21:30

crisp

Devver

Pixelated

Het kan gewoon allemaal veel simpeler:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
<head>
<title>chatbox</title>
<script type="text/javascript">

function doPost(form) {

  if (form.elements['dummy'].value == '') return false;

  form.elements['text'].value = form.elements['dummy'].value;
  form.elements['dummy'].value = '';
  return true;

}

</script>
</head>
<body>
<form action="reload.php" target="reload" onsubmit="return doPost(this)">
  <input type="hidden" name="nick" value="<? echo $_SESSION['un']; ?>" />
  <input type="hidden" name="text" value="" />
  Bericht: <input type="text" size="70" name="dummy" value="" />
  <input type="submit" value="Verzend"/>
</form>
</body>
</html>


Je kan er nu zelfs een POST van maken als je wilt ;)

[ Voor 3% gewijzigd door crisp op 25-12-2003 12:17 ]

Intentionally left blank


Verwijderd

Topicstarter
Invoegen gaat nu idd wel, alleen krijg je als je een bericht verzend een nieuw venster met die aanroep van reload.php erin. Dat venster loopt dan (in IE 6 iig) als het ware vast, ik heb het idee dat dat door het iframe komt waarin de inhoud van de database wordt weergegeven en ververst. De code daarvan is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?

    include "../lib/auth.php";
    include "../lib/inc.php";
    
    function update($last) {
        $r = mysql_query("SELECT id, nickname, message FROM forum_chatbox WHERE id > $last ORDER BY id");
        $c = mysql_num_rows($r);

        while ($row = mysql_fetch_array($r, MYSQL_NUM)) {
            $id = (int) $row[0];

            echo formatMessage(stripslashes($row[1]), stripslashes($row[2]));
        }
        
        if ($c > 0) {
            echo "<script>scrollDown()</script>\n\n";
            flush();
        }
        return $id;
    }

    function formatMessage($name, $message) {
         return "<b>" . $name . "</b>: " . $message . "<br />";
    }

    if ($last == 0) {
        $print_header = true;
        $r = mysql_query("SELECT MAX(id) FROM forum_chatbox");
        $row = mysql_fetch_array($r, MYSQL_NUM);
        $last = $row[0] - 1;
    }
?>
<html>
<head>
<script language="Javascript">
function scrollDown() {

    //Voor Mozilla
    var scroll = -1;
    while(window.scrollY > scroll) {
        scroll = window.scrollY;
        window.scrollBy(0, 500);
    }

    //Voor IE
    var count = 0;
        var doc = document.body;
        while(doc.scrollTop < doc.scrollHeight && count < 20) {
        doc.scrollTop = doc.scrollHeight;
        count++;
    }
}
</script>
</head>
<body>
<?

    while(true) {
        $id = (int) update($last);

        if($id > 0) $last = $id;
        sleep(1);
    }

?>
</body>
</html>

Volgens mij maakt die while(true)-loop de boel helemaal in de war, maar ik zou niet weten hoe het anders opeglost zou meten worden :?

Verwijderd

Topicstarter
Niemand :?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 21:30

crisp

Devver

Pixelated

natuurlijk komt dat door die while(true); je connectie naar de server blijft openstaan totdat de browser een timeout genereert. Als je wil refreshen moet je dat clientside regelen met een javascriptje of een meta-refresh. Je moet het client-server concept in ogenschouw nemen, en het feit dat die communicatie stateless is.

Intentionally left blank


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
offtopic:
Ik zou met platte tekstbestanden gaan werken als ik jou was, kijk eens naar fopen enzo.
Om een chatbox in mysql te implementeren is _erg_ zwaar voor de server.
Pagina: 1