28 września 2015

Czat z wykorzystaniem jQuery

Kategoria: JavaScript, PHP Autor: FX

Czat z wykorzystaniem technologii jQuery.

Cz. 1 – wprowadzanie danych z klawiatury

Poniższy program wprowadza dane z klawiatury i wypisuje je w formie Czatu z komputerem, który co 4 sekundy odpisuje tylko „cześć”.

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
<html>
 <head>
 <meta charset="utf-8">
 <title>Chat</title>
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
 </head>
 <body>
  <div id="lista">
  </div>
 <br>  
  <div id="inputbox">
   <input id="wiadomosc">
   <input type="button" value="wyslij" onclick="wyslij()">
  </div>
  <script>
   var wprowadz = document.getElementById("wiadomosc");
   var wypisz = document.getElementById("lista");

   function wyslij()
   {
     wypisz.innerHTML += "<i>Użytkownik:</i> "+ wprowadz.value + "<br>";
     wprowadz.value = "";
     //tu trzeba zrobić wysyłanie na serwer wiadomości do zapisu w bazie
    }

  function odbierz()
  {
      wypisz.innerHTML += "<i>Komputer:</i> cześć<br>";
       // tu trzeba zrobić odczyt z bazy wpisów innych użytkowników, na razie komputer odpisuje tylko "cześć" co 4 sek.  
  }

  setInterval(odbierz, 2000); //funkcja odbierz() będzie uruchamiana co 4 sekundy
  </script>
 </body>
</html>

Działający przykład:
Link
c.d.n.

Etap 2 – zapis rozmowy do bazy danych

W bazie danych tworzymy tabelę:

1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `czat` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `uzytkownik` VARCHAR(50) NOT NULL,
  `wiadomosc` VARCHAR(200) NOT NULL,
  `czas` datetime NOT NULL,
  `ip` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Logujemy autora wiadomości, treść, datę i czas oraz IP z którego wysłano wiadomość.

Następnie:

Tworzymy na serwerze program wstaw.php, który będzie zapisywał do tej tabeli zmienne typu _GET
wstaw.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 include "polacz.php";
 $uzytkownik = $_GET["uzytkownik"];
 $wiadomosc = $_GET["wiadomosc"];
 $ip = $_SERVER['REMOTE_ADDR']; //odczyt zdalnego IP komputera klienta
 if ($sql = $baza->prepare("INSERT INTO czat VALUES( '', ?, ?, NOW(), ? );"))
 {
  $sql->bind_param("sss", $uzytkownik, $wiadomosc, $ip);
  $sql->execute();
  $sql->close();
 }
$baza->close();
?>

i rozbudowujemy nasz czat o kilka linijek zapisujących do bazy

1
2
3
4
 $.get(
       "wstaw.php",
       { uzytkownik: uzytkownik, wiadomosc: document.getElementById("wiadomosc").value }
     );

Trzecia odsłona – wczytywanie całego czatu z bazy

Tworzymy teraz plik odczytujący z bazy:
odbierz.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
include "polacz.php";
if ($sql = $baza->prepare("SELECT uzytkownik, ip, wiadomosc, czas FROM czat ORDER BY id DESC LIMIT 20"))
{
 $sql->execute();
 $sql->bind_result($uzytkownik, $ip, $wiadomosc, $czas);
 $wynik="";
 while ($sql->fetch())
 {
   $wynik = "<i>$uzytkownik</i>@$ip: $wiadomosc <small>$czas</small> <br>".$wynik;
 }
 $sql->close();
 echo $wynik;
}
$baza->close();
?>

Zmienna $wynik jest pomocnicza, odwraca kolejność wierszy tak,by nowe były u dołu, wczytujemy tylko ostatnie 20 wierszy czatu

W programie w funkcji odbierz zamiast komputerowego zgłoszenia „cześć” umieszczamy odbieranie najnowszego stanu z bazy:

1
2
3
4
5
6
7
 $.get(
        "odbierz.php",
        function (dane,statut)
        {
                document.getElementById("lista").innerHTML = dane; //wpisuje cały czat z bazy do warstwy
        }
  );

W całości będzie to wyglądać tak:
chat.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
<html>
 <head>
 <meta charset="utf-8">
 <title>Chat</title>
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
 </head>
 <body>
<?php
include "polacz.php";
$uzytkownik = wczytaj( "uzytkownik" ); // wczyta nazwe uzytkownika z tablicy $_GET  z adresu
?>
  <div id="lista">
  </div>
 <br>
  <div id="inputbox">
   <input id="wiadomosc">
   <input type="button" value="wyslij" onclick="wyslij()">
  </div>
  <script>
   function wyslij()
   {
     var uzytkownik = "<?php echo $uzytkownik; ?>";
     $.get(
       "wstaw.php",
       {
         uzytkownik: uzytkownik,
         wiadomosc:  document.getElementById("wiadomosc").value
       }
     );
     wprowadz.value = "";
    }

  function odbierz()
  {
    $.get(
        "odbierz.php",
        function (dane, bledy)
        {
                document.getElementById("lista").innerHTML = dane; //wpisuje cały czat z bazy do warstwy
        }
    );
  }

  setInterval( odbierz, 2000);
  </script>
 </body>
 </html>

UWAGA! Chat wywołujemy z parametrem będącym nazwą użytkownika np.

1
chat.php?uzytkownik=adam

Komentowanie wyłączone.