Każda baza danych umożliwia gromadzenie informacji. Standardowo dane te możemy przeglądać, dodawać, modyfikować i usuwać za pomocą języka SQL. Jednak takie rozwiązanie jest bardzo kłopotliwe dla zwykłego użytkownika. Projektując aplikację bazodanową musimy zadbać o tzw. interfejs użytkownika, który jest pośrednikiem pomiędzy systemem bazy danych, a użytkownikiem. Jedną z możliwości jest wykorzystanie języka PHP do zbudowania interfejsu użytkownika jako strony WWW. Poniżej przedstawimy podstawowe zasady budowania aplikacji w języku PHP z wykorzystaniem danych z bazy PostgreSQL.
Dostęp do bazy danych
Język PHP posiada funkcje umożliwiające wykonywanie operacji na popularnych bazach danych takich jak: MySQL, Oracle, MS SQL, PostgreSQL. W zależności od bazy danych należy wykorzystać odpowiednie dla niej funkcje obsługi zaimplementowane w PHP. Niezależnie jednak od typu bazy dostęp do informacji w niej zawartych uzyskujemy za pomocą tego samego schematu postępowania:
- Uzyskanie dostępu do bazy danych
- Wykonanie operacji na bazie
- Rozłączenie
Dostęp do bazy danych możliwy jest po autoryzacji. Niezależnie od narzędzi (psql, PgAdmin, PHP) musimy przekazać systemowi bazy danych informacje o nazwie użytkownika, jego haśle oraz nazwie bazy danych. Zakładamy, że w systemie PostgreSQL jest zdefiniowany użytkownik o nazwie "student" identyfikujący się hasłem "moje_haslo" i mający dostęp do bazy danych "moja_BD". Poniższy fragment programu umożliwia nawiązanie połączenia z naszą bazą danych:
if (! $dbh = pg_pconnect("host='localhost' port='5432'
user='student' password='moje_haslo' dbname='moja_DB'"))
echo "Nie mogę się połączyć z bazą danych";
Trzy ostatnie parametry to oczywiście: nazwa użytkownika, hasło oraz nazwa bazy danych. Wyjaśnienia wymagają jeszcze dwa pierwsze parametry: host to nazwa hosta - serwera, na którym znajduje się nasz system bazodanowy. Możemy tam wpisać również adres IP. port to zdefiniowany dla naszej bazy port, na którym nasłuchuje serwer. Podana składnia umożliwia podłączenie do bazy danych oraz w zależności od wyniku wyświetlenie komunikatu o błędzie, lub przejście do dalszej części programu. W przypadku braku połączenia należy zadbać o to, aby skrypt PHP zakończył działanie.
Operacje na danych
Prawidłowo wykonana operacja podłączenia do bazy danych umożliwia wykonanie dowolnych operacji przewidzianych w języku SQL za pomocą PHP. Wykonanie dowolnego polecenia umożliwia funkcjapg_query(). Jako parametr wywołania funkcji podajemy kompletne polecenie języka SQL. Funkcja zwraca wartość "FALSE", w przypadku, gdy polecenie SQL nie zostało wykonane, lub identyfikator wyniku. Poniższe polecenie wstawia dane do tabeli "produkty":
$query="insert into produkty values(12,'Klawiatura','Klawiatura PS/2');";
if($wynik=pg_query($query))
echo "Produkt dodany";
else
echo "Błąd SQL";
Polecenia takie jak:insert, update, delete, drop, append zwracają informację o prawidłowym wykonaniu, ewentualnie o ilości wykonanych zmian. W typowych sytuacjach dane te nie są istotne, liczy się tylko, czy polecenie wykonano prawidłowo, czy nie. Inna sytuacja występuje w przypadku poleceniaselect. Tutaj najważniejsza jest informacja zwrotna uzyskana z bazy danych. Funkcja pg_query() umożliwia wykonanie zapytania SQL i zwraca identyfikator wyniku. W celu uzyskania dokładnych informacji zwróconych w wyniku zaputania musimy posłużyć się dodatkowymi funkcjami. Do odczytu całego rekordu danych wykorzystujemy funkcjępg_fetch_row(). Wywołujemy ją z dwoma parametrami: pierwszy to identyfikator zwrócony z pg_query(), drugi natomias to numer zwróconego rekordu. Przykładowa funkcja zwracająca 3 rekord z zapytania SQL.
$query="select * from produkty;";
if($wynik=pg_query($query))
$wiersz=pg_fetch_row($wynik,2);
else
echo "Błąd SQL";
Funkcja pg_fetch_row() zwraca cały wiersz zapytania w tablicy o indeksach numerycznych. Dla powyższego przykładu: $wiersz[0], $ wiersz[1]... Często lepszym rozwiązaniem byłoby uzyskanie danych ułożonych w tablicy, której nazwy pól odpowiadałyby nazwom kolumn tabeli. Umożliwia to funkcjapg_fetch_array(). Poniższy przykład przedstawia wykorzystanie funkcji pg_fetch_array():
$query="select * from produkty;";
if($wynik=pg_query($query))
$dane=pg_fetch_array($wynik,2);
else
echo "Błąd SQL";
Po prawidłowym wykonaniu powyższego kodu w zmiennej $dane znajdują się informacje uzyskane z poszczególnych pól. Przykładowo: $dane["nazwa"], $dane["Opis"] itd. W powyższych przykładach podaliśmy bezpośrednio numer rekordu, który chcemy odczytać. W aplikacjach rzeczywistych nie wiemy ile rekordów zwróci nasze zapytanie. W tym celu należy wykorzystać funkcję pg_num_rows(). Jako argument wywołania podajemy nazwę zmiennej przechowującej wartość zwracaną przez funkcję pg_query().
Rozłączenie - zamknięcie połączenia
Połączenie zamykamy za pomocą funkcji pg_close(). W języku PHP nie jest wymagane zamykanie połączenia. System sam wykona tę operację po wykonaniu skryptu. Istnieją jednak przypadki, w których wymagane jest zamknięcie połączenia.
Przykład
Poniżej znajduje się przykładowy kompletny kod w języku PHP, który umożliwia wyświetlenie zawartości tabeli podanej w zapytaniu.
<?php
$host="localhost";
$port="5432";
$user="student";
$haslo="moje_haslo";
$baza="moja_DB";
if (! $dbh = pg_pconnect("host=$host port=$port user=$user
password=$haslo dbname=$baza"))
echo "Nie mogę się połączyć z bazą danych";
else
{
$tabelka="produkty";
$query="select * from $tabelka;";
if($wynik=pg_query($query))
{
$licznik=pg_num_rows($wynik);
echo "<html>";
echo "<H2> Dane z tabeli $tabelka: </H2>";
$li=0;
while($li++<$licznik)
{
$linia=pg_fetch_row($wynik,$li);
echo "$linia[0] $linia[1] <br>";
}
echo "</html>";
}
else
echo "Brak danych...";
}
?>
Jak można zauważyć w przykładzie dane do połączenia oraz nazwa tabeli przechowywane są w zmiennych języka PHP. Rozwiązanie takie ułatwia szybkie zmodyfikowanie tego przykładu do potrzeb własnej bazy danych.
Podsumowanie
Na zakończenie kilka uwag praktycznych.
Powyższy rozdział nie przedstawia pełnych możliwości języka PHP. Funkcji obsługujących dane bazy PostgreSQL jest kilkanaście. Ich nazwy, oraz opis można znaleźć na www.php.net. Dane możemy modyfikować za pomocą formularzy zbudowanych w HTML-u. Najczęściej stosuje się zbiór funkcji obsługujących bazę zapisany w oddzielnym pliku. Rozwiązanie takie ułatwia tworzenie interfejsu.