Podstawy programowania
PHP5 - PostgreSQL
PostgreSQL
• System zarządzania bazami danych
PostrgreSQL, jest podobnie jak MySQL, jest
projektem Open Source.
• Bazy danych PostgreSQL nie są tak szybkie
jak bazy danych MySQL, ale za to
implementacja języka SQL wbudowana w
PostgreSQL jest dużo bardziej rozbudowana
w porównaniu do MySQL.
• Kod źródłowy aktualnej wersji PostgreSQL jes
dostępny na witrynie
http://postgresql.com
Nawiązanie połączenia z
serwerem
• Aby nawiązać połączenie z serwerem bazy danych
PostgreSQL należy skorzystać z funkcji PHP5
pg_connect().
• Składnia funkcji jest następująca:
<?php
resource pg_connect( string parametry_połączenia);
?>
• Funkcja zwraca obiekt resource reprezentujący
połączenie z bazą danych. Ciąg może zawierać takie
parametry jak:
– host, nazwa serwera na którym uruchomiona jest baza danych
– port, numer portu na którym serwer bazy danych nasłuchuje
połączenia
– dbname, nazwa bazy danych, z którą łączy się procesor PHP5
– user, nazwa użytkownika bazy danych
– password, hasło użytkownika user.
Przykład nawiązania
połączenia
• Nawiązanie połączenia z bazą danych PostgreSQL
<?php
$identyfikator = pg_connect(‘host=localhost
dbname=moja_baza user=testowy’);
echo($identyfikator);
?>
• Serwerem bazy danych jest tu localhost, co oznacza
że jest to ten sam komputer na którym uruchomiony
został serwer WWW.
• Interpreter PHP5 próbuje połączyć się z bazą danych
moja_baza jako użytkownik testowy.
• W wyniku na przeglądarce powinien pojawić się tekst
Resource id #1.
• Uwaga: próba nawiązania kolejnego połączenia o
identycznych parametrach spowoduje odwołanie się
do istniejącego połączenia.
Zamykanie połączenia
z bazą danych
•
Po nawiązaniu połączenie z serwerem bazy danych
będzie trwało, dopóki nie zostanie zakończony skrypt,
który zainicjował połączenie, lub póki nie zostanie
ono zamknięte funkcją pg_close( ).
•
Przykład użycia funkcji pg_close( )
<?php
bool pg_close([resource identyfikator]);
?>
•
Zakładamy, że identyfikator jest identyfikatorem
połączenia z bazą danych, który został utworzony po
poprawnym wywwołaniu funkcji pg_connect( ).
Funkcja zwraca wartość TRUE, jeśli wywołanie się
powiedzie albo FALSE w przeciwnym przypadku.
•
Jeśli argument funkcji pg_close( ) nie zostanie
podany, funkcja zamknie ostatnie utworzone
połączenie.
Brak możliwości połączenia
z bazą danych
• Jeżeli interpreter PHP5 nie będzie mógł nawiązać
połączenia z serwerem bazy danych, w przeglądarce
WWW zostanie wyświetlony komunikat o błędzie
podający przyczynę wystąpienia błędu,
Warning: pg_connect( ) [function.pg_connect]: Unable to
connect to PostgreSQL server:
FATAL: user ”testowy” does not exist in skrypt.php on line 1
• Dodatkowo funkcja pg_connect( ) zwróci wartość
FALSE zamiast identyfikatora połączenia.
• Jeśli nie będziemy chcieli, aby PHP5 nie wyświetlał
wyżej pokazanego błędu, możemy postawić przed
instrukcją operator kontroli błędów @.
Skrypt reagowania na błędy
w połączeniu z bazą danych
<?php
//Próba nawiązania połączenia z serwerem PostgreSQL
if (!@pg_connect(‘host=localhost dbname=moja_baza
user=testowy’)) {
//Nawiązanie połączenia nie udało się
exit(‘Nie można nawiązać połączenia z Bazą danych
PostgreSQL’);
}
//Nawiązanie połączenia z serwerem PostgreSQL
udane
echo(‘Nawiązano połączenie z bazą danych
PostgreSQL’);
pg_close( );
?>
Przesyłanie zapytań
do bazy danych
• Gdy skrypt uzyska połączenie z bazą danych, można
rozpocząć komunikację z serwerem za pomocą języka SQL.
• W PHP5 do wykonania zapytań do bazy danych
PostgreSQL służy funkcja pg_query( ).
<php?
resource pg_query( resource identyfikator , string treść_zapytania;
?>
• Funkcja pg_query( ) wysyła zapytanie SQL podane jako
argument treść_zapytania do serwera PostgreSQL, z
którym połączenie identyfikowane jest poprzez argument
identyfikator.
• Wynikiem wykonania funkcji jest obiekt typu resource,
który stanowi identyfikator obiektu zawierającego wynik
zapytania, lub wartość TRUE. Jeżeli treść zapytania jest
niepoprawna, funkcja zwróci wartość FALSE oraz
wygeneruje błąd klasy E_WARNING.
Poznanie przyczyny błędu
• O tym jaka jest przyczyna błędu możemy się
dowiedzieć przez wywołanie funkcji pg_last_error( ).
<?php
string pg_last_error( resource identyfikator_połączenia);
?>
• Funkcja zwraca treść ostatniego błędu, w połączeniu
identyfikowanym przez identyfikator_połączenia.
• Przykład wykorzystania omawianych funkcji:
<?php
//Próba nawiązania połączenia z serwerem PostgreSQL
if (!$identyfikator = @pg_connect( ‘host=localhost dbname=
moja_baza user=testowy’))
exit(‘Nie można nawiązać połączenia z serwerem PostgreSQL’);
if (!$wynik=@pg_query($identyfikator, ‘SELECT * FROM Table’))
echo( ‘Wystąpił błąd w zapytaniu SQL;
’.pg_last_error($identyfikator). ‘<br/>);
pg_close($identyfikator);
?>
Pobieranie informacji z bazy
danych
• Podana definicja funkcji pg_query( ) pokazuje, że funkcja może
zwrócić obiekt typu resource. Dzieje się tak, gdy wynikiem zapytania
SQL (np. typu SELECT) będzie zbiór rekordów, które zwróci serwer
PostgreSQL.
• Obiekt typu resource zwrócony przez funkcję pg_query( ) nie pozwala
w bezpośredni sposób uzyskać dostępu do danych zwróconych przez
serwer. Skrypt PHP5 musi w tym celu skorzystać z jednej z funkcji
grupy pg_feach_.
• Są to funkcje:
– pg_feach_row( ), zwraca rekord danych w postaci zwykłej tablicy,
– pg_feach_assoc( ), zwraca rekord danych w postaci tablicy
asocjacyjnej,
– pg_feach_array( ), zwraca rekord danych w postaci tablicy
asocjacyjnej lub zwykłej, w zależności od wartości jednego
parametru,
– pg_feach_object( ), zwraca rekord danych w postaci obiektu
zawierajćego właściwości, których nazwy odpowiadają polom
rekordu.
Szablon skryptu wyświetlania
informacji pobranej z bazy
danych
<?php
//Funkcja wykonująca zapytania SQL i zwraca wynik
function queryFunc($queryString) {
if (!$result = @pg_query( $queryString))
exit( ‘Wystąpił błąd w zapytaniu <b>’ . $queryString. ‘</b>: ‘
.pg_last_error( ).
‘<br/>’);
//Zwrócenie wyników zapytania
return $result;
}
//Funkcja nawiązania połączenia z bazą danych moja_baza na
serwerze PostgreSQL
if ( !$identyfikator=@pg_connect( ‘host=localhost
dbname=moja_baza
user=testowy’))
exit(‘Nie można nawiązać połączenia z serwerem PostgreSQL’);
//Wysłanie zapytania SQL i odebranie wyników
$wyniksql = queryFunc( ‘SELECT * FROM Osoba’);
//Tutaj jest miejsce kodu wyświetlania wyniku
//Zamknięcie połączenia z bazą danych
pg_close( );
?>
Funkcja pg_fetch_row( )
• Składnia funkcji pg_feach_row( ):
<?php
array pg_feach_row( resource wynik_zapytania_sql
[, int numer_wiersza]);
?>
• Funkcja zwraca w postaci tablicy zwykłej wiersz (rekord)
danych zawartych w wyniku zapytania SQL zwróconego
przez funkcję pg_query i reprezentowanego przez
argument wynik_zapytania _sql lub zwraca wartość
FALSE, jeśli niema kolejnego rekordu.
• Jeżeli podany zostanie opcjonalny argument
numer_wiersza, to funkcja zwróci dane ze wskazanego
wiersza. W innym przypadku zwróci dane z wiersza, na
który wskazuje wewnętrzny numer pozycji, następnie
przesunie wskaźnik na następną pozycję. Przy pierwszy
wywołaniu funkcji wewnętrzny wskaźnik znajduje się na
pierwszej pozycji.
• Każde wywołąnie funkcji pg_feach_row( ) powoduje
zwrócenie zawartości jednego rekordu danych zawartego
w wyniku zapytania
Przykład wyświetlenia
wyniku
<?php
…..
echo( ‘<table border=”0”>’
echo( ‘<tr><td colspan=”2”><b>Wyniki></b></td></tr>’);
while ($row=pg_feach_row($wyniksql)) {
echo(‘<tr><td align=”right”>Imię; </td><td>’ .$row[1]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Nazwisko; </td><td>’ .$row[2]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Płeć; </td><td>’ .$row[3]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Data urodz; </td><td>’ .$row[4]. ‘</td></tr>’);
echo(‘<tr><td colspan=”2”> </td></tr>’);
}
echo( ‘</table>’);
?>
Funkcja pg_fetch_assoc( )
• Składnia funkcji pg_feach_assoc( ):
<?php
array pg_feach_assoc( resource wynik_zapytania_sql
[, int numer_wiersza]);
?>
• Działanie funkcji pg_feach_ assoc( ) jest podobne do
działania funkcji pg_feach_row( ), z tym że zwracana tablica
jest tablicą asocjacyjną. Nazwy poszczególnych elementów
tablicy odpowiadają nazwom pól zawartym w rekordach.
• Funkcja zwraca tablicę asocjacyjną zawierającą rekord
danych lub wartość FALSE, jeżeli niema kolejnego rekordu.
Liczba elementów tablicy odpowiada liczbie pól w rekordzie.
• Jeśli podamy opcjonalny argument numer_wiersza, funkcja
pg_feach_assoc( ) zwróci pole wybranego wiersza.
Przykład wyświetlenia
wyniku
<?php
…..
echo( ‘<table border=”0”>’
echo( ‘<tr><td colspan=”2”><b>Wyniki></b></td></tr>’);
while ($row=pg_feach_assoc($wyniksql)) {
echo(‘<tr><td align=”right”>Imię; </td><td>’ .$row[1]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Nazwisko; </td><td>’ .$row[2]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Płeć; </td><td>’ .$row[3]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Data urodz; </td><td>’ .$row[4]. ‘</td></tr>’);
echo(‘<tr><td colspan=”2”> </td></tr>’);
}
echo( ‘</table>’);
?>
Funkcja pg_fetch_array( )
• Składnia funkcji pg_feach_array( ):
<?php
array pg_feach_array( resource wynik_zapytania_sql
[, int numer_wiersza. [. int typ_wyniku]]);
?>
• Funkcja jest połączeniem funkcji pg_feach_row( )
oraz funkcji pg_feach_assoc( ) i pozwala na
zwrócenie rekordu jedno-cześnie w postaci tablicy
numerycznej i asocjacyjnej, chyba że zdecydujemy
inaczej.
• To, jakiego rodzaju tablica zostanie zwrócona przez
funkcję, zależy od wartości argumentu typ_wyniku:
– PQSQL_NUM - zwraca tablicę numeryczną
– PGSQL_ASSOC – zwraca tablicę asocjacyjną
– PGSQL_BOTH – zwraca dwie tablice numeryczną i
asocjacyjną
Przykład wyświetlenia
wyniku
<?php
…..
echo( ‘<table border=”0”>’
echo( ‘<tr><td colspan=”2”><b>Wyniki></b></td></tr>’);
while ($row=pg_feach_array($wyniksql, NUL , PGSQL_BOTH)) {
echo(‘<tr><td align=”right”>Imię; </td><td>’ .$row[1]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Nazwisko; </td><td>’ .$row[2]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Płeć; </td><td>’ .$row[3]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Data urodz; </td><td>’ .$row[4]. ‘</td></tr>’);
echo(‘<tr><td colspan=”2”> </td></tr>’);
}
echo( ‘</table>’);
?>
Funkcja pg_fetch_object( )
• Składnia funkcji pg_feach_object( ):
<?php
object pg_feach_object( resource wynik_zapytania_sql
[, int numer_wiersza]);
?>
• Funkcja zwraca obiekt, którego właściwości (typu
public) odpowiadają polom rekordu danych. Jeżeli
w wyniku zapytania SQL zwróconym przez
funkcję pg_query( ) niema więcej rekordów,
funkcja pg_fetch_object( ) zwraca wartość
FALSE.
• Nazwy właściwości obiektu zwracanego –
odpowiadają nazwom pól rekordu danych.
Przykład wyświetlenia
wyniku
<?php
…..
echo( ‘<table border=”0”>’
echo( ‘<tr><td colspan=”2”><b>Wyniki></b></td></tr>’);
while ($row=pg_feach_object($wyniksql)) {
echo(‘<tr><td align=”right”>Imię; </td><td>’ .$row[1]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Nazwisko; </td><td>’ .$row[2]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Płeć; </td><td>’ .$row[3]. ‘</td></tr>’);
echo(‘<tr><td align=”right”>Data urodz; </td><td>’ .$row[4]. ‘</td></tr>’);
echo(‘<tr><td colspan=”2”> </td></tr>’);
}
echo( ‘</table>’);
?>
Uzyskiwanie dodatkowych
informacji o zwróconych
danych
• Funkcja pg_num_row( ) – podaje liczbę rekordów
zawartą w wyniku zwróconym przez funkcję
pg_query( ).
• Funkcja pg_num_fields( ) – zwraca liczbę pól jaką
zawierają zwrócone rekordy przez funkcję pg_query( ).
• Funkcja pg_field_name( ) – zwraca nazwę pola
rekordu danych.
• Funkcja pg_field_type( ) – zwraca nazwę typu pola
rekordu danych.
• Funkcja pg_field_prtlen( ) – zwraca aktualną długość
pola (w znakach) rekordu danych.
• Funkcja pg_free_result( ) – niszczy obiekt typu
resource.
• Funkcja pg_affected_rows( ) – zwraca liczbę wierszy,
na których była wykonana operacja, jeżeli w zapytaniu
SQL użyto poleceń: INSERT, UPDATE lub DELETE.