LXXX. PostgreSQL Funktionen

PostgreSQL, ursprünglich entwickelt im UC Berkeley Computer Science Department, hat Pionierarbeit bei objektrelationalen Datenbankkonzepten geleistet, die jetzt Einzug in kommerzielle Datenbanken halten. PostgreSQL bietet SQL92/SQL99 Sprachunterstützung, Transaktionen und ein erweiterbares Typkonzept. PostgreSQL ist eine Public Domain und Open Source Weiterentwicklung des ursprünglichen Berkeley-Codes.

PostgreSQL ist ein Open Source Produkt und kostenlos erhältlich. 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 der Seite www.postgresql.org erhältlich.

Um die PostgreSQL-Unterstützung nutzen zu können, müssen Sie PHP mit "--with-pgsql[=DIR]" kompilieren. Falls das shared object module verfügbar ist, kann das PostgreSQL-Modul mit der extension-Direktive der Datei php.ini geladen werden oder mittels der Funktion dl(). Die unterstützten ini-Direktiven sind in der Datei php.ini-dist beschrieben, die mit der Distribution ausgeliefert wird.

Warnung

Wegen eines Bugs in der Behandlung von NOTICE-Benachrichtigungen sollte das PostgreSQL-Modul der PHP Version 4.0.6 nicht benutzt werden.

Warnung

Die Namen der PostgreSQL-Funktionen werden sich ab der PHP Version 4.2.0 ändern, um sie an die gültigen Coding-Standards anzupassen. Die meisten neuen Namen enthalten zusätzliche Unterstriche, z.B. pg_lo_open(). Einige Funktionen werden 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. Die CVS-Version benutzt die neuen Funktionsnamen.

Tabelle 1. Die geänderten Funktionsnamen

Alter NameNeuer 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_unlink()
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()/pg_pconnect wird ungültig werden, um zukünftig asynchrone Verbindungen zu unterstützen. Bitte benutzen Sie einen Verbindungsstring mit pg_connect() und 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 neuer 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 als auch über UNIX Domain Sockets eine Verbindung aufzubauen.

Tabelle 2. Der Postmaster und PHP

PostmasterPHPStatus
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

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 8KB 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 abort oder rollback 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 schließen.

Inhaltsverzeichnis
pg_affected_rows -- Gibt die Anzahl betroffener Datensätze (Tupel) zurück
pg_cancel_query --  Löscht eine asynchrone Abfrage
pg_client_encoding --  Liefert die Kodierung des Clients
pg_close -- Schließt eine PostgreSQL-Verbindung
pg_connect -- Öffnet eine PostgreSQL Verbindung
pg_connection_busy --  Gibt den Status der Verbindung zurück (busy/not busy)
pg_connection_reset --  Setzt die Verbindung zurück und verbindet neu
pg_connection_status --  Gibt den Verbindungsstatus zurück
pg_convert --  Convert associative array value into suitable for SQL statement.
pg_copy_from --  Fügt Datensätze aus einem Array in eine Tabelle ein
pg_copy_to --  Kopiert eine Tabelle in ein Array
pg_dbname -- Gibt den Namen der Datenbank zurück
pg_delete --  Delete records.
pg_end_copy -- Synchronisation mit dem PostgreSQL-Server
pg_escape_bytea --  Maskiert Binärdaten für den Typ bytea
pg_escape_string --  Maskiert einen String für die text/char Datentypen
pg_fetch_array -- Holt eine Zeile als Array
pg_fetch_object -- Holt einen Datensatz als Objekt
pg_fetch_result -- Liefert Werte aus einer Ergebnismenge
pg_fetch_row -- Holt einen Datensatz als nummerisches Array
pg_field_is_null -- Prüft, ob ein Feld NULL ist
pg_field_name -- Gibt den Namen eines Feldes zurück
pg_field_num -- Liefert die Feldnummer des angegebenen Feldes
pg_field_prtlen -- Gibt die Länge des Feldes zurück
pg_field_size --  Liefert die interne Speichergröße des bezeichneten Felds
pg_field_type --  Liefert den Feldtyp der entsprechenden Feldnummer
pg_free_result -- Gibt den durch Ergebnisse belegten Speicher frei
pg_get_result --  Gibt asynchrone Abfrageergebnisse zurück
pg_host --  Gibt den Namen des Host zurück, zu dem verbunden wurde
pg_insert --  Insert array into table.
pg_last_error -- Gibt die letzte Fehlermeldung einer Verbindung zurück
pg_last_notice --  Gibt die letzte NOTICE-Meldung des PostgreSQL-Servers zurück
pg_last_oid --  Gibt den Objektbezeichner eines neu eingefügten Datensatzes zurück
pg_lo_close -- Schließt ein Large Object
pg_lo_create -- Erzeugt ein Large Object
pg_lo_export -- Exportiert ein Large Object in eine Datei
pg_lo_import --  Importiert ein Large Object aus einer Datei
pg_lo_open -- Öffnet ein Large Object
pg_lo_read_all --  Liest ein Large Object vollständig und reicht es direkt an den Browser weiter
pg_lo_read -- Liest ein Large Object
pg_lo_seek --  Seeks position of large object
pg_lo_tell --  Returns current position of large object
pg_lo_unlink -- Löscht ein Large Object
pg_lo_write -- Schreibt in ein Large Object
pg_metadata --  Get metadata for table.
pg_num_fields -- Gibt die Anzahl der Felder zurück
pg_num_rows -- Gibt die Anzahl der Zeilen zurück
pg_options -- Liefert die Verbindungsoptionen
pg_pconnect --  Öffnet eine persistente PostgreSQL-Verbindung
pg_port --  Gibt die Portnummer zurück, mit der die Verbindung aufgebaut wurde
pg_put_line --  Sendet eine NULL-terminierte Zeichenkette zum PostgreSQL-Server
pg_query -- Führt eine Abfrage aus
pg_result_error --  Gibt eine Fehlermeldung zu einer Ergebniskennung zurück
pg_result_status --  Gibt den Status eines Abfrageergebnisses zurück
pg_select --  Select records.
pg_send_query --  Sendet eine asynchrone Abfrage
pg_set_client_encoding --  Setzt die Kodierung des Clients
pg_trace --  Ermöglicht die Protokollierung einer Verbindung
pg_tty --  Gibt den tty-Namen zurück, der mit der Verbindung verknüpft ist.
pg_untrace --  Beendet die Protokollierung der Verbindung
pg_update --  Update table.