begin process at 2012 05 27 22:11:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > CLASSE BASE DE DONNEES , EX AVEC MYSQL & MSSQL [PHP5 & PHP4]

CLASSE BASE DE DONNEES , EX AVEC MYSQL & MSSQL [PHP5 & PHP4]


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de données Classé sous :classe, bdd, abstraction, mysql, mssql Niveau :Initié Date de création :20/01/2006 Date de mise à jour :08/02/2006 12:59:30 Vu / téléchargé :8 847 / 1 183

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Bonjour tout le monde :-)

Voici une petite classe d'abstraction de base de données.
1 classe parente, database, gère tout le travail.
J'ai joint 2 classes héritant de cette classe parente :
- 1 pour mysql
- 1 pour mssql

Vous verrez qu'elles sont toutes les 2 TRES simples. Je n'ai pas implémenté d'autres bdd, mais peut-être un jour...
Ce code est disponible en 2 versions : 1 version PHP5, et 1 version PHP4.
Et il est livré avec 2 fichiers de tests, 1 pour chaque version de PHP.

C'est une classe volontairement allégée, donnant accès à ce que l'on utilise le plus souvent, simplement, pas de frioritures...mis à part 2 ou 3 petits trucs ;-)

Possibilités :
- connexion (ouais ouais) explicite ou non
- déconnexion (si si) explicite (ou non...)
- sélection de base explicite (ou non... ;-) )
- méthode pour lancer une requête (bah oui)
- num_rows : compte le nombre de lignes renvoyées par une requête
- fetch row : va chercher les résultats sous forme d'un tableau indexé numériquement
- fetch_array : bla bla indexé numériquement ET associativement
- fetch_assoc : bla bla indexé associativement
- error : méthode privé pour gérer (et afficher si on veut) les erreurs. Et les stocker.
- get : méthode pour afficher une ou plusieurs propriétés de l'instance
- queryPerf : lance une requête, ET fait un bench dessus. Et l'affiche. Et le stocke.

Voili voulou, c'est tout :-)
Je balance le code pour la version PHP5 ici (mais dans le zip, y a tout, php4 et php5)

Source

  • // FICHIER database.cls.php
  • <?php
  • class database {
  • /***************************************************************************************************************************************
  • * Définition des Propriétés
  • ***************************************************************************************************************************************/
  • protected $config = array ();
  • private $errorLog = array ();
  • private $options = array (
  • 'ERROR_DISPLAY' => true
  • );
  • protected $sql = '';
  • private $qryRes;
  • protected $link;
  • private $sQueryPerf = array ();
  • /***************************************************************************************************************************************
  • * Constructeur
  • * On peut ou non passer le nom de la base de données; si on le passe, la connexion à la base se fait d'elle même
  • * Sinon, il faudra passer par la méthode select_base ()
  • * @Param string $host => serveur de bdd
  • * @Param string $user => login
  • * @Param string $pwd => password
  • * @Param string $db => base de donnée
  • * @Param array $options => options (voir la propriété $config)
  • ***************************************************************************************************************************************/
  • public function __construct ($host, $user, $pwd, $db = '', $options = array ()) {
  • $this -> config['HOST'] = $host;
  • $this -> config['USER'] = $user;
  • $this -> config['PWD'] = $pwd;
  • if (!empty ($options)) {
  • foreach ($options as $clef => $opt) {
  • if (array_key_exists ($clef, $this -> options) && is_bool ($opt)) {
  • $this -> options[$clef] = $opt;
  • }
  • }
  • }
  • if (!empty ($db)) {
  • $this -> connect ();
  • $this -> select_base ($db);
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode de connexion
  • * méthode publique
  • * Se fait automatiquement, ou peut être explicitement appelée
  • ***************************************************************************************************************************************/
  • public function connect () {
  • if (false === $this -> private_connect ()) {
  • $this -> error (get_class ($this).' :: connect()', $this -> private_errno().' : '.$this -> private_error(), 'Connexion avec Host : '.$this -> config['HOST'].' User : '. $this -> config['USER'].' Pwd : ********');
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode de log des erreurs
  • * méthode privée
  • * @Param string $func => méthode appelant l'erreur
  • * @Param string $err => message d'erreur interne au moteur de la bdd
  • * @Param string $qry => requête ayant provquée l'erreur, ou message interne à la classe
  • ***************************************************************************************************************************************/
  • private function error ($func, $err, $qry) {
  • $this -> errorLog[] = $func.' : '.$err.' => '.$qry;
  • if ($this -> options['ERROR_DISPLAY'] === true) {
  • echo 'ERREUR! : ', $this -> errorLog[key ($this -> errorLog)], '<br />';
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode de sélection d'une base de données
  • * méthode publique
  • * @Param string $name => nom de la base.
  • ***************************************************************************************************************************************/
  • public function select_base($name=null) {
  • if (false === is_scalar ($name)) {
  • $this -> error (get_class ($this).' :: select_base()', $this -> private_errno().' : '.$this -> private_error(), 'Nom incorrect passé à la méthode : '.$name);
  • } else {
  • $this -> config['BD'] = $name;
  • if (false === $this -> private_select_base()) {
  • $this -> error (get_class ($this).' :: select_base()', $this -> private_errno().' : '.$this -> private_error(), 'La méthode n\'a pu se connecter à la base : '.$name);
  • }
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode de fermeture de la connexion
  • * méthode publique
  • ***************************************************************************************************************************************/
  • public function close() {
  • $this -> __destruct ();
  • }
  • /***************************************************************************************************************************************
  • * Destructeur
  • * méthode publique
  • ***************************************************************************************************************************************/
  • public function __destruct () {
  • if (isset($this-> link) ) {
  • $this -> private_close();
  • unset ($this-> link);
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode de "requêtage"
  • * méthode publique
  • * @Param string $qry => requête
  • ***************************************************************************************************************************************/
  • public function query ($qry) {
  • $this -> sql = $qry;
  • if (false === $this -> qryRes = $this -> private_query ()) {
  • $this -> error (get_class ($this).' :: query ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
  • } else {
  • return $this -> qryRes;
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode pour compter le nombre de lignes renvoyées
  • * méthode publique
  • * @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
  • * On peut la passer explicitement, ou prendre la propriété
  • ***************************************************************************************************************************************/
  • public function num_rows ($qry = null) {
  • if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
  • $num = $this -> private_num_rows ($qry);
  • if (false === $num) {
  • $this -> error (get_class ($this).' :: num_rows ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
  • return false;
  • } else {
  • return $num;
  • }
  • }elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
  • $num = $this -> private_num_rows ($this -> qryRes);
  • if (false === $num) {
  • $this -> error (get_class ($this).' :: num_rows ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
  • return false;
  • } else {
  • return $num;
  • }
  • } else {
  • $this -> error (get_class ($this).' :: num_rows ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode pour parcourir les lignes renvoyée par ujne requête sous forme de tableau associatif
  • * méthode publique
  • * @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
  • * On peut la passer explicitement, ou prendre la propriété
  • ***************************************************************************************************************************************/
  • public function fetch_assoc ($qry = null) {
  • if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
  • return $this -> private_fetch_assoc ($qry);
  • }elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
  • return $this -> private_fetch_assoc ($this -> qryRes);
  • } else {
  • $this -> error (get_class ($this).' :: fetch_assoc ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode pour parcourir les lignes renvoyée par ujne requête sous forme de tableau associatif et numérique
  • * méthode publique
  • * @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
  • * On peut la passer explicitement, ou prendre la propriété
  • ***************************************************************************************************************************************/
  • public function fetch_array ($qry = null) {
  • if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
  • return $this -> private_fetch_array ($qry);
  • }elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
  • return $this -> private_fetch_array ($this -> qryRes);
  • } else {
  • $this -> error (get_class ($this).' :: fetch_array ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode pour parcourir les lignes renvoyée par ujne requête sous forme de tableau numérique
  • * méthode publique
  • * @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
  • * On peut la passer explicitement, ou prendre la propriété
  • ***************************************************************************************************************************************/
  • public function fetch_row ($qry = null) {
  • if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
  • return $this -> private_fetch_row ($qry);
  • }elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
  • return $this -> private_fetch_row ($this -> qryRes);
  • } else {
  • $this -> error (get_class ($this).' :: fetch_row ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode renvoyant le dernier ID inséré
  • * méthode publique
  • ***************************************************************************************************************************************/
  • public function insert_id () {
  • if (isset ($this -> link)) {
  • $id = $this -> private_insert_id ();
  • } else {
  • $this -> error (get_class ($this).' :: insert_id ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de lien valide');
  • return false;
  • }
  • if (false === $id) {
  • $this -> error (get_class ($this).' :: insert_id ()', $this -> private_errno ().' : '.$this -> private_error (), 'Echec de récupération du dernier id inséré');
  • return false;
  • } else {
  • return $id;
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode pour récupérer la valeur d'une ou plusieurs propriété(s) de la classe
  • * méthode publique
  • * On peut passer n'importe quel nombre de paramètres, sous la forme de chaînes ayant pour valeur le nom d'une
  • * propriété EXISTANTE de la classe
  • ***************************************************************************************************************************************/
  • public function get () {
  • $aArgs = func_get_args();
  • foreach ($aArgs as $clef => $arg) {
  • if (isset ($this -> $arg)) {
  • $aRetour[$arg] = $this -> $arg;
  • }
  • }
  • if (isset ($aRetour) && is_array ($aRetour)) {
  • return $aRetour;
  • } else {
  • return false;
  • }
  • }
  • /***************************************************************************************************************************************
  • * Méthode de "requêtage" renvoyant en plus les performances de la requête (bench)
  • * méthode publique
  • * @Param string $qry => requête
  • ***************************************************************************************************************************************/
  • public function queryPerf ($qry) {
  • $this -> sql = $qry;
  • $start = microtime ();
  • $this -> qryRes = $this -> private_query ();
  • $stop = microtime ();
  • if (false === $this -> qryRes) {
  • $this -> error (get_class ($this).' :: query ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
  • return false;
  • } else {
  • $elapsed = $stop - $start;
  • $clef = count ($this -> sQueryPerf);
  • $this -> sQueryPerf[$clef]['query'] = $this -> sql;
  • $this -> sQueryPerf[$clef]['time'] = $elapsed;
  • echo 'Query [', $this -> sQueryPerf[$clef]['query'], '] => ', $this -> sQueryPerf[$clef]['time'];
  • return $this -> qryRes;
  • }
  • }
  • }
  • ?>
  • //FICHIER mssql.cls.php
  • <?php
  • class mssql extends database {
  • protected function private_connect () {
  • if (false === $this -> link = @mssql_connect ($this -> config['HOST'], $this -> config['USER'], $this -> config['PWD'])) {
  • return false;
  • } else {
  • return true;
  • }
  • }
  • protected function private_select_base () {
  • if (false === @mssql_select_db($this->config['BD'], $this->link)) {
  • return false;
  • } else {
  • return true;
  • }
  • }
  • protected function private_close() {
  • mssql_close($this-> link);
  • }
  • protected function private_query () {
  • return @mssql_query ($this -> sql, $this -> link);
  • }
  • protected function private_num_rows ($qry) {
  • return @mssql_num_rows ($qry);
  • }
  • protected function private_fetch_row ($qry) {
  • return @mssql_fetch_row ($qry);
  • }
  • protected function private_fetch_array ($qry) {
  • return @mssql_fetch_array ($qry);
  • }
  • protected function private_fetch_assoc ($qry) {
  • return @mssql_fetch_array ($qry);
  • }
  • protected function private_insert_id () {
  • $sQuery = 'SELECT @@IDENTITY';
  • $requete = $this -> query ($sQuery);
  • $res = $this -> fetch_row ($requete);
  • return $res[0];
  • }
  • protected function private_errno () {
  • return false;
  • }
  • protected function private_error () {
  • return @mssql_get_last_message ();
  • }
  • }
  • ?>
  • // FICHIER mysql.cls.php
  • <?php
  • class mysql extends database {
  • protected function private_connect () {
  • if (false === $this -> link = @mysql_connect ($this -> config['HOST'], $this -> config['USER'], $this -> config['PWD'])) {
  • return false;
  • } else {
  • return true;
  • }
  • }
  • protected function private_select_base () {
  • if (false === @mysql_select_db($this->config['BD'], $this->link)) {
  • return false;
  • } else {
  • return true;
  • }
  • }
  • protected function private_close() {
  • mysql_close($this-> link);
  • }
  • protected function private_query () {
  • return @mysql_query ($this -> sql, $this -> link);
  • }
  • protected function private_num_rows ($qry) {
  • return @mysql_num_rows ($qry);
  • }
  • protected function private_fetch_assoc ($qry) {
  • return @mysql_fetch_assoc ($qry);
  • }
  • protected function private_fetch_array ($qry) {
  • return @mysql_fetch_array ($qry);
  • }
  • protected function private_fetch_row ($qry) {
  • return @mysql_fetch_row ($qry);
  • }
  • protected function private_insert_id () {
  • return @mysql_insert_id ($this -> link);
  • }
  • protected function private_errno () {
  • return @mysql_errno ($this -> link);
  • }
  • protected function private_error () {
  • return @mysql_error ($this -> link);
  • }
  • }
  • ?>
  • // FICHIER EXEMPLE (non exhaustif, loin de là...) test.php
  • <?php
  • DEFINE ('SQL_LOGIN', '');
  • DEFINE ('SQL_PWD', '');
  • DEFINE ('SQL_DB', '');
  • DEFINE ('SQL_HOST', '');
  • $dbOptions = array (
  • 'ERROR_DISPLAY' => true
  • );
  • function __autoload ($class_name) {
  • require_once $class_name . '.cls.php';
  • }
  • $oDB = new mysql (SQL_HOST, SQL_LOGIN, SQL_PWD, SQL_DB, $dbOptions);
  • $sQuery = 'select * from users';
  • $oDB -> queryPerf ($sQuery);
  • echo '<br />';
  • $sQuery = 'select * from departements';
  • $oDB -> queryPerf ($sQuery);
  • echo '<br />';
  • $arr = $oDB -> get ('link', 'config', 'sQueryPerf');
  • echo '<pre>', print_r ($arr), '</pre>';
  • $sQuery = '
  • SELECT
  • mag.mag_id, mag.mag_libelle, dept.dept_libelle
  • FROM
  • magasins mag, departements dept
  • WHERE
  • mag.dept_id = dept.dept_id
  • ORDER BY
  • mag.dept_id, mag.mag_libelle
  • ';
  • $oDB -> connect ();
  • $requete = $oDB -> query ($sQuery);
  • $oDB -> close (); // pour mysql, je le fais ici
  • $deptPrev = '';
  • $sForm = '';
  • while ($mag = $oDB -> fetch_assoc ($requete)) {
  • if ($deptPrev !== $mag['dept_libelle']) {
  • if (!empty ($deptPrev)) {
  • $sForm .= '<optgroup />';
  • }
  • $deptPrev = $mag['dept_libelle'];
  • $sForm .= '<optgroup label="'.$mag['dept_libelle'].'">';
  • }
  • $selected = (isset ($_POST['mag_id']) && $_POST['mag_id'] === $mag['mag_id'])?'selected="selected"':'';
  • $sForm .= '<option value="'.$mag['mag_id'].'" '.$selected.'>'.$mag['mag_libelle'].'</option>';
  • }
  • $oDB -> close (); // pour mssql, je le fais ici...saleté de mssql, hein ? ;-)
  • ?>
// FICHIER database.cls.php

<?php
class database {

	/***************************************************************************************************************************************
	* Définition des Propriétés
	***************************************************************************************************************************************/
	protected $config = array ();
	private $errorLog = array ();
	private $options = array (
		'ERROR_DISPLAY' => true
		);
	protected $sql = '';
	private $qryRes;
	protected $link;
	private $sQueryPerf = array ();

	/***************************************************************************************************************************************
	* Constructeur
	* On peut ou non passer le nom de la base de données; si on le passe, la connexion à la base se fait d'elle même
	* Sinon, il faudra passer par la méthode select_base ()
	* @Param string $host => serveur de bdd
	* @Param string $user => login
	* @Param string $pwd => password
	* @Param string $db => base de donnée
	* @Param array $options => options (voir la propriété $config)
	***************************************************************************************************************************************/
	public function __construct ($host, $user, $pwd, $db = '', $options = array ()) {
		$this -> config['HOST'] = $host;
		$this -> config['USER'] = $user;
		$this -> config['PWD'] = $pwd;
		if (!empty ($options)) {
			foreach ($options as $clef => $opt) {
				if (array_key_exists ($clef, $this -> options) && is_bool ($opt)) {
					$this -> options[$clef] = $opt;
				}
			}
		}
		if (!empty ($db)) {
			$this -> connect ();
			$this -> select_base ($db);
		}
	}

	/***************************************************************************************************************************************
	* Méthode de connexion
	* méthode publique
	* Se fait automatiquement, ou peut être explicitement appelée
	***************************************************************************************************************************************/
	public function connect () {
		if (false ===  $this -> private_connect ()) {
			$this -> error (get_class ($this).' :: connect()', $this -> private_errno().' : '.$this -> private_error(), 'Connexion avec Host : '.$this -> config['HOST'].' User : '. $this -> config['USER'].' Pwd : ********');
		}
	}

	/***************************************************************************************************************************************
	* Méthode de log des erreurs
	* méthode privée
	* @Param string $func => méthode appelant l'erreur
	* @Param string $err => message d'erreur interne au moteur de la bdd
	* @Param string $qry => requête ayant provquée l'erreur, ou message interne à la classe
	***************************************************************************************************************************************/
	private function error ($func, $err,  $qry) {
		$this -> errorLog[] = $func.' : '.$err.' => '.$qry;
		if ($this -> options['ERROR_DISPLAY'] === true) {
			echo 'ERREUR! : ', $this -> errorLog[key ($this -> errorLog)], '<br />';
		}
	}

	/***************************************************************************************************************************************
	* Méthode de sélection d'une base de données
	* méthode publique
	* @Param string $name => nom de la base.
	***************************************************************************************************************************************/
	public function select_base($name=null) {
		if (false === is_scalar ($name)) {
			$this -> error (get_class ($this).' :: select_base()', $this -> private_errno().' : '.$this -> private_error(), 'Nom incorrect passé à la méthode : '.$name);
		} else {
			$this -> config['BD'] = $name;
			 if (false === $this -> private_select_base()) {
				 $this -> error (get_class ($this).' :: select_base()', $this -> private_errno().' : '.$this -> private_error(), 'La méthode n\'a pu se connecter à la base : '.$name);
			 }
		}
	}

	/***************************************************************************************************************************************
	* Méthode de fermeture de la connexion
	* méthode publique
	***************************************************************************************************************************************/
	public function close() {
		$this -> __destruct ();
	}

	/***************************************************************************************************************************************
	* Destructeur
	* méthode publique
	***************************************************************************************************************************************/
	public function __destruct () {
		if (isset($this-> link) ) {
			$this -> private_close();
			unset ($this-> link);
		}
	}

	/***************************************************************************************************************************************
	* Méthode de "requêtage"
	* méthode publique
	* @Param string $qry => requête
	***************************************************************************************************************************************/
	public function query ($qry) {
		$this -> sql = $qry;
		if (false === $this -> qryRes = $this -> private_query ()) {
			$this -> error (get_class ($this).' :: query ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
		} else {
			return $this -> qryRes;
		}
	}

	/***************************************************************************************************************************************
	* Méthode pour compter le nombre de lignes renvoyées
	* méthode publique
	* @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
	* On peut la passer explicitement, ou prendre la propriété
	***************************************************************************************************************************************/
	public function num_rows ($qry = null) {
		if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
			$num =  $this -> private_num_rows ($qry);
			if (false === $num) {
				$this -> error (get_class ($this).' :: num_rows ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
				return false;
			} else {
				return $num;
			}
		}elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
			$num =  $this -> private_num_rows ($this -> qryRes);
			if (false === $num) {
				$this -> error (get_class ($this).' :: num_rows ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
				return false;
			} else {
				return $num;
			}
		} else {
			$this -> error (get_class ($this).' :: num_rows ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
		}
	}
	/***************************************************************************************************************************************
	* Méthode pour parcourir les lignes renvoyée par ujne requête sous forme de tableau associatif
	* méthode publique
	* @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
	* On peut la passer explicitement, ou prendre la propriété
	***************************************************************************************************************************************/
	public function fetch_assoc ($qry = null) {
		if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
			return  $this -> private_fetch_assoc ($qry);
		}elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
			return  $this -> private_fetch_assoc ($this -> qryRes);
		} else {
			$this -> error (get_class ($this).' :: fetch_assoc ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
		}
	}

	/***************************************************************************************************************************************
	* Méthode pour parcourir les lignes renvoyée par ujne requête sous forme de tableau associatif et numérique
	* méthode publique
	* @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
	* On peut la passer explicitement, ou prendre la propriété
	***************************************************************************************************************************************/
	public function fetch_array ($qry = null) {
		if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
			return  $this -> private_fetch_array ($qry);
		}elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
			return  $this -> private_fetch_array ($this -> qryRes);
		} else {
			$this -> error (get_class ($this).' :: fetch_array ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
		}
	}

	/***************************************************************************************************************************************
	* Méthode pour parcourir les lignes renvoyée par ujne requête sous forme de tableau numérique
	* méthode publique
	* @Param mixed $qry => ressource d'une requête ou identifiant de ressource pour mssql
	* On peut la passer explicitement, ou prendre la propriété
	***************************************************************************************************************************************/
	public function fetch_row ($qry = null) {
		if ((get_class ($this) === 'mysql' && is_resource ($qry)) || (get_class ($this) === 'mssql' && is_int ($qry))) {
			return  $this -> private_fetch_row ($qry);
		}elseif (isset ($this -> qryRes) && (get_class ($this) === 'mysql' && is_resource ($this -> qryRes)) || (get_class ($this) === 'mssql' && is_int ($this -> qryRes))) {
			return  $this -> private_fetch_row ($this -> qryRes);
		} else {
			$this -> error (get_class ($this).' :: fetch_row ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de ressource valide');
		}
	}

	/***************************************************************************************************************************************
	* Méthode renvoyant le dernier ID inséré
	* méthode publique
	***************************************************************************************************************************************/
	public function insert_id () {
		if (isset ($this -> link)) {
			$id = $this -> private_insert_id ();
		} else {
			$this -> error (get_class ($this).' :: insert_id ()', $this -> private_errno ().' : '.$this -> private_error (), 'Pas de lien valide');
			return false;
		}
		if (false === $id) {
			$this -> error (get_class ($this).' :: insert_id ()', $this -> private_errno ().' : '.$this -> private_error (), 'Echec de récupération du dernier id inséré');
			return false;
		} else {
			return $id;
		}
	}

	/***************************************************************************************************************************************
	* Méthode pour récupérer la valeur d'une ou plusieurs propriété(s) de la classe
	* méthode publique
	* On peut passer n'importe quel nombre de paramètres, sous la forme de chaînes ayant pour valeur le nom d'une
	* propriété EXISTANTE de la classe
	***************************************************************************************************************************************/
	public function get () {
		$aArgs = func_get_args();
		foreach ($aArgs as $clef => $arg) {
			if (isset ($this -> $arg)) {
				$aRetour[$arg] = $this -> $arg;
			}
		}
		if (isset ($aRetour) && is_array ($aRetour)) {
			return $aRetour;
		} else {
                        return false;
                }
	}

	/***************************************************************************************************************************************
	* Méthode de "requêtage" renvoyant en plus les performances de la requête (bench)
	* méthode publique
	* @Param string $qry => requête
	***************************************************************************************************************************************/
	public function queryPerf ($qry) {
		$this -> sql = $qry;
		$start = microtime ();
		$this -> qryRes = $this -> private_query ();
		$stop = microtime ();
		if (false === $this -> qryRes) {
			$this -> error (get_class ($this).' :: query ()', $this -> private_errno ().' : '.$this -> private_error (), $this -> sql);
                        return false;
		} else {
			$elapsed = $stop - $start;
			$clef = count ($this -> sQueryPerf);
			$this -> sQueryPerf[$clef]['query'] = $this -> sql;
			$this -> sQueryPerf[$clef]['time'] = $elapsed;
			echo 'Query [', $this -> sQueryPerf[$clef]['query'], '] => ', $this -> sQueryPerf[$clef]['time'];
			return $this -> qryRes;
		}
	}
}
?>

//FICHIER mssql.cls.php

<?php
class mssql extends database {

	protected function private_connect () {
		if (false === $this -> link = @mssql_connect ($this -> config['HOST'], $this -> config['USER'], $this -> config['PWD'])) {
			return false;
		} else {
			return true;
		}
	}

	protected function private_select_base () {
		 if (false === @mssql_select_db($this->config['BD'], $this->link)) {
			return false;
		 } else {
		 	return true;
		 }
 	}

	protected function private_close() {
		mssql_close($this-> link);
	}


	protected function private_query () {
		return @mssql_query ($this -> sql, $this -> link);
	}

	protected function private_num_rows ($qry) {
		return @mssql_num_rows ($qry);
	}

	protected function private_fetch_row ($qry) {
		return @mssql_fetch_row ($qry);
	}

	protected function private_fetch_array ($qry) {
		return @mssql_fetch_array ($qry);
	}

	protected function private_fetch_assoc ($qry) {
		return @mssql_fetch_array ($qry);
	}

	protected function private_insert_id () {
		$sQuery = 'SELECT @@IDENTITY';
		$requete = $this -> query ($sQuery);
		$res = $this -> fetch_row ($requete);
		return $res[0];
	}

	protected function private_errno () {
		return false;
	}

	protected function private_error () {
		return @mssql_get_last_message ();
	}
}
?>

// FICHIER mysql.cls.php

<?php
class mysql extends database {

	protected function private_connect () {
		if (false === $this -> link = @mysql_connect ($this -> config['HOST'], $this -> config['USER'], $this -> config['PWD'])) {
			return false;
		} else {
			return true;
		}
	}

	protected function private_select_base () {
		 if (false === @mysql_select_db($this->config['BD'], $this->link)) {
			return false;
		 } else {
		 	return true;
		 }
 	}

	protected function private_close() {
		mysql_close($this-> link);
	}


	protected function private_query () {
		return @mysql_query ($this -> sql, $this -> link);
	}

	protected function private_num_rows ($qry) {
		return @mysql_num_rows ($qry);
	}

	protected function private_fetch_assoc ($qry) {
		return @mysql_fetch_assoc ($qry);
	}

	protected function private_fetch_array ($qry) {
		return @mysql_fetch_array ($qry);
	}

	protected function private_fetch_row ($qry) {
		return @mysql_fetch_row ($qry);
	}

	protected function private_insert_id () {
		return @mysql_insert_id ($this -> link);
	}

	protected function private_errno () {
		return @mysql_errno ($this -> link);
	}

	protected function private_error () {
		return @mysql_error ($this -> link);
	}
}
?>

// FICHIER EXEMPLE (non exhaustif, loin de là...) test.php

<?php
DEFINE ('SQL_LOGIN', 	'');
DEFINE ('SQL_PWD', 	'');
DEFINE ('SQL_DB', 		'');
DEFINE ('SQL_HOST',     '');

$dbOptions = array (
	'ERROR_DISPLAY' => true
	);

function __autoload ($class_name) {
	require_once $class_name . '.cls.php';
}

$oDB = new mysql (SQL_HOST, SQL_LOGIN,  SQL_PWD, SQL_DB, $dbOptions);

$sQuery = 'select * from users';
$oDB -> queryPerf ($sQuery);

echo '<br />';

$sQuery = 'select * from departements';
$oDB -> queryPerf ($sQuery);

echo '<br />';

$arr = $oDB -> get ('link', 'config', 'sQueryPerf');
echo '<pre>', print_r ($arr), '</pre>';

$sQuery = '
SELECT
	mag.mag_id, mag.mag_libelle, dept.dept_libelle
FROM
	magasins mag, departements dept
WHERE
	mag.dept_id = dept.dept_id
ORDER BY
	mag.dept_id, mag.mag_libelle
';
$oDB -> connect ();
$requete = $oDB -> query ($sQuery);
$oDB -> close (); // pour mysql, je le fais ici
$deptPrev = '';
$sForm = '';
while ($mag = $oDB -> fetch_assoc ($requete)) {
	if ($deptPrev !== $mag['dept_libelle']) {
		if (!empty ($deptPrev)) {
			$sForm .= '<optgroup />';
		}
		$deptPrev = $mag['dept_libelle'];
		$sForm .=  '<optgroup label="'.$mag['dept_libelle'].'">';
	}
	$selected = (isset ($_POST['mag_id']) && $_POST['mag_id'] === $mag['mag_id'])?'selected="selected"':'';
	$sForm .= '<option value="'.$mag['mag_id'].'" '.$selected.'>'.$mag['mag_libelle'].'</option>';
}
$oDB -> close (); // pour mssql, je le fais ici...saleté de mssql, hein ? ;-)
?>

 Conclusion

Merci à FhX pour quelques idées piquées à sa classe d'abstraction à lui, plus complète.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

20 janvier 2006 17:44:56 :
Rajout du test sur le type des valeurs des options, dans l'instanciation de la classe.
20 janvier 2006 18:00:59 :
Oublis de 'return' ;-)
08 février 2006 12:59:31 :
Correction sur la méthode num_rows ().

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

Source avec Zip ORM : DAO, ACTIVERECORD ET DBLIST par Reldan
Source avec une capture CET EXTRAIT PERMET D'AJOUTER DANS UN TABLEAU UNE AGRÉGATION ... par Denis007
EXPORT DE BASE AU FORMAT CSV par remib74
Source avec Zip RECHERCHE DES DOUBLONS DANS UNE TABLE MYSQL EN SÉLECTIONNANT... par aladec2007
[CRON] INSERT ON DUPLICATE KEY UPDATE par pierreSabatier

 Sources en rapport avec celle ci

SYSTÈME DE PAGINATION AVEC BDD ET IMAGES (FICHIERS) par begueradj
CLASSE MYSQL UTILISANT LES FONCTIONS PDO par Vince66
Source avec Zip Source avec une capture DBOC - V3.1 [AJAX][PHP5] par Morphinof
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip PHP5 CLASSE GÉNÉRIQUE GESTION ROUTINES MYSQL par oxxo

Commentaires et avis

Commentaire de FhX le 20/01/2006 17:08:44

Ah c'est bien ce que je pensais, elle me disait plus ou moins quelque chose :)

Content de savoir qu'on peut se servir de ce que j'ai fait pour un tas de choses ! :D
Par contre, petite remarque :
"# if (!empty ($options)) {
#             foreach ($options as $clef => $opt) {
#                 if (array_key_exists ($clef, $this -> options)) {
#                     $this -> options[$clef] = $opt;
#                 }
#             }
#         }"
$opt est forcément TRUE ou false. Hors, quelqu'un qui ne le sait pas forcément (ou un oublis ou autre) peut se tromper.
Il faudrait rajouter (ou plutot modifier) :
if ( array_key_exists($clef, $this->options) && is_bool($opt) ) {
Au moins tu es sur du type :)

C'est une version allégée de la mienne donc j'imagine que les perfs sont un poil meilleur :p

Commentaire de malalam le 20/01/2006 17:40:59 administrateur CS

T'as raison, j'ai modifié.

J'ai d'autres trucs à ajouter, et de petites erreurs à corriger.
Curieusement...j'utilisais cette classe pour un petit projet, et j'avais pour habitude d'ouvrir ma connexion avant le query () et de la fermer juste après (et donc, avec tout fetch_...). Cela fonctionnait...et cela ne fonctionne plus.
Lol.
Je ne sais pas pourquoi, c'est ce à quoi je m'attèle là, en l'occurence.

Sur mes projets, les perfs sont un poil meilleures, oui.

J'ai récupéré la structure basique de ta classe, avec les private_ parce que je trouvais ça explicite :-)
Après bon, c'est une classe de bdd...lol. On peut pas réinventer la poudre.
J'ai fait ma propre version du bench, du log des erreurs, et surtout, surtout, ce qui m'a paru intéressant était de proposer une version mssql, ce qui est plutôt rare par ici.
Je n'ai pas implémenté les unbuffered queries, parce que mssql ne les gère pas. Du coup je ne les utilise pas ;-)
Mais je vais implémenter ça dès que j'ai un peu de temps libre, et tout le reste au passage, lol. (toutes les fonctions mysql, mssql, de php).

Commentaire de NoTsu le 31/03/2006 11:58:40

Salut,

D'abord bavo pour la classe, elle est vraiment très intéressante pour régler les problèmes d'abstractions de bases de données.
Par contre un truc qui m'a suprit c'est que la gestion des erreurs est gérée dans ta classe primitive ( database ) , et c'est içi que tu fais des distinctions sur le type de base qui est utilisée. Ce qui me semble aller contre l'intéret de la classe, qui est de d'avoir un code commun pour la primitive, et d'avoir un code distinct ensuite sur chacune des classes dérivées.Ainsi à chaque nouveau type de base qu'on souhaites rajouter on a juste à créer un fichier supplémentaire, et pas à aller trippoter le code de database.cls.php.
J'ai pas comprit pourquoi tu avais fait de cette manière.

Sinon le reste c'est vraiment du tout bon, encore bravo.

Commentaire de malalam le 31/03/2006 12:04:52 administrateur CS

Hello,

assez d'accord, à vrai dire.
Mais j'ai une raison...justement : Le but était en effet d'avoir des classes "typées" les plus simples possible.
Et justement, de ne pas avoir à s'emmerder avec la gestion des erreurs etc...
Sauf qu'évidemment, pour que ce soit le cas, il faudrait que je code toutes les bases possibles, sinon, le mec voulant en ajouter une sera effectivement obligé de modifier aussi la classe primitive.

De toutes façons, il y a pas mal de problèmes liés à cette classe, je dois la modifier, et c'est un bon moment pour le faire je crois :-) vais profiter de ma pause déjeuner pour m'y remettre!

Merci, ceci dit :-)

Commentaire de dubaddxx le 15/01/2007 12:11:23

salut.

Cette classe est vraiment pratique et bien pensée, merci en tout cas les gars.
Par contre, j'ai lu que si on veut exécuter des procédures stockées, il faut utiliser un objet de type MYSQLI.

J'imagine dans ce cas qu'il n'est plus possible de l'utiliser tel quelle et qu'il faudrait la revoir ?

Commentaire de malalam le 15/01/2007 12:28:27 administrateur CS

Il te suffit de créer la classe mysqli, en la calquant sur les autres, et éventuellement ajouter les méthodes supplémentaires dont tu aurais besoin.

Commentaire de dubaddxx le 15/01/2007 15:19:45

Mouais, j'ai essayé ça, mais il semblerait que le retour de "is_resource ($qry)", dans la classe database, soit
toujours à FALSE.
Du coup je me vois tout le temps afficher le message d'erreur comme quoi il n'y a pas de resources valides.
Alors qu'avec mysql à la place de mysqli, y'a pas ce pb ...
une idée ?
Merci !

Commentaire de malalam le 15/01/2007 15:42:27 administrateur CS

Il faut modifier ces vérifications en fonction de ce que renvoie mysqli (en l'occurrence, un objet...)
C'est pénible, mais malheureusement les retours des fonctions/méthodes db sous PHP ne sont pas franchement normalisés.
Je réécrirai sous peu une classe d'abstraction DB avec quelques corrections à ce niveau-là notamment (et pas mal d'ajouts).
Par exemple, sur mon pc en local (PHP 5.2), mssql retourne des ressources de type mssql (mssql link, mssql result etc...).
Sur mon serveur en prod (PHP 5.014), les fonctions mssql retournent des identifiants de ressource (des entiers)...
Pénible je vous dis ;-)

Commentaire de FhX le 15/01/2007 18:41:01

Ohh mon pauvre :p

Commentaire de malalam le 15/01/2007 19:25:56 administrateur CS

Ca t'fait rire ;-) ? Moi po, j'ai passé 2 heures à essayer de comprendre pourquoi ça ne marchait pas sur mon serveur, j'me souviens... :-(

Commentaire de FhX le 15/01/2007 21:18:37

Ca, c'est dla mauvaise gestion d'erreur :p


Na ! :D

Commentaire de malalam le 16/01/2007 09:36:53 administrateur CS

Bah si on veut...faut bien tester sur quelquechose, moi je teste une ressource mssql, ça m'a paru logique. Nan? ;-) Pas d'ma faute si ils changent les retours au fil de versions de php lol

Commentaire de FhX le 16/01/2007 13:51:27

Bah vi, c'est logique :p

C'est parce qu'on a même pas lu le changelog, sinon on s'en serait appercu :)

Commentaire de malalam le 16/01/2007 15:02:41 administrateur CS

Certes lol, mais bon quand on bosse en générique sur plusieurs versions de php... :-(

Commentaire de kendrak le 05/03/2007 13:28:14

Salut !
Merci pour cette classe bien pratique ^^
par contre j'ai un soucis la... en local c'est chouette ca marche mais une fois chez free non.
Si je tente une connexion classique avec mysql_connect() ca marche mais pas avec cette classe.... je comprends pas et ca me pète le crane depuis hier....

quelqu'un a une idée ?

Merci de votre aide

Commentaire de docteurflasbios le 06/01/2011 01:06:22 6/10

Excusez d'avance mon "àl'ouesteté" ....
mais voilà, j'arrive 4 ans après la guerre,
et découvre que des montagnes de talents se sont bien emmerdés à fabriquer des classes fabuleuses
(tous mes compliments) et moi, qui n'ai encore rien inventé utilise un objet tout prêt servi chaud...
c'est peut être con, comme questions, mais :  
Que pensez-vous de PDO ? Suis-je complètement Hors-sujet ?
Aviez-vous déjà posté toutes ces sources avant que PDO existe ?
Qu'utiliseriez vous pour des fonctionnalités supplémentaires cette année ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

MySQL [ par intello2001 ] j'ai fait une base MySQL toute neuve, toute VIDE !!je voudrai avoir des exemple de création de table et tt sa...je c juste sa :$host="sql.free.fr";$ba BDD mysql --> Access [ par YarbY ] SalutJ'ai un site qui tourne avec une base de donées mysql, et je voudrais récupérer les données dans Access, en gardant ma base sur le serveur. Je ve postgresl --> mysql [ par NDK ] Bonjour, Je dois reprendre un site qui a été réalisé en php avec une bdd en Postgresql, et j'aimerais convertire le code pour qu il travaille avec une Php & MySql ??? [ par nova85 ] Je voudrai savoir si il est possible de realiser un site assez important juste avec une BDD mysql , si c'est capable de resister , et surtout savoir s classe PHP pour accés BDD [ par cuicui ] Bonjour,Je recherche des classes en PHP qui perùet d'acceder à des des bases de données tel que INTERBASE ou MySQL.Merci à touscuicui... image php Mysql [ par arnaldo21 ] bonjour pourriez-vous me donner un exemple concret d'affichage d'image a partir d'une bdd. J'utilise un upload qui stock le nom de l'image dans la bdd Problème affichage BD multiples [ par ekipage2 ] Bonjour,j'ai plusieurs BD : eleve / matières / et exercicesLorque l'élèv se connecte, il peut afficher la liste des exercices correspondants à sa clas Intégrité BDD [ par isis26 ] Bonjour,Je suis d&#233;butante en PHP. Je dois charger un fichier texte dans une base de donn&#233;es MySQL.Une ligne du fichier permet de remplir plu Mettre un log et psw sur bdd mysql ??? [ par nova85 ] Comment met ton un login et un mot de passe sur une base mysql avec phpmyadmin ?nova liste deroulante bdd mysql [ par lagombe ] Voilà je tente désespérement de monter sur un formulaire deux listes déroulantes, la première apparaît toute seule (contenu d'une bdd, ça ça marche...


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales