Podstawy PHP - Mariusz Dymek

Transkrypt

Podstawy PHP - Mariusz Dymek
Instytut Techniki
Zakład Elektrotechniki i Informatyki
UNIWERSYTET RZESZOWSKI
INSTRUKCJE DLA STUDENTÓW
TECHNIKI MULTIMEDIALNE
Tematyka:
1. Technologia języka skryptowego PHP
2. Moduł integrujący PHP4 i MySQL
3. Administracja i zarządzanie RSZBD w PHP
Rzeszów 2004
Laboratorium 1
PHP jest językiem skryptowym, wykonywanym po stronie serwera, a pisane w nim skrypty są
umieszczane w kodzie HTML.
HTML
Dokumenty zawierające skrypty PHP (pliki zazwyczaj mają rozszerzenie .php,
.php .php3,
.php3 .php4)
.php4 to
pomieszanie kodu HTML i tekstu programu. W rzeczywistości w kodzie HTML tekst programu jest
wydzielony znacznikiem z tego kodu (choć może też być odwrotnie: kod HTML-owy może być zawarty w
skrypcie PHP!). Początek i koniec programu mogą być oznaczone odpowiednio przez:
<?php
?>
<?
?>
<SCRIPT LANGUAGE=”php”>
</SCRIPT>
Komentarz jest fragmentem kodu pomijanym przez interpreter. Musimy oczywiście odpowiednio
ów opis zaznaczyć:

// - interpreter pominie wszystko co znajdzie za tymi znakami aż do końca linii

/* i */ - oznaczają odpowiednio początek i koniec komentarza obejmującego jedną lub więcej linii

dla kodu HTML komentarz zaznaczamy poprzez użycie znaczników <!<!-- i -->.
Ćwiczenie 1.1.
Utwórz w PHP program, który wypisze Twoje imię i nazwisko.
Musimy zapoznać się z funkcją, która pozwala na wypisanie tekstu.
print
echo
printf
Najprostsza funkcja wypisująca podaną wartość.
Funkcja wypisująca podaną wartość, podobna do print.
Funkcja pozwalająca na wypisanie wartości po jej wcześniejszym sformatowaniu. Jest bardzo
przydatna, a zapoznamy się z nią w ćwiczeniu 3.5.
Napiszmy teraz program:
//Listing 1-1.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Moje imię i nazwisko</TITLE>
</HEAD>
<BODY>
<?
// Wypisujemy imię i nazwisko, używając funkcji "print"
print ("Nazywam się Mariusz Dymek");
?>
</BODY>
</HTML>
Po umieszczeniu pliku na serwerze (nie jest ważne, czy to obcy serwer w Internecie, gdzie
mamy konto, czy też zainstalowany Apache na naszym komputerze) i wpisaniu adresu dokumentu
uzyskamy wynik działania pierwszego napisanego skryptu PHP (rysunek 1.1).
Rys. 1.1. Wynik działania pierwszego skryptu PHP
Ćwiczenie 1.2.
Utwórz skrypt, który wypisze Ci informacje o konfiguracji PHP na serwerze.
Wykorzystamy funkcję, która zwraca stronę informacyjną o konfiguracji serwera.
phpinfo
Oto skrypt:
Funkcja zwracająca stronę informacyjną o konfiguracji PHP i o bieżącym połączeniu i zmiennych
systemowych
//Listing 1-2.php
<?
// Wykorzystujemy funkcję "phpinfo" w celu uzyskania
// informacji o konfiguracji PHP.
phpinfo();
?>
W przeglądarce wyświetli się strona z informacjami (rysunek 1.2).
Rys. 1.2. Strona informacyjna wygenerowana za pomocą funkcji phpinfo.
phpinfo
Funkcja phpinfo wyświetla kompletny tekst HTML strony informacyjnej.
W sekcji Environment znajduje się lista zmiennych środowiskowych, np.:
-
HTTP_HOST,
HTTP_HOST w której jest zapisana jego nazwa;
-
REQUEST_URI,
REQUEST_URI pamiętająca nazwę skryptu;
-
SERVER_ADMIN,
SERVER_ADMIN z której można odczytać adres e-mail administratora serwera;
-
REMOTE_ADDR,
REMOTE_ADDR która określa adres IP odwiedzającego;
-
HTTP_USER_AGENT,
HTTP_USER_AGENT z której można wyczytać, z jakiego systemu operacyjnego korzysta i jaką
posługuje się przeglądarką.
Zmienne, stałe, operatory.
Nazwy zmiennych mogą składać się z liter, cyfr i znaków podkreślenia, jednak nie mogą
zaczynać się od cyfry. W programie poprzedza sieje znakiem dolara ($
$). W PHP nie jest wymagane
wcześniejsze deklarowanie ich przed użyciem, a więc wcześniejsze określanie jej typu
Zmienne w PHP dzielą się na typy, np.:
-
łańcuchy znakowe;
-
liczby całkowite;
-
liczby zmiennopozycyjne.
Ćwiczenie 1.3.
Utwórz zmienne, w których zapamiętasz swoje imię i nazwisko i wypisz je.
Skrypt realizujący to zadanie:
//Listing 1-3.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Moje imię i nazwisko</TITLE>
</HEAD>
<BODY>
<?
// Imię i nazwisko, zapamiętujemy w zmiennych
// a następnie wypisujemy funkcją print.
$imie = 'Mariusz';
$nazwisko = "Dymek";
print ("Nazywam się " . $imie . " " . $nazwisko);
?>
</BODY>
</HTML>
Ważnym elementem są znaki kropki w instrukcji print,
print pomiędzy poszczególnymi łańcuchami. Znak
kropki jest operatorem połączenia dwóch łańcuchów.
Łańcuch tekstowy może być zawarty w pojedynczych lub podwójnych cudzysłowach.
"…"
W łańcuchach w podwójnych cudzysłowach następuje tak zwana interpolacja zmiennych.
zmiennych
Oznacza to, że nazwy zmiennych zawartych w takich łańcuchach są zastępowane przez ich
wartości.
'…'
W łańcuchach w pojedynczych cudzysłowach taka zmiana nie następuje.
Różnice w użyciu podwójnych i pojedynczych cudzysłowów.
$tekst = "Nazywam się $imie $nazwisko";
Nazywam się Mariusz Dymek
$tekst = ‘Nazywam się $imie $nazwisko’;
Nazywam się $imie $nazwisko
Ćwiczenie 1.4.
Napisz skrypt, który wypisze obwód i pole prostokąta o zadanych bokach.
//Listing 1-4.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Contenttype"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Pole i obwód prostok±ta</TITLE>
</HEAD>
<BODY>
<?
// W zmiennych zapamiętamy boki prostok±ta, a
// następnie obliczymy pole i obwód kwadratu.
$bokA = 5;
$bokB = 7;
print ("Pole prostok±ta o bokach $bokA i $bokB
$bokA*$bokB. " a obwód: " . 2*($bokA+$bokB) );
?>
</BODY>
</HTML>
wynosi:".
Efekt w przeglądarce widać na rysunku 1.3.
Rys. 1.3. Wyniki obliczeń programu.
Stałymi. nazywamy pewne obiekty, które mają z góry określoną wartość, która nie ulega zmianie
podczas wykonywania programu. Jako stałe możesz definiować nie tylko liczby, ale także teksty. Musisz
je wtedy zawrzeć w cudzysłowach.
Stałe definiuje się za pomocą funkcji define.
define
define
Definiowanie wartości stałej.
Oto przykład definicji:
define ("STAWKA_PODATKOWA", 0.19)
Funkcja posiada dwa argumenty: nazwę stałej i jej wartość.
wartość
Ćwiczenie 1.5
Napisz skrypt, który wyświetli wartość podatku od dochodu 5000 zł w 2001 roku.
Użyj stałych do zapamiętania kwoty wolnej od podatku i stawki procentowej. Podatek
należy obliczyć w następujący sposób: od dochodu trzeba odjąć kwotę wolną od
podatku i następnie wynik pomnożyć przez stawkę procentową.
//Listing 1-5.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Podatek od dochodu 5000 PLN w 2001 roku </TITLE>
</HEAD>
<BODY>
<?
define ("KWOTA_DO_ODJECIA", 436.20);
define ("STAWKA_PODATKOWA", 0.19);
// czyli 19%
print ("Podatek od dochodu 5000 PLN w 2001 roku wynosi: ");
printf ("%0.2f", (5000*STAWKA_PODATKOWA - KWOTA_DO_ODJECIA));
print (' PLN');
?>
</BODY>
</HTML>
Rys. 1.4. Wynik działania programu po obliczeniu podatku.
Funkcją printf pozwala na formatowanie wypisywanego tekstu. Funkcja wymaga argumentu,
określającego sposób formatowania, po którym wpisuje się informacje do wyświetlenia, oddzielając je
przecinkami.
Poniżej znajduje się lista operatorów arytmetycznych i operatorów przypisania.
Operatory arytmetyczne
Operator
+
-
Opis
dodawanie
odejmowanie
*
/
%
mnożenie
dzielenie
reszta z dzielenia
Operatory przypisania
Operator
=
+=
-=
*=
/=
%=
.=
==
!=
!
++
--
Opis
liczba stojąca po lewej stronie operatora przyjmuje wartość liczby stojącej po prawej stronie
operatora
liczba stojąca po lewej stronie operatora przyjmuje wartość będącą sumą jej samej i liczby
stojącej po prawej stronie operatora
liczba stojąca po lewej stronie operatora przyjmuje wartość będącą różnicą jej samej i liczby
stojącej po prawej stronie operatora
liczba stojąca po lewej stronie operatora przyjmuje wartość będącą iloczynem jej samej i liczby
stojącej po prawej stronie operatora
liczba stojąca po lewej stronie operatora przyjmuje wartość będąca ilorazem jej samej i liczby
stojącej po prawej stronie operatora
liczba stojąca po lewej stronie operatora przyjmuje wartość będąca resztą z dzielenia (modulo)
jej samej i liczby stojącej po prawej stronie operatora
przypisuje do wyniku (będącego łańcuchem) jego połączenie z łańcuchem (będącym
argumentem)
operator równości
operator różności
operator zaprzeczenia (negacji), stosowany przed argumentem
operator zwiększenia o 1 (czyli inkrementacja)
operator zmniejszenia o 1 (czyli dekrementacja)
Ćwiczenie 1.6
Napisz skrypt, który wypisze Twoje informacje adresowe, używając operatora .=
(przypisującego połączenie wyniku z argumentem).
Poszczególne informacje będziemy gromadzić w kolejnych poleceniach skryptu.
//Listing 1-6.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Moje dane</TITLE>
</HEAD>
<BODY>
<?
//Kolejne informacje zostają zbierane przy użyciu operatora .=
//(przypisującego połączenie wyniku z argumentem).
$tekst
= 'Mariusz';
$tekst .= ' Dymek';
$tekst .= '<BR>';
$tekst .= 'Rzeszów';
$tekst .= '<BR>';
$tekst .= 'tel. (502) 204 123';
print ($tekst);
?>
</BODY>
</HTML>
Poniżej znajduje się wynik działania skryptu:
Rys. 1.5. Wynik działania programu w przeglądarce.
Zadania:
1. Napisz skrypt,
pogrubieniem.
żeby
wyniki
obliczeń
z
ćwiczenia
1.4
były
wyróżnione
Efekt w przeglądarce widać na rysunku 1.6.
Rys. 1.6. Wyniki obliczeń zostały wyróżnione pogrubieniem.
2. Posługując się programem z zadania 1.5. napisz program wstawiając w nim
instrukcję, wypisującą podatek dla dochodu 10.000 zł.
3. Napisz skrypt, który obliczy pole i obwód okręgu.
drugą
Laboratorium 2
Instrukcja warunkowa
Instrukcja warunkowa w PHP ma następującą formę:
if (warunek1) {
blok instrukcji 1
} elseif (warunek2) {
blok instrukcji 2
} elseif (warunek3) {
blok instrukcji 3
...
} else {
blok instrukcji n
}
lub formę uproszczoną:
if (warunek) {
blok instrukcji 1
}
Oto przykład wykorzystania instrukcji warunkowej:
if ($i>0) {
print ('zmienna i jest większa od 0 ' )
)
else
(
print ('zmienna i jest mniejsza lub równa 0’)
}
Powyższy przykład można nieco rozbudować, w celu odróżnienia wartości zmiennej $i równej i mniejszej
od zera:
if ($i>0) {
print ('zmienna i jest większa od 0 ')
} elseif ($i ==0) {
print (‘zmienna i jest równa 0’)
} else {
print ('zmienna i jest mniejsza lub równa 0’)
}
Ćwiczenie 2.1.
Napisz skrypt, który wypisze większą wartość z dwóch określonych liczb.
//Listing 2-1.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Większa z dwóch liczb</TITLE>
</HEAD>
<BODY>
<?
// W instrukcji if sprawdzamy, czy większe jest $a czy $b.
$a = 2;
$b = 3;
print ("<B>a</B> ma wartość $a<BR>");
print ("<B>b</B> ma wartość $b<BR>");
if ($a>$b) {
print ("Większą liczbą jest a, ma wartość $a");
} elseif ($a==$b) {
print ("Liczby a i b są sobie równe, obie mają wartość $a");
} else {
print ("Większą liczbą jest b, ma wartość $b");
}
?>
</BODY>
</HTML>
Poniżej znajduje się efekt działania skryptu.
Rys. 2.1. Wynik działania skryptu.
Ćwiczenie 2.2
Wylicz pierwiastki równania kwadratowego o współczynnikach A, B i C.
Aby obliczyć pierwiastki równania kwadratowego najpierw należy wyliczyć deltę: B2B2-4AC.
4AC W zależności
od jej znaku, równanie posiada zero, jedno lub dwa rozwiązania.
//Listing 2-2.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Pierwiastki równania kwadratowego</TITLE>
</HEAD>
<BODY>
<?
// Pierwiastki równania kwadratowego obliczamy zgodnie
// ze wzorem.
$a = -1; $b = -2; $c = 1;
print ("a = $a, b = $b, c = $c<BR>"};
$delta = $b*$b-4*$a*$c;
if ($delta < 0) {
print ('Równanie nie ma pierwiastków rzeczywistych');
}
elseif ($delta == 0) {
$xl = -$b/(2 * $a);
print ("Równanie ma jeden pierwiastek rzeczywisty: $xl");
}
else {
$xl = (-$b-sqrt($delta)) / (2*$a);
$x2 = (-$b+sqrt($delta)) / (2*$a);
print ("Równanie ma dwa pierwiastki rzecz.: $xl i $x2");
}
?>
</BODY>
</HTML>
Rys. 2.2. Efekt programu.
Pętla for
W PHP mamy do dyspozycji kilka możliwości „zapętlania", czyli wielokrotnego wykonywania
bloku instrukcji. Najprostszą jest pętla for , która ma postać:
for (ustalenie_poczatku; warunek_petli; zwiększenie_licznika)
{
blok instrukcji
}
W sekcji pierwszej (ustalenie
ustalenie początku)
początku nadajemy zmiennej sterującej w pętli wartość
początkową. Druga sekcja (warunek
warunek pętli)
pętli to wyrażenie określające warunek, przy którego spełnieniu
pętla ma być wykonywana. W trzeciej sekcji (zwiększanie
zwiększanie licznika)
licznika określamy sposób zwiększania
zmiennej sterującej przy każdym przebiegu pętli.
Ćwiczenie 2.3
Napisz program, który wypisze liczby od 1 do 10, a następnie od 10 do 1.
//Listing 2-3.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Odliczamy</TITLE>
</HEAD>
<BODY>
<?
// Wykorzystujemy dwie pętle - "w górę" i "w dół".
for ($i=1; $i<=10; $i++) {
print ("$i<BR>") ;
}
print ( '<BR>' ) ;
for ($i=10; $i>=1; $i-- ) {
print ("$i<BR>");
}
?>
</BODY>
</HTML>
Rys. 2.3. Efekt działania programu.
Pętle while i do...while
Pętla while ma postać:
while (warunek)
{
blok
instrukcji
}
Pętla do ...while ma postać:
do {
blok
instrukcji
}
while (warunek)
Istotę tych instrukcji dobrze oddaje ich przetłumaczenie na język polski:
1. Dopóki jest spełniony warunek, wykonuj instrukcje.
2. Wykonuj instrukcje, dopóki jest spełniony warunek.
Ćwiczenie 2.4
Napisz program, który znajdzie najmniejszy wspólny podzielnik dwóch liczb: A i B.
//Listing 2-4.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>NWD</TITLE>
</HEAD>
<BODY>
<?
// Największy wspólny podzielnik liczb a i b znajdziemy
// stosując odmianę algorytmu Euklidesa.
$a = 32; $b = 12;
print ("Największy wspólny podzielnik liczb $a i $b to: ");
while ($a != $b) {
if ($a < $b){
$pora = $a; $a = $b; $b = $pora;
}
$a = $a - $b;
}
print ("$a");
?>
</BODY>
</HTML>
Rys. 2.4. Efekt programu w przeglądarce.
Ćwiczenie 2.5
Napisz program, który sprawdzi, ile kolejnych liczb naturalnych, zaczynających się od
1, daje sumę większą od 100.
Do napisania skryptu wykorzystamy funkcję do..while,
do..while w której będą sumowane kolejne wyrazy ciągu,
aż do uzyskania sumy 100.
//Listing 2-5.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Suma ciągu</TITLE>
</HEAD>
<BODY>
<?
// Szukamy najmniejszego i takiego, że suma liczb od
// l do i przekracza 100.
$i = 0;
$suma = 0;
do {
$suma += ++$i;
}
while ($suma < 100);
print ("Suma liczb od l do $i daje $suma.");
?>
</BODY>
</HTML>
Rys. 2.5. Efekt programu.
Instrukcja wyboru [switch]
Instrukcja wyboru switch umożliwia rozgałęzienie działania programu w zależności od wartości
wyrażenia. Oto postać tej instrukcji:
switch (wyrazenie)
{
case wartosc1:
dzialanie1;
break;
case wartosc2:
dzialanie2;
break;
...
default dzialanie;
}
Wartości wartość1,
wartość1 wartosc2,
wartosc2 ... (zwane wyrażeniami wyboru) służą do określenia, które
działanie ma zostać podjęte (to, dla którego warunek odpowiada wartości). W przypadku, gdy nie jest to
spełnione dla żadnej wartości, wykonywane są instrukcje z bloku default.
default
Ćwiczenie 2.6
Napisz program, który wypisze bieżącą datę z miesiącem w języku polskim.
//Listing 2-6.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Data</TITLE>
</HEAD>
<BODY>
<?
// Polska nazwa miesiąca określona w funkcji switch
// do uzyskania dnia, miesiąca i roku używamy funkcji date.
$dzien = date("d");
$miesiac = date("m");
$rok = date("Y");
switch ($miesiac) {
case '01': $miesiac = 'stycznia'; break;
case '02': $miesiac = 'lutego'; break;
case '03': $miesiac = 'marca'; break;
case '04': $miesiac = 'kwietnia'; break;
case '05': $miesiac = 'maja'; break;
case '06': $miesiac = 'czerwca'; break;
case '07': $miesiac = 'lipca'; break;
case '08': $miesiac = 'sierpnia'; break;
case '09': $miesiac = 'września'; break;
case '10': $miesiac = 'października'; break;
case '11': $miesiac = 'listopada'; break;
case '12': $miesiac = 'grudnia'; break;
default: $miesiac = 'niezidentyfikowany'; break;
}
print "$dzien $miesiac $rok";
?>
</BODY>
</HTML>
Rys. 2.6. Efekt programu.
Podając format daty można użyć następujących znaków specjalnych:
Znak
D
I
w
z
d
F
M
m
t
h
H
a
A
i
s
Y
y
Zadania
Opis
dzień tygodnia w skróconym zapisie tekstowym, na przykład "Fri"
dzień tygodnia w zapisie tekstowym, na przykład "Monday"
dzień tygodnia w postaci numerycznej od "0" (Niedziela) do "6" (Sobota)
dzień w roku od "0" do "365"
dzień miesiąca w zapisie numerycznym od "01" do "31"
miesiąc w zapisie tekstowym np.: "January"
miesiąc w skróconym zapisie tekstowym, na przykład "Jan"
miesiąc w zapisie numerycznym od "01" do " 12"
liczba dni w miesiącu od "28" do "31 "
godzina, format 12-godzinowy od "01" do "12"
godzina, format 24-godzinowy od "00" do "23"
"am", czy "pm"
"AM", czy "PM"
minuty, od "00" do "59"
sekundy od "00" do "59"
rok w zapisie 4-cyfrowym, na przykład "2002"
rok w zapisie 2-cyfrowym, na przykład "02 ".
1. Dobierz takie wartości zmiennych $a, $b i $c w ćwiczeniu 2.2., by uzyskać
równanie bez, z jednym i z dwoma rozwiązaniami rzeczywistymi.
2. Napisz skrypt, który wyświetli powitanie wraz z aktualną datą.
3. Napisz program, który obliczy i wyświetli N!.
4. Napisz program, który sprawdzi, czy n jest liczbą pierwszą.
Laboratorium 3
Funkcje
Definicja funkcji musi nastąpić przed jej wywołaniem i ma postać:
function nazwa (lista_paramertów)
{
blok instrukcji
}
Parametry, czyli dane przekazane do funkcji, są widoczne wewnątrz niej pod odpowiednimi nazwami (takimi,
jakie zadeklarowaliśmy w nagłówku funkcji) i można na nich operować tak jak na zmiennych.
Jeżeli chcesz, by funkcja zwróciła jakąś wartość, należy posłużyć się instrukcją return.
return Powoduje ona
zakończenie działania funkcji i zwrócenie jako wyniku wartości wyrażenia występującego w instrukcji return.
return
Ćwiczenie 3.1.
Napisz funkcją, która oblicza silnię liczby, i program sprawdzający jej działanie.
Zwróć uwagę, że do napisanej już funkcji możesz się odwołać tak, jak do standardowej.
//Listing 3-1.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Silnia</TITLE>
</HEAD>
<BODY>
<?
function silnia ($n) {
$silnia = 1;
for ($i=1; $i<=$n; $i++) {
$silnia *= $i;
}
return $silnia;
}
print ("10! = ".silnia(10));
?>
</BODY>
</HTML>
Zmienne $i oraz $silnia,
$silnia używane w funkcji silnia są na zewnątrz niewidoczne. Noszą one nazwę
zmiennych lokalnych funkcji.
funkcji Z kolei taka, która jest używana w głównym bloku programu, to zmienna
globalna.
globalna Istnieje możliwość użycia w funkcji zmiennych lokalnych o takich samych nazwach, jak
zmienne globalne.
Rys. 3.1. Wynik działania skryptu.
Jeżeli chciałbyś skorzystać ze zmiennej globalnej, możesz użyć instrukcji global.
global Powoduje ona,
że na zmiennej będzie można operować tak samo, jak na lokalnej, a jeżeli funkcja zmieni jej wartość, po
zakończeniu działania pozostanie ona zmieniona.
Ćwiczenie 3.2.
Napisz funkcję, która łańcuch sformatuje pogrubieniem.
//Listing 3-2.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Pogrubienie</TITLE>
</HEAD>
<BODY>
<?
function pogrubienie ($lancuch)
{
return "<B>".$lancuch."</B>";
}
print ("To jest tekst zwykły,<BR>");
print pogrubienie("a to jest tekst pogrubiony.");
?>
</BODY>
</HTML>
Rys. 3.2. Efekt działania funkcji.
Ćwiczenie 3.3.
Napisz funkcję, która oblicza największy wspólny dzielnik dwóch liczb, i program
sprawdzający jej działanie.
//Listing 3-3.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>NWD</TITLE>
</HEAD>
<BODY>
<?
function nwd ($a, $b)
{
// Funkcja znajduje największy wspólny podzielnik liczb
// a i b znajdziemy stosując odmianę algorytmu Euklidesa.
$a = 32;
$b = 12;
while ($a != $b) ( if ($a < $b)
{
$pora = $a;
$a = $b;
$b = $pom;
}
$a = $a - $b;
}
return $a;
}
$a = 32;
$b = 8;
print ("Największy wspólny podzielnik liczb $a i $b to: ");
print nwd ($a, $b) ;
?>
</BODY>
</HTML>
Rys. 3.3. Wynik działania funkcji.
Ćwiczenie 3.4.
Napisz funkcję, która dla parametru będącego imieniem, zgaduje płeć osoby.
Zgadywanie niestety nie będzie skuteczne w 100%. Metoda będzie polegać na tym, że jeżeli
ostatnią literą imienia będzie „a", ocenimy, że mamy do czynienia z kobietą, jeżeli nie - z mężczyzną.
Aby zrealizować ćwiczenie należy skorzystać z dwóch predefiniowanych funkcji. Funkcja substr
pozwoli nam uzyskać dowolny podciąg tekstu. Aby jednak otrzymać ostatnią literę, musisz też znać jego
długość. W tym celu wykorzystaj funkcję strlen.
strlen
//Listing 3-4.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>NWD</TITLE>
</HEAD>
<BODY>
<?
function plec ($imie)
{
// Funkcja próbuje zgadnąć płe ć osoby na podstawie
// ostatniej litery jej imienia.
$ostatnialitera = substr($imie, strlen($imie)-1, 1);
if ($ostatnialitera =='a') { return 'kobieta'; }
else { return 'mężczyzna'; }
}
print ("Mariusz -– ".plec ('Mariusz'));
?>
</BODY>
</HTML>
Rys.3.4. Efekt działania skryptu.
Najczęściej używane gotowe funkcje:
substr
strlen
require
include
pow($a, $b)
zwraca podłańcuch pierwszego parametru, zaczynający się od znaku o numerze
określonym drugim parametrem i długości określonej trzecim. Należy pamiętać, że znaki są
liczone od 0
zwraca długości łańcucha określonego parametrem
włączenie pliku - argumentu do dokumentu
wykonanie instrukcji z pliku - argumentu
podnosi $a do potęgi $b
Zadania
1. Napisz funkcję, która oblicza N! w sposób rekurencyjny.
2. Napisz funkcję, która oblicza metodą rekurencyjną naturalną potęgę (n) liczby
całkowitej c, i program sprawdzający jej działanie.
3. Napisz program, który wypisuje wszystkie podzbiory zbioru liczb naturalnych
mniejszych lub równych N.
Laboratorium 4
Tablice to złożone typy danych, które mogą zawierać wiele wartości indeksowanych przy użyciu liczb lub
łańcuchów znaków. Dla przykładu, tablicę łańcuchów znaków można stworzyć w poniższy sposób:
$var[0]="Mariusz";
$var[1]="Dymek";
Ćwiczenie 4.1.
Napisz program, który zapełni tablicę 20 liczbami losowymi z zakresu 1…20,
a następnie sprawdzi, ile razy występuje w niej dana liczba.
//Listing 4-1.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Zliczanie</TITLE>
</HEAD>
<BODY>
<? // Program zapełnia tablicę losowymi liczbami i sprawdza,
// ile razy znajduje się w niej szukana liczba.
$szukana = 5;
srand(time());
for ($i=0; $i<20; $i++) {
$liczby[$i] = rand()%20+1;
}
$ileZnaleziono = 0;
for ($i=0; $i<20; $i++) {
print "$liczby[$i] ";
if ($liczby [$i] == $szukana) {
$ileZnaleziono++;
}
}
if ($ileZnaleziono == 0) {
print ("<P>Liczby $szukana w tablicy nie odnaleziono.");
} else {
print ("<P>Liczbę $szukana w tablicy odnaleziono ".
"$ileZnaleziono razy.");
}
?>
</BODY>
</HTML>
Ćwiczenie 4.2.
Napisz program, który do tablicy dwuwymiarowej o wielkości 3x3 wpisze wartości
losowe z zakresu –5…5 i policzy wyznacznik macierzy, którą tablica reprezentuje.
Wyznacznik macierzy To wymiarach 3x3, gdzie T[i,j] oznacza element w i-tym wierszu i j-tej kolumnie
liczy się według wzoru:
W(T) = T[1,1]*T[2,2]*T[3,3] + T[1,2]*T[2,3]*T[3,1] + T[1,3]*T[2,1]*T[3,2] – T[1,1]*T[2,3]*T[3,2] –
T[1,2]*T[2,1]*T[3,3] – T[1,3]*T[2,2]*T[3,1]
//Listing 4-2.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Wyznacznik macierzy</TITLE>
</HEAD>
<BODY>
<?
// Oblicza wyznacznik macierzy 3x3. Macierz jest pamiętana w
// tablicy dwuwymiarowej.
srand(time());
print "<TABLE>";
for ($i=1; $i<=3; $i++) {
print "<TR>";
for ($j=1; $j<=3; $j++) {
print "<TD ALIGN=RIGHT>".($macierz [$i][$j] = rand()%11-5)."</TD>";
}
print "</TR>";
}
print "</TABLE>";
$wyznacznik = $macierz[1][1]*$macierz[2][2]*$macierz[3][3] +
$macierz[1][2]*$macierz[2][3]*$macierz[3][1] +
$macierz[1][3]*$macierz[2][1]*$macierz[3][2] $macierz[1][1]*$macierz[2][3]*$macierz[3][2] $macierz[1][2]*$macierz[2][1]*$macierz[3][3] $macierz[1][3]*$macierz[2][2]*$macierz[3][1];
print "Wyznacznik macierzy to $wyznacznik.";
?>
</BODY>
</HTML>
Ćwiczenie 4.3.
Napisz program, który wyświetla polską nazwę dnia tygodnia.
Wykorzystamy funkcję date,
date która wywołana z parametrem "1" określa dzień tygodnia – niestety po
angielsku. Utworzymy więc tablicę asocjacyjną, w której zapamiętamy polskie nazwy dni tygodnia.
Indeksem tej tablicy będą nazwy angielskie.
//Listing 4-3.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Dzień tygodnia</TITLE>
</HEAD>
<BODY>
<?
// Program wypisuje nazwę dnia tygodnia w języku polskim. Do
// pamiętania polskich odpowiedników używamy tablicy asocjacyjnej.
$konwersja['Monday'] = 'poniedziałek' ;
$konwersja['Tuesday'] = 'wtorek';
$konwersja['Wednesday'] = 'środa';
$konwersja['Thursday'] = 'czwartek';
$konwersja['Friday'] = 'piątek';
$konwersja['Saturday'] = 'sobota';
$konwersja['Sunday'] = 'niedziela';
$dzientygodnia = date("l");
print "Dziś jest $konwersja[$dzientygodnia].";
?>
</BODY>
</HTML>
Ćwiczenie 4.4.
Napisz program, który sprawdzi działanie poniższej pętli for. Zdefiniuj tablicę
z nazwami dni tygodnia (polskimi i angielskimi), a następnie używając jej, wyświetl
wszystkie.
for (reset ($tablica); $klucz=key($tablica); next($tablica))
{
print("$klucz, ".pos($tablica)."<BR>");
}
Tablice asocjacyjne opierają się na następującej metodzie: tablice posiadają wewnętrzny wskaźnik, który
można przesuwać, a także odwoływać się do nazwy indeksu (klucza) i wartości tablicy.
reset ustawia wskaźnik na początku tablicy
next
przesuwa wskaźnik do kolejnego elementu tablicy
prev
przesuwa wskaźnik do poprzedniego elementu tablicy
key
zwraca wartość indeksu (klucz) aktualnie wskazywanego elementu
pos
zwraca wartość aktualnie wskazywanego elementu
//Listing 4-4.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Dni tygodnia</TITLE>
</HEAD>
<BODY>
<?
// Program wypisuje nazwę dni tygodnia w języku polskim. Do
// pamiętania polskich odpowiedników używamy tablicy asocjacyjnej.
$tablica = array ('Monday' => 'poniedziałek' , 'Tuesday' => 'wtorek',
'Wednesday' => 'środa', 'Thursday' => 'czwartek',
'Friday' => 'piątek', 'Saturday' => 'sobota',
'Sunday' => 'niedziela');
for (reset ($tablica); $klucz=key($tablica); next ($tablica))
{
print ("$klucz, ".pos($tablica)."<BR>");
}
?>
</BODY>
</HTML>
Zadania
1. Napisz program, który zapełni tablicę 20 liczbami losowymi z zakresu 1…20,
a następnie uporządkuje je niemalejąco.
2. Napisz program, który wylosuje położenie Hetmana na szachownicy i wyświetli
go, pokazując, które pola są w jego zasięgu.
3. Napisz program, który sprawdzi działanie poniższego zapisu. Można wykorzystać
tablicę z nazwami dni tygodnia (polskimi i angielskimi) z ćwiczenia 4.4.
while ($wpis=each($tablica))
{
print $wpis['key'].", ".$wpis['value']."<BR>";
}
Laboratorium 5
Podstawowym sposobem pobierania danych od użytkownika na stronach WWW są formularze.
Formularz na stronie WWW ma następującą postać:
<FORM ACTION="skrypt.php" METHOD=POST>
<!-- Tu występują pola formularza -->
<INPUT TYPE=Submit VALUE="Wyślij">
</FORM>
Metodą w formularzu może być także GET.
GET
Wysyłanie e-mail'i
Aby skonfigurować naszą instalację PHP do wysyłania poczty e-mail należy wykonać
następującą czynność: w pliku c:\FoxServ\php\php.ini odnajdujemy sekcję mail_function i w pozycji
SMTP wpisujemy adres naszego serwery poczty, a w pozycji sendmail_from adres poczty
elektronicznej. Do wysłania listu elektronicznego wykorzystamy funkcję mail.
mail Funkcja ta w najprostszym
przypadku ma postać:
mail (adres_odbiorcy, temat, tresc);
Aby wysłać e-mail - będziemy musieli pobrać od użytkownika informacje, takie jak tekst wiadomości czy
adresat. Użyjemy do tego celu formularzy HTML. Formularze te składają się z różnego typu pól, które
użytkownik może wypełniać. Podstawowe typy pól to:
Typ pola
text
textarea
submit
checkbox
radio
select
hidden
Opis
tekst, jedna linia
tekst, wiele linii
przycisk służący do wysyłania formularza lub do kasowania zawartości wypełnionych pól
pole wyboru (wybór „wiele z wielu")
pole wyboru (wybór „jeden z wielu")
menu rozwijane lub lista
pole niewidoczne (za jego pomocą możemy przesłać dodatkowe, niewidoczne dla użytkownika
dane)
Ćwiczenie 5.1.
Sporządzanie skryptu
wiadomości e-mail.
wyświetlającego
formularz
HTML
służący
do
wysyłania
Potrzebne nam będzie pole do wpisania adresata i tematu wiadomości (dwa zwykłe pola edycji - text)
text
oraz pole z tekstem wiadomości (wielowierszowe pole edycji – textarea).
textarea
//Listing 5-1.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<title> Wysyłanie e-maila </title>
</HEAD>
<body bgcolor="#FFFFFF">
<form method="post" action="wyslij.php">
<table border="1" cellspacing="2" cellpadding="2">
<tr>
<td><font face="Arial"><b>Do :</b></font></td>
<td>
<input type="text" name="do" size="25">
</td>
</tr>
<tr>
<td><font face="Arial"><b>Temat :</b></font></td>
<td> <input type="text" name="temat" size="25"> </td>
</tr> <tr> <td><font face="Arial"><b>Treść :</b></font></td>
<td> <textarea name="tresc" cols="50" rows="5"></textarea> </td>
</tr> <tr> <td> <b>
<input type="hidden" name="op" value="wyslij"> </b></td>
<td> <input type="submit" name="Submit" value="Wyslij"> </td>
</tr> </table>
</form>
</body> </html>
Rys. 5.1. Formularz HTML.
Ćwiczenie 5.2.
Utwórz program, który będzie wyświetlał formularz z jednym polem tekstowym, a po
wysłaniu tego formularza wyświetli wpisaną wartość.
W zależności od tego, czy zmienna $tekst przyjmuje jakąś wartość, czy też nie, wyświetlamy albo
formularz, albo informację o tym, co w nim zostało wpisane.
//Listing 5-2.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Formularz</TITLE>
</HEAD>
<BODY>
<?
// Drukuje formularz i jednocześnie odbiera i wyświetla wpisane
// w nim dane.
if ($tekst) {
// jest wpisana jakaś wartość w formularzu
print "Wpisana wartość to <B>$tekst</B><BR>";
print '<A HREF="4-01.php">Powrót do formularza</A>';
} else {
// nie ma wpisanych danych, wyświetlamy formularz
print '<FORM ACTION="4-01.php" METHOD=GET>';
print '<INPUT TYPE="text" NAME="tekst">';
print '<INPUT TYPE="submit" VALUE="Wyślij">';
print '</FORM>';
}
?>
</BODY>
</HTML>
Ćwiczenie 5.3.
Popraw program z ćwiczenia 5.2 tak, by przetwarzał wpisane dane aby były
bezpieczne w wyświetlaniu. Sprawdź jego działanie na przykładach z poprzedniego
ćwiczenia.
W zależności od ich charakteru funkcja powinna wykonywać różne operacje. Na początek
wykorzystaj wbudowaną funkcję PHP, która znaczniki HTML-a przetworzy na "bezpieczne" do
wyświetlenia. W szczególności zamieni znaki większości i mniejszości na &gt; i &lt;, co spowoduje, że
wpisane znaczniki HTML nie zostaną przy ich dołączeniu do strony zinterpretowane, lecz wyświetlone.
htmlentities zamienia znaczniki HTML na kody "bezpieczne" do wyświetlenia na stronach WWW
//Listing 5-3.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Formularz</TITLE>
</HEAD>
<BODY>
<?
// Drukuje formularz i jednocześnie odbiera i wyświetla wpisane
// w nim dane. Dane są przetworzone funkcją htmlentities.
if ($tekst) { # jest wpisana jakaś wartość w formularzu
$tekst = htmlentities ($tekst);
print "Wpisana wartość to <B>$tekst</B><BR>";
print '<A HREF="4-02.php">Powrót do formularza</A>';
} else { # nie ma wpisanych danych, wyświetlamy formularz
print '<FORM ACTION="4-02.php" METHOD=GET>';
print '<INPUT TYPE="text" NAME="tekst">';
print '<INPUT TYPE="submit" VALUE="Wyślij">';
print '</FORM>';
}
?>
</BODY>
</HTML>
Ćwiczenie 5.4.
Utwórz program, który po podaniu odpowiedniej nazwy użytkownika i jego hasła
wyświetli tajną informację. Jeżeli zaś wpisane dane będą nieprawidłowe – informację
o błędzie.
Dane o użytkownikach i hasłach zapamiętamy jawnie w tablicy asocjacyjnej. Oczywiście użytkownik nie
będzie mógł ich podejrzeć.
//Listing 5-4.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Informacja na hasło</TITLE>
</HEAD>
<BODY>
<?
// Pobiera od użytkownika nazwę i hasło. Jeżeli dane są prawidłowe,
// wyświetla tajną informację, a jeżeli nie - informację o błędzie.
$hasla = array ('admin' => 'emdi', 'tester' => 'emdi25',
'mariusz' => '1wgd7w3', 'dymek' => '56sghx');
if (($uzytkownik)&&($haslo)) {# wartości w formularzu są wpisane
if ($hasla[$uzytkownik] == $haslo)
{
print ("Tajna informacja to: <B>2*2=4</B>");
}
else
{
print ("Wpisano niepoprawne dane o użytkowniku i haśle.<BR>");
print ('<A HREF="4-04.php">Wróć</A> i spróbuj ponownie.');
}
} else
{
# nie ma wpisanych danych, wyświetlamy formularz
print '<FORM ACTION="4-04.php" METHOD=POST>';
print '<TABLE><TR><TD>użytkownik: </TD><TD><INPUT TYPE="text" ';
print "NAME=\"uzytkownik\" VALUE=\"$uzytkownik\"></TD></TR>";
print '<TR><TD>haslo: </TD><TD><INPUT TYPE="password" ';
print 'NAME="haslo"></TD></TR></TABLE>';
print '<INPUT TYPE="submit" VALUE="Wyślij">';
print '</FORM>';
}
?>
</BODY>
</HTML>
Ćwiczenie 5.5.
Napisz program, który wyświetli menu, a następnie pokaże wybraną przez użytkownika
opcję.
Wybraną przez użytkownika określimy za pomocą instrukcji switch.
switch Na podstawie wartości zmiennej
$opcja w $cowybrano zapamiętamy wybraną przez użytkownika opcję.
//Listing 5-5.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-
Type"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Menu w formularzu</TITLE>
</HEAD>
<BODY>
<? // Wyświetla wybraną przez użytkownika opcję
if ($opcja) { # wartości w formularzu są wpisane
switch ($opcja) {
case 'pilka': $cowybrano = 'piłka nożna' ; break;
case 'kosz': $cowybrano = 'koszykówka'; break;
case 'siat': $cowybrano = 'siatkówka'; break;
case 'nar': $cowybrano = 'narciarstwo'; break;
case 'hokej': $cowybrano = 'hokej'; break;
case 'boks': $cowybrano = 'boks'; break;
case 'inny': $cowybrano = 'inny sport'; break;
default: $cowybrano = 'niezidentyfikowana opcja'; break;
}
print ("Użytkownik wybrał opcję: <B>$cowybrano</B>.<BR>");
print '<BR><A HREF="4-05.php">Powrót do formularza</A>';
} else { # nie ma wpisanych danych, wyświetlamy formularz
print '<FORM ACTION="4-05.php" METHOD=POST>';
print '<SELECT NAME="opcja">';
print '<OPTION SELECTED VALUE="">-&gt; wybierz, jak sport lubisz:';
print '<OPTION VALUE="pilka">piłka nożna' ;
print '<OPTION VALUE="kosz">koszykówka';
print '<OPTION VALUE="siat">siatkówka';
print '<OPTION VALUE="nar">narciarstwo';
print '<OPTION VALUE="hokej">hokej';
print '<OPTION VALUE="boks">boks';
print '<OPTION VALUE="inny">inny sport';
print '</SELECT>';
print '<INPUT TYPE="submit" VALUE="Wyślij">';
print '</FORM>';
}
?>
</BODY>
</HTML>
Zadania:
1. Utwórz program, który będzie wyświetlał formularz z możliwością wpisania
trzech danych: a, b i c, po czym wyświetli rozwiązanie równania kwadratowego:
ax2+bx+c=0.
2. Napisz program, który w pierwszym formularzu zbierze informacje o tym, czym
zainteresowany jest użytkownik, a w drugim, jak się nazywa. Po wpisaniu
wszystkich potrzebnych danych program powinien wyświetlić zebrane informacje.
3. Popraw program z ćwiczenia 5.5 tak, by nazwy opcji i wartości zostały zapisane
w tablicy asocjacyjnej, a zmiana treści formularza była możliwa poprzez
poprawienie jej zawartości.
Laboratorium 6
Obsługa plików
Najprostsza operacja na pliku składa się z trzech etapów:

otwarcia pliku;

zapisu lub odczytu z niego;

zamknięcia pliku.
Ćwiczenie 6.1.
Napisz program,
i nazwiskiem.
który
w
podkatalogu
dane
utworzy
plik
z
Twoim
imieniem
Na początku należy utworzyć katalog dane, w którym powstanie plik. Wykorzystamy trzy funkcje
operujące na plikach. fopen, fputs, fclose.
Poniżej znajduje się lista najczęściej używanych funkcji:
fopen
fputs
fclose
fgets
otwarcie pliku o nazwie określonej pierwszym parametrem, w trybie określonym drugim
parametrem. Na przykład r oznacza otwarcie do odczytu, a w - do zapisu. Funkcja zwraca uchwyt
pliku, poprzez który możemy się do niego odwoływać
pozwala na zapis tekstu, który jest drugim parametrem, do pliku określonego uchwytem
w pierwszym parametrze
zamyka wskazany przez uchwyt plik
odczytuje z pliku wskazanego przez pierwszy argument liczbę znaków w bieżącym wierszu,
określoną przez drugi argument
file_exists zwraca prawdę, gdy istnieje plik, którego nazwę podaje się jako parametr, a fałsz – w przeciwnym
razie
zwraca prawdę, gdy osiągnięto koniec pliku, określonego pierwszym parametrem, a fałsz –
feof
w przeciwnym razie
ustawia blokadę pliku, którego uchwyt jest pierwszym argumentem w trybie określonym przez
flock
drugi. Na przykład tryb 2 oznacza blokowanie na wyłączność, a tryb 3 – odblokowanie
przesuwa wskaźnik położenia w pliku, którego uchwyt jest pierwszym argumentem, w miejsce
fseek
wskazane przez drugi
tempnam tworzy plik o unikalnej nazwie w katalogu określonym pierwszym parametrem. Początek nazwy
można określić drugim parametrem. Plik zwraca nazwę utworzonego pliku
usuwa plik o nazwie podanej jako parametr
unlink
file
zapamiętuje całą zawartość pliku o nazwie podanej jako parametr
//Listing 6-1.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Zapisujemy plik</TITLE>
</HEAD>
<BODY>
<?
// Program tworzy plik tekstowy z imieniem i nazwiskiem.
$plik = fopen ("dane/imienazwisko.txt"/ "w");
if (!($plik)) {
print "BŁĄD: Nie da się utworzyć pliku.";
} else {
print "Plik z imieniem i nazwiskiem został utworzony.";
fputs ($plik, "Mariusz Dymek");
fclose ($plik); )
?>
</BODY>
</HTML>
Ćwiczenie 6.2.
Napisz program, który odczyta utworzony w poprzednim ćwiczeniu plik i wyświetli jego
zawartość.
Do odczytania danych z tego pliku użyjemy funkcji fgets:
fgets
//Listing 6-2.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Odczytywanie pliku</TITLE>
</HEAD>
<BODY>
<? // Program odczytuje plik tekstowy z imieniem i nazwiskiem.
$plik = fopen ("dane/imienazwisko.txt", "r");
if (!($plik)) {
print "BŁĄD: Nie da się otworzyć pliku.";
} else {
$wiersz = fgets ($plik, 255);
print "Dane z pliku: <B>$wiersz</B>";
fclose ($plik);
}
?>
</BODY>
</HTML>
Ćwiczenie 6.3.
Napisz program, który odczyta zawartość głównej strony serwisu http://republika.pl/
emdik/ i wyświetli ją, zamieniając najpierw kolor tła z niebieskawego na zielony.
W celu wykonania tego ćwiczenia serwer, na którym uruchamiasz programy PHP, musi być podłączony
do Internetu, aby program mógł odczytać autorską stronę.
//Listing 6-3.php
<?
// Program odczytuje stronę republika.pl/emdik i
wyświetla, // podmieniając kolory.
$plik = fopen ("http://republika.pl/emdik", "r");
if (!($plik))
{
print "BŁĄD: Nie da się otworzyć strony http://republika.pl/emdik";
}
else
{
while (!(feof($plik)))
{
$wiersz = (fgets ($plik, 255));
$wiersz = str_replace ('#E4E7ED', '#A2FFB5', $wiersz);
$wiersz = str_replace (' SRC="','SRC="http://republika.pl/emdik',
$wiersz);
print "$wiersz";
}
fclose ($plik);
}
?>
Zadania:
1. Napisz program, realizujący prosty licznik tekstowy, którego wskazanie jest
pamiętane w pliku tekstowym. Pamiętaj o blokowaniu pliku.
2. Napisz program, który będzie wyświetlał przysłowie na dany dzień – jedno
wylosowane z wielu, zapamiętanych w pliku tekstowym.
3. Napisz program, który będzie zbierał informacje o użytkowniku. Dane niech
będą zbierane w pliku czasowym, którego nazwa będzie przekazywana
w ukrytym polu.
Laboratorium 7
PHP dysponuje grupą funkcji, które pozwalają otwierać, wyświetlać i manipulować obrazami
w przeglądarkach WWW. Poniżej zostały omówione niektóre z tych funkcji:
umieszcza tekst na rysunku, identyfikator tekstu jest pierwszym argumentem;
następne to: numer czcionki, współrzędne x i y, od których rozpoczyna się
pisanie, tekst to wypisania i jego kolor
wskazuje, czy rysunek określony pierwszym parametrem ma być wyświetlony
imageinterface
z przeplotem; jeżeli tak, drugi argument powinien mieć wartość TRUE
imagecolortransparent dla rysunku określonego pierwszym argumentem ustala kolor, który będzie
przezroczysty (stanowi on drugi argument)
funkcja zwraca zmienną określającą – rysunek zawarty w pliku, którego nazwa
createimageformgif
stanowi argument funkcji
funkcja zwraca szerokość rysunku, określonego przez identyfikator – parametr
imagesizex
imagestring
imagesizey
getimagesize
funkcja zwraca wysokość rysunku, określonego przez identyfikator – parametr
funkcja zwraca tablicę, zawierającą cztery pola: szerokość rysunku, jego
wysokość, typ oraz łańcuch znaków do wykorzystania w znaczniku IMG
Ćwiczenie 7.1.
Utwórz program, który przygotuje i wyświetli ilustrację w formacie JPG, przy
założeniu, że będzie to biała kratka na czarnym tle, o rozmiarach 100x100.
W ćwiczeniu użyto następujących funkcji:
header
imagecreate
imagecolorallocate
imagefill
imageline
imagejpg
imagegif
imagepng
przesyła nagłówek, określany jako parametr
tworzy rysunek, parametry określają jego rozmiar w pikselach a funkcja
zwraca zmienną, będącą jego identyfikatorem
definiowanie koloru dla rysunku, kolejnymi argumentami są: zmienna, będąca
identyfikatorem rysunku oraz składowe koloru: R, G i B (od 0 do 255). Funkcja
zwraca identyfikator koloru.
wypełnienie rysunku (identyfikator jest pierwszym argumentem) kolorem
stanowiącym czwarty argument. Drugi i trzeci argument to współrzędne, od
których rozpoczyna się wypełnianie obszaru (jako obszar rozumiane są
piksele jednego koloru, a jakikolwiek inny kolor stanowi brzeg)
w rysunku, którego identyfikatorem jest pierwszym argumentem, rysuje linię
o współrzędnych początku i końca podanych w kolejnych czterech
parametrach; kolor linii jest określony szóstym parametrem.
wyświetlenie ilustracji w formacie jpg; argument funkcji jest identyfikatorem
ilustracji
wyświetlenie ilustracji w formacie gif argument funkcji jest identyfikatorem
ilustracji
wyświetlenie ilustracji w formacie png argument funkcji jest identyfikatorem
ilustracji
Całość programu przedstawia się następująco:
//Listing 7-1.php
<?
// Program tworzy ilustrację z białą kratką na czarnym tle.
header("Content-type: image/jpeg");
$rysunek = imagecreate (100,100);
$kolorbialy = imagecolorallocate ($rysunek, 255, 255, 255);
$kolorczarny = imagecolorallocate ($rysunek, 0, 0, 0);
imagefill ($rysunek, 0, 0, $kolorczarny);
for ($i=1; $i<10; $i++) {
imageline ($rysunek, 10*$i, 0, 10*$i, 100, $kolorbialy);
imageline ($rysunek, 0, 10*$i, 100, 10*$i, $kolorbialy);
}
imagejpeg ($rysunek);
?>
Efektem działania jest rysunek w formacie jpg o wymiarach 100x100, przedstawiający szachownicę.
Ćwiczenie 7.2.
Utwórz podobną szachownicę jak w ćwiczeniu 7.1. Grafikę wyświetl w formacie GIF, a
każde pole szachownicy wypełnij losowym kolorem.
W pętli, dla każdego ze 100 pól szachownicy, będziemy losować kolor. Jeżeli chcemy, by
wartość każdej ze składowych zawierała się w przedziale 0-255, wywołanie funkcji powinno mieć
następującą postać:
imagecolorallocate($rysunek, rand()%256, rand()5256, rand()5256);
Nie należy zapominać o zainicjowaniu generatora liczb pseudolosowych funkcją srand.
srand
//Listing 7-2.php
<?
// Program tworzy ilustrację z białą kratką. Każde pole
// jest wypełnione losowym kolorem.
header("Content-type: image/gif");
$rysunek = imagecreate (100,100);
$kolorbialy = imagecolorallocate ($rysunek, 255, 255, 255);
$kolorczarny = imagecolorallocate ($rysunek, 0, 0, 0);
imagefill ($rysunek, 0, 0, $kolorczarny);
for ($i=1; $i<10; $i++) {
imageline ($rysunek, 10*$i, 0, 10*$i, 100, $kolorbialy);
imageline ($rysunek, 0, 10*$i, 100, 10*$i, $kolorbialy);
}
srand(time());
for ($x=0; $x<10; $x++) {
for ($y=0; $y<10; $y++) {
$kolorlosowy = imagecolorallocate
($rysunek, rand()%256, rand()%256, rand()%256);
imagefill ($rysunek, 5+$x*10, 5+$y*10, $kolorlosowy);
}
}
imagegif ($rysunek);
?>
Tworząc własne grafiki przy pomocy modułu GD,
GD można kontrolować kolor każdego piksela (pamiętając
o ograniczenia każdego z formatów graficznych).
Ćwiczenie 7.3.
Napisz program, który w rysunku w formacie GIF o wymiarach 100x100 wylosuje
i zakoloruje 300 punktów czerwonych i 300 czarnych (punkty w kolejnych losowaniach
mogą się powtarzać.
Została wykorzystana funkcja, która określa kolor pojedynczego piksela.
imagesetpixe dla rysunku określonego przez pierwszy argument definiuje kolor piksela o współrzędnych
podanych przez drugi i trzeci argument. Czwarty argument określa kolor.
l
//Listing 7-3.php
<?
// Program losuje 300 punktów czerwonych i czarnych i zaznacza je.
header("Content-type: image/gif");
$rysunek = imagecreate (100,100);
$kolorbialy = imagecolorallocate ($rysunek, 255, 255, 255);
$kolorczerwony = imagecolorallocate ($rysunek, 255, 0, 0);
$kolorczarny = imagecolorallocate ($rysunek, 0, 0, 0);
imagefill ($rysunek, 0, 0, $kolorbialy);
srand(time());
for ($i=1; $i<=300; $i++)
{
imagesetpixel ($rysunek, rand()%100-1, rand()%100-1,
$kolorczerwony);
imagesetpixel ($rysunek, rand()%100-1, rand()%100-1, $kolorczarny);
}
imagegif ($rysunek);
?>
Ćwiczenie 7.4.
Napisz program, który w rysunku w formacie GIF o wymiarach 100x100 narysuje pięć
okręgów czerwonych i pięć czarnych w losowych miejscach.
Nie ma funkcji rysującej okrąg, ale można skorzystać z bardziej ogólnej, która rysuje wycinek elipsy.
imagearc rysuje wycinek elipsy; kolejnymi argumentami są: identyfikator rysunku, współrzędna x środka
łuku, współrzędna y środka łuku, szerokość łuku, wysokość łuku, kąt początku, kąt końca, kolor.
Jeżeli w wywołaniu funkcji szerokość i wysokość będą sobie równe, a łuk będzie pełen (od 0 do 360
stopni), to rysowany łuk okaże się okręgiem.
//Listing 7-4.php
<?
// Program tworzy ilustrację z pięcioma czerwonymi i pięcioma
// czarnymi okręgami.
header("Content-type: image/gif");
$rysunek = imagecreate (100,100);
$kolorbialy = imagecolorallocate ($rysunek, 255, 255, 255);
$kolorczerwony = imagecolorallocate ($rysunek, 255, 0, 0);
$kolorczarny = imagecolorallocate ($rysunek, 0, 0, 0);
imagefill ($rysunek, 0, 0, $kolorbialy);
srand(time());
for ($i=1; $i<=5; $i++) {
imagearc ($rysunek, rand()%100-1, rand()%100-1,
20, 20, 0, 360, $kolorczerwony);
imagearc ($rysunek, rand()%100-1, rand()%100-1,
20, 20, 0, 360, $kolorczarny);
}
imagegif ($rysunek);
?>
Ćwiczenie 7.5.
Napisz program, który wyświetli formularz pozwalający wpisać liczbę. Po jej wpisaniu
wyświetli graficzną prezentację wpisanej liczby.
Liczbę należy konstruować z poszczególnych cyfr. W katalogu cyfry należy umieścić wszystkie cyfry
w formacie GIF o rozmiarze 15x20 pikseli.
Wykorzystane są tutaj trzy nowe funkcje:
imagecreatetromgif tworzy rysunek na podstawie już istniejącego; argumentem jest nazwa pliku; funkcja
imagecopyresized
imagedestroy
zwraca identyfikator utworzonego rysunku
kopiuje do rysunku określonego przez pierwszy argument inny – określony przez
drugi; następne argumenty określają: współrzędne x i y miejsca, w którym należy
rysunek umieścić, współrzędne x i y oraz rozmiar dx i dy w rysunku docelowym
i wielkość ddx i ddy w rysunku źródłowego (pozwalające na przeskalowanie)
likwiduje identyfikator rysunku, jednocześnie zwalniając pamięć z nim związaną
//Listing 7-5.php
<?
// Program wyświetla formularz, pozwalający wpisać liczbę.
//Jeżeli liczba jest wpisana, wyświetla ją w postaci graficznej
function printliczba ($numer) {
// funkcja wyświetla liczbę w postaci grafiki, korzystając
// z grafik - cyfr, zawartych w katalogu cyfry.
$liczbacyfr=1; $l = $numer;
while ($l >= 10) {
$liczbacyfr++;
$l=floor($l/10);
}
header("Content-type: image/gif");
$rysunek = imagecreate (15*$liczbacyfr,20);
for ($i=$liczbacyfr; $i>=1; $i--) {
$cyfra = floor($numer/pow(10,$i-1));
$numer = $numer % pow(10,$i-1);
$rysunekcyfra = imagecreatefromgif ("cyfry/$cyfra.gif");
imagecopyresized
($rysunek,$rysunekcyfra,($liczbacyfr-$i)*15,0,0,0,15,20,15,20);
imagedestroy ($rysunekcyfra);
}
imagegif ($rysunek);
}
if ($liczba>0) { # jest wpisana jakaś wartość w formularzu
printliczba ($liczba);
} else { # nie ma wpisanych danych, wyświetlamy formularz
print '<HTML>';
print '
<HEAD>';
print '
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; ';
print '
charset=iso-8859-2">';
print '
<TITLE>Liczba graficznie</TITLE>';
print '
</HEAD>';
print '
<BODY>';
print '
<FORM ACTION="5-05.php" METHOD=GET>';
print '
<INPUT TYPE="text" NAME="liczba">';
print '
<INPUT TYPE="submit" VALUE="Wyślij">';
print '
</FORM>';
print '
</BODY>';
print '</HTML>';
}
?>
Do graficznej prezentacji danych nieoceniona jest funkcja, która rysuje wypełniony prostokąt.
imagefilledrectangle rysuje wypełniony prostokąt; argumentami są: identyfikator rysunku, współrzędne
x i y lewego górnego rogu, współrzędne x i y prawego dolnego rogu oraz kolor
Zadania
1. Napisz skrypt, który wypełni tablicę dziesięcioma losowymi liczbami z zakresu
0-9. Następnie zilustruj wylosowane wartości na wykresie słupkowym.
2. Napisz skrypt, który utworzy ilustrację (o rozmiarach 80x600). Zapełnij ją
wieloma różnokolorowymi kwadratami. Narysuj też linię i wypisz jakiś tekst.
Wyświetl ilustrację z przeplotem.
3. Napisz skrypt, który utworzy ilustrację z czerwonym kółkiem na białym tle.
Spraw, by biały kolor był przezroczysty. Wyświetl ilustrację na stronie HTML,
która posiada tło innego niż biały koloru.
4. Dla istniejącego rysunku wyświetl go w dokumencie HTML, automatycznie
określając jego szerokość i wysokość, a także nadając atrybuty WIDTH
i HEIGHT.
5. Napisz skrypt, który przeskalowuje ilustrację. Porównaj jakość takiej ilustracji
z przeskalowaną za pomocą programu graficznego.
Laboratorium 8
Baza danych jest pewnym zbiorem informacji. MySQL jest systemem zarządzania bazą danych (SZBD
SZBD),
który umożliwia w łatwy sposób dostęp do informacji i ich modyfikację.
Podstawową jednostką organizacyjną w bazie danych jest tabela. Można ją sobie wyobrazić jako tablica,
w której wierszach są umieszczane rekordy,
rekordy opisujące pojedyncze obiekty.
obiekty Poszczególne kolumny
tabeli opisują pola danego rekordu, które zawierają odpowiednie dotyczące go informacje.
Administracja bazą danych jest łatwa dzięki programowi PHPMyAdmin – napisanemu w PHP systemowi
administracji bazą danych.
Ćwiczenie 8.1.
Uruchom program PHPMyAdmin. Utwórz nową bazę danych o nazwie cwicz, a w niej
tabelę ksiazkatelefoniczna.
Aby uruchomić program PHPMyAdmin, połącz się z adresem http://localhost/phpmyadmin (powinieneś
mieć już uruchomiony serwer Apache i MySQL). Ukaże się program okienka administracyjnego.
Rys. 8.1. Panel administracyjny PHPMyAdmin.
Po utworzeniu bazy danych pojawi się ona w lewej ramce.
Rys. 8.2. Efekt po utworzenia tabeli ksiazkatelefoniczna.
Ćwiczenie 8.2.
Korzystając z programu PHPMyAdmin, sprawdź zawartość tabeli książkatelefoniczna.
Rys. 8.3. Zawartość tabeli ksiazkatelefoniczna.
Ćwiczenie 8.3.
Za pomocą PHP połącz się z bazą danych MySQL. Doprowadź do tego, by dane
z tabeli ksiazkatelefoniczna zostały wyświetlone na stronie WWW.
Rys. 8.4. Skrypt wyświetlający zawartość tabeli ksiazkatelefoniczna.
ksiazkatelefoniczna
Zadania
1. Korzystając z programu PHPMyAdmin, wpisz dane do tabeli ksiazkatelefoniczna.
2. Uzupełnij program z ćwiczenia 8.3. o opcję kasowania danych.
3. Popraw skrypt z zadania 2 tak, by umożliwiał również dodawanie nowych
rekordów.
4. Napisz program, który umożliwia dodawanie, usuwanie i również kasowanie
nowych rekordów.
Laboratorium 9
Ćwiczenie 9.1.
Utwórz licznik graficzny, który zlicza odwiedziny na stronach. Dla każdej ze stron
powinno następować osobne zliczanie. Informacje mają być przechowywane w bazie
danych MySQL.
Kod skryptu powinien być następujący:
//Listing 9-1.php
<?
// Licznik graficzny do wykorzystania w dokumentach HTML i PHP,
// dane pamiętane w bazie danych.
function printliczba ($numer) {
// funkcja wyświetla liczbę w postaci grafiki,
// korzystając z grafik - cyfr, zawartych w katalogu cyfry.
$liczbacyfr=1; $l = $numer;
while ($l >= 10) {
$liczbacyfr++;
$l=floor($l/10);
}
header("Content-type: image/gif");
$rysunek = imagecreate (15*$liczbacyfr,20);
for ($i=$liczbacyfr; $i>=1; $i--) {
$cyfra = floor($numer/pow(10,$i-1));
$numer = $numer % pow(10,$i-1);
$rysunekcyfra = imagecreatefromgif ("cyfry/$cyfra.gif");
imagecopyresized
($rysunek,$rysunekcyfra,($liczbacyfr-$i)*15,0,0,0,15,20,15,20);
imagedestroy ($rysunekcyfra);
}
imagegif ($rysunek);
}
if (($GLOBALS["SERVER_NAME"] != 'localhost') ||
($GLOBALS["HTTP_REFERER"] == '')) {
printliczba (0); exit;
}
$nazwapliku = addslashes(str_replace
('http://'.
$GLOBALS["SERVER_NAME"],'',$GLOBALS["HTTP_REFERER"]));
$nazwapliku = addslashes($nazwapliku);
mysql_connect ("localhost", "root", "") or
die ("Nie można połączy ć się z MySQL");
mysql_select_db ("cwicz") or
die ("Nie można połączy ć się z bazą cwicz");
$query = "SELECT liczba FROM liczniki ".
"WHERE strona = '$nazwapliku';";
$wynik = mysql_query ($query);
$rekord = mysql_fetch_array ($wynik);
$ile = $rekord[0];
if ($ile>0) {
$query = "UPDATE liczniki ".
"SET liczba = liczba+1 ".
"WHERE strona='$nazwapliku';";
} else {
$query = "INSERT INTO liczniki (strona, liczba)".
"VALUES ('$nazwapliku', '1');";
}
$wynik = mysql_query ($query);
printliczba ($ile+1);
?>
Ćwiczenie 9.2.
Napisz aplikację korzystającą z baz danych, aby pozwalała użytkownikom na
nadsyłanie sugestii oraz na głosowanie jakie imię należy nadać Twojemu dziecku.
Należy wykorzystać bazę danych MySQL.
Poniżej przedstawiono strukturę tabeli imiona:
imiona
CREATE TABLE imiona (
imie varchar(30) NOT NULL,
glosy int(4),
PRIMARY KEY(imie)
);
Powyższe polecenie zostało zapisane w formacie akceptowanym przez MySQL i można go
bezpośrednio użyć do stworzenia tabeli. Polecenie to definiuje pole tekstowe oraz pole przechowujące
liczby całkowite. Pole tekstowe tabeli będzie używane do przechowywania sugerowanego imienia
dziecka, natomiast pole całkowite będzie przechowywało ilość głosów złożonych na to imię. Kluczem
podstawowym tabeli jest pole imię,
imię a to oznacza, że jego wartości będą unikalne (czyli w tabeli nie
będzie mogło być dwóch rekordów o takiej samej wartości pola imię).
imię
Zakłada się, że aplikacja będzie wykonywała kilka rzeczy. Powinna posiadać zabezpieczenie
uniemożliwiające osobie oddawanie większej ilości głosów w krótkich odstępach czasu. Zrealizować to
można wykorzystując cookies o czasie ważności do końca bieżącej sesji. Aplikacja będzie również
pokazywała mały wykres słupkowy, prezentujący procentową ilość głosów oddanych na poszczególne
imiona. Wykres ten będzie tworzony przy użyciu niebieskiego obrazka typu GIF o wielkości 1 piksela,
który zostanie odpowiednio przeskalowany przy użyciu atrybutu WIDTH oraz HEIGHT znacznika <IMG>.
<IMG>
Innym rozwiązaniem byłoby wykorzystanie wbudowanych funkcji graficznych PHP do narysowania
bardziej wymyślnego wykresu.
Pozostałe części aplikacji to raczej oczywisty kod tworzący formularz i zapewniający obsługę
bazy danych. Używane są także inne rozwiązania upraszczające kod aplikacji. Dla przykładu, zamiast
odczytywać wszystkie głosy oddane na poszczególne imiona (w celu uzyskania sumarycznej ilości
głosów koniecznej do obliczenia procentowej ilości głosów oddanych na poszczególne imiona) używamy
wbudowanej funkcji bazy MySQL o nazwie SUM.
SUM Część kodu odpowiedzialna za wyświetlenie
wszystkich imion wraz z odpowiadającymi jej wartościami procentowymi jest dość skomplikowana.
Sprowadza się ona do pobierania wartości z bazy danych i przesyłania (w odpowiednich momentach)
poprawnych znaczników tabel HTML.
HTML
Poniżej przedstawiony został pełny kod aplikacji:
//Listing 9-2.php
<?
if($glos && $juz_glosowano) SetCookie("juz_glosowano","1");
?>
<HTML>
<HEAD>
<TITLE>Jak nazwać dziecko</TITLE>
</HEAD>
<BODY>
<H3>Jak nazwać dziecko</H3>
<FORM ACTION="dziecko.php3" METHOD="POST">
Sugeruję: <INPUT TYPE="text" NAME=nowe_imie><P>
<INPUT TYPE="submit" VALUE="Przeslij sugestię i /lub głos" >
<?
mysql_pconnect("localhost","","");
$db="test";
$tabela="imiona";
if($nowe_imie)
{
if(!mysql_db_query($db,"insert into $tabela values
('$nowe_imie',0)"))
{
echo mysql_errno().":";
echo mysql_error()."<BR>";
}
}
if($glos && $juz_glosowano)
{
echo "<FONT COLOR=#FF0000>Hej! Ty już głosowałe ś .<BR>";
echo "Twój głos jest nieważny.</FONT><P>\n";
}
else if($glos)
{
if(!mysql_db_query($db,"update $tabela set glosy=glosy+1 where
imie='$glos'"))
{
echo mysql_errno().": ";
echo mysql_error()."<BR>";
}
}
$wyniki = mysql_db_query($db, "select sum(glosy) as suma from
$tabela");
if($wyniki) {
$suma=(int) mysql_result($wyniki,0,"suma");
mysql_free_result($wyniki);
}
$wyniki=mysql_db_query($db,"select * from $tabela order by glosy
DESC");
echo"<TABLE BORDER=0><TR><TH>Głos</TH>";
echo"<TH>Imię</TH><TH COLSPAN=2>Głosy</TH>";
echo"<TR>\n";
while($wiersz=mysql_fetch_row($wyniki))
{
echo "<TR><TD ALIGN=center>";
echo"<INPUT TYPE=radio NAME=glos";
echo "VALUE='$wiersz[0]'></TD><TD>";
echo $wiersz[0]."</TD><TD ALIGN=right>";
echo $wiersz[1]."</TD><TD>";
if($suma && (int)$wiersz[1])
{
$per=(int)(100 * $wiersz[1]/$suma);
echo "<IMG SRC=punkt.gif HEIGHT=12";
echo "WIDTH=$per> $per %</TD>";
}
echo "</TR>\n";
}
echo "</TABLE>";
mysql_free_result($wyniki);
?>
<INPUT TYPE="submit" VALUE="Prześlij sugestie i/lub głos" >
<INPUT TYPE="reset">
</FORM>
</BODY>
</HTML>
Rys. 9.1. Efekt działania skryptu sondy.
Ćwiczenie 9.3.
Utwórz prostą księgę gości, w której dane będą pamiętane w bazie danych.
Na początku należy rozpocząć od utworzenia tabeli, w której będą pamiętane wpisy do księgi
gości. Najlepiej posłużyć się skryptem PHPMyAdmin.
PHPMyAdmin
Tabela ksiegagosci będzie miała trzy pola. W pierwszym, data,
data (typu DATETIME)
DATETIME będzie pamiętana
data wpisu (na jej podstawie zdołamy chronologicznie uporządkować wpisy). Pozostałe dwa pola (osoba
osoba
i wpis)
wpis to zwykłe pola tekstowe, w których będziemy pamiętać, kto i co wpisał do księgi gości.
Każdy wpis do księgi będzie osobnym rekordem w bazie danych.
//Listing 9-3.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Prosta ksiega gości działaj ąca w oparciu o bazę danych</TITLE>
</HEAD>
<BODY>
<?
//Skrypt realizuje zapis informacji w księdze gości w bazie danych.
mysql_connect ("localhost", "root", "") or
die ("Nie można połączy ć się z MySQL");
mysql_select_db ("cwicz") or
die ("Nie można połączy ć się z bazą cwicz");
$osoba = addslashes(nl2br(htmlentities ($osoba)));
$wpis = addslashes(nl2br(htmlentities ($wpis)));
if ($osoba && $wpis) {
// są informacje do wpisania do księgi gości
$query = "INSERT INTO ksiegagosci (data, osoba, wpis) ".
"VALUES (now(), '$osoba', '$wpis');";
$wynik = mysql_query ($query);
}
// jeżeli jest już księga, trzeba ją wypisać, niezależnie od tego,
// czy jest nowy wpis.
$wynik = mysql_query("SELECT * FROM ksiegagosci ORDER BY data
DESC;");
while ($rekord = mysql_fetch_array ($wynik)) {
print "<DL><DT>".stripslashes($rekord[2])."<DD><B>".
stripslashes($rekord[1]).",</B>
<I>".$rekord[0]."</I></DL>\n";
$sawpisy = 1;
}
if ($sawpisy) { print "<HR>"; }
?>
<!-- Na dole jest formularz z możliwości ą dopisania się do księgi-->
<FORM METHOD="POST">
<TABLE>
<TR><TD>Osoba:</TD><TD><INPUT TYPE="text"
NAME="osoba"></TD></TR>
<TR><TD>Wpis:</TD><TD>
<TEXTAREA NAME="wpis" COLS=45 ROWS=4 wrap="VIRTUAL"></TEXTAREA>
</TD></TR>
</TABLE>
<INPUT TYPE="submit" VALUE="wyślij">
</FORM>
</BODY>
</HTML>
Rys. 9.2 Tworzenie tabeli ksiegagosci.
ksiegagosci
Ćwiczenie 9.4.
Utwórz w bazie danych tabelę pamiętającą newsy. Wypełnij ją kilkunastoma
informacjami. Następnie napisz skrypt, który pozwoli na ich wyświetlanie i nawigację
pomiędzy nimi, a także na ich zamieszczanie na stronie HTML.
Tabelę, w której będą pamiętane informacje, nazwiemy news.
news Do jej utworzenia należy użyć
PHPMyAdmin.
PHPMyAdmin
Rys. 9.3. Zakładanie tabeli news.
news
Pierwszym z siedmiu pól tabeli jest numer newsa (o nazwie nr).
nr Należy wybrać dla niego opcję
auto_increment
increment w kolumnie Extra,
Extra a także zaznaczyć cechy Index i Unique.
Unique
Kolejne pola są następujące: data informacji, tytuł, krótka treść do zamieszczenia w spisie, pełna
treść i osoba, która ją wpisała. Ostatnie pole (ok.) będzie ono znacznikiem, czy informacja została
zaakceptowana przez administratora serwisu (i w związku z tym może zostać wyświetlona).
Po utworzeniu tabeli wypełnij ją danymi, również używając skryptu PHPMyAdmin. Nie wpisuj
żadnej wartości w pole nr.
increment, pole to wypełni się samo
nr Ponieważ wybraliśmy auto_increment
odpowiednim indeksem.
//listing 9-4html.php
<?
// Skrypt wyświetla nagłówki czterech najnowszych informacji,
// do wykorzystania mechanizmem SSI.
mysql_connect ("localhost", "root", "") or
die ("Nie można połączy ć się z MySQL");
mysql_select_db ("cwicz") or
die ("Nie można połączy ć się z bazą cwicz");
$wynik = mysql_query ("SELECT * FROM news WHERE ok=1 ".
"ORDER BY nr DESC LIMIT 0,4;");
while ($rekord = mysql_fetch_array ($wynik)) {
print "<P><B><A HREF=\"6-09.php?nr=".$rekord[0]."\">";
print $rekord[2]."</A></B><BR>".$rekord[3]."</P>";
print "<P ALIGN=RIGHT><I>".$rekord[1]."</I></P>\n";
}
?>
Jeżeli dla plików HTML-owych masz już włączone SSI, napisanie strony nie będzie trudne. Poniżej jest
zamieszczona przykładowa strona główna, wykorzystująca powyższy skrypt. Jej oryginalna treść zawiera
dość dużo tekstu – wypełniacza. Dla zmniejszenia jego objętości część tekstu została pominięta.
//Listing 9-4.htm
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Strona główna serwisu</TITLE>
<STYLE>
h2 {font-family: Arial, Helvetica, sans-serif; font-size: 12pt}
p {font-family: Arial, Helvetica, sans-serif; font-size: 9pt}
</STYLE>
</HEAD>
<BODY>
<TABLE CELLPADDING=10><TR>
<TD VALIGN=TOP WIDTH="33%">
<P>Troska wszystkich obywateli, a szczególnie zabezpieczenie
informacyjne naszej działalności w znaczący sposób wpływa na
rozwój modelu rozwoju.</P>
<P>Bezpośredni wzrost świadomości administracyjnej musi spowodować
weryfikację kierunków postępowego wykonania.</P>
</TD>
<TD VALIGN=TOP WIDTH="33%">
<H2>Newsy:</H2>
<!--#include virtual="6-09-2html.php" -->
<P ALIGN=RIGHT><A HREF="6-09.php">wszystkie newsy</A></P>
</TD>
<TD VALIGN=TOP WIDTH="33%">
<P>Prawny aspekt zagadnienia musi spowodować weryfikację
przepisów karno-skarbowych.</P>
<P>Kompleksowa strategia rozwoju przedstawia interesując ą próbę
sprawdzenia kierunków postępowego wykonania oraz musi spowodować
weryfikację odpowiednich warunków aktywizacji.<P>
</TD>
</TR></TABLE>
</BODY>
</HTML>
Może się zdarzyć, że ktoś będzie chciał, aby główna strona serwisu (albo inna, zawierająca
newsy) nie była dokumentem HTML,
HTML lecz skryptem PHP. W tej sytuacji można utworzyć funkcję, która
wykonuje to, co nasz skrypt i używać jej tam, gdzie powinny znaleźć się newsy.
Pozostało napisać jeszcze skrypt, który wyświetla pojedynczego newsa lub listę wszystkich wiadomości,
aby łącza zaprezentowane na głównej stronie zaczęły działać.
//Listing 9-4.php
<HTML>
<HEAD>
<META HTTP-EQUIV="ContentType"CONTENT="text/html;charset=iso-8859-2">
<TITLE>Newsy</TITLE>
</HEAD>
<BODY>
<?
// Skrypt wyświetla news o podanym w parametrze nr numerze, a jeżeli
// go nie podano - wszystkie newsy.
mysql_connect ("localhost", "root", "") or
die ("Nie można połączy ć się z MySQL");
mysql_select_db ("cwicz") or
die ("Nie można połączy ć się z bazą cwicz");
if ($nr>0) {
// wyświetlamy pojedynczego newsa
$wynik = mysql_query ("SELECT * FROM news WHERE nr=$nr AND
ok=1;");
if ($rekord = mysql_fetch_array ($wynik))
{
print "<H2>".$rekord[2]."</H2><P>".$rekord[4]."</P>";
print "<P ALIGN=RIGHT><I>".$rekord[5].", ".
$rekord[1]."</I></P>";
}
else
{ // nie ma newsa o takim numerze
print "Nie ma newsa o takim numerze\n";
}
print "<P><A HREF=\"6-09.php\">Wszystkie newsy &gt;&gt;</A></P>";
}
else { // nie ma numeru -- wyświetlamy całą listę
print "<H2>Newsy</H2>";
$wynik = mysql_query ("SELECT * FROM news WHERE ok=1 ".
"ORDER BY nr DESC;");
while ($rekord = mysql_fetch_array ($wynik)) {
print "<P><B><A HREF=\"6-09.php?nr=".$rekord[0]."\">".
$rekord[2];
print "</A></B><BR>".$rekord[3]."</P>";
print "<P ALIGN=RIGHT><I>".$rekord[5].", ".
$rekord[1]."</I></P>";
}
}
?>
</BODY>
</HTML>
Zadania
1. Utwórz skrypt, który połączy się ze wskazaną bazą danych.
2. Utwórz licznik, który będzie działał zarówno ze skryptami PHP, jak
i z dokumentami HTML. Licznik powinien oddzielnie zliczać liczbę odwiedzin dla
każdego z nich. Dane powinny być pamiętane w bazie danych MySQL.
3. Wyposaż skrypt z ćwiczenia 9.4. (listing 9-4.php) w wyszukiwarkę newsów.
4. Napisz skrypt, który umożliwi użytkownikom dopisanie własnych newsów.

Podobne dokumenty