YGREG.COM - Kurs PHP - Część 6 

29.07.2004
Nowa oferta hostingowa.

29.07.2004
Kurs XPath.

13.10.2002
Poprawiony problem z oznaczaniem przeczytanych wiadomości na forum.

13.06.2002
PHP z Zend Engine 2 już dostępne!

17.02.2002
Zmiany w organizacji serwisu.








Początek strony

(C)opyright 1997-2007
by Grzegorz Plebański
INDEX I ARTYKUŁY I SKRYPTY I DOWNLOAD

Dodaj stronę
do ulubionych

Artykuły i kursy
   PHP
   XML
   CGI
   HTML
   Inne

Skrypty PHP
   Komunikacja
   Księgi gości
   Statystyki
   Głosowania
   Bannery
   Inne
Skrypty CGI

Download



Kurs PHP - Część 6





Ogólny zarys skryptu

        W tym rozdziale opiszę krok po kroku tworzenie skryptu obsługującego prostego chata. Gotowy do użycia skrypt można ściągnąć stąd. 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,
        $lineNr=2; // zapisywanie 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 z7byt 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>");
      fwrite($file, "$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 stronach zamieszczonych w dziale linki. Dużo ciekawych stron można znaleźć na oficjalnej stronie PHP. Strona ta ma także bogaty zbiór linków.


Grzegorz 'Ygreg' Plebański
ygreg@ygreg.com
http://www.ygreg.com