Porady
FAQ
Słownik
Sonda
-- LICZNIK --
Licznik: 84368860

Część 6 - Prosty chat
Ogólny zarys skryptu

W tym rozdziale opiszę krok po kroku tworzenie skryptu obsługującego prostego chata.
Okno przeglądarki podzielimy ramkami na dwie części. W dolnej będzie znajdował się formularz, zawierający jedno pole do wpisywania tekstu, w górnej będzie wyświetlać się treść rozmowy. Aby uniknąć użycia Javy w górnej ramce umieścimy znacznik META powodujący odświeżenie zawartości co 1 sekundę. Skrypt obsługujący formularz umieścimy w tym samym pliku, co formularz. Dięki temu użytkownik po wpisaniu linijki tekstu będzie mógł od razu zacząć pisać następną.

Użyte pliki HTML
Nasz skrypt będzie potrzebował 4 plików. Będą to:
index.html - plik zawierający definicję ramek
gora.php3 - górna ramka, zawierająca skrypt wyświetlający rozmowę
dol.php3 - dolna ramka, zawierająca formularz i skrypt do jego obsługi
chat.txt - plik w którym będzie przechowywana treść rozmowy
Skrypt w pliku dol.php3 musi mieć możliwość zapisu do pliku chat.txt. Teraz przedstawię początkową zawartość tych plików:

index.html:
=============
<HTML>
<HEAD>
<TITLE>YGREG - Chat</TITLE>
</HEAD>

<FRAMESET ROWS="*, 60" FRAMEBORDER=0 FRAMESPACING=0 BORDER=0>
<FRAME SRC=gora.php3 NAME="gora">
<FRAME SRC=dol.php3 NAME="dol" SCROLLING=NO>
</FRAMESET>
</HTML>


gora.php3:
============
<HTML>

<HEAD>
<META http-equiv="Content-type"
content="text/html; charset=iso-8859-2">
<META HTTP-EQUIV="REFRESH" CONTENT="1">
</HEAD>

<BODY BGCOLOR=WHITE TEXT=BLACK>

<TABLE BORDER=1 CELLPADDING=5 CELLSPACING=0 WIDTH=500 HEIGHT=400>
<TR><TD VALIGN=TOP>

<FONT CLASS=text>
<?
// tutaj umieścimy skrypt wyświetlający treść
?>
</FONT>

</TR></TD></TABLE>

</BODY>
</HTML>


dol.php3:
===========
<HTML>
<HEAD>
<META http-equiv="Content-type"
content="text/html; charset=iso-8859-2">
</HEAD>

<BODY BGCOLOR=WHITE TEXT=BLACK>
<FORM METHOD=GET ACTION=dol.php3 NAME=formularz>
<INPUT TYPE=HIDDEN NAME=ACTION VALUE=add>
<INPUT TYPE=TEXT SIZE=80 MAXLENGTH=80 NAME=TEKST>

<?
// tutaj umieścimy skrypt obsługujący formularz
?>

</FORM>

</BODY>
</HTML>


Dla zwiększenia czytelności skryptów pola formularza będe zawsze nazywał dużymi literami. Jak widać w powyższym pliku będą potrzebne 2 skrypty - wyświetlający treść rozmowy i dodający nową linię.

Wyświetlanie treści rozmowy
Zaczniemy od skryptu wyświetlającego treść rozmowy w pliku gora.php3. Będzie on czytał kolejne linie z pliku chat.txt i wyświetlał je, rozdzielając tagami <BR>:

<?
$file=fopen("chat.txt", "r");
flock($file, 1);

while($linia=fgets($file, 81))
{
echo($linia);
echo("<BR>");
}

flock($file, 3);
fclose($file);
?>

Dodawanie nowej linii
Teraz pora na skrypt dodający do pliku linię. Ten będzie już bardziej skomplikowany. Oprócz dodania nowej lini na końcu, trzeba będzie usunąć pierwszą linię pliku, jeżeli stanie się on zbyt długi:

<?
if($ACTION=="add") // jeśli użytkownik dopiero wszedł
// na stronę, zmienna $ACTION będzie pusta
{
$file=fopen("chat.txt", "r");
flock($file, 1);

for($lineNr=1;true;$lineNr++)
{
$linia=fgets($file, 81); // odczytuje kolejną linię z pliku

if(!$linia)
break; // kończy pętle, jeśli natrafi na koniec pliku

$linie[$lineNr]=$linia; // dopisuje linię do tablicy $linie
}

flock($file, 3);
fclose($file);

$nLines=$lineNr; // zapisuje ilość lini w zmiennej $nLines

$file=fopen("chat.txt", "w");
flock($file, 2);

if($nLines<16) // jeżeli lini jest mniej niż 16 zapisywanie
$lineNr=1; // do pliku zacznie się od pierwszej lini
else // jeżeli 16 lub więcej, zapisywanie
$lineNr=2; // zaczyna się od 2 lini

for(;$lineNr<$nLines;$lineNr++) // zapisuje kolejne linie
fwrite($file, $linie[$lineNr]);

fwrite($file, $TEKST); // dopisuje linię podaną przez użytkownika
fwrite($file, "\n");

flock($file, 3);
fclose($file);
}
?>

Teraz można już przetestować pierwszą, najprostszą wersję skryptu. Najbardziej rażącą niedogodnością jest to, że po wysłaniu formularza pole do wpisywania tekstu nie jest aktywne i trzeba użyć myszy, żeby wpisać kolejną linię. Można temu zaradzić stosując bardzo prosty skrypt Javy:

<SCRIPT LANGUAGE="JavaScript">
<!--

document.formularz.TEKST.focus();

// -->
</SCRIPT>

Skrypt ten należy dopisać pod formularzem w pliku dol.php3. Teraz po załadowaniu strony dol.php3 pole formularza uaktywnia się automatycznie.

Rozróżnianie użytkowników
Chociaż skrypt działa już całkiem nieźle, ciężko będzie się w nim dogadać z więcej niż jedną osobą. Trzeba dodać możliwość wpisania imienia. Ale po wpisaniu imienia, trzeba je gdzieś zapamiętać. Można użyć 2 sposobów - skorzystać z Cookie, lub ukrytego pola w formularzu.
W tym przypadku lepsze będzie ukryte pole - dzięki takiemu rozwiązaniu użytkownik będzie mógł przy ponownym wejściu na stronę podać inne imię. Ze strony będą też mogły skorzystać osoby, których przeglądarki nie obsługują cookies (jest ich już bardzo mało, ale może jakaś się trafi).

Musimy więc stworzyć nowy plik, zawierający formularz do wpisania imienia. Plik imie.htm należy wpisać w pliku index.html jako źródło dolnej ramki (zamiast dol.php3).

imie.htm
==========
<HTML>
<HEAD>
<META http-equiv="Content-type"
content="text/html; charset=iso-8859-2">
</HEAD>

<BODY BGCOLOR=WHITE TEXT=BLACK>
<FORM METHOD=GET ACTION=dol.php3>
Wpisz swoje imię:
<INPUT TYPE=TEXT SIZE=80 MAXLENGTH=80 NAME=IMIE>
</FORM>
</BODY>
</HTML>

Konieczne będzie też dokonanie zmian w pliku dol.php3. Na końcu skryptu obsługującego formularz trzeba dopisać linię:

echo("<INPUT TYPE=HIDDEN NAME=IMIE VALUE=$IMIE>");

Spowoduje ona wprowadzanie do formularza ukrytego pola, zawierającego imię użytkownika. Należy teakże zmienić linię dodającą nowy tekst do pliku na:

fwrite($file, "$IMIE> $TEKST");

Teraz można już swobodnie rozmawiać.

Kolory
Każdy użytkownik ma już swoje imię, po którym można go odróżnić od innych.
Może jeszcze pozwolić mu na wybór koloru, jakim będzie wyświetlane to imię? Nie będzie z tym zbyt dużo kłopotu. Wystarczy na końcu skryptu w pliku dol.php3 dodać poniższy fragment kodu:

$kolory[0]="black";
$opisy[0]="Czarny";
$kolory[1]="blue";
$opisy[1]="Niebieski";
$kolory[2]="red";
$opisy[2]="Czerwony";
$kolory[3]="green";
$opisy[3]="Zielony";

if($KOLOR=="")
$KOLOR="black";

echo("<SELECT NAME=KOLOR>");
for($i=0;$i<4;$i++)
{
echo("<OPTION VALUE=$kolory[$i]");
if($kolory[$i]==$KOLOR)
echo(" SELECTED");
echo(">$opisy[$i]</OPTION>");
}
echo("</SELECT>");

A linię wpisującą do pliku nowy tekst zmienić na

fwrite($file, "<FONT COLOR=$KOLOR>$IMIE></FONT> $TEKST");

W ten sposób zostanie utworzone pole wyboru, zawierające 4 kolory. Po wysłaniu formularza domyślnie zaznaczony będzie ostatnio wybrany kolor.

Gotowy skrypt
Ostatecznie chat składa się z następujących plików: index.html, imie.htm, dol.php3, gora.php3 i chat.txt. W pliku chat.txt jest zapisywana rozmowa. Pozostałe pliki w ostatecznej formie:

index.html
============
<HTML>
<HEAD>
<TITLE>YGREG - Chat</TITLE>
</HEAD>
<FRAMESET ROWS="*, 60" FRAMEBORDER=0 FRAMESPACING=0 BORDER=0>
<FRAME SRC=gora.php3 NAME="gora">
<FRAME SRC=imie.htm NAME="dol" SCROLLING=NO>
</FRAMESET>
</HTML>


imie.htm
==========
<HTML>
<HEAD>
<META http-equiv="Content-type"
content="text/html; charset=iso-8859-2">
</HEAD>

<BODY BGCOLOR=WHITE TEXT=BLACK>
<FORM METHOD=GET ACTION=dol.php3>
Wpisz swoje imię: <INPUT TYPE=TEXT SIZE=80 MAXLENGTH=80 NAME=IMIE>
</FORM>
</BODY>
</HTML>


dol.php3
==========
<HTML>
<HEAD>
<META http-equiv="Content-type"
content="text/html; charset=iso-8859-2">
</HEAD>

<BODY BGCOLOR=WHITE TEXT=BLACK>
<FORM METHOD=GET ACTION=dol.php3 NAME=formularz>
<INPUT TYPE=HIDDEN NAME=ACTION VALUE=add>
<INPUT TYPE=TEXT SIZE=80 MAXLENGTH=80 NAME=TEKST>

<?
if($ACTION=="add")
{
$file=fopen("chat.txt", "r");
flock($file, 1);

for($lineNr=1;true;$lineNr++)
{
$linia=fgets($file, 81);

if(!$linia)
break;

$linie[$lineNr]=$linia;
}

flock($file, 3);
fclose($file);

$nLines=$lineNr;

$file=fopen("chat.txt", "w");
flock($file, 2);

if($nLines<16)
$lineNr=1;
else
$lineNr=2;

for(;$lineNr<$nLines;$lineNr++)
fwrite($file, $linie[$lineNr]);

fwrite($file, "<FONT COLOR=$KOLOR>$IMIE></FONT> $TEKST");
fwrite($file, "\n");

flock($file, 3);
fclose($file);
}

echo("<INPUT TYPE=HIDDEN NAME=IMIE VALUE=$IMIE>");

$kolory[0]="black";
$opisy[0]="Czarny";
$kolory[1]="blue";
$opisy[1]="Niebieski";
$kolory[2]="red";
$opisy[2]="Czerwony";
$kolory[3]="green";
$opisy[3]="Zielony";

if($KOLOR=="")
$KOLOR="black";

echo("<SELECT NAME=KOLOR>");
for($i=0;$i<4;$i++)
{
echo("<OPTION VALUE=$kolory[$i]");
if($kolory[$i]==$KOLOR)
echo(" SELECTED");
echo(">$opisy[$i]</OPTION>");
}
echo("</SELECT>");

?>

</FORM>

<SCRIPT LANGUAGE="JavaScript">
<!--

document.formularz.TEKST.focus();

// -->
</SCRIPT>

</BODY>
</HTML>


gora.php3
===========
<HTML>

<HEAD>
<META http-equiv="Content-type"
content="text/html; charset=iso-8859-2">
<META HTTP-EQUIV="REFRESH" CONTENT="1">
</HEAD>

<BODY BGCOLOR=WHITE TEXT=BLACK>

<TABLE BORDER=1 CELLPADDING=5 CELLSPACING=0 WIDTH=500 HEIGHT=400>
<TR><TD VALIGN=TOP>

<FONT CLASS=text>
<?
$file=fopen("chat.txt", "r");
flock($file, 1);

while($linia=fgets($file, 81))
{
echo($linia);
echo("<BR>");
}

flock($file, 3);
fclose($file);
?>
</FONT>

</TR></TD></TABLE>

</BODY>
</HTML>


Zakończenie
To już koniec tego kursu. Więcej informacji o PHP, jak i gotowe skrypty można znaleźć na oficjalnej stronie PHP, strona ta ma także bogaty zbiór linków.

Cofnij...

Kurs udostępnił:
http://ygreg.and.pl

skrypty skrypty