Objectif
======
J’ai écrit cette classe lorsque j’avais besoin d’utiliser une base de données Oracle dans un petit projet PHP à l’[Université de Manchester] (http://cs.man.ac.uk/). L’objectif était triple:
* éviter d’avoir a entrer des variables paramètres de configuration à chaque accès à la base Oracle (factorisation du code)
* offrir une interface proche de celle de mysql, que je connaissais mieux (merci à l’abstraction)
* offrir des fonctionnalités plus poussées que celles offertes par les fonctions natives ora_*
Je ne sais pas si cette classe est encore d’actualité (je ne fais plus de PHP) mais elle pourra sans doute servir à d’autres.
Code
====
/** * PHP Class to ease the access of the Oracle Database in the University * of Manchester. * It mimics the mysql_* functions. * * Copyright (C) 2003 - Regis Decamps* * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * / class DataBase { /* connection index. */ var $conn; // the connection handler var $cursor; // internal Oracle cursor var $dbuser; //user to connect to the database var $dbpass; //password to connect to the database /** [public] Constructor. * Constructs a ressource to query the Oracle database. *@argument user The user name to connect the database to. *@argument password The password associated to this username */ function DataBase($user=DBUSER,$password=DBPASS) { $this->dbuser=$user; $this->dbpass=$password; // Set environment variables putenv("TWO_TASK=teach.cs.man.ac.uk"); putenv("TNS_ADMIN=/home/oracle/app/oracle/product/8.1.6/network/config/tcp_cs_man_ac_uk"); putenv("ORACLE_HOME=/home/oracle/app/oracle/product/8.1.6"); register_shutdown_function(array($this, '_database')); } /** [private] * Effectively connect to the database. */ function connect() { if (!$this->conn) { $this->conn= ora_logon($this->dbuser,$this->dbpass); } } /** [private] * Nicely close the connection to the database. * You may want to call the function when you don't need the database * object any more. */ function close() { if ($this->conn) { @ora_close($this->cursor); $ret=ora_logoff($this->conn); if (!$ret) { user_error('Cannot disconnect from '.$this->conn); } } } /** [private] Destructor. * This is the destructor (automatically called by PHP when the script * finishes). It makes a call to close() *@see #close */ function _database() { //user_error ( 'Destructor of database object called.',E_USER_NOTICE ); $this->close(); } /* * db_query() sends a query to the currently active database on the * server. * Prints an error message in case of problem. *@return TRUE if success *@return FALSE if not */ function query($query_string) { /* Connect if not done yet */ $this->connect(); if(!$this->conn) { user_error('User '.$this->dbuser.' failed to connect to database.',E_USER_WARNING); } $this->cursor=@ora_do($this->conn,$query_string); if(!$this->cursor) { //user_error('Syntax error in query '.$query_string.': ['.ora_errorcode().'] '.ora_error(),E_USER_WARNING); return FALSE; } return TRUE; } /** * Returns an array that corresponds to the fetched row, or FALSE if * there are no more rows. *@return the next row, if any *@return NULL otherwise *@see mysql_fetcharray */ function fetch_array() { $retval=array(); if(!$this->cursor) { return NULL; } $nbcols=@ora_numcols($this->cursor); for($i=0; $i<$nbcols; $i++){ // parse throught cols $retval[$i]=ora_getcolumn($this->cursor,$i); $retval[ora_columnname($this->cursor,$i)]=ora_getcolumn($this->cursor,$i); } if (!ora_fetch($this->cursor)) { ora_close($this->cursor); $this->cursor=0; } return $retval; } /** [public] * Returns the number of columns of the query * @return int: number of columns */ function ncols(){ $retval=@ora_numcols($this->cursor); return $retval; } } //end class DataBase ?>
