Podręcznik PHP
Poprzedni |  | Następny

# C. PostgreSQL

PostgreSQL, stworzony początkowo na Wydziale Nauk Komputerowych Uniwersytetu Berkeley, był pionierem wielu koncepcji obiektowych obecnie dostępnych w komercyjnych bazach danych. Jest zgodny z ze standardami języka SQL92/SQL3, obsługuje transakcje i pozwala definiować własne typy danych. PostgreSQL jest wolno-dostępnym spadkobiercą oryginalnego kodu Berkeley.

PostgreSQL jest produktem Open Source i jest dostępny za darmo. Aby korzystać wsparcia dla PosgreSQL-a, będziesz potrzebował PostgreSQL w wersji 6.5 lub nowszej. Aby wykorzystać wszystkie możliwości modułu potrzebny jest PostgreSQL 7.0 lub nowszy. PostgreSQL wspiera wiele stron kodowych, z wielobajtowymi włącznie. Aktualna wersja i więcej informacji jest dostępne tu: http://www.postgresql.org/.

W celu uruchomienia wsparcia dla PostgreSQL-a, należy użyć opcji --with-pgsql[=DIR] w czasie kompilacji PHP. Jeśli jest dostępny współdzielony moduł, może on być załadowany przez wpisanie dyrektywy extension w pliku `php.ini` lub funkcji dl(). Wspierane dyrektywy ini są opisane w pliku `php.ini-dist` który jest zawarty w dystrybucji źródłowej.

Ostrzeżenie
Używanie modułu PostgreSQL z PHP 4.0.6 nie jest zalecane ze względu na błąd w obsłudze komunikatów. Zaleca się używanie wersji 4.1.0 lub nowszej.

Ostrzeżenie
Nazwy funkcji PostgreSQL będą zmienione w wersji 4.2.0 w celu dostosowania do obecnych standardów kodowania. Większość nowych nazw będzie miała dodatkowe podkreślenia np. pg_lo_open(). Niektóre funkcje będą miały zmienione nazwy, aby ujednolicić nazewnictwo np. pg_exec() na pg_query(). Stare nazwy będzie można używać w wersji 4.2.0 i w kilku kolejnych, mogą jednak być usunięte w przyszłości. Tabela 1. Zmienione nazwy funkcji
Stara nazwa | Nowa nazwa
--- | ---
pg_exec() | pg_query()
pg_getlastoid() | pg_last_oid()
pg_cmdtuples() | pg_affected_rows()
pg_numrows() | pg_num_rows()
pg_numfields() | pg_num_fields()
pg_fieldname() | pg_field_name()
pg_fieldsize() | pg_field_size()
pg_fieldnum() | pg_field_num()
pg_fieldprtlen() | pg_field_prtlen()
pg_fieldisnull() | pg_field_is_null()
pg_freeresult() | pg_free_result()
pg_result() | pg_fetch_result()
pg_loreadall() | pg_lo_read_all()
pg_locreate() | pg_lo_create()
pg_lounlink() | pg_lo_unlink()
pg_loopen() | pg_lo_open()
pg_loclose() | pg_lo_close()
pg_loread() | pg_lo_read()
pg_lowrite() | pg_lo_write()
pg_loimport() | pg_lo_import()
pg_loexport() | pg_lo_export()
Stara składnia pg_connect()/ pg_pconnect() będzie wycofywana aby zapewnić w przyszłości wsparcie dla asynchronicznych połączeń. Prosimy używać łańcucha połączeniowego dla pg_connect() i pg_pconnect().

Nie wszystkie funkcje są wspierane przez wszystkie wersje. Zależy to od twojej wersji libpq (Interfejs C klienta PostgreSQL) i sposobu jej kompilacji. Jeśli brakuje jakiejś funkcji, libpq nie będzie wspierać danej funkcjonalności.

Jest istotne żeby używać nowszej biblioteki libpq niż serwer PostgreSQL z którym się łączymy. Jeśli libpq jest starsze niż oczekiwane przez serwer PostgreSQL, możesz mieć problemy.

Od wersji 6.3 (03/02/1998) PostgreSQL używa gniazdek domen unixowych ("unix domain socket"). Port TCP NIE będzie domyślnie otwarty. Poniższa tabela pokazuje te nowe rodzaje połączeń. Plik gniazdka znajduje się w `/tmp/.s.PGSQL.5432`. Ta opcja może być odblokowana przez użycie flagi '-i' z poleceniem postmaster i oznacza: "nasłuchuj na gniazdkach TCP/IP oraz na gniazdkach domen unixowych".

Tabela 2. PostgreSQL Postmaster i PHP

Postmaster | PHP | Status
--- | --- | ---
postmaster & | pg_connect("dbname=MyDbName"); | OK
postmaster -i & | pg_connect("dbname=MyDbName"); | OK
postmaster & | pg_connect("host=localhost dbname=MyDbName"); | Unable to connect to PostgreSQL server: connectDB() failed: Is the postmaster running and accepting TCP/IP (with -i) connection at 'localhost' on port '5432'? in /path/to/file.php on line 20.
postmaster -i & | pg_connect("host=localhost dbname=MyDbName"); | OK

Połączenie do serwera PostgreSQL może być nawiązane poprzez ustawienie następujących wartości w łańcuchu połączenia: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ");

Poprzednia składnia: $conn = pg_connect ("host", "port", "options", "tty", "dbname") jest wycofywana.

Zmienne środowiskowe wpływają na zachowanie klienta i serwera PostgreSQL. Przykładowo, moduł PostgreSQL będzie poszukiwał zmiennej PGHOST kiedy nazwa serwera będzie pominięta w łańcuchu połączeniowym. Używane zmienne środowiskowe zmieniają się wraz z wersjami. Szczegóły można znaleźć w PostgreSQL Programmer's Manual (libpq - Environment Variables).

Upewnij się że ustawiłeś zmienne środowiskowe dla właściwego użytkownika. Użyj $_ENV lub getenv() aby sprawdzić jakie zmienne środowiskowe są dostępne dla bieżącego procesu.

Przykład 1. Ustawianie domyślnych parametrów
    PGHOST=psgql.exmaple.com
    PGPORT=7890
    PGDATABASE=web-system
    PGUSER=web-user
    PGPASSWORD=secret
    PGDATESTYLE=ISO
    PGTZ=JST
    PGCLIENTENCODING=EUC-JP

    export PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD PGDATESTYLE PGTZ PGCLIENTENCODING

Poczynając od PostgreSQL 7.1.0, jedno pole typu text może pomieścić do 1GB. Wcześniejsze wersje limitowały wielkość pola do rozmiaru bloku (domyślnie 8KB, maksymalnie 32KB, definiowane przy kompilacji).

Użycie interfejsu wielkich obiektów (LO - Large Objects) wymaga zamknięcia go wewnątrz bloku transakcji. Transakcja rozpoczyna się poleceniem SQL BEGIN i - jeśli transakcja się powiedzie - kończy się poleceniem COMMIT lub END. Jeśli transakcja nie powiedzie się, powinna być zakończona poleceniem ROLLBACK lub ABORT.

Przykład 2. Używanie wielkich obiektów (Large Objects)
`<?php $database = pg_connect ("dbname=jacarta"); pg_query ($database, "begin"); $oid = pg_lo_create ($database); echo "$oid\n"; $handle = pg_lo_open ($database, $oid, "w"); echo "$handle\n"; pg_lo_write ($handle, "large object data"); pg_lo_close ($handle); pg_query ($database, "commit"); ?>`

Nie wolno zamykać połączenia do serwera PostgreSQL, przed zamknięciem wielkiego obiektu.

Poprzedni | Spis treści | Następny
pfpro_version | Początek rozdziału | pg_affected_rows