Bazy danych - Politechnika Gdańska

Transkrypt

Bazy danych - Politechnika Gdańska
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
Instrukcja do laboratorium z przedmiotu:
Bazy danych
Laboratorium nr 5.
Tworzenie interfejsu użytkownika
Opracował A. Bujnowski
2010-04-28
1. Cele laboratorium – Zapoznanie z metodami dostępu do danych przy pomocy języków
Projekt "Przygotowanie i realizacja kierunku inżynieria biomedyczna – studia międzywydziałowe”
współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego.
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
wyższego poziomu – zagadnienia tworzenia interfejsu użytkownika.
2. Przykładowa baza danych:
Jako przykład bazy danych posłuży nam przygotowana uprzednio i nieco zmodyfikowana
struktura bazy dla wypożyczalni płyt DVD. Na potrzeby dzisiejszego laboratorium do
poprzednio zaprojektowanej struktury tabel dołączymy jeszcze jedną: gatunek oraz dodamy
atrybut cena dla każdej płyty. Zakładamy, że płyta należy do jednego gatunku.
CREATE TABLE klient (
imie varchar(20) not null,
nazwisko varchar(40) not null,
nr_dowodu char(10),
id_klienta serial primary key);
CREATE TABLE gatunek(
nazwa varchar(30) not null,
id_gatunku serial PRIMARY KEY
);
CREATE TABLE plyta(
tytul varchar(40) not null,
numer serial primary key,
cena numeric(4,2),
gatunek integer REFERENCES gatunek ON DELETE SET NULL ON
UPDATE CASCADE);
CREATE TABLE wypozyczenie(
kto_wypozyczyl int not null REFERENCES klient ON DELETE
RESTRICT ON UPDATE RESTRICT,
co_wypozyczyl int not null REFERENCES plyta ON DELETE
RESTRICT ON UPDATE CASCADE,
data_wypozyczenia timestamp default now(),
data_zwrotu timestamp,
primary key(kto_wypozyczyl, co_wypozyczyl,
data_wypozyczenia) );
2
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
CREATE TABLE jest_pracownikiem(
rabat int,
id_klienta int primary key references klient);
1. Język C
Do połączenia bazy danych do projektu pisanego w języku C niezbędne są odpowiednie biblioteki.
Dla postrgreSQL jest to biblioteka libpq. Definicje dostępnych funkcji zawiera plik nagłówkowy o
nazwie libpq-fe.h.
Wykorzystując kompilator gcc zainstalowany na serwerze bazy.eti.pg.gda.pl możliwe jest
wykonanie połączenia do bazy danych. Zakładając, że plik źródłowy ma nazwę main.c i chcemy
zbudować w oparciu o ten plik program wynikowy o nazwie baza musimy wykonać polecenie:
gcc -o baza -lpq main.c
-o baza -mówi, że wynikowym plikiem będzie plik o nazwie „baza” - w systemach uniksowych nie
musimy dawać rozszerzenia aby plik był wykonywalny
-lpq – dołącz do projektu funkcje z bliku libpq.so
Zawartość pliku main.c:
#include <stdio.h>
#include <libpq-fe.h>
void show_table(PGresult *result)
{
int n,r,nrows,nfields;
nrows = PQntuples(result);
nfields = PQnfields(result);
for(n=0;n<nfields;n++)
{
printf("%s \t|", PQfname(result,n));
}
printf("\n");
for(r=0;r<nrows;r++)
{
for(n=0;n<nfields;n++)
{
printf(" %s \t |",PQgetvalue(result,r,n));
}
printf("\n");
}
}
int main(void)
3
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
{
PGconn * dbh; //wskaźnik do struktury połączenia
Pgresult *wynik;
dbh = PQconnectdb(“dbname=wyklad user=bujnows password =
cccc host=153.19.51.211 port=5432“);
if (PQstatus(dbh) == CONNECTION_OK) //CONNECTION_BAD
{
printf("Udane polaczenie z baza \n");
// ... tu pracujemy z bazą
wynik = PQexec(dbh,"SELECT * from osoba ");
switch(PQresultStatus(wynik))
{
case PGRES_TUPLES_OK: //zapytanie zwr dane tutaj sprawdzimy
show_table(wynik);
break;
case PGRES_COMMAND_OK: // nie ma danych
printf("Zapytanie się powiodlo \n");
break;
case PGRES_EMPTY_QUERY:
printf ("Serwer nie mial nic do roboty, może blad ?\n");
break;
case PGRES_NONFATAL_ERROR:
printf("Blad niekrytyczny, sprobuj ponowic zapytanie \n");
break;
case PGRES_FATAL_ERROR:
default:
printf("Blad krytyczny \n"); // wyswietlmy status bledu
printf("%s\n",PQresultErrorMessage(wynik));
}
Pqclear(wynik); // wyczyscmy wynik o ile jest
PQfinish(dbh);
}
else printf(“Blad polaczenia z baza \n“);
}
Ważniejsze funkcje:
Pgconn *dbh = PQconnectdb(“dbname=wyklad user=bujnows password =
cccc host=153.19.51.211 port=5432“); - funkcja zwracająca uchwyt do poprawnie
połączonej bazy danych. Jako parametr przyjmuje zmienną tekstową opisującą parametry
połączenia.
4
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
PQfinish(dbh) – rozłącz się z bazą danych
PQstatus(dbh) – zwraca status połączenia (CONNECTION_OK lub CONNECTION_BAD)
wynik = Pqexec(dbh,char * query) – wykonuje zapytanie do bazy danych, zwraca
wynik rypu PQresult
PQresultStatus(wynik) – zwraca status wykonania zapytania:
int PQntuples(wynik) – zwraca liczbę wierszy w
int PQnfields(wynik) – zwraca liczbę atrybutów
char * PQfname(result,n) – zwraca nazwę n-tego
char * PQgetvalue(result,r,n) – zwraca wartość
wynikowej o pozycji r,n
wyniku
(kolumn) w tabeli
atrybutu tabeli
elementu tabeli
2. Język PHP
Język PHP jest skryptowym językiem programowania. Dzięki możliwości wygodnego łączenia z
serwerem www np Apache pozwala na uruchamianie skryptów w takcie ładowania stron www.
PHP, co jest skrótem od "PHP: Hypertext Preprocessor", jest powszechnie używanym językiem
skryptowym ogólnego przeznaczenia, który jest szczególnie przystosowany do tworzenia aplikacji
Webowych, także poprzez zagnieżdżenie wewnątrz języka HTML. Składnia, wywodząca się z
języków C, Java i Perl, jest łatwa do nauczenia się. Głównym celem języka jest umożliwienie
programistom szybkiego tworzenia stron internetowych, ale PHP umożliwia znacznie więcej.
Język PHP może działać w oparciu o jedną z dwóch technologii – CLI (command line interface) lub
też CGI – jako skrypt wbudowany w serwer www.
Obecnie skupimy się jedynie na tej drugiej możliwości, jaką daje ten język. Zasada działania jest
taka :
● Tworząc strony korzystamy z jednego z języków prezentacji (HTML, XML, XHTML), którym
posługujemy się w celu formatowania informacji. Wewnątrz kodu strony umieszczamy kod
skryptu.
● Skrypt wykonując się produkuje informację, która może zawierać elementy języka opisu.
● W trakcie ładowania strony wynik działania skryptu wklejany jest w miejsce , w którym
skrypt został umieszczony
● Aby poinformować serwer , że w pobieranym przez niego pliku znajdują się skrypty, plik
MUSI mieć rozszerzenie PHP.
Przykład pierwszego skryptu w PHP:
5
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
W swoim katalogu domowym, w podkatalogu public_html stworz plik test.php (np. touch test.php
<polecenie touch zakłada nowy plik o podanej nazwie – plik jest zerowej długości>)
Wyedytuj zawartość pliku test.php:
<html>
<head>
<title>Pierwszy skrypt w php</title>
</head>
<body>
<h1> TEST </h1>
<?php
// tu umieszczamy kod skryptu
echo "<b>To jest test</b>”;
print "i to jest test”;
?>
</body>
</html>
Załaduj ten plik do swojej przeglądarki w komputerze, na którym pracujesz:
http://153.19.55.211/~twojlogin/test.php ( http://bazy.eti.pg.gda.pl/~twojlogin/test.php)
Sprawdź jak wygląda źródło strony po jej załadowaniu przez przeglądarkę (Edycja->Pokaż źródło
strony).
Dokumentacja.
Jedną z mocniejszych stron języka PHP jest jego dokumentacja – dostępna on-line ze strony
www.php.net. Dokumentacja jest wielojęzyczna, w tym również w języku polskim, ponadto jest
ona bardzo bogata w przykłady. Duża część informacji zawartych w tym skrypcie będzie korzystała z
dokumentacji języka – właśnie z tej strony.
Zmienne w języku PHP
Każdą zmienną w PHP zapisuje się, poprzedzając jej nazwę znakiem dolara "$". Wielkość liter w
nazwie zmiennej jest rozróżniana.
Nazw zmiennych dotyczą te same reguły, co innych rodzajów nazw w PHP. Poprawna nazwa
zmiennej zaczyna się od litery lub znaku podkreślenia "_", po których może wystąpić dowolna ilość
liter, cyfr lub znaków podkreślenia. Jako wyrażenie regularne, można to zapisać tak: '[a-zA-Z_\x7f-\
xff][a-zA-Z0-9_\x7f-\xff]*'
<?php
$foo = "PHP";
$bar = &$foo;
.
$bar = "To jest $bar";
// Przypisz wartość "PHP" do $foo.
// Przypisz referencyjnie $foo do $bar
// Zmień $bar...
6
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
echo $bar;
echo $foo;
?>
// $foo też się zmieniło.
Należy pamiętać, że tylko wyrażenia posiadające nazwę mogą być przypisane przez referencję.
<?php
$foo = 25;
$bar = &$foo;
$bar = &(24 * 7);
rażenia.
// Przypisanie poprawne.
// Przypisanie niepoprawne - do nienazwanego wy
function test()
{
return 25;
}
$bar = &test();
?>
// Niepoprawne.
Typy danych:
PHP używa ośmiu typów danych:
Skalarne:
•
•
•
•
boolean
integer
float (typ zmiennoprzecinkowy double)
string
Dwa złożone typy:
•
•
array
object
I dwa typy specjalne:
•
•
resource
NULL
Operatory
Associativity
Operators
Additional Information
non-associative new
new
left
array()
[
7
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
Associativity
Operators
Additional Information
non-associative ++ --
increment/decrement
non-associative ~ - (int) (float) (string) (array) (object) (bool) @ types
non-associative instanceof
types
right
!
logical
left
*/%
arithmetic
left
+-.
arithmetic i string
left
<< >>
bitwise
non-associative < <= > >=
comparison
non-associative == != === !==
comparison
left
&
bitwise i references
left
^
bitwise
left
|
bitwise
left
&&
logical
left
||
logical
left
?:
ternary
right
= += -= *= /= .= %= &= |= ^= <<= >>=
assignment
left
and
logical
left
xor
logical
left
or
logical
left
,
many uses
Pętle i instrukcje warunkowe:
if
•
•
•
•
•
•
•
•
•
•
else
elseif
Alternative syntax for control structures
while
do-while
for
foreach
break
continue
switch
8
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
•
•
•
•
•
•
declare
return
require
include
require_once
include_once
Przykłady:
for($k=0;$k<10;$k++)
{
echo $k;
if($k < 5)
{
echo “K za male “;
}
}
PHP I PostgreSQL
Aby skorzystać z bazy danych PostgreSQL w języku PHP należy wykonać kilka podstawowych
czynności:
1. Połączyć się z bazą danych
2. Wykonać zapytanie
3. Przetworzyć i ew. wyświetlić dane
4. Zwolnić zasoby.
Stwórzmy pusty plik o nazwie testbd.php (pamiętajmy o lokalizacji tego pliku – w index_html)
# touch testbd.php
(*** polecenie touch zakłada nowy plik ***)
Wyedytujmy jego zawartość:
<html>
<head>
<title>PostgreSQL i php</title>
</head>
<body>
9
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
<h1> TEST </h1>
<?php
// tu umieszczamy kod skryptu
// Połączmy się z bazą danych i rozłączmy się z nią natychmiast
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
echo "Jest Polaczenie z baza danych !”;
pg_close($dbh);
?>
</body>
</html>
i załadujmy skrypt do przeglądarki: http://153.19.55.211/~mojlogin/testdb.php
Sprawdźmy jak działa ten skrypt.
Funkcja pg_connect zwraca uchwyt do połączenia z bazą danych, jako argument tekstowy
przyjmuje ciąg znaków w którym jest pewna prawidłowość typu klucz=wartość. Pary klucz=wartość
rozdziela się spacjami, całość ciągu zamyka się w cudzysłowiach. Co oznaczają poszczególne klucze:
host – nazwa komputera, na którym pracuje serwer bazy danych (na serwerze "mamma” klucz ten
jest obowiązkowy – ze względu na politykę bezpieczeństwa serwera baz danych
user - Twój login
password – twoje hasło do baz danych – moższesz ustawić lub zmienić swoje hasło wpisując z
poziomu psql-a polecenie:
ALTER USER twojlogin WITH ENCRYPTED PASSWORD 'twojenowehaslo”;
- od tej pory używasz tego hasła w połączeniach z bazą danych, zawsze możesz je zmienić na inne
ponownie wywołując powyższe polecenie.
dbname – nazwa bazy danych do której chcesz się połączyć
UWAGA ! - ze względu na sposób pracy usługi http – do twojej bazy danych teoretycznie może
połączyć się każdy, kto ma ustawionego użytkownika w bazie, natomiast polityka bezpieczeństwa
na serwerze wymusza pełne logowanie, o ile użytkownik systemu jest innym użytkownikiem niż
10
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
właściciel bazy. Skrypty w PHP uruchamia użytkownik apache, a nie TY – dlatego musisz w pełni, z
hasłem zalogować się do bazy danych, i obowiązkowo podać host, aby wymusić połączenie i
autoryzację przez gniazdo TCPIP.
O ile udało nam się już połączyć z bazą danych (wyświetla się komunikat o tym że połączenie jest
nawiązane) to spróbujmy wykonać jakieś zapytanie. Poprawmy skrypt dopisując parę linii:
<html>
<head>
<title>PostgreSQL i php</title>
</head>
<body>
<h1> TEST </h1>
<?php
// tu umieszczamy kod skryptu
// Połączmy się z bazą danych i rozłączmy się z nią natychmiast
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=153.19.51.70”) | die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
$query = "INSERT INTO klient(imie,nazwisko) VALUES ('Adam',
'Nowak');
$wynik = pg_query($query);
echo "Jest Polaczenie z baza danych !”;
pg_close($dbh);
?>
</body>
</html>
I teraz przeładujmy stronę, sprawdźmy dodatkowo jakie zmiany nastąpiły w bazie danych.
Teraz spróbujmy wyświetlić dane z jakiejś tabeli:
<html>
<head>
<title>PostgreSQL i php</title>
</head>
<body>
11
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
<h1> TEST </h1>
<?php
// tu umieszczamy kod skryptu
// Połączmy się z bazą danych i rozłączmy się z nią natychmiast
$dbh = pg_connect(”dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die(”Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
$query = ”INSERT INTO osoba(imie,nazwisko) VALUES ('Adam',
'Nowak');
$wynik = pg_query($dbh,$query);
// wyświetlmy dane
$query = ”Select * from klient”;
$wynik = pg_query($dbh,$query);
// odbierzmy rozmiary tabeli:
$liczba_kolumn = pg_num_fields($wynik);
$liczba_wierszy = pg_num_rows($wynik);
// teraz wyświetlmy dane
for($w =0;$w<$liczba_wierszy;$w++) {
for($k =0;$k<$liczba_kolumn;$k++) {
echo pg_fetch_result($wynik,$w,$k);
echo ”\t”;
}
echo ”<br />”;
}
//echo ”Jest Polaczenie z baza danych !”;
pg_close($dbh);
?>
</body>
</html>
Sprawdźmy rezultat i porównajmy z wynikiem działania poniższego skryptu:
<?php
// tu umieszczamy kod skryptu
// Połączmy się z bazą danych i rozłączmy się z nią natychmiast
$dbh = pg_connect(”dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) | die(”Nie moge polaczyc
sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
//$query = "INSERT INTO osoba(imie,nazwisko) VALUES ('Adam',
'Nowak');
12
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
//$wynik = pg_query($dbh,$query);
// wyświetlmy dane
$query = "Select * from klient”;
$wynik = pg_query($dbh,$query);
// odbierzmy rozmiary tabeli:
$liczba_kolumn = pg_num_fields($wynik);
$liczba_wierszy = pg_num_rows($wynik);
// teraz wyświetlmy dane
echo "<TABLE border width=1>”;
echo "<TR>”;
for($k =0;$k<$liczba_kolumn;$k++)
{
echo "<TD>”;
echo pg_field_name($wynik,$k);
echo "</TD>”; //echo "\t”;
}
echo "</TR>”;
for($w =0;$w<$liczba_wierszy;$w++)
{
echo "<TR>”;
for($k =0;$k<$liczba_kolumn;$k++)
{
echo "<TD>”;
echo pg_fetch_result($wynik,$w,$k);
echo "</TD>”; //echo "\t”;
}
echo "</TR>”; //echo "<br />”;
}
echo "</TABLE>”;
//echo "Jest Polaczenie z baza danych !”;
pg_close($dbh);
?>
</body>
</html>
Obsługa formularzy w PHP
Formularze są elementami umożliwiającymi interakcję z serwisami www. Typowy kod formularza
wygląda następująco:
<form action = plik.php method=POST >
13
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
<input type=text name=nazwa value=wartosc domyslna>
<input type=submit name=dodaj value=dodaj>
</form>
Elementy formularzy to
Pole tekstowe : <intput type=text ...>
Pole z hasłem : <input type=password ...>
Pole wyboru : <input type=checkbox name=nazwa value=wartosc[checked]>
Pole ukryte : <input type=hidden name=nazwa value=wartosc>
Pole wyboru: <select name=nazwa>
<option value=wart1> tresc do wart </option>
<option value=wart2> tresc do wart2 </option>
</select>
Większe pole tekstowe:
<textarea name=nazwa cols=liczba_kolumn rows=lpa_wierszy>
Tu tresc w polu
</textarea>
Pole zatwierdzenia (przycisk) :<input type=submit name=dodaj value=dodaj>
i inne, zgodnie z normą dotyczącą języków html, xhtml
Za dyrektywą <form następuje modyfikator action, który ma wartość pliku, lub URL -a do którego
będziemy pzesyłali dane zgodnie z metodą określoną w modyfikatorze method, która przyjmuje
generalnie dwie wartości POST lub GET. Sprawdźmy na przykładzie:
<?php
// tu umieszczamy kod skryptu
// Połączmy się z bazą danych i rozłączmy się z nią natychmiast
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
//$query = "INSERT INTO klient(imie,nazwisko) VALUES ('Adam',
'Nowak');
//$wynik = pg_query($dbh,$query);
// wyświetlmy dane
$query = "Select * from klient”;
$wynik = pg_query($dbh,$query);
// odbierzmy rozmiary tabeli:
$liczba_kolumn = pg_num_fields($wynik);
$liczba_wierszy = pg_num_rows($wynik);
14
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
// teraz wyświetlmy dane
echo "<TABLE border width=1>”;
for($w =0;$w<$liczba_wierszy;$w++)
{
echo "<TR>”;
for($k =0;$k<$liczba_kolumn;$k++)
{
echo "<TD>”;
echo pg_fetch_result($wynik,$w,$k);
echo "</TD>”; //echo "\t”;
}
echo "</TR>”; //echo "<br />”;
}
echo "</TABLE>”;
// Tu dopiszmy nową osobę
echo "<FORM action=dodos.php method=POST>
Dodaj nową osobę do bazy <br />
Imię: <input type=text name=imie>
Nazwisko: <input type=text name=nazw>
Telefon: <input type=text name=tel>
<input type=submit name=Dodaj value=Dodaj>
</form>”;
pg_close($dbh);
?>
</body>
</html>
Oczywiście taka forma formularza wymaga stwozenia oddzielnego pliku o nazwie dodos.php –
stwórzmy zatem taki plik:
# touch dodos.php
<html>
<head>
<title>Dodaj osobę</title>
</head>
<body>
<h1> Dodaję osobę </h1>
<?php
// tu umieszczamy kod skryptu
//po pierwsze – odbierzmy paramery dla skryptu przekazane
15
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
//metodą //POST – uzyjemy je w zapytaniu ponizej
$im = $_POST['imie'];
$na = $_POST['nazw'];
$te = $_POST['tel'];
// Połączmy się z bazą danych
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
$query = "INSERT INTO klient(imie,nazwisko,tel) VALUES
('$im','$na','$te');
$wynik = pg_query($query);
// sprawdzmy ile wierszy podmieniono
$lz = pg_affected_rows($wynik);
echo " Dodano $ls osob <br /> \n”;
pg_close($dbh);
// zapewnijmy powrot do strony poprzedniej
echo "<form action=testdb.php method=post>
<input type=submit name=Ok value=OK>
</form>”;
?>
</body>
</html>
Dodajmy jeszcze nowe własności dla tabeli klient
plik testbd.php:
<?php
// tu umieszczamy kod skryptu
// Połączmy się z bazą danych i rozłączmy się z nią natychmiast
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
//$query = "INSERT INTO klient(imie,nazwisko) VALUES ('Adam',
'Nowak');
//$wynik = pg_query($dbh,$query);
16
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
// wyświetlmy dane
$query = "Select * from klient”;
$wynik = pg_query($dbh,$query);
// odbierzmy rozmiary tabeli:
$liczba_kolumn = pg_num_fields($wynik);
$liczba_wierszy = pg_num_rows($wynik);
// teraz wyświetlmy dane
echo "<TABLE border width=1>”;
echo "<TABLE border width=1>”;
echo "<TR>”;
for($k =0;$k<$liczba_kolumn;$k++)
{
echo "<TD>”;
echo pg_field_name($wynik,$k);
echo "</TD>”; //echo "\t”;
}
echo "<td>Usun</td><td>Edytuj</td></TR>”;
for($w =0;$w<$liczba_wierszy;$w++)
{
echo "<TR>”;
for($k =0;$k<$liczba_kolumn;$k++)
{
echo "<TD>”;
echo pg_fetch_result($wynik,$w,$k);
echo "</TD>”; //echo "\t”;
}
$idos = pg_fetch_result($wynik,$w,$liczba_kolumn-1);
// tu dodajemy formularz do usuwania osoby
echo "<form action=delos.php method=POST>
<input type=hidden name=idos value=$idos>
<input type=submit name=usun value=Usun></form>”;
// tu dodajemy formularz do edycji osoby
echo "<form action=edos.php method=POST>
<input type=hidden name=idos value=$idos>
<input type=submit name=usun value=Usun></form>”;
echo "</TR>”; //echo "<br />”;
}
echo "</TABLE>”;
// Tu dopiszmy nową osobę
echo "<FORM action=dodos.php method=POST>
17
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
Dodaj nową osobę do bazy <br />
Imię: <input type=text name=imie>
Nazwisko: <input type=text name=nazw>
Telefon: <input type=text name=tel>
<input type=submit name=Dodaj value=Dodaj>
</form>”;
pg_close($dbh);
?>
</body>
</html>
i dwa nowe pliki delos.php:
<html>
<head>
<title>Usuń osobę</title>
</head>
<body>
<h1> Usuwam osobę </h1>
<?php
// tu umieszczamy kod skryptu
//po pierwsze – odbierzmy paramery dla skryptu przekazane
//metodą //POST – uzyjemy je w zapytaniu ponizej
$id = $_POST['idos'];
// Połączmy się z bazą danych
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie
$query = "DELETE FROM klient where id_klienta = '$id';
$wynik = pg_query($query);
// sprawdzmy ile wierszy podmieniono
$lz = pg_affected_rows($wynik);
echo " Usunieto $ls osobe <br /> \n”;
pg_close($dbh);
// zapewnijmy powrot do strony poprzedniej
18
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
echo "<form action=testdb.php method=post>
<input type=submit name=Ok value=OK>
</form>”;
?>
</body>
</html>
edos.php:
<html>
<head>
<title>Edytuj osobę</title>
</head>
<body>
<h1> Edytuj osobę </h1>
<?php
// tu umieszczamy kod skryptu
//po pierwsze – odbierzmy paramery dla skryptu przekazane
//metodą //POST – uzyjemy je w zapytaniu ponizej
$id = $_POST['idos'];
$imie = $_POST['imie'];
$nazw = $_POST['nazw'];
$tel = $_PORT['tel'];
// Połączmy się z bazą danych
$dbh = pg_connect("dbname=nazwamojejbazy user=mojlogin
password=mojehaslodobazy host=localhost”) or die("Nie moge
polaczyc sie z baza danych !”);
// tu powinno byc polaczenie
// wykonajmy zapytanie – najpierw wyswietlmy dane
$query = "SELECT imie,nazwisko,tel,id_klienta from klient where
id=$id”;
$wynik = pg_query($query);
echo "<form action=edos.php method=post>”;
echo "<table border width=1>”;
for($k = 0;$k<$lk -1; $k++)
{
echo "<tr>;
echo "<td>”;
19
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
echo pg_field_name($wynik,$k);
echo "</td>”;
echo "<td>”;
echo "<intput type=text name=”.pg_field_name($wynik,
$k) .”value=”. pg_fetch_result($wynik,0,$k).”>”;
echo "</td>”;
echo "</tr>”;
}
echo "</table>”;
echo "<input type=hidden name=idos value=$id>”;
echo "<input type=submit name=zmien value=zmien>”;
echo "</form>”
if ($zm = 'zmien')
{
$query = "UPDATE klient SET imie='$imie', nazwisko='$nazw',
tel='$tel' where id=$id”;
$wynik = pg_query($query);
// sprawdzmy ile wierszy podmieniono
$lz = pg_affected_rows($wynik);
echo " Edytowano $ls osob <br /> \n”;
}
pg_close($dbh);
// zapewnijmy powrot do strony poprzedniej
echo "<form action=testdb.php method=post>
<input type=submit name=Ok value=OK>
</form>”;
?>
</body>
</html>
Zadania dodatkowe:
1. Stwórz podobną funkcjonalność dla tabeli płyta
2. Korzystając z widoków wyświetl tabele zbiorcze płyt
wypożyczonych i niezwróconych oraz płyt wypozyczonych i
zwróconych (2 tabele)
3. Korzystając z formularza typu <select> obsłuż akcję
wypożyczenia i zwrotu płyty
4. Zastanów się nad układem formularzy i dostępnością danych w
tak przygotowanej stronie
5. Zastanów się w jaki sposób nie umieszczać twojego loginu i
hasła w bazie danych
6. Zastanów się nad estetyką strony, rozważ skrypty css, może
20
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
style strony również zapamiętać w bazie danych ?
DODATEK:
Wykaz funkcji dostępu do PostgreSQL z poziomu PHP:
● pg_ affected_ rows
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
pg_ cancel_ query
pg_ client_ encoding
pg_ close
pg_ connect
pg_ connection_ busy
pg_ connection_ reset
pg_ connection_ status
pg_ convert
pg_ copy_ from
pg_ copy_ to
pg_ dbname
pg_ delete
pg_ end_ copy
pg_ escape_ bytea
pg_ escape_ string
pg_ execute
pg_ fetch_ all_ columns
pg_ fetch_ all
pg_ fetch_ array
pg_ fetch_ assoc
pg_ fetch_ object
pg_ fetch_ result
pg_ fetch_ row
pg_ field_ is_ null
pg_ field_ name
pg_ field_ num
pg_ field_ prtlen
pg_ field_ size
pg_ field_ table
pg_ field_ type_ oid
pg_ field_ type
pg_ free_ result
pg_ get_ notify
pg_ get_ pid
pg_ get_ result
pg_ host
pg_ insert
pg_ last_ error
pg_ last_ notice
pg_ last_ oid
21
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski
Politechnika Gdańska, międzywydziałowy kierunek "INŻYNIERIA BIOMEDYCZNA”
pg_ lo_ close
● pg_ lo_ create
● pg_ lo_ export
● pg_ lo_ import
● pg_ lo_ open
● pg_ lo_ read_ all
● pg_ lo_ read
● pg_ lo_ seek
● pg_ lo_ tell
● pg_ lo_ unlink
● pg_ lo_ write
pg_ meta_ data
pg_ num_ fields
pg_ num_ rows
pg_ options
pg_ parameter_ status
pg_ pconnect
pg_ ping
pg_ port
pg_ prepare
pg_ put_ line
pg_ query_ params
pg_ query
pg_ result_ error_ field
pg_ result_ error
pg_ result_ seek
pg_ result_ status
pg_ select
pg_ send_ execute
pg_ send_ prepare
pg_ send_ query_ params
pg_ send_ query
pg_ set_ client_ encoding
pg_ set_ error_ verbosity
pg_ trace
pg_ transaction_ status
pg_ tty
pg_ unescape_ bytea
pg_ untrace
pg_ update
pg_ version
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
22
BAZY DANYCH, laboratorium nr 2 , A. Bujnowski