LXXXIII. PostgreSQL

Introduction

La base de données PostgreSQL est un produit Open Source, disponible sans frais. Postgres, développé au département de Science informatique, à UC Berkeley, mis en place la majorité des concepts des bases relationnelles, actuellement disponibles sur le marché. PostgreSQL accepte le langage SQL92/SQL3, assure l'intégrité transactionnelle, et l'extension de type. PostgreSQL est une évolution du code originale de Berkeley.

Pré-requis

Pour accéder au support PostgreSQL, vous avez besoin de PostgreSQL 6.5 ou plus récent, PostgreSQL 7.0 ou plus récent pour activer toutes les fonctionnalités du moduel PostgreSQL. PostgreSQL supporte de nombreux jeux de caractères, y compris les jeux multi-octets asiatiques. La version courante et plus de détails sur PostgreSQL sont accessibles sur le site http://www.postgresql.org/ et http://techdocs.postgresql.org/.

Installation

Afin d'activer le support PostgreSQL, l'option --with-pgsql[=DIR] est nécessaire lore de la compilation de PHP. DIR est le path du dossier d'installation de PostgreSQL, et par défaut il vaut /usr/local/pgsql. Si le module shared object est disponible, le module PostgreSQL est chargeable avec la directive du fichier php.ini ou via la fonction dl().

Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Tableau 1. Options de configuration

NomPar défautModifiable
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
Pour plus de détails sur les constantes PHP_INI_*, reportez-vous à ini_set().

Voici un éclaircissement sur l'utilisation des directives de configuration.

pgsql.allow_persistent bool

Whether to allow persistent Postgres connections.

pgsql.max_persistent integer

Le nombre maximum de connexions persistantes Postgre par processus.

pgsql.max_links integer

Le nombre maximum de connexions Postgre par processus, y compris les connexions persistantes.

Trucs et astuces d'utilisation

Avertissement

Utiliser le module PostgreSQL avec PHP 4.0.6 n'est pas recommandé à cause d'un bug dans le gestionnaire d'alerte. Utilisez plutôt la version 4.1.0 ou plus récent.

Avertissement

Le nom des fonctions PostgreSQL va changer dans la version 4.2.0 pour prendre en compte les standards actuels de programmation. La plupart des nouveaux noms recevront des soulignés, comme par exemple pg_lo_open(). Certaines fonctions sont renommées différemment, comme par exemple pg_exec() en pg_query(). Les anciens noms sont toujours utilisés pour encore quelques versions, mais ils seront bientôt supprimés définitivement.

Tableau 2. Nom des fonctions qui ont changé

Ancien nomNouveau nom
pg_cmdtuples()pg_affected_rows()
pg_errormessage()pg_last_error()
pg_exec()pg_query()
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_getlastoid()pg_last_oid()
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()
pg_numrows()pg_num_rows()
pg_numfields()pg_num_fields()
pg_result()pg_fetch_result()

Les anciennes syntaxes de pg_connect()/pg_pconnect() seront rendues obsolètes pour supporter les nouvelles connexions asynchrones. Utilisez la chaîne de connexion avec pg_connect() et pg_pconnect().

Toutes les fonctions ne sont pas supportées par toutes les compilations. Cela dépend de votre librairie libpq (la librairie C client de PostgreSQL), et comment libq est compilé. Si il y a des fonctions qui manquent, libpq ne supporte par la fonctionnalité sur laquelle reposait la fonction n'est pas disponible.

Il est aussi important que vous utilisiez une version de libpq qui soit plus récente que le serveur sur lequel vous vous connectez. Si vous utilisez une version de libq plus ancienne que le serveur, vous aurez des problèmes.

Depuis la version 6.3 (03/02/1998) PostgreSQL utilise les sockets UNIX, et une table est dédiée à ces nouvelles capacités. La socket est située dans le dossier /tmp/.s.PGSQL.5432. Cette option peut être activée avec '-i' passé au postmaster et cela s'interprète: "écoute sur les sockets TCP/IP et sur les sockets Unix".

Tableau 3. Postmaster et PHP

PostmasterPHPStatut
postmaster &pg_connect("dbname=MonDbName");OK
postmaster -i &pg_connect("dbname=MonDbName");OK
postmaster &pg_connect("host=localhost dbname=MonDbName"); Unable to connect to PostgreSQL server: connectDB() failed: Impossible de se connecter au serveur PostgreSQL: connectDB() a échoué. Est ce que le postmaster fonctionne, et accepte les TCP/IP (option -i) sur le port '5432'?
postmaster -i &pg_connect("host=localhost dbname=MonDbName");OK

Il est possible de se connecter avec la commande suivante : $conn = pg_Connect("host=monHote port=monPort tty=monTTY options=myOptions dbname=myDB user=myUser password=myPassword");

L'ancienne syntaxe : $conn = pg_connect("host", "port", "options", "tty", "dbname") est obsolète.

Les variables environnementales affecent le comportement de PostgreSQL. Par exemple, le module PostgreSQL va rechercher PGHOST dans les variables d'environnement, si le nom du serveur hôte est omis dans la chaîne de connexion. Les variables d'environnement supportées sont différentes suivant les versions. Reportez vous au manuel du programmeur PostgreSQL (libpq - Environment Variables) pour plus de détails.

Assurez vous que vous avez bien configuré vos variables d'environnement pour le bon utilisateur. Utilisez $_ENV ou getenv() pour vérifier quelles variables d'environnement sont disponibles pour le processus courant.

Exemple 1. Configuration par défaut des paramètres

PGHOST=pgsql.example.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

Constantes prédefinies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

PGSQL_ASSOC (entier)

PGSQL_NUM (entier)

PGSQL_BOTH (entier)

PGSQL_CONNECTION_BAD (entier)

PGSQL_CONNECTION_OK (entier)

PGSQL_SEEK_SET (entier)

PGSQL_SEEK_CUR (entier)

PGSQL_SEEK_END (entier)

PGSQL_ESCAPE_STRING (entier)

PGSQL_ESCAPE_BYTEA (entier)

PGSQL_EMPTY_QUERY (entier)

PGSQL_COMMAND_OK (entier)

PGSQL_TUPLES_OK (entier)

PGSQL_COPY_OUT (entier)

PGSQL_COPY_IN (entier)

PGSQL_BAD_RESPONSE (entier)

PGSQL_NONFATAL_ERROR (entier)

PGSQL_FATAL_ERROR (entier)

Exemples

Depuis PostgreSQL 7.1.0, vous pouvez stocker jusqu'à 1Go dans un champ de type text. Dans les anciennes versions, vous étiez limité à la taille maximale d'un bloc (qui, par défaut, valait 8 ko, et au mieux, 32 ko, suivant le choix au moment de la compilation).

Pour utiliser l'interface des grands objets (large object (lo) interface), il est nécessaire de les placer dans un bloc de transaction. Un bloc de transaction commence avec begin et si la transaction se termine avec un commit et end. Si la transaction échoue, elle doit être conclue par un abort et rollback.

Exemple 2. Utilisation des objets de grande taille (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");
?>
Vous ne devez pas fermer la connexion au serveur PostgreSQL avant de fermer l'objet de grande taille.

Table des matières
pg_affected_rows -- Retourne le nombre de lignes affectées
pg_cancel_query -- Annule une requête asynchrone
pg_client_encoding --  Lit l'encodage du client
pg_close -- Termine une connexion PostgreSQL
pg_connect -- Ouvre une connexion PostgreSQL
pg_connection_busy -- Vérifie si la connexion PostGreSQL est occupée
pg_connection_reset -- Relance la connexion au serveur PostGresSQL
pg_connection_status -- Lit le statut de la connexion PostGreSQL
pg_convert -- Convertit un tableau associatif en une commande PostGreSQL
pg_copy_from --  Insère des lignes dans une table à partir d'un tableau
pg_copy_to -- Copie une table dans un tableau
pg_dbname -- Nom de la base de données
pg_delete -- Efface des lignes PostGreSQL
pg_end_copy -- Synchronise avec le serveur PostgreSQL
pg_escape_bytea -- Protège le caractères d'une chaîne binaire en mode bytea
pg_escape_string -- Protège une chaîne de caractères
pg_fetch_all -- Lit toutes les lignes d'un résultat
pg_fetch_array -- Lit une ligne de résultat PGSQL dans un tableau
pg_fetch_assoc --  Lit une ligne de résultat PGSQL sous forme de tableau numérique
pg_fetch_object -- Lit une ligne de résultat PGSQL dans un objet
pg_fetch_result -- Retourne les valeurs d'un résultat
pg_fetch_row -- Lit une ligne dans un tableau
pg_field_is_null -- Teste si un champ PostGreSQL est à NULL
pg_field_name -- Retourne le nom d'un champ PostGreSQL
pg_field_num -- Retourne le numéro d'une colonne
pg_field_prtlen -- Retourne la taille imprimée
pg_field_size --  Retourne la taille interne de stockage d'un champ donné.
pg_field_type -- Retourne le type d'un champ PostGreSQL donné par index
pg_free_result -- Libère la mémoire
pg_get_notify -- Lit le message de NOTIFY
pg_get_pid -- Lit l'identifiant de processus du serveur
pg_get_result -- Lit un résultat asynchrone
pg_host -- Retourne le nom d'hôte
pg_insert -- Insère un tableau dans une table
pg_last_error -- Lit le dernier message d'erreur sur la connexion
pg_last_notice --  Retourne la dernière note du serveur PostgreSQL
pg_last_oid -- Retourne l'identifiant du dernier objet
pg_lo_close -- Ferme un objet de grande taille PostgreSQL
pg_lo_create -- Crée un objet de grande taille PostgreSQL
pg_lo_export -- Exporte un objet de grande taille vers un fichier
pg_lo_import -- Importe un objet de grande taille depuis un fichier
pg_lo_open -- Ouvre un objet de grande taille PostgreSQL
pg_lo_read_all -- Lit un objet de grande taille en totalité
pg_lo_read -- Lit un objet de grande taille
pg_lo_seek --  Modifie la position dans un objet de grande taille
pg_lo_tell -- Retourne la position courante dans un objet de grande taille
pg_lo_unlink -- Efface un objet de grande taille
pg_lo_write -- Ecrit un objet de grande taille PGSQL
pg_meta_data -- Lit les données méta de la table PostGreSQL
pg_num_fields -- Retourne le nombre de champ
pg_num_rows -- Retourne le nombre de lignes PostgreSQL
pg_options -- Retourne les options PostgreSQL
pg_pconnect -- Etablit une connexion PostgreSQL persistante
pg_ping -- Pingue la connexion à la base
pg_port -- Retourne le numéro de port
pg_put_line -- Envoie une chaîne au serveur PostgreSQL
pg_query -- Exécute une requête
pg_result_error -- Lit le message d'erreur associé à un résultat
pg_result_seek -- Modifie la ligne courant dans un résultat
pg_result_status -- Lit le statut du résultat
pg_select -- Effectue une selection
pg_send_query -- Exécute une requête PostGreSQL asynchrone
pg_set_client_encoding --  Choisit l'encodage du client
pg_trace -- Active le suivi d'une connexion PostgreSQL
pg_tty -- Retourne le nom de tty
pg_unescape_bytea -- Supprime le protection d'une chaîne de type bytea
pg_untrace -- Termine le suivi d'une connexion PostgreSQL
pg_update -- Modifie les lignes d'une table