PHP Handbuch
Zurück |  | Weiter

# C. PostgreSQL Funktionen

# Einführung

PostgreSQL ist ein kostenloses Open Source Datenbanksystem. Es wurde ursprünglich im UC Berkeley Computer Science Department entwickelt und hat Pionierarbeit bei objektrelationalen Datenbankkonzepten geleistet, die jetzt Einzug in einige kommerzielle Datenbanken halten. PostgreSQL bietet SQL92/SQL99 Sprachunterstützung, Transaktionen, referentielle Integrität, benutzerdefinierte Funktionen und ein erweiterbares Typkonzept. PostgreSQL ist eine Weiterentwicklung des ursprünglichen Berkeley-Codes.

# Anforderungen

Um PostgreSQL benutzen zu können, brauchen Sie mindestens eine Version 6.5 oder später, um alle Leistungsmerkmale des PostgreSQL-Moduls nutzen zu können, müssen Sie eine Version ab 7.0 haben. PostgreSQL unterstützt viele Zeichencodierungen, einschließlich multibyte character encoding. Die aktuelle Version sowie weitere Informationen über PostgreSQL sind auf den Seiten http://www.postgresql.org/ und http://techdocs.postgresql.org/ erhältlich.

# Installation

Um die PostgreSQL-Unterstützung zu aktivieren müssen Sie PHP mit der Option --with-pgsql[=DIR] kompilieren. DIR ist das Basis Installationsverzeichnis von PostgreSQL, normalerweise `/usr/local/pgsql`. Falls das shared-object-Modul verfügbar ist, kann PostgreSQL mit der extension-Directive in `php.ini` oder der Funktion dl() geladen werden.

# Laufzeit Konfiguration

Das Verhalten dieser Funktionen wird durch Einstellungen in der `php.ini` beeinflusst.

Tabelle 1. PostgreSQL Konfigurationsoptionen

Name | Standard | Änderbar
--- | --- | ---
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM
pgsql.max_links | "-1" | PHP_INI_SYSTEM
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM
pgsql.ignore_notice | "0" | PHP_INI_ALL
pgsql.log_notice | "0" | PHP_INI_ALL

Für weitere Details und Definitionen der PHP_INI_* Konstanten wird auf ini_set() verwiesen.

Hier sind kurze Erläuterungen zu den Konfigurationsdirektiven:

pgsql.allow_persistent boolean

  Bestimmt, ob persistente PostgreSQL-Verbindungen zulässig sind.

pgsql.max_persistent integer

  Legt die maximale Anzahl persistenter PostgreSQL-Verbindungen pro Prozess fest.

pgsql.max_links integer

  Legt Die maximale Anzahl aller PostgreSQL-Verbindungen, einschliesslich der persistenten Verbindungen, pro Prozess fest.

# Hinweise

Warnung
Wegen eines Bugs in der Behandlung von NOTICE-Benachrichtigungen sollte das PostgreSQL-Modul der PHP Version 4.0.6 nicht benutzt werden. Bitte benutzen Sie PHP 4.1.0 oder höher.

Warnung
Die Namen der PostgreSQL-Funktionen wurden ab der PHP Version 4.2.0 geändert, um sie an die gültigen Coding-Standards anzupassen. Die meisten neuen Namen enthalten zusätzliche Unterstriche, z.B. pg_lo_open(). Einige Funktionen wurden der Einheitlichkeit wegen umbenannt, z.B. pg_exec() zu pg_query(). Die älteren Namen können in der Version 4.2.0 und auch ein paar Releases danach noch verwendet werden, aber sie werden irgendwann gelöscht. Tabelle 2. Die geänderten Funktionsnamen
Alter Name | Neuer Name
--- | ---
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_openk()
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()
Die veraltete Syntax von pg_connect() und pg_pconnect() wird ungültig werden, um zukünftig asynchrone Verbindungen zu unterstützen. Bitte benutzen Sie einen Verbindungsstring mit pg_connect() bzw. pg_pconnect().

Nicht alle Funktionen sind in allen Versionen verfügbar. Es hängt davon ab, welche libpq Version (das PostgreSQL C Client Interface) auf Ihrem Rechner verfügbar ist und wie libpq kompiliert wurde. Falls eine Funktion nicht verfügbar ist, liegt es daran, dass libpq die nötigen Routinen nicht unterstützt, die die Funktion braucht.

Es ist außerdem wichtig, dass Ihre libpq nicht älter ist, als der PostgreSQL-Server, zu dem Sie eine Verbindung aufbauen. Wenn Sie eine libpq benutzen, die älter ist, als vom PostgreSQL-Server erwartet, werden Sie wahrscheinlich Probleme haben.

Seit Version 6.3 (03/02/1998) benutzt PostgreSQL per Voreinstellung Unix Domain Sockets. Ein TCP/IP Port wird NICHT standardmäßig geöffnet. In der untenstehenden Tabelle werden diese neuen Verbindungsmöglichkeiten gezeigt. Der Socket ist in `/tmp/.s.PGSQL.5432` zu finden. Der Schalter -i, der dem postmaster mitgegeben werden kann, weist diesen an, sowohl über TCP/IP Sockets als auch über UNIX Domain Sockets eine Verbindung aufzubauen.

Tabelle 3. Der Postmaster und 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 /pfad/zu/datei.php on line 20.
postmaster -i & | pg_connect("host=localhost dbname=MyDbName"); | OK

Eine Verbindung zu einem PostgreSQL-Server lässt sich auch mit den folgenden Wertepaaren, die im Verbindungsstring gesetzt werden, herstellen (wobei mindestens der Name der Datenbank angegeben sein muss): $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ");

Die bisherige Syntax $conn = pg_connect ("host", "port", "options", "tty", "dbname") ist veraltet und sollte nicht weiter verwendet werden.

Umgebungsvariablen beeinflussen das Server/Client-Verhalten von PostgreSQL. Zum Beispiel sucht das PostgreSQL-Modul nach der Umgebungsvariablen PGHOST, falls der Hostname im Verbindungsstring nicht angegeben wurde. Die unterstützten Umgebungsvariablen variieren von Version zu Version. Schauen Sie für weitere Informationen in den PostgreSQL Programmer's Guide (nach den libpq Umgebungsvariablen).

Versichen Sie sich, dass Sie die Umgebungsvariable für den aktuellen Benutzer gesetzt haben. Um sich die Umgebungsvariablen, die für den aktuellen Prozess verfügbar sind, anzeigen zu lassen, benutzen Sie $_ENV oder getenv().

Beispiel 1. Umgebungsvariablen setzen
`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`

# Vordefinierte Konstanten

Folgende Konstanten werden von dieser Erweiterung definiert und stehen nur zur Verfügung, wenn die Erweiterung entweder statisch in PHP kompiliert oder dynamisch zur Laufzeit geladen wurde.

`PGSQL_ASSOC` (integer)

`PGSQL_NUM` (integer)

`PGSQL_BOTH` (integer)

`PGSQL_CONNECTION_BAD` (integer)

`PGSQL_CONNECTION_OK` (integer)

`PGSQL_SEEK_SET` (integer)

`PGSQL_SEEK_CUR` (integer)

`PGSQL_SEEK_END` (integer)

`PGSQL_ESCAPE_STRING` (integer)

`PGSQL_ESCAPE_BYTEA` (integer)

`PGSQL_EMPTY_QUERY` (integer)

`PGSQL_COMMAND_OK` (integer)

`PGSQL_TUPLES_OK` (integer)

`PGSQL_COPY_OUT` (integer)

`PGSQL_COPY_IN` (integer)

`PGSQL_BAD_RESPONSE` (integer)

`PGSQL_NONFATAL_ERROR` (integer)

`PGSQL_FATAL_ERROR` (integer)

# Beispiele

Ab der PostgreSQL Version 7.1.0 ist die maximale Grösse eines Feldes mit dem Datentyp text 1GB. Ältere PostgreSQL Versionen begrenzten Felder vom Typ text auf Blockgrösse (normalerweise 8 KB bis maximal 32 KB, falls dies bei der Kompilation angegeben wurde).

Um die Large Object-Schnittstelle (lo) zu benutzen, ist es nötig, die Large-Object-Funktionen in einen Transaktionsblock einzuschließen. Ein Transaktionsblock beginnt mit einem SQL-Befehl BEGIN und endet, falls die Transaktion gültig war, mit COMMIT oder END. Wenn die Transaktion fehlschlägt, sollte sie mit ROLLBACK oder ABORT geschlossen werden.

Beispiel 2. Large Objects benutzen
`<?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, "Daten des Large Objects"); pg_lo_close ($handle); pg_query ($database, "commit"); ?>`

Schließen Sie zuerst das Large Object, bevor Sie die Verbindung zum PostgreSQL Server schließen.

Zurück | Zum Anfang | Weiter
pfpro_version | Nach oben | pg_affected_rows