Designed by Derf !
34 en ligne
  Forum | Actu | Glossaire | Codes | Tips | Liens | Livres | Annuaire
 

 Recherche





   

Oracle et PHP

Scripts utiles avec les fonctions ora_...





iubito
J'ai tellement galéré pendant mon stage pour me connecter à une base Oracle avec PHP (sous nunux), que j'ai décidé de partager les bouts de scripts utiles, select/update/insert... et quelques explications... Vous avez de la chance ;)

Cet article est également disponible sur mon site perso à l'adresse http://iubito.free.fr/prog/oracle.php avec plus de mise en page ;-)

Pour ceux qui ne le savent pas, Oracle est une base de données ;-)
Tout comme MySQL a un fort succès auprès du grand public, Oracle est l'une des bases de données les plus rencontrées en entreprise.
Donc, ces scripts ne serviront pas à Monsieur ToutLeMonde qui fait son pauv' site sur free ou wanadoo... Non ! Ils serviront à ceux qui font un stage dans une boîte bien branchée Oracle. Voilà !


Installation - Connexion/Déconnexion - Requête SELECT - Autres requêtes - Tout ça dans une classe ? - Conclu


Je viens de trouver un outil qui permet de gérer une base Oracle par PHP (un peu comme PhpMyAdmin ou Eskuel).

OracleToolBox

Je ne peux pas tester mais ça me semble pas mal ;-) Si quelqu'un teste, qu'il le dise !


Pour accèder à une base de données Oracle, il y a en PHP les "vieilles" fonctions (qui commencent par ora_) et les nouvelles : les OCI (Oracle Call Interface) à partir de Oracle 8i (8.1.5).
L'interface OCI peut être utilisée avec beaucoup de langages de programmation comme par exemple en Pro_Cobol ou en Pro_C.

Si vous programmez en PHP3 ou avec Oracle < 8i, seules les fonctions ora_ sont accessibles.
Il se peut aussi que le script de configuration de PHP ne détecte pas la bonne version d'Oracle (à cause du changement de nom du répertoire orainst...). C'est ce qui s'est produit pour moi. Oracle 8.1.7 était détecté en version 7.3 par PHP.

Donc, pour une question de compatibilité avec Oracle 7 et PHP3, les codes de ce tutorial utilisent les fonctions ora_, d'autant plus que les fonctions ora_ sont supportées par les versions récentes d'Oracle.

Oracle fonctionne en client/serveur, c'est-à-dire qu'un serveur contient les données et que tous les ordinateurs de l'entreprise possèdent la version "client" : les utilitaires tels que SQL*Plus (pour faire des requêtes).
Le serveur web Apache est installé sur une machine possèdant le client.



Installation

Sous Linux :

Oracle utilise des "variables d'environnement". Il peut se poser des problèmes d'utilisateurs.
Sur une machine on va trouver par exemple :

  • root, le maître de la machine qui possède tous les droits ;
  • oracle, l'utilisateur qui a installé la base Oracle et qui est y accède ;
  • apache, un utilisateur qui a souvent des droits plus limités, puisque c'est le serveur web.
Lorsqu'on appelle un page web de cette machine, c'est le serveur Apache qui nous répond, et il travaille sous le nom d'utilisateur "apache".

Or notre objectif est qu'Apache (et plus particulièrement le module PHP) accède à Oracle. Mais l'utilisateur qui accède à Oracle est oracle.
On résoud le problème en créant des variables d'environnement pour l'utilisateur apache.

Les variables suivantes sont à ajouter dans le fichier .bashrc. Pour prendre les valeurs exactes, cherchez ces variables dans le .bashrc de l'utilisateur oracle.

#----------------------------------------
#Variables pour Oracle
#----------------------------------------
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/8.1.7
export ORACLE_DOC=$ORACLE_HOME/odoc
export PATH=$ORACLE_HOME/bin:/home/oracle/outil:$PATH
export NLS_LANG=FRENCH_FRANCE.WE8ISO8859P1
export NLS_DATE_FORMAT=dd/mm/yyyy_hh24:mi:ss
export NLS_SORT=BINARY
export NLS_NUMERIC_CHARACTERS=".,"

Grâce à ces variables d'environnement, l'utilisateur apache peut se connecter à la base et donc les pages PHP y faisant appel fonctionnent.

Compilation d'Apache :

Pour de la documentation et pour télécharger Apache, visitez sur http://httpd.apache.org/.
Téléchargez dans le répertoire /usr/local/, décompressez le tar.gz dans un répertoire que vous renommerez apache.

Dans un shell, placez-vous dans le répertoire /usr/local/apache et tapez successivement les lignes suivantes : cd /usr/local/apache
./configure --prefix=/usr/local/apache
make
make install

Ensuite on démarre apache :
/usr/local/apache/bin/apachectl start
et on se connecte à http://IP_DE_LA_MACHINE/. Si vous obtenez un résultat semblable à l'image ci-dessous, Apache fonctionne :-)

Pour continuer, on arrête Apache :
/usr/local/apache/bin/apachectl stop

Installation PHP :

Pour de la documentation et pour télécharger PHP, tout se trouve sur le site http://fr.php.net/.
Téléchargez dans le répertoire /usr/local/, décompressez le tar.gz dans un répertoire que vous renommerez php.

Pour installer PHP, tapez les commandes suivantes :
cd /usr/local/php
./configure --with-oracle=$ORACLE_HOME \
--with-oci8=$ORACLE_HOME \
--with-config-file=/usr/local/apache/conf \
--with-apache=/usr/local/apache \
--enable-track-vars
make
make install

Le ./configure est une seule commande, les \ (backslash) en fin de ligne permettent d'aller à la ligne pour rendre le code plus lisible. Si vous n'êtes pas sûr, enlever les \ et les retours à la ligne, la commande marchera.
Notez bien les paramètres --with-oracle et --with-oci8. Pour ce tutorial, seul le paramètre --with-oracle est utile vu que je ne parlerai pas des fonction OCI.

Recompilation d'Apache :

Maintenant nous allons dire à Apache de supporter le PHP.
cd /usr/local/apache
./configure --activate-module=src/modules/php4/libphp4.a \
--enable-module=so
make
make install

Sous windows c'est plus simple, il suffit à priori de d'enlever le ; de la ligne
;extension=php_oci8.dll
;extension=php_oracle.dll

du php.ini qui se trouve normalement dans le répertoire de Windows (c:\windows ou c:\winnt)


Maintenant il ne reste plus qu'à démarrer Apache et passer au code PHP.



Connexion/Déconnexion

Documentation PHP : ora_logon - ora_logoff.

Nous allons créer deux fichiers appelés connexion.php et deconnexion.php, qui auront pour seule fonction l'ouverture et la fermeture de la connexion à la base de données.

Petit aparté à propos des connexions permanentes :
Personnellement je n'utilise pas les connexion permanentes en PHP pour les raisons suivantes :
  • Une connexion permanente veut dire que la connexion n'est pas fermée pendant que l'utilisateur lit la page, et quand il demande une autre page la connexion est déjà ouverte. C'est bien, mais le serveur est vite encombré si plusieurs utilisateurs surfent en même temps sur le site !
  • De même, comment savoir si le surfeur est toujours là où il est parti ? Impossible, donc on ferme arbitrairement la connexion au bout de quelques minutes...
Le système des classes de Java permet de faire des connexion permanentes, une classe instanciée au démarrage ouvre plusieurs connexions, et quand une page en a besoin, elle la prend, puis la rend.
Peut-être qu'en PHP5 on pourra faire ça ? ;-)

Aller on attaque le code :-p
Voici le fichier connexion.php :
<?php
// connexion.php se connecte à la base.
$ora_conn = ora_logon("NomDeLaBase@service","pass");
?>

NomDeLaBase et pass, ça devrait pas poser trop de problèmes ;) Le service (ou TNS) est un nom du service utilisé par les applications "client" d'Oracle installées sur la même machine. Il est donc nécessaire de connaître ces infos, demandez au DBA Oracle.

Voici maintenant le fichier deconnexion.php qui ferme la connexion $ora_conn :
<?php
// Se déconnecter de la base
ora_logoff($ora_conn);
?>

En cas d'erreur ORA-12545, vérifiez les variables d'environnement, le fichier tnsnames.ora (votre DBA Oracle connais mieux ce fichier que moi !).

Dans chaque page nécessitant une connexion à la base de données, il faut inclure les fichiers connexion au début et déconnexion à la fin.
<? include("connexion.php");
// blabla
include("deconnexion.php"); ?>



Requête SELECT

Documentation PHP : ora_do - ora_numcols - ora_columnname - ora_getcolumn - ora_fetch.
Notez que ora_do est la combinaison de ora_parse, ora_exec et ora_fetch.

Faire une requête "SELECT ..." sur Oracle via PHP n'est pas tout simple.

Le but est de rendre le code le plus lisible... Il est possible de faire un fichier inclus, appelé select.php par exemple, et qui va réaliser le travail, pourvu qu'on lui indique la requête.
Voici donc comment faire une requête de sélection.

Suite à la question très judicieuse de sharareh, j'ai mis à jour le code pour que l'on récupère un tableau avec les noms des colonnes. C'est beaucoup plus souple à utiliser, par exemple quand vous ajoutez une colonne à la requête, plus de soucis ! ;-)
Donc merci Sharareh !

Je laisse l'ancien code au moins provisoirement en page 2 de ce tutorial.

<?php include("connexion.php");
echo "Liste des people";
$query="select nom, prenom from people where...";
include("includes/select.php");
// Connaître le nombre de résultats :
echo "Il y a " . count($results) . " résultats."
// Parcours du tableau $results pour afficher les résultats :
if (count($results)) // Si y'a des résultat
{
 reset($results); // se placer à la première ligne du tableau $results
 while($res=each($results)) // Parcourir le tableau $results
 {
  echo $res[1]['NOM']; // nom
  echo $res[1]['PRENOM']; // prenom
  // Attention, il faut bien mettre les noms de colonnes en MAJUSCULE
  // et entre ' et ' ou " et "
 }
}
else // Pas de résultat
{ echo "Y'a personne :("; }
include("deconnexion.php"); ?>

C'est assez lisible quand même... maintenant imagine c'qu'il y a dans le fichier select.php ;)
Bon aller cherche plus, voilà c'qu'il y a... :

<? // Il suffit de mette en commentaire error_reporting pour faire du
// débogage - voir quand il n'y a aucun résultat "NO DATA FOUND" par exemple.
error_reporting(0);

// Crée un tableau, un curseur, compte les colonnes,
// fait le fetch en insérant dans le tableau.
$results = array();
$ora_cur = ora_do($ora_conn, $query);

if ($ora_cur)
{
  // Nombre de colonnes
  $numCols = ora_numcols($ora_cur);

  // Prends la première ligne et la met dans le tableau...
  $row = array();
  for($i=0; $i<$numCols; $i++)
  { // Parcours des colonnes
    $row[ora_columnname($ora_cur, $i)] = ora_getcolumn($ora_cur,$i);
  }
  array_push($results,$row);

  // "Fetch" des lignes, une par une, en créant un tableau pour chaque ligne.
  // Chaque tableau est inséré à la suite du tableau $results.
  while (ora_fetch($ora_cur))
  { // Pour chaque ligne
    $row = array();
    for($i=0; $i<$numCols; $i++)
    { // Chaque colonne
      $row[ora_columnname($ora_cur, $i)] = ora_getcolumn($ora_cur,$i);
    }
    array_push($results,$row);
  }
}
// Le fameux error_reporting. Mettre en commentaire pour voir les NO_DATA_FOUND.
error_reporting(1);
?>

Imagine si on mettait ce code à chaque requête ! Donc INCLUSION DE FICHIER O-BLI-GA-TOIRE !!! ;)

Bon j'explique comment on affiche les résultats... pour bien comprendre, voici un ch'tit schéma. $results est le grand tableau suivant.
rangchamps rapportés par la requête, sous forme d'un tableau
0Array("NOM" => "Machefert", "PRENOM" => "Sylvain")
1Array("NOM" => "Brubeck", "PRENOM" => "Dave")
2Array("NOM" => "Desmond", "PRENOM" => "Paul")

ou si tu préfères, un print_r($results) donne (NOTA : il faut faire un print_r entre des balises <pre>...) :

Array(
    0 => Array(
        "NOM" => "Machefert",
        "PRENOM" => "Sylvain"
    ),
    1 => Array(
        "NOM" => "Brubeck",
        "PRENOM" => "Dave"
    ),
    2 => Array(
        "NOM" => "Desmond",
        "PRENOM" => "Paul"
    )
)
L'instruction while($res = each($results)) parcours ligne par ligne l'Array $results. La variable $res équivaut à une ligne du tableau ci-dessus. Donc $res[0] contient le numéro du rang. Et $res[1] contient un Array...
D'où $res[1]['NOM_DE_LA_COLONNE']
Compris ?




Autres requêtes, UPDATE, INSERT, DELETE...

Documentation PHP : ora_open - ora_parse - ora_exec - ora_commit - ora_close.

Bon on a fait le plus compliqué... le select... voici donc maintenant des choses très simples :

<? include("connexion.php");
$query = "UPDATE people SET nom='O'chon' where prenom='Paul'";
include("includes/requete.php");
include("deconnexion.php"); ?>
et le p'tit fichier requete.php :
<?
$curseur=ora_open($ora_conn); //Créer un curseur
if($curseur) // Si ça créé
{
  $resultat = ora_parse($curseur,$query); // Parse la requête = vérifie si elle est correcte syntaxiquement
  $resultat = ora_exec($curseur); // Exécute la requête
  $a = ora_commit($ora_conn); // Fait le COMMIT pour valider
  $b = ora_close($curseur); // Ferme le curseur
}
else
// Y'a un pb
}
?>

Là je n'ai pas mis d'affichage pour dire : "Paul Desmond a bien été changé en Paul O'chon", ou alors : "bein ça a foiré :("... Mais il est possible de mettre des résultat en controlant les valeurs de $resultat, $a et $b...




Tout ça dans une classe ?

Maintenant que j'ai expliqué de manière simple avec des fichiers inclus (ce qui convient aux débutants), voici comment aller un tout petit plus loin, et mettre tout ça dans une classe ;)

Pas de panique c'est vraiment tout simple à utiliser !

Merci à Battraculte sur CodeS-SourceS pour m'avoir pondu cette version "classe" ;-)

La classe ainsi qu'un code pour tester se trouve dans ce zip.

Je conseille aux débutants de regarder ce code, même si le mot classe leur fait peur... ils verront que c'est même plus simple que les codes que j'ai mis dans cette page !




Conclusion

Bein voilà c'est fini, à toi de jouer maintenant :p

Ce que je garde comme leçon de mon stage, c'est qu'en passant de nombreuses heures à développer le script de select, après j'ai tracé pour développer le site entier. Hop! $query="machin"; include truc; afficher les résultats et c'est magique ;)))

Have Fun !

Pour pouvoir écrire dans ce forum, identifiez-vous !

  v1.3p © ASP-PHP.net 2002  

iubito le 15/02/2004 (113 980 hits)
Didier Téléchargez gratuitement et légalement des logiciels Microsoft ! Si, si ;)
  • Visual Studio 2010
  • Office 2010
  • Expression Studio 3
  • SQL Server 2008
  • et d'autres...
Au fil des news  
PHP - Drupagora : 1ère edition
Utiliser Reporting Services pour des NewsLetter - SQL Server Reporting Services et les NewsLetters
Le moteur de rapport inclus dans Microsoft SQL Server permet de créer de nombreux rapports ...
Changer la page d'erreur 401 SharePoint - La page d'erreur d'authentification SharePoint
Avec l'authentification classique des sites SharePoint, l'erreur d'authentification est gérée par ...
PHP - Graphique de l'angle du soleil en fonction du lieu
PHP5 - Graphique de l'angle du soleil en fonction du lieu
Adobe - Disponibilité d'Adobe Creative Suite 5.5
Les Thèmes dans SharePoint 2010 - Gérer les thèmes dans SharePoint 2010
SharePoint 2010 apporte de nombreuses modifications dont certaines dans le principe des thèmes.
JavaScript - fonction qui affiche l'heure à travers javascript
Installer SharePoint Foundation 2010 sur Windows 7 - Installer SP Foundation 2010 sur Windows Seven
Lorsque l'on souhaite développer dans le monde SharePoint, il existe plusieurs solutions. La ...
SharePoint et SQL Server 2008 R2 Report Server - Comment accéder à SharePoint depuis SSRS 2008 R2
Depuis la première version, la solution de rapport proposée par Microsoft "SQL Server Reporting ...
JS - Envoi d'un formulaire après chargement d'une image
Divers - Bannir une ip dans le global asax
Dreamweaver CS5 - Nouvelle version Dreamweaver CS5
Déjà plus de 6 mois que le produit est sorti, il fallait bien que je vous en parle un peu. Je vous ...
SharePoint Output Caching dans un site Intranet - Comment utiliser le cache dans un site Publishing
Afin de permettre l'amélioration des performances de sa ferme MOSS utilisée pour le site portail ...
Adobe - Adobe lance le Musée Adobe des Médias Numériques
Adobe - Adobe lance HTML5 Pack pour Illustrator CS5
PHP - Forum PHP 2010 : Le programme
Magazines - Le numéro 133 de programmez est disponible
Adobe - Adobe lance des applications Photoshop Express....
PHP - Détermination de l'intersection entre 2 segments
Magazines - Le N°132 de Programmez est disponible
Les alertes dans SharePoint 2007 - Comment SharePoint 2007 gère les User Alerts
Une des fonctionnalités de base de SharePoint, aussi bien dans Windows SharePoint Services (WSS) ...
Adobe - Photoshop.com Mobile pour Android 1.2
Adobe - Adobe dévoile une technologie de lecture.......
PHP - Experts PHP : participez au Forum PHP 2010 !
PHP - Fobec.com - Code source PHP & javascript
Foliotage alphabétique - Lister sur la première lettre d'un champ
Pour faire suite à l'article de JPierre sur la pagination alphabétique, voici, en ASP et en PHP, ...
Dreamweaver CS4 + Php + Mysql - Pagination alphabétique
Je vous propose la création d'une barre de navigation ou pagination alphabétique pour filtrer les ...
Adobe - HTML5 dans Dreamweaver CS5
VBScript - Déterminer si un chemin est absolu ou relatif
VBScript - Lire/écrire un fichier texte
Magazines - Le N°130 de Programmez est disponible
Hebergement - Hébergement à prix libre
Adobe - Adobe Creative Suite 5
PHP - Calcul de la date de Pâques
Magazines - Le N°128 de Programmez est disponible
Magazines - Le N°127 de Programmez est disponible
Dreamweaver CS4 + Php + Mysql - Trucs et Astuces - Part 6
Pour continuer dans le même style, je vous propose une suite au précédent article. Rechercher tous ...
Adobe - Adobe Photoshop.com Mobile pour iPhone 1.1
JavaScript - Ajouter une page dans vos favorites
Tutorial : HTML | Scripting | ASP-PHP | ASP.net | SQL Server | XML
Sharepoint | XAML | Pocket | Dreamweaver | VML | Divers
  Scripts : Scripting | ASP-PHP | ASP.net | Divers
  Boutique | Annuaire | Bannières | Météo | Tribune | Partenariats
v3b © Didier 2003   
 

Corpo Sciences de Reims Partitions gratuites Carte, météo, annonces
 TechNet ASP-magazine MVP Groupes Utilisateurs Microsoft DotNet Project