Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Wstp .............................................................................................. 9
Rozdzia 1. Globalna sie ................................................................................. 11
Skrypt 1. Uzyskanie adresu IP ......................................................................................... 11
Skrypt 2. Odczytanie rekordw MX ................................................................................ 13
Skrypt 3. Nawizanie poczenia TCP ............................................................................ 14
Skrypt 4. Wysyanie poczty ............................................................................................. 17
Skrypt 5. Pobranie pliku z serwera ftp ............................................................................ 19
Skrypt 6. Wysanie pliku do serwera ftp ........................................................................... 20
Skrypt 7. Wysanie pliku do serwera (upload pliku) ....................................................... 21
Skrypt 8. Przekierowanie z uyciem znacznika <meta> ................................................. 24
Skrypt 9. Przekierowanie z uyciem nagwkw HTTP ................................................. 25
Skrypt 10. Przekierowanie ze wzgldu na adres IP ......................................................... 25
Skrypt 11. Przekierowanie na losow witryn ................................................................ 26
Skrypt 12. Zablokowanie wybranych adresw IP ........................................................... 27
Skrypt 13. Walidacja adresu e-mail ................................................................................. 28
Skrypt 14. Wysanie pliku do przegldarki ..................................................................... 28
Skrypt 15. Pobieranie plikw z listy I ............................................................................. 30
Skrypt 16. Pobieranie plikw z listy II ............................................................................ 32
Skrypt 17. Generowanie listy plikw do pobrania .......................................................... 35
Spis treci
5
Skrypt 78. Zapamitanie danych uytkownika .............................................................. 157
Skrypt 79. Automatyczne logowanie ............................................................................. 163
Skrypt 80. Liczba osb obecnych na stronie ................................................................. 165
Skrypt 81. Liczba osb przegldajcych stron z rnych adresw IP ............................ 167
Skrypt 82. Statystyka strony (lista odwiedzin) .............................................................. 169
Skrypt 83. Liczba przegldajcych stron (z wykorzystaniem statystyki strony) ......... 171
Skrypt 84. Pobieranie plikw ........................................................................................ 172
Skrypt 85. Ranking plikw ............................................................................................ 176
Skrypt 86. Automatyczne generowanie nazw plikw ................................................... 180
Skrypt 87. Lista odnonikw ......................................................................................... 181
Skrypt 88. Zliczanie odwoa z kadego adresu IP ....................................................... 183
Skrypt 89. Porada dnia ................................................................................................... 186
Skrypt 90. Statystyka przegldarek ............................................................................... 187
Spis treci
7
Funkcja fseek ........................................................................................................... 269
Funkcja fstat ............................................................................................................ 269
Funkcja ftell ............................................................................................................. 269
Funkcja ftruncate ..................................................................................................... 269
Funkcja fwrite ......................................................................................................... 270
Funkcja glob ............................................................................................................ 270
Funkcja is_dir .......................................................................................................... 271
Funkcja is_executable ............................................................................................. 271
Funkcja is_file ......................................................................................................... 271
Funkcja is_link ........................................................................................................ 271
Funkcja is_readable ................................................................................................. 271
Funkcja is_uploaded_file ........................................................................................ 272
Funkcja is_writable ................................................................................................. 272
Funkcja is_writeable ............................................................................................... 272
Funkcja link ............................................................................................................. 272
Funkcja linkinfo ...................................................................................................... 272
Funkcja lstat ............................................................................................................ 273
Funkcja mkdir ......................................................................................................... 273
Funkcja move_uploaded_file .................................................................................. 273
Funkcja parse_ini_file ............................................................................................. 273
Funkcja pathinfo ...................................................................................................... 274
Funkcja pclose ......................................................................................................... 274
Funkcja popen ......................................................................................................... 274
Funkcja readfile ....................................................................................................... 274
Funkcja readlink ...................................................................................................... 275
Funkcja realpath ...................................................................................................... 275
Funkcja rename ....................................................................................................... 275
Funkcja rewind ........................................................................................................ 275
Funkcja rmdir .......................................................................................................... 275
Funkcja set_file_buffer ........................................................................................... 276
Funkcja stat ............................................................................................................. 276
Funkcja symlink ...................................................................................................... 276
Funkcja tempnam .................................................................................................... 276
Funkcja tmpfile ....................................................................................................... 277
Funkcja touch .......................................................................................................... 277
Funkcja unlink ......................................................................................................... 277
Funkcje sieciowe ........................................................................................................... 277
Funkcja checkdnsrr ................................................................................................. 277
Funkcja closelog ...................................................................................................... 278
Funkcja debugger_off ............................................................................................. 278
Funkcja debugger_on .............................................................................................. 278
Funkcja define_syslog_variables ............................................................................ 278
Funkcja dns_check_record ...................................................................................... 278
Funkcja dns_get_mx ............................................................................................... 279
Funkcja dns_get_record .......................................................................................... 279
Funkcja fsockopen ................................................................................................... 279
Funkcja gethostbyaddr ............................................................................................ 280
Funkcja gethostbyname ........................................................................................... 280
Funkcja gethostbynamel .......................................................................................... 280
Funkcja getmxrr ...................................................................................................... 280
Funkcja getprotobyname ......................................................................................... 280
Funkcja getprotobynumber ..................................................................................... 281
Funkcja getservbyname ........................................................................................... 281
Funkcja getservbyport ............................................................................................. 281
Rozdzia 3.
48
Uruchomienie tego skryptu spowoduje pojawianie si strony jak na rysunku 3.1. Jak
wida, realizacja najprostszego licznika nie powinna sprawi kopotu nawet pocztkujcym
programistom. Naley jedynie pamita, aby ustawi uprawnienia pliku counter.txt,
tak aby PHP mia moliwo jego odczytu i zapisu.
Rysunek 3.1.
Dziaanie licznika
tekstowego
49
$dzien = trim(fgets($fp));
$miesiac = trim(fgets($fp));
$ro< = trim(fgets($fp));
Zastosowana w wywoaniach funkcja trim suy do usunicia znakw koca linii, ktre
pozostaj w cigu wynikowym zwracanym przez fgets. Odczytane w ten sposb dane
zostan wywietlone na stronie w formacie: dzie-miesic-rok.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<title>Liczni< te<stowy</title>
</head>
<body>
<div style="text-align:center">
<h2>Tutaj znajduje si tre strony.</h2>
<br /><br />
</div>
<div style="text-align:center">
Ta strona zostaa odwiedzona
<?php
/*S<rypt pochodzi z <si<i "PHP. 101 pra<tycznych s<ryptw"
autor: Marcin Lis
http://marcinlis.com*/
function printHits()
{
$end_line = "\r\n";
if(($fp = fopen("counter.txt" "r")) === false)
return false;
$count = fgets($fp);
$dzien = trim(fgets($fp));
$miesiac = trim(fgets($fp));
$ro< = trim(fgets($fp));
$count = $count ( 1;
fclose($fp);
if(!($fp = fopen("counter.txt" "wb")) === false){
fputs($fp $count.$end_line);
fputs($fp $dzien.$end_line);
fputs($fp $miesiac.$end_line);
fputs($fp $ro<.$end_line);
fclose($fp);
}
echo("$count razy od $dzien-$miesiac-$ro< r.");
}
printHits();
?>
</div>
</body>
</html>
50
Zmienna $count zawiera liczb odwiedzin w postaci cigu znakw, a $strLength to dugo tego cigu. Po wykonaniu caej ptli zmienna $imgStr bdzie zawieraa odpowiedni
cig znacznikw <img>. Na przykad dla liczby 123 bdzie to:
<img src="1.jpg" alt="1"><img src="2.jpg" alt="2"><img src="3.jpg" alt="3">
51
Rysunek 3.2.
Licznik odwiedzin
w formie graficznej
function getHits()
{
if(($fp = @fopen("counter.txt" "r(")) === false)
return false;
$count = fgets($fp);
$count = $count ( 1;
fsee<($fp 0);
fputs($fp $count);
fclose($fp);
$count = strval($count);
$strLength = strlen($count);
$imgStr = "";
for($i = 0; $i < $strLength; $i((){
$temp = $count[$i]. '.jpg';
$imgStr .= "<img src=\"$temp\" alt=\"{$count[$i]}\">";
}
return $imgStr;
}
echo(getHits());
?>
razy od 18 <wietnia 2008 r.
</div>
</body>
</html>
52
53
54
55
56
skadaa z dwch czci. Pierwsza z nich to kod HTML wywietlajcy pytanie oraz formularz umoliwiajcy wybranie odpowiedzi, druga to skrypt PHP przetwarzajcy dane
oraz wywietlajcy wyniki. Kod formularza HTML bdzie mia nastpujc posta:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<title>An<ieta</title>
</head>
<body>
<div>
<p style="font-weight:bold">Ja<i jest Twj ulubiony <olor?</p>
</div>
<div>
<form method="get" action="an<ieta.php">
<table>
<tr>
<td>czerwony</td>
<td>
<input type="radio" name="vote" value="czerwony">
</td>
</tr>
<tr>
<td>zielony</td>
<td>
<input type="radio" name="vote" value="zielony">
<td>
</tr>
<tr>
<td>niebies<i</td>
<td>
<input type="radio" name="vote" value="niebies<i">
<td>
</tr>
<tr>
<td>fioletowy</td>
<td>
<input type="radio" name="vote" value="fioletowy">
<td>
</tr>
<tr>
<td>czarny</td>
<td>
<input type="radio" name="vote" value="czarny">
<td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Gosuj">
<input type="hidden" name="action" value="vote">
</td>
</tr>
</table>
</form>
</div>
57
<div>
<a href="an<ieta.php?action=show"> Zobacz wyni<i </a>
</div>
</body>
</html>
Za formularzem zosta umieszczony odnonik, ktry bdzie umoliwia obejrzenie wynikw gosowania bez oddawanie gosu. Odnonik ten ma posta:
<a href="http://localhost/an<ieta.php?action=show">
a zatem jeli do skryptu ankieta.php zostanie przekazany parametr action o wartoci show,
bdzie to oznaczao, e ankieta ma zosta jedynie wywietlona na ekranie, jeli natomiast
parametr action bdzie mia warto vote (zapewnia to ukryte pole formularza: <input
type="hidden" name="action" value="vote">), bdzie to oznaczao, e ma zosta zapisany nowy gos.
Tre skryptu przetwarzajcego dane (zapisanego w pliku ankieta.php) bdzie nastpujca:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<title>Wyni<i gosowania</title>
</head>
<body>
<div>
<?php
/*S<rypt pochodzi z <si<i "PHP. 101 pra<tycznych s<ryptw"
autor: Marcin Lis
http://marcinlis.com*/
58
switch($color){
case "czerwony":$czerwony((;brea<;
case "zielony":$zielony((;brea<;
case "niebies<i":$niebies<i((;brea<;
case "fioletowy":$fioletowy((;brea<;
case "czarny":$czarny((;brea<;
}
fsee<($fp 0);
fputs($fp $czerwony."\r\n");
fputs($fp $zielony."\r\n");
fputs($fp $niebies<i."\r\n");
fputs($fp $fioletowy."\r\n");
fputs($fp $czarny."\r\n");
fclose($fp);
return true;
function show()
{
if(file_exists("colors.txt")){
if(($fp = fopen("colors.txt"
echo("Bd serwera. Wyni<i
return;
}
}
else{
if(($fp = fopen("colors.txt"
echo("Bd serwera. Wyni<i
return;
$czerwony = intval(fgets($fp));
$zielony = intval(fgets($fp));
$niebies<i = intval(fgets($fp));
$fioletowy = intval(fgets($fp));
$czarny = intval(fgets($fp));
$votes_no = $czerwony ( $zielony ( $niebies<i ( $fioletowy ( $czarny;
$votes_no == 0?$votes_no = 1:0;
$czerwony_proc = sprintf("%.2f" $czerwony * 100 / $votes_no);
$zielony_proc = sprintf("%.2f" $zielony * 100 / $votes_no);
$niebies<i_proc = sprintf("%.2f" $niebies<i * 100 / $votes_no);
$fioletowy_proc = sprintf("%.2f" $fioletowy * 100 / $votes_no);
$czarny_proc = sprintf("%.2f" $czarny * 100 / $votes_no);
echo("<table border='1'>");
echo("<tr><td>Nazwa <oloru</td><td>Liczba gosw</td>");
echo("<td>Procent gosw</td></tr>");
echo("<tr><td>czerwony</td><td>$czerwony</td>");
echo("<td>$czerwony_proc</td></tr>");
echo("<tr><td>zielony</td><td>$zielony</td>");
echo("<td>$zielony_proc</td></tr>");
echo("<tr><td>niebies<i</td><td>$niebies<i</td>");
echo("<td>$niebies<i_proc</td></tr>");
echo("<tr><td>fioletowy</td><td>$fioletowy</td>");
echo("<td>$fioletowy_proc</td></tr>");
echo("<tr><td>czarny</td><td>$czarny</td>");
echo("<td>$czarny_proc</td></tr>");
}
echo("</table>");
if(isSet($_GET["action"])){
if($_GET["action"] == "show"){
show();
}
else if($_GET["action"] == "vote"){
if(vote()) show();
}
else{
echo("Otrzymano nieprawidowe dane.");
}
}
else{
echo("Otrzymano nieprawidowe dane.");
}
?>
59
60
Po otwarciu pliku za pomoc funkcji fread odczytywane s jego kolejnego wiersze. Pierwszy wiersz zawiera informacj o liczbie gosw oddanych na kolor czerwony, drugi
o liczbie gosw oddanych na kolor zielony itd. Odczytane wartoci poddawane s konwersji do typu int (odpowiadaj za to wywoania funkcji intval) i przypisywane zmiennym: $czerwony, $zielony, $niebiesfi, $fioletowy i $czarny. Cakowita liczba oddanych gosw jest zapisywana w zmiennej $votes_no, warto ta jest nastpnie wykorzystywana do obliczenia, jaki procent gosw uzyska kady z kolorw. Do obliczenia
procentowego udziau gosw wykorzystywany jest wzr:
procent = liczba gosw na dany <olor * 100 / ca<owita liczba gosw
Wyniki s formatowane z dokadnoci do dwch miejsc po przecinku za pomoc funkcji sprintf. Uzyskane w ten sposb dane umieszczane s w tabeli HTML generowanej
za pomoc standardowych znacznikw: <table>, <tr> i <td>, i wysyane do przegldarki za pomoc instrukcji echo.
61
Zadaniem funkcji vote jest umieszczenie aktualnie otrzymanego gosu w pliku colors.txt.
Jej dziaanie rozpoczyna si od sprawdzenia, czy w tablicy $_GET znajduje si klucz
o nazwie vote oraz czy nie jest on pustym cigiem znakw. Jeeli jeden z wymienionych
warunkw jest prawdziwy, oznacza to, e do skryptu nie zostay przekazane poprawne
dane, a zatem funkcja wywietla komunikat o bdzie i koczy dziaanie. Jeli jednak
klucz o nazwie vote istnieje, jego warto jest przypisywana zmiennej color. Po wykonaniu tych czynnoci sprawdzane jest, czy istnieje plik colors.txt. Jeli istnieje, podejmowana jest prba otwarcia go w trybie r+, jeli natomiast nie istnieje, podejmowana jest
prba otwarcia go w trybie w+ (co jest w tym przypadku rwnoznaczne z prb utworzenia pliku na dysku). Jeeli prby te zakocz si niepowodzeniem, funkcja wywietla komunikat o bdzie i koczy dziaanie.
Po otwarciu pliku nastpuje odczyt jego zawartoci, analogicznie jak miao to miejsce
w przypadku funkcji show. Liczba gosw oddanych na poszczeglne kolory przypisywana jest zmiennym: $czerwony, $zielony, $niebiesfi, $fioletowy i $czarny. Nastpnie za pomoc instrukcji wyboru switch sprawdzane jest, na jaki kolor zosta oddany
biecy gos (czyli jaki kolor wskazuje zmienna $color), i opowiadajca mu zmienna
jest zwikszana o jeden. Na zakoczenie wskanik pozycji w pliku jest przesuwany na
pozycj zerow (na pocztek pliku), wszystkie dane s ponownie zapisywane i plik jest
zamykany za pomoc funkcji fclose.
62
Zawiera on jedynie kod HTML tworzcy struktur strony. Znajduj si w nim dyrektywy include, ktre wczytuj pozostae czci skryptu, czyli pliki add.inc i guestbook.inc.
W pliku add.inc znajduje si formularz pozwalajcy na dodawanie wpisw. Formularz
zosta utworzony za pomoc standardowych elementw jzyka HTML, czyli znacznikw
<form> oraz <input>; jest on pozycjonowany za pomoc typowej tabeli i ma posta:
<form action="guestboo<.php"
method="post"
>
<table border="0"
align="center"
style="bac<ground-color:yellow;"
>
<tr>
<td>Imi:</td>
<td>
<input type="text" name="imie" style="width:150">
</td>
<td>Nazwis<o:</td>
63
<td>
<input type="text" name="nazwis<o" style="width:152">
</td>
</tr><tr>
<td>Adres email:</td>
<td colspan="3">
<input type="text" name="email" style="width:380">
</td>
</tr><tr>
<td>Wpis:</td>
<td colspan="3">
<textarea name="contents" rows="5" cols="45" style="width:380"></textarea>
</td>
</tr><tr>
<td colspan="4" align="center">
<input type="submit" value="Dodaj">
</td>
</tr>
</table>
</form>
64
if(isSet($_POST["imie"])){
$imie = $_POST["imie"];
}
else{
$imie = "";
}
if(isSet($_POST["nazwis<o"])){
$nazwis<o = $_POST["nazwis<o"];
}
else{
$nazwis<o = "";
}
if(isSet($_POST["email"])){
$email = $_POST["email"];
}
else{
$email = "";
}
if(isSet($_POST["contents"])){
$contents = $_POST["contents"];
}
else{
$contents = "";
}
if($imie == "" && $nazwis<o == ""
&& $email == "" && $contents == ""){
echo(readGuestBoo<());
}
else{
addToGuestBoo<($imie $nazwis<o $email $contents);
echo(readGuestBoo<());
}
?>
Wykonywanie kodu rozpoczyna si od odczytania zawarto tablicy $_POST i przypisania wartoci poszczeglnych pl do zmiennych: $imie, $nazwisfo, $email i $contents.
Jeli po tym przypisaniu co najmniej jedna z wymienionych zmiennych nie zawiera
pustego cigu znakw, oznacza to, e uytkownik klikn klawisz Dodaj i naley dokona wpisu do ksigi goci.
Za dodanie nowego wpisu odpowiada funkcja o nazwie addToGuestBoof. Wszystkie
niezbdne dane dotyczce wpisu, czyli: imi, nazwisko, adres e-mail oraz tre wpisu, s
65
jej przekazywane w postaci argumentw. W tej funkcji otwierany jest plik guestbook.txt
w trybie r, czyli tylko do odczytu, a nastpnie jego zawarto jest odczytywana i przypisywana tymczasowej zmiennej $tempC.
Po wykonaniu wymienionych operacji plik jest zamykany za pomoc funkcji fclose,
a nastpnie ponownie otwierany, tym razem w trybie w tylko do zapisu. Otwarcie
w tym trybie powoduje obcicie dugoci pliku do zera, a tym samym skasowanie starej
zawartoci. Za pomoc serii instrukcji fputs zapisywane s zatem wszystkie nowe dane,
a na kocu dopisywana jest zawarto tymczasowej zmiennej $tempC. Dziki temu ostatnio wprowadzone przez uytkownika dane zawsze bd znajdoway si na pocztku
ksigi goci.
Do wywietlenia zawartoci pliku guestbook.txt wykorzystywana jest funkcja printGuestBoof. Jej konstrukcja jest bardzo prosta w ptli while za pomoc funkcji fgets
s wczytywane i dopisywane do zmiennej $contents kolejne wiersze tekstu. Dodatkowo
do kadego odczytanego acucha znakw jest dodawany znacznik HTML <br />. Ostatecznie, po osigniciu koca pliku, zmienna $contents bdzie zawieraa gotow do
wywietlenia na ekranie tre ksigi goci.
Skrypt zawiera rwnie funkcjonalno polegajc na uniemoliwieniu uytkownikowi wprowadzenia do treci wpisu znacznikw HTML, ktre mogyby zaburzy ukad
ksigi. Taka blokada moe by wprowadzona na wiele rnych sposobw, mona na
przykad zdefiniowa, ktre znaczniki HTML bd akceptowane, i odrzuca pozostae,
mona te filtrowa wprowadzone dane i usuwa kady napotkany znacznik (np. przy
uyciu funkcji strip_tags). Innym sposobem jest wprowadzenie sekwencji znakw
specjalnych. Naley wtedy zamieni wszystkie wystpienia < na < i wszystkie wystpienia > na > lub, lepiej, uy funkcji htmlentities. Zalet tego sposobu jest prostota
oraz to, e w ksidze pojawi si dokadnie to, co wpisa uytkownik, wcznie ze
wszystkimi znacznikami (rysunek 3.6 przy skrypcie 33.).
Wyboru konkretniej techniki pozbycia si niebezpieczestwa zwizanego ze znacznikami HTML naley dokona wedug wasnych potrzeb i uznania. Za usuwanie znacznikw odpowiada funkcja removeTags i to od jej wewntrznej realizacji zaley sposb
wykonania tego zadania. W powyszym skrypcie zostaa wykorzystana ostatnia z omawianych wczeniej metod, czyli wprowadzenie do kodu sekwencji znakw specjalnych,
za pomoc funkcji htmlentities.
Funkcja removeTags jest wywoywana w funkcji addToGuestBoof i przetwarza zawarto
zmiennych $imie, $nazwisfo, $email i $contents.
66
rozwiza przez dodanie do ksigi moliwoci nawigacyjnych, wymaga to jednak znacznej modyfikacji skryptu z poprzedniego przykadu. Bez zmian pozostan pliki pomocnicze: add.inc i guestbook.php, natomiast zmodyfikowany kod skryptu guestbook.inc
jest widoczny na poniszym listingu:
<?php
/*S<rypt pochodzi z <si<i "PHP. 101 pra<tycznych s<ryptw"
autor: Marcin Lis
http://marcinlis.com*/
$ile = 2;
$re<_size = 5;
function removeTags($str)
{
return htmlentities($str);
}
function s<ipRe<ord($fp $re<_size)
{
for($i = 0; $i < $re<_size; $i((){
fgets($fp);
if(feof($fp)){
return false;
}
}
return true;
}
function readGuestBoo<($from $ile $re<_size)
{
$contents = "";
if(($fp = fopen("guestboo<.txt" "r")) === false)
return false;
for($i = 0; $i < $from; $i((){
if(!s<ipRe<ord($fp $re<_size))
brea<;
}
for($i = $from * $re<_size; $i < ($from ( $ile) * $re<_size; $i((){
if(feof($fp)){
brea<;
}
$tempStr = fgets($fp);
$contents .= $tempStr."<br />";
}
fclose($fp);
return trim($contents);
}
function addToGuestBoo<($imie $nazwis<o $email $contents)
{
if(($fp = @fopen("guestboo<.txt" "r")) === false)
return false;
$imie = removeTags($imie);
$nazwis<o = removeTags($nazwis<o);
$email = removeTags($email);
$contents = removeTags($contents);
if(isSet($_GET["from"])){
$from = $_GET["from"];
}
else{
$from = 0;
}
if($from <= 0){
$from = 0;
$prev = 0;
$next = $ile;
}
else{
$prev = $from - $ile;
$next = $from ( $ile;
}
if(isSet($_POST["imie"])){
$imie = $_POST["imie"];
}
else{
$imie = "";
}
if(isSet($_POST["nazwis<o"])){
$nazwis<o = $_POST["nazwis<o"];
}
else{
$nazwis<o = "";
}
if(isSet($_POST["email"])){
$email = $_POST["email"];
}
else{
$email = "";
}
if(isSet($_POST["contents"])){
$contents = $_POST["contents"];
}
else{
$contents = "";
}
67
68
Na pocztku zostay zdefiniowane dwie nowe zmienne: $ile, wskazujca liczb wpisw
wywietlanych na pojedynczej stronie, oraz $ref_size, okrelajca, ile linii zawiera
pojedynczy wpis. Bardzo przydatna jest rwnie dodatkowa funkcja o nazwie sfipReford, ktra przesuwa wskanik aktualnej pozycji w pliku na nastpny wpis. Jej dziaanie polega na odczytaniu liczby linii wskazywanych przez zmienn $ref_size.
Odczytem danych z ksigi goci zajmuje si funkcja readGuestBoof. W stosunku do
przedstawionej w skrypcie 32. wymagaa ona jednak wielu zmian. Przede wszystkim
w aktualnej wersji otrzymuje trzy argumenty: $from, $ile oraz $ref_size. Znaczenie
dwch ostatnich zostao wyjanione w poprzednim akapicie, argument $from oznacza
natomiast, od ktrego rekordu ma si zacz czytanie pliku, i jest wykorzystywany
w dodatkowej ptli pomijajcej zadan liczb rekordw.
Kolejna ptla, zajmujca si waciwym odczytem danych, musi w obliczeniach uwzgldnia przesunicie o $from rekordw. Niezbdne jest zatem wykonanie kilku dodatkowych dziaa arytmetycznych, tak aby prawidowo wyliczy warunek jej zakoczenia.
Std posta ptli:
for($i = $from * $re<_size; $i < ($from ( $ile) * $re<_size; $i((){
if(feof($fp)){
brea<;
}
$contents .= fgets($fp)."<br />";
}
69
Kady odnonik ponownie wywouje skrypt, przypisujc polu from warto zawart
w zmiennej $prev lub $next. Zmienne te musz by oczywicie odpowiednio zainicjowane. Jeeli $from bdzie mniejsze lub rwne 0, to $prev otrzymuje warto 0, a $next
warto $ile. W przeciwnym przypadku (czyli kiedy $from jest wiksze od 0), $prev
otrzymuje warto $from - $ile, a $next warto $from + $ile. Niezbdne jest rwnie zablokowanie moliwoci powikszania wartoci zmiennej $next w nieskoczono. W tym celu jest sprawdzane, czy funkcja readGuestBoof zwrcia pusty cig znakw lub te cig oznaczajcych koniec linii tekstu. W obu przypadkach na ekranie jest
wywietlany tekst Koniec wpisw, a zmienna $next jest pomniejszana o warto zapisan w zmiennej $ile.
70
=>
=>
=>
=>
"Porada
"Porada
"Porada
"Porada
numer
numer
numer
numer
2"
3"
4"
5"
function getText()
{
srand((float) microtime() * 10000000);
$arr = $GLOBALS["porady"];
return($arr[array_rand($arr)]);
}
echo(getText());
?>
Lista porad powinna zosta zapisana w tablicy o nazwie porady. Za wylosowanie jednej
z nich odpowiada funkcja getText. Inicjuje ona najpierw generator liczb pseudolosowych1, nastpnie przypisuje do zmiennej $arr globaln tablic $porady. Losowanie
odbywa si za pomoc funkcji array_rand, ktra zwraca losowy indeks tablicy przekazanej tej funkcji w postaci argumentu. Wylosowany tekst jest zwracany za pomoc
instrukcji return.
Poczwszy od PHP 4.0.2, inicjalizacja generatora liczb pseudolosowych nie jest konieczna (ta czynno
jest wykonywana automatycznie), jednak w celu zachowania maksymalnej kompatybilnoci zostaa
pozostawiona w skrypcie.
71
}
return $texts;
function getText()
{
if(($arr = readArray()) != false){
srand((float) microtime() * 10000000);
return($arr[array_rand($arr)]);
}
else return "Bra< porady dnia na dzisiaj...";
}
echo(getText());
?>