Développer pour Oracle en PHP – Gestion de la connexion

code php

L’idée de ces pages de blogs est de créer une classe PHP simplifiant les interractions avec Oracle. Basée sur OCI. Pour mémoire la base pour se connecter à Oracle en utilisant PHP est l’instruction suivante :

  function oraConnect ($user, $password, $cnxInfo, $cnxMode) {
    $conn=oci_pconnect($user,$password,$cnxInfo,'AL32UTF8',$cnxMode);
    if ( !$conn ) {
      return FALSE;
    } else {
      return $conn;
    }
  }

Ca manque cruellement d’intérêt et ce n’est au final qu’une réécriture de la fonction oci_pconnect. Ce que je voudrais dans cette classe c’est pouvoir exécuter une requête, éventuellement tirée d’un fichier, éventuellement versionnable et la sortir au format que je souhaite (csv, json, table …) le tout dans une session personnalisée

class myOracle {
  private $conn ;

  function __construct() {
    return $this;
  }

  function connect ($user, $password, $cnxInfo, $cnxMode) {
    $conn=oci_pconnect($user,$password,$cnxInfo,'AL32UTF8',$cnxMode);
    if ( !$conn ) {
      return FALSE;
    } else {
      $this->conn=$conn;
    }
    ...
  }

  function execSql ($sqlText, $binds=array(), $format='array') {
    ...
  }

  function execSqlFromFile ($sqlFile, $binds=array(), $format='array') {
    ...
  }

  ...
}

Concernant la connexion, je souhaite l’identifier, formater les sorties par défaut et influencer le fonctionnement de l’optimiseur de requêtes de manière à ignirer les valeurs des variables lors de la détermination des plans (oui, vous l’avez compris, je souhaite que ma session soit en « cursor_sharing=FORCE ») et enfin je souhaite que les tris soient effectués en mode binaire sans tenir compte de la langue car j’ai ma petite idée d’application et les tris en langue locale n’y seront pas nécessaires. Au final j’obtiens la fonction connect suivante:

/**
 * Se connecte à une base de donnée oracle et positionne des variables de session Oracle
 *
 * @param  string $user
 * @param  string $password
 * @param  string $cnxInfo
 * @param  string $cnxMode
 * @return void
 */
  function connect (string $user,string $password,string $cnxInfo,string $cnxMode) {
    $conn=oci_pconnect($user,$password,$cnxInfo,'AL32UTF8',$cnxMode);
    if ( !$conn ) {
      return FALSE;
    } else {
      $this->conn=$conn;
    }
    oci_set_module_name($conn,'MyModule');
    
    $sql="alter session set cursor_sharing=FORCE";
    $stmt=oci_parse($conn,$sql);
    oci_execute($stmt);

    $sql="alter session set NLS_NUMERIC_CHARACTERS='.,'";
    $stmt=oci_parse($conn,$sql);
    oci_execute($stmt);

    $sql="alter session set NLS_SORT='binary'";
    $stmt=oci_parse($conn,$sql);
    oci_execute($stmt);

    $sql="alter session set NLS_DATE_FORMAT='YYYY-MM-DD\"T\"HH24:MI:SS'";
    $stmt=oci_parse($conn,$sql);
    oci_execute($stmt);

    $sql="alter session set NLS_TIMESTAMP_FORMAT='YYYY-MM-DD\"T\"HH24:MI:SS'";
    $stmt=oci_parse($conn,$sql);
    oci_execute($stmt);
  }

On note l’ajoût d’un commentaire au format PHPDoc, nécessaire pour la maintenance et le typage des paramètres comme permis par PHP 8.

La fonction oci_pconnect utilisée pour se connecter à une base de données l’a été de manière basique, elle est documentée sur le site de documentation PHP et permet entr’autres choses l’utilisation d’un wallet ou l’authentification via Kerberos, mais aussi le choix de l’encodage de travail.

Le code de la leçon est disponible sur notre gitlab (Chapitre-0001). il doit évidemment être adapté pour pouvoir se connecter à votre base.