Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INTERFACE DATABASE ET CLASSE MYSQL


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : interface, classe, mysqli, mysql, database Niveau : Initié Date de création : 28/01/2008 Vu / téléchargé: 7 052 / 359

Note :
8 / 10 - par 3 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

J'avais fait un peu de programmation objet en Java et j'ai voulu m'y mettre en PHP.
J'ai donc décidé  de faire une interface de manipulation de base de donnée et une classe Mysql l'implémentant pour deux raisons :
- but pédagogique (voir la plupart de ce que l'on peut faire en PHP en objet)
- créer une interface qui peut être complétée par d'autres classe l'implémentant pour l'accès à d'autres bases de données (il ne me semble pas que ce soit présent sur ce site)

La classe Mysql utilise la classe mysqli (je l'utilise pour créer des méthodes qui me sembles utiles à la manipulation de base de données). Pourquoi avoir fait une classe utilisant une autre classe? Pour ne pas être limiter à mysqli (je peux toujours changer ma classe mysql sans changer les scriptes qui l'utilise) et pouvoir créer des méthodes qui répondent à mes besoins de manière plus précise et conforme à l'interface (même méthodes pour la manipulations de différentes bases de données).

Voilà :-D
J'espère que mes première lignes de code objet en PHP vous plairont (c'est ma première source également lol) ;-)
 

Source

  • //Fichier Db.php
  • <?php
  • /************************************************************************
  • Interface Database - David "Davjack" Bellanca
  • Creer le 27 janvier 2008
  • Modifie le 28 janvier 2008
  • Compatible PHP5
  • **************************************************************************/
  • interface Db
  • {
  • /*-------------------------------------
  • Partie de connexion a la base de donnee
  • -------------------------------------*/
  • //__construct utilise db_connect pour se connecter a la base de donnees
  • /*
  • $db_host : nom de l'hote, par exemple localhost
  • $db_user : nom de l'utilisateur
  • $db_pass : mot de passe
  • $db_name : nom de la base de donnees
  • */
  • public function __construct($db_host,$db_user,$db_pass,$db_name);
  • public function db_connect($db_host,$db_user,$db_pass,$db_name);
  • //Verification de la connexion (retourne l'erreur si il y en a une, sinon null)
  • //public function db_connectError();
  • // Fermer la connexion
  • public function db_close();
  • // Lors de la destruction de la classe, on ferme la connexion
  • public function __destruct();
  • //Desactiver / Activer l'autocommit
  • public function db_autocommit($TrueFalse);
  • //Retourne la version du serveur
  • public function db_version();
  • /*-------------------------------------------
  • Partie de manipulations de la base de donnees
  • -------------------------------------------*/
  • //Envoie d'une requete
  • public function sql_query($query);
  • //Valide une requete
  • public function sql_commit();
  • //Annuler une requete
  • public function sql_rollback();
  • //Retourne le resultat de la derniere requete sous forme d'un tableau associatif (une ligne)
  • public function sql_arrayAssocResult();
  • //Retourne le resultat de la derniere requete sous forme d'un tableau indexe numeriquement (une ligne)
  • public function sql_arrayNumResult();
  • //Retourne les resultats de la derniere requete sous forme d'un tableau associatif (plusieurs lignes)
  • public function sql_arrayAssocResults();
  • //Retourne les resultats de la derniere requete sous forme d'un tableau indexe numeriquement (plusieurs lignes)
  • public function sql_arrayNumResults();
  • //Retourne le nombre de lignes affectees par la derniere requete
  • public function sql_numRows();
  • //Retourne le nombre de colonnes de la derniere requete
  • public function sql_numCols();
  • //Retourne la PK auto-incremente/sequence de la derniere requete
  • public function sql_lastPKIncremented();
  • //Retourne la liste de toutes les tables de la base de donnees dans un tableau
  • public function sql_listTables();
  • }
  • ?>
  • //Fichier Mysql.php
  • <?php
  • /************************************************************************
  • Classe Mysql - David "Davjack" Bellanca
  • Creer le 27 janvier 2008
  • Modifie le 28 janvier 2008
  • Compatible PHP5
  • **************************************************************************/
  • require_once 'Db.php';
  • class Mysql implements Db
  • {
  • private $mysqli;
  • private $result;
  • private $db_name;
  • //--------
  • //Methodes
  • //--------
  • //__construct utilise db_connect pour se connecter a la base de donnees
  • public function __construct($db_host,$db_user,$db_pass,$db_name)
  • {
  • $this->db_connect($db_host,$db_user,$db_pass,$db_name);
  • }
  • public function db_connect($db_host,$db_user,$db_pass,$db_name)
  • {
  • unset($this->result);
  • unset($this->mysqli);
  • $this->db_name = $db_name;
  • $this->mysqli = new mysqli($db_host,$db_user,$db_pass,$db_name);
  • if (mysqli_connect_errno())
  • {
  • throw new Exception("Echec de la connexion");
  • //throw new Exception("Echec de la connexion : ".mysqli_connect_error());
  • }
  • }
  • // Fermer la connexion
  • public function db_close()
  • {
  • $this->mysqli->close();
  • }
  • // Lors de la destruction de la classe, on ferme la connexion
  • public function __destruct()
  • {
  • $this->db_close;
  • }
  • //Desactiver / Activer l'autocommit
  • //!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
  • public function db_autocommit($TrueFalse)
  • {
  • if (is_bool($TrueFalse))
  • {
  • $this->mysqli->autocommit($TrueFalse);
  • //On verifie que l'autocommit a bien ete active/desactive
  • if ($TrueFalse)
  • {
  • $this->sql_query("SELECT @@autocommit");
  • $autocommit = $this->sql_arrayNumResult();
  • if ($autocommit[0][0] != 1)
  • throw new Exception("Erreur : l'autocommit n'a pas &eacute;t&eacute; activ&eacute;");
  • }
  • else
  • {
  • $this->sql_query("SELECT @@autocommit");
  • $autocommit = $this->sql_arrayNumResult();
  • if ($autocommit[0][0] != 0)
  • throw new Exception("Erreur : l'autocommit n'a pas &eacute;t&eacute; d&eacute;sactiv&eacute;");
  • }
  • }
  • else
  • {
  • throw new Exception("Vous devez entrer un bool&eacute;en en param&egrave;tre");
  • }
  • }
  • //Retourne la version du serveur
  • public function db_version()
  • {
  • return $this->mysqli->get_server_info();
  • }
  • /*-------------------------------------------
  • Partie de manipulations de la base de donnees
  • -------------------------------------------*/
  • //Envoie d'une requete
  • public function sql_query($query)
  • {
  • if (!$this->result = $this->mysqli->query($query))
  • {
  • throw new Exception("Erreur de requ&ecirc;te SQL : ".$this->mysqli->error);
  • //throw new Exception("Erreur de requ&ecirc;te SQL");
  • }
  • }
  • //Valide une requete
  • public function sql_commit()
  • {
  • $this->mysqli->commit();
  • }
  • //Annuler une requete
  • public function sql_rollback()
  • {
  • if(!$this->mysqli->rollback())
  • throw new Exception("Erreur rollback");
  • }
  • //Retourne le resultat de la derniere requete sous forme d'un tableau associatif (une ligne)
  • public function sql_arrayAssocResult()
  • {
  • if ($this->result)
  • {
  • $result = $this->result->fetch_array(MYSQLI_ASSOC);
  • return $result;
  • }
  • else
  • {
  • throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
  • }
  • }
  • //Retourne le resultat de la derniere requete sous forme d'un tableau indexe numeriquement (une ligne)
  • public function sql_arrayNumResult()
  • {
  • if ($this->result)
  • {
  • $result = $this->result->fetch_array(MYSQLI_NUM);
  • return $result;
  • }
  • else
  • {
  • throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
  • }
  • }
  • //Retourne les resultats de la derniere requete sous forme d'un tableau associatif (plusieurs lignes)
  • public function sql_arrayAssocResults()
  • {
  • if ($this->result)
  • {
  • $i = 0;
  • while ($temp = $this->result->fetch_array(MYSQLI_ASSOC))
  • {
  • $result[$i] = $temp;
  • $i++;
  • }
  • return $result;
  • }
  • else
  • {
  • throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
  • }
  • }
  • //Retourne les resultats de la derniere requete sous forme d'un tableau indexe numeriquement (plusieurs lignes)
  • public function sql_arrayNumResults()
  • {
  • if ($this->result)
  • {
  • $i = 0;
  • while ($temp = $this->result->fetch_array(MYSQLI_NUM))
  • {
  • $result[$i] = $temp;
  • $i++;
  • }
  • return $result;
  • }
  • else
  • {
  • throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
  • }
  • }
  • //Retourne le nombre de lignes affectees par la derniere requete
  • public function sql_numRows()
  • {
  • return $this->mysqli->affected_rows;
  • }
  • //Retourne le nombre de colonnes de la derniere requete
  • public function sql_numCols()
  • {
  • return $this->mysqli->field_count;
  • }
  • //Retourne la PK auto-incremente/sequence de la derniere requete
  • public function sql_lastPKIncremented()
  • {
  • return $this->mysqli->insert_id;
  • }
  • //Retourne la liste de toutes les tables de la base de donnees dans un tableau
  • public function sql_listTables()
  • {
  • $this->sql_query("SHOW TABLES FROM ".$this->db_name);
  • $listTemp = $this->sql_arrayNumResults();
  • $i = 0;
  • foreach($listTemp as $cle=>$valeur)
  • {
  • foreach($valeur as $cle2=>$table)
  • {
  • $result[$i] = $table;
  • $i++;
  • }
  • }
  • return $result;
  • }
  • }
  • ?>
  • //Fichier utilisation.php
  • <?php
  • /************************************************************************
  • Utilisation de la classe Mysql - David "Davjack" Bellanca
  • **************************************************************************/
  • try{
  • //require_once 'myPHPException.php';
  • //Pour ne pas afficher les erreurs si vous n'avez pas acces a php.ini.
  • //A commenter pendant le developpement
  • ini_set('display_errors','Off');
  • require_once 'Mysql.php';
  • //Creation d'une connexion a une base MySQL - Instanciation de la classe
  • $db = new Mysql('host','login','mot de passe','base de donnee');
  • //Affiche la version du serveur MySQL
  • echo $db->db_version()."<br />";
  • //FALSE pour arreter l'autocommit et TRUE pour l'activer
  • //!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
  • $db->db_autocommit(FALSE);
  • $db->sql_query("delete from table");
  • //Annule les
  • //!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
  • //et si l'autocommit est desactive
  • $db->sql_rollback();
  • $requete = "INSERT INTO table (...)
  • VALUES (...)";
  • $db->sql_query($requete);
  • //Affichage de la valeur de l'auto-incrementation de la derniere requete
  • echo "PK : ".$db->sql_lastPKIncremented()."<br />";
  • //!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
  • //et si l'autocommit est desactive
  • $db->sql_commit();
  • //Requete renvoyant plusieurs lignes
  • $db->sql_query("select * from table");
  • //Affichage du nombre de lignes affectees par la derniere requete
  • echo "Nb lignes : ".$db->sql_numRows()."<br />";
  • //Affichage du nombre de colonnes de la derniere requete
  • echo "Nb colonnes : ".$db->sql_numCols()."<br />";
  • //Parcours des resultats (plusieurs lignes) de la derniere requete
  • foreach($db->sql_arrayNumResults() as $val) //ou $db->sql_arrayAssocResults();
  • {
  • foreach($val as $cle=>$valeur)
  • {
  • echo $cle.' : '.$valeur.'<br />';
  • }
  • echo "<br />";
  • }
  • //Requete renvoyant une ligne
  • $db->sql_query("select * from table where num = 1");
  • //Affichage de la ligne de resultat
  • foreach($db->sql_arrayAssocResult() as $cle=>$valeur) //ou $db->sql_arrayNumResult()
  • {
  • echo $cle.' : '.$valeur.'<br />';
  • }
  • //Affichage de toutes les tables de la base
  • foreach($db->sql_listTables('test') as $valeur)
  • {
  • echo $valeur.'<br />';
  • }
  • //Fermeture de la derniere connexion
  • $db->db_close();
  • }
  • catch (Exception $e)
  • {
  • //Gestion des exceptions renvoyees par la classe
  • echo $e->getMessage();
  • }
  • ?>
//Fichier Db.php
<?php
/************************************************************************
Interface Database - David "Davjack" Bellanca
Creer le 27 janvier 2008
Modifie le 28 janvier 2008
Compatible PHP5

**************************************************************************/

interface Db
{
	/*-------------------------------------
	Partie de connexion a la base de donnee
	-------------------------------------*/
	//__construct utilise db_connect pour se connecter a la base de donnees
	/*
	$db_host	:	nom de l'hote, par exemple localhost
	$db_user	:	nom de l'utilisateur
	$db_pass	:	mot de passe
	$db_name	:	nom de la base de donnees
	*/
	public function __construct($db_host,$db_user,$db_pass,$db_name);
	public function db_connect($db_host,$db_user,$db_pass,$db_name);
	
	//Verification de la connexion (retourne l'erreur si il y en a une, sinon null)
	//public function db_connectError();
	
	// Fermer la connexion
	public function db_close();

	// Lors de la destruction de la classe, on ferme la connexion
	public function __destruct();
	
	//Desactiver / Activer l'autocommit
	public function db_autocommit($TrueFalse);
	
	//Retourne la version du serveur
	public function db_version();

	/*-------------------------------------------
	Partie de manipulations de la base de donnees
	-------------------------------------------*/
	//Envoie d'une requete
	public function sql_query($query);
	
	//Valide une requete
	public function sql_commit();
	
	//Annuler une requete
	public function sql_rollback();

	//Retourne le resultat de la derniere requete sous forme d'un tableau associatif (une ligne)
	public function sql_arrayAssocResult();

	//Retourne le resultat de la derniere requete sous forme d'un tableau indexe numeriquement (une ligne)
	public function sql_arrayNumResult();

	//Retourne les resultats de la derniere requete sous forme d'un tableau associatif (plusieurs lignes)
	public function sql_arrayAssocResults();

	//Retourne les resultats de la derniere requete sous forme d'un tableau indexe numeriquement (plusieurs lignes)
	public function sql_arrayNumResults();
	
	//Retourne le nombre de lignes affectees par la derniere requete
	public function sql_numRows();
	
	//Retourne le nombre de colonnes de la derniere requete
	public function sql_numCols();
	
	//Retourne la PK auto-incremente/sequence de la derniere requete
	public function sql_lastPKIncremented();
	
	//Retourne la liste de toutes les tables de la base de donnees dans un tableau
	public function sql_listTables();
}
?>


//Fichier Mysql.php
<?php
/************************************************************************
Classe Mysql - David "Davjack" Bellanca
Creer le 27 janvier 2008
Modifie le 28 janvier 2008
Compatible PHP5

**************************************************************************/

require_once 'Db.php';

class Mysql implements Db
{
	private $mysqli;

	private $result;
	private $db_name;

	//--------
	//Methodes
	//--------
	//__construct utilise db_connect pour se connecter a la base de donnees
	public function __construct($db_host,$db_user,$db_pass,$db_name)
	{
		$this->db_connect($db_host,$db_user,$db_pass,$db_name);
	}
	public function db_connect($db_host,$db_user,$db_pass,$db_name)
	{
		unset($this->result);
		unset($this->mysqli);
		$this->db_name = $db_name;
		$this->mysqli = new mysqli($db_host,$db_user,$db_pass,$db_name);

		if (mysqli_connect_errno())
		{
			throw new Exception("Echec de la connexion");
			//throw new Exception("Echec de la connexion : ".mysqli_connect_error());
		}
	}
	
	// Fermer la connexion
	public function db_close()
	{
		$this->mysqli->close();
	}

	// Lors de la destruction de la classe, on ferme la connexion
	public function __destruct()
	{
		$this->db_close;
	}
	
	//Desactiver / Activer l'autocommit
	//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
	public function db_autocommit($TrueFalse)
	{
		if (is_bool($TrueFalse))
		{
			$this->mysqli->autocommit($TrueFalse);

			//On verifie que l'autocommit a bien ete active/desactive
			if ($TrueFalse)
			{
				$this->sql_query("SELECT @@autocommit");
				$autocommit = $this->sql_arrayNumResult();
				if ($autocommit[0][0] != 1)
					throw new Exception("Erreur : l'autocommit n'a pas &eacute;t&eacute; activ&eacute;");
			}
			else
			{
				$this->sql_query("SELECT @@autocommit");
				$autocommit = $this->sql_arrayNumResult();
				if ($autocommit[0][0] != 0)
					throw new Exception("Erreur : l'autocommit n'a pas &eacute;t&eacute; d&eacute;sactiv&eacute;");
			}
			
		}
		else
		{
			throw new Exception("Vous devez entrer un bool&eacute;en en param&egrave;tre");
		}
	}
	
	//Retourne la version du serveur
	public function db_version()
	{
		return $this->mysqli->get_server_info();
	}

	/*-------------------------------------------
	Partie de manipulations de la base de donnees
	-------------------------------------------*/
	//Envoie d'une requete
	public function sql_query($query)
	{
		if (!$this->result = $this->mysqli->query($query))
		{
			throw new Exception("Erreur de requ&ecirc;te SQL : ".$this->mysqli->error);
			//throw new Exception("Erreur de requ&ecirc;te SQL");
		}
	}
	
	//Valide une requete
	public function sql_commit()
	{
		$this->mysqli->commit();
	}
	
	//Annuler une requete
	public function sql_rollback()
	{
		if(!$this->mysqli->rollback())
			throw new Exception("Erreur rollback");
	}

	//Retourne le resultat de la derniere requete sous forme d'un tableau associatif (une ligne)
	public function sql_arrayAssocResult()
	{
		if ($this->result)
		{
			$result = $this->result->fetch_array(MYSQLI_ASSOC);
			return $result;
		}
		else
		{
			throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
		}
	}
	
	//Retourne le resultat de la derniere requete sous forme d'un tableau indexe numeriquement (une ligne)
	public function sql_arrayNumResult()
	{
		if ($this->result)
		{
			$result = $this->result->fetch_array(MYSQLI_NUM);		
			return $result;
		}
		else
		{
			throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
		}
	}
	
	//Retourne les resultats de la derniere requete sous forme d'un tableau associatif (plusieurs lignes)
	public function sql_arrayAssocResults()
	{
		if ($this->result)
		{
			$i = 0;  
			while ($temp = $this->result->fetch_array(MYSQLI_ASSOC))
			{
				$result[$i] = $temp;
				$i++;
			}
		
			return $result;
		}
		else
		{
			throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
		}
	}
	
	//Retourne les resultats de la derniere requete sous forme d'un tableau indexe numeriquement (plusieurs lignes)
	public function sql_arrayNumResults()
	{
		if ($this->result)
		{
			$i = 0;  
			while ($temp = $this->result->fetch_array(MYSQLI_NUM))
			{
				$result[$i] = $temp;
				$i++;
			}
		
			return $result;
		}
		else
		{
			throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
		}
	}
	
	//Retourne le nombre de lignes affectees par la derniere requete
	public function sql_numRows()
	{
		return $this->mysqli->affected_rows;
	}
	
	//Retourne le nombre de colonnes de la derniere requete
	public function sql_numCols()
	{
		return $this->mysqli->field_count;
	}
	
	//Retourne la PK auto-incremente/sequence de la derniere requete
	public function sql_lastPKIncremented()
	{
		return $this->mysqli->insert_id;
	}

	//Retourne la liste de toutes les tables de la base de donnees dans un tableau
	public function sql_listTables()
	{
		$this->sql_query("SHOW TABLES FROM ".$this->db_name);
		$listTemp = $this->sql_arrayNumResults();

		$i = 0;
		foreach($listTemp as $cle=>$valeur)
		{
			foreach($valeur as $cle2=>$table)
			{
				$result[$i] = $table;
				$i++;
			}
		}
		return $result;
	}
}
?>


//Fichier utilisation.php
<?php
/************************************************************************
Utilisation de la classe Mysql - David "Davjack" Bellanca

**************************************************************************/
try{
	//require_once 'myPHPException.php';	

	//Pour ne pas afficher les erreurs si vous n'avez pas acces a php.ini.
	//A commenter pendant le developpement
	ini_set('display_errors','Off');

	require_once 'Mysql.php';

	//Creation d'une connexion a une base MySQL - Instanciation de la classe
	$db = new Mysql('host','login','mot de passe','base de donnee');


	//Affiche la version du serveur MySQL
	echo $db->db_version()."<br />";


	//FALSE pour arreter l'autocommit et TRUE pour l'activer
	//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
	$db->db_autocommit(FALSE);

	$db->sql_query("delete from table");


	//Annule les 
	//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
	//et si l'autocommit est desactive
	$db->sql_rollback();

	$requete = "INSERT INTO table (...)
	VALUES (...)";
	$db->sql_query($requete);


	//Affichage de la valeur de l'auto-incrementation de la derniere requete
	echo "PK : ".$db->sql_lastPKIncremented()."<br />";


	//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
	//et si l'autocommit est desactive
	$db->sql_commit();


	//Requete renvoyant plusieurs lignes
	$db->sql_query("select * from table");


	//Affichage du nombre de lignes affectees par  la derniere requete
	echo "Nb lignes : ".$db->sql_numRows()."<br />";
	//Affichage du nombre de colonnes de la derniere requete
	echo "Nb colonnes : ".$db->sql_numCols()."<br />";


	//Parcours des resultats (plusieurs lignes) de la derniere requete
	foreach($db->sql_arrayNumResults() as $val) //ou $db->sql_arrayAssocResults();
	{
		foreach($val as $cle=>$valeur)
		{
			echo $cle.' : '.$valeur.'<br />';
		}
		echo "<br />";
	}


	//Requete renvoyant une ligne
	$db->sql_query("select * from table where num = 1");


	//Affichage de la ligne de resultat
	foreach($db->sql_arrayAssocResult() as $cle=>$valeur) //ou $db->sql_arrayNumResult()
		{
			echo $cle.' : '.$valeur.'<br />';
		}


	//Affichage de toutes les tables de la base
	foreach($db->sql_listTables('test') as $valeur)
	{
		echo $valeur.'<br />';
	}


	//Fermeture de la derniere connexion
	$db->db_close();

}
catch (Exception $e)
{
	//Gestion des exceptions renvoyees par la classe
	echo $e->getMessage();
}

?>

Conclusion

Pour l'utilisation de la classe, regardez le code de utilisation.php
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de garfield90 le 28/01/2008 17:51:33

Juste quelques petits trucs à modifié :

tu pourrais ajouter une propriété transactionnelle ce qui te permettrai de faire un check dans ta fonction sql_rollback() et en cas d'erreur/exception sur ta requete de faire le rollback si nécessaire.

sinon personellement je suis pas fan de cette notation :
if ( !$this->mysqli->rollback() )
car avec cette mauvaise habitude, on peut avoir des soucis, je prefere écrire :
if  ( false === $this->mysqli->rollback )
plus lisible est empeche des bugs qd la fonction retourne 0 ou '' ou false, etc.

Sinon, classe interessante

signaler à un administrateur
Commentaire de Davjack le 28/01/2008 17:52:03

N'hésitez pas à poster vos commentaires ;-)

signaler à un administrateur
Commentaire de Davjack le 28/01/2008 18:01:11

Merci pour tes critiques Garfield90.

Qu'entends-tu par une propriété transactionnelle?

Pour if(! ... c'est une question d'habitude mais je comprends que tu préfères (false === ... Moi j'ai l'habitude d'utiliser (!... (peut-être qu'un jour je le regretterai) dans la plupart des langages dans lesquelles je programmes.

signaler à un administrateur
Commentaire de garfield90 le 28/01/2008 18:07:47

en fait, cette propriété/variable permettrai de savoir si ta base doit etre traité comme étant transactionnelle ou pas

petit exemple:
essaye :
if (! strpos('toto', 't') ){
  echo 'chaine non trouvée';
}
// affiche chaine non trouvé
if (false === strpos('toto', 't') ){
   echo 'chaine non trouvée';
}
// affiche rien

la deuxieme te donne un résultat correct, donc pour garder une homogénéité, je code comme ca :p

signaler à un administrateur
Commentaire de Davjack le 28/01/2008 18:34:36

L'ennui avec la variable transactionnelle, c'est que si je veux traiter ma base en transactionnelle, je dois d'abord faire stopper l'autocommit. Ensuite, toutes les tables de la base (ou au moins toutes celle que je vais manipuler) doivent être transactionnelles (si par malheur j'en ai une MyISAM, et que je la manipule  durant la transaction, c'est plus une transaction car la requete est directement commité).
En gros, il faudrait regarder les tables touchées par chaque requête de la transaction, et si elles sont toutes transactionnelles, on peut la lancer. J'ai pas voulu pousser si loin car ça fait vraiment beaucoup de code pour pas grand chose. Je comptais plutôt sur l'utilisation consciencieuse de la classe mais l'idée n'est pas mauvaise. Si, une fois, j'ai une idée simple pour traiter ce problème, je modifierai la source mais merci quand même pour l'idée ;-)

signaler à un administrateur
Commentaire de codefalse le 28/01/2008 20:48:19 administrateur CS 7/10

J'aime bien l'approche, car c'est vrai qu'il y a milles et une manières de s'abstraire d'une base de données.
Le problème avec l'abstraction, c'est que maintenant l'ennui vient avec les requetes, si tu fait un sql_query ("SELECT * FROM table LIMIT 1"); mais maintenant si je te dit que je veux etre sous Mssql, c'est pas limit mais top. Il faudrait donc maintenant faire une classe de requetes... et ensuite une classe ActiveRecord, Scaffolding et BAM on a un framework (bon j'exagère un peu ;))

Bonne source en tout cas :)

Juste un petit point en moin : Tu n'utilise pas la SPL pour les boucles (tel que foreach) en implémentant Iterable, Countable et Seekable, du coup, ton foreach fait le tri deux fois, une fois pour récuperer en tant que tableau dans sql_listTables et une autre fois dans ton code, tu alourdit donc le procédé.

Regarde du coté de la SPL, tu y trouvera des infos super intéressantes ! :)

signaler à un administrateur
Commentaire de Davjack le 29/01/2008 11:55:16

Je vais me renseigner sur le SPL. Merci pour l'info et la critique ;-)

signaler à un administrateur
Commentaire de Bidou le 29/01/2008 13:03:43 administrateur CS

Ca fait plaisir de voir que tu viens poster ici!

Concernant le code, pas beaucoup à dire étant donné que je ne suis pas un expert PHP, cependant:

- Est-ce que l'interface Db est vraiment nécessaire? A priori, non.
- Toutes les méthodes avec if/else qui ont une instruction return dans le if n'ont pas besoin de else. Ca fait du code un peu plus compacte :)


P.S: Dès que les exas c'est fini, tu me contactes :)

signaler à un administrateur
Commentaire de garfield90 le 29/01/2008 14:14:20

Je vais répondre à Bidou en ce qui concerne l'interface, tu peux implementer rapidement une gestion de DB vers un autre SGBD en gardant une homogénéité de ton code.

signaler à un administrateur
Commentaire de codefalse le 29/01/2008 14:17:55 administrateur CS

@Bidou : L'interface permet de définir les mêmes méthodes pour différentes bases. Je ne veux pas t'apprendre ca, vu ton niveau, mais du coup je serai intéressé par ton idée d'implémentation ? Comment tu t'y prendrai toi ?

"Toutes les méthodes avec if/else qui ont une instruction return dans le if n'ont pas besoin de else. Ca fait du code un peu plus compacte :)" => Mais si ca va pas dans le if, le else s'occupera de l'action correspondante, ou est-ce que tu trouve que c'est inutile ?
La ligne que j'ai vu en exemple c'était :

#  if ($this->result)
# {
# $result = $this->result->fetch_array(MYSQLI_NUM);
# return $result;
# }
# else
# {
# throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");
# }

(en faisant roulette rapide), donc tu a une erreur de lancée si le if n'est pas interprété. Apres tu peux tres bien faire

if ($this->result)
    return $this->result->fetch_array(MYSQLI_NUM);

throw new Exception("Aucune requ&ecirc;te n'a &eacute;t&eacute; ex&eacute;cut&eacute;e");

c'est toujours ca de gagné ! :)

signaler à un administrateur
Commentaire de malalam le 29/01/2008 19:36:24 administrateur CS

Hello,

perso, j'inverserais :
if(false === ($result = $this->result->fetch_array(MYSQLI_NUM))) {
  throw bla bla
}
return $result;
                                            
ça me semble plus clair. Mais dans tous les cas, c'est du pinaillage.

@codefalse => une classe de requpete, si c'est une idée rigolotte, serait probablement beaucoup trop lourde. Je préfère laisser le choix au développeur de créer ses propres requêtes. L'abstraction se chargeant de vérifier que le driver de BD  a accepté la requête ou pas, si ce n'est pas le cas, de balancer une exception. Si tu tentes d'exécuter du C avec Firefox, il ne va pas le traduire en html, il va t'envoyer ch*** :-)

Je préfère passer des constantes à 1 méthode pour récupérer des données, plutôt que d'appeler différentes méthodes selon que je veux un tableau associatif, numérique, etc...mais ça, c'est un choix perso. Ceci dit, ça allègerait aussi le code.

Moi j'aime bien le code. Il est clair, agréable à lire; pour un début en POO php5, c'est pas mal du tout. On sent le codeur quand même...Bref, pour un essai, c'est bien foutu. Ne pas oublier que c'était pour tester la POO...donc les fonctionnalités sont à mettre de côté. Néanmoins, tu devrasi effectivement aller plus loin si tu veux tester la POO sous PHP5 : tu l'effleures à peine, là...:-) Et du coup en effet, chercher de nouvelles fonctionnalités : la SPL pour parcourir les jeux de résultat en effet. Voire les limiter :-) Tu peux toujours caser un peu de Réflexion au milieu aussi, juste pour voir comment cela fonctionne. Jouer avec __wakeup, __sleep, des accesseurs via __get et __set, les méthode statiques en intégrant une notion de singleton, et de multiton, et une usine (factory).

Bref, t'as encore de quoi jouer...

signaler à un administrateur
Commentaire de codefalse le 29/01/2008 22:03:43 administrateur CS

@Malalam : L'histoire de faire une classe pour requete, je pense que c'est un peu commes les couleurs. Si tu regarde, la plupart des frameworks (php) actuels implémentent des pré-requetes principales (modele CRUD). En effet, tu ne va pas changer quelques parties de ton code pour un changement de bdd, juste modifier la classe de requete. Apres c'est mon avis ! Ta référence avec du C pour firefox n'est pas vrai, je dira plus que tu propose à firefox d'interpréter du html, xhtml, xml, etc. Il y a des nuances, mais la base reste la meme (SQL ANSI).

signaler à un administrateur
Commentaire de malalam le 29/01/2008 23:57:13 administrateur CS

Nan, parce que pour reprendre ton exemple, TOP n'est pas l'équivalent de LIMIT : TOP ne va que chercher les X premiers résultats renvoyés par ta requête. En aucun cas il ne permet de se placer sur un offset particulier. Il n'existe pas d'équivalent à LIMIT sous mssql. Et dans ce cas, ce n'est pas une méthode de seudo requêtes qu'il faut créer, mais une méthode permettant de se déplacer à loisir dans les résultats (voire dans les jeux de requêtes dans le cas de jeux multiples) : via les itérateurs par exemple.
Appliquer un modèle CRUD, ça me va pour des cas spécifique : je crée une classe document, et je lui donne des méthodes permettant de créer un document, de le lire, de le mettre à jour et de l'effacer. Là oui ça a un intérêt, et c'est ce que font les frameworks. Mais ça n'est jamais lié à la classe de BD : ces classes se servent de l'abstraction de BD, c'est différent. Mais des méthodes de pseudo requête dans ma classe de pseudo BD...je vais faire quoi, une méthode delete à laquelle je passe une table et un champ conditionnel (par exemple, pour faire simple), et qui me génère une requête sql ansi qui fait DELETE FROM table WHERE champ_conditionnel = valeur conditionnelle ? Puis utilise ma méthode query pour l'exécuter ? Je n'en vois pas l'intérêt. Ca alourdit le traitement pour rien, alors qu'un DELETE est à peu de choses prêt TOUJOURS du sql ansi. De plus, ce genre de méthode fait de manière complexe ce que l'on peut faire simplement, et ne permet pas de faire des requêtes vraiment complexe.
Et Firefox ne transforme pas ton xml en html, par exemple. Il interprête les deux, nuances. Il ne propose pas de pseudo langage. Tu ne peux pas lui donner du xml pour qu'il le transforme et l'interprête comme du html. Et si le base pour ces "langage" reste la même (sgml), il n'en reste pas moins que si tu le compares à une classe sql , c'est une classe sql qui comprend et interprête directement le sql de mssql, de mysql, d'oracle et d'access...tu peux lui parler dans n'importe lequel de ces langages : il les comprend. Mais il ne comprend pas le C...et ne t'autorise pas à t'en servir : parce qu'il n'est pas fait pour ça.

signaler à un administrateur
Commentaire de codefalse le 30/01/2008 13:54:19 administrateur CS

Mon exemple avec Top n'était peut-etre pas le meilleur, je dirai alors Offset de pgsql. Apres  bien sur la méthode des itérateurs semble intéressante (je la pratique aussi) dans ce cas là. Mais c'était en tant qu'exemple, pour un autre type de particularité de requete, je pense pas qu'on aura aussi des paliatifs en php.

Le framework CodeIgniter possède des classes de requetes directement (insert, update, delete, select, create, drop, show, ...), va faire un tour dans system>database>drivers>UNDRIVER>mysql_driver.php

J'ai pas regardé avec autant de précision les autres framework, mais du coup l'usage dans ton travail en est, je trouve facilité, car tu n'a qu'a appeler la fonction avec les éléments que tu veux (table, colonnes, valeurs, conditions) et hop ! :)

Pour ne pas polluer la source de @Davjack, j'ai crée un topic dans le forum qui reprends mon dernier message et un liens, histoire de continuer notre discussion sur un support approprié ! :) Mais sache que ton idée m'interesse, je viens juste de finir un systeme de Bdd abstraite ou j'intègre justement des classes de requetes avec des select et consort, donc j'aimerai bien ton point de vue histoire d'avoir la bonne (ou une meilleure) vision de la chose :)

Url du topic : http://www.phpcs.com/infomsg_REQUETES-PRE-EXISTANTES-DANS-ABSTRACTION-SGBD_1068454.aspx

signaler à un administrateur
Commentaire de AlexN le 30/01/2008 22:03:24 7/10

Bonjour à tous,

C'est un bon début pour s'abstraire du niveau de communication avec les bases de données fourni par le language PHP.

Je voudrais signaler l'existence une librarie orientée objet d'abstraction des bases de données : adodb (http://adodb.sourceforge.net/)
Cette librairie est développée depuis 2000. Elle existe en version PHP et python. Elle est utilisable avec MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL, Foxpro, Access, ADO, Sybase, FrontBase, DB2, SAP DB, SQLite, Netezza, LDAP et les bases supportant l'ODBC.

Qualques fonctionnalités supplémentaires :

- Mode debug
- Un système de filtres sur les jeux d'enregistrements (une sorte d'array_walk pour les jeux d'enregistrements)
- Supporte les connections multiples simultanées
- Supporte le mode transactionnel.
et pleins d'autres...

Existe aussi en version lite pour réduire son empreinte (en mémoire pas écologique...)

Un petit livret d'introduction en français se trouve à cette adresse : http://phplens.com/phpeverywhere/adodb_french

signaler à un administrateur
Commentaire de peretoine le 19/02/2008 15:55:48 10/10

bravo :-)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Creer MySQL database [ par pluton83fr ] Slt Je suis un debutant en php, Je suis en train d installer un portail :Neocrome http://www.neocrome.net Et il me dise ca!!Mais le pb c'est que je n Formulaire avec select et update de bdd mysql [ par arnold002 ] Bonjour &#224; tous,J'ai un formulaire qui contient 2 champs de type select : classe et annee.Je veux associer chaque classe &#224; chaque ann&#233;e passage de variables de form vers bdd mysql [ par arnold002 ] Bonjour,Mon probl&#232;me n'avance pas...Mon form contient 2 champs select for($i<FONT color=#008000 s 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 problème mysql : Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource [ par wizard512 ] je sui entrain de cr&#233;er un script et je rencontre&nbsp;l'&#233;rreur suivante:==&gt;mysql_query(): supplied argument is not a valid MySQL-Link re Recherche mysql [ par simon0000 ] salut tous le monde ,j'ai une table mysql nom&#233;&nbsp;ecole ou il ya Retour des données d'une classe MySQL [ par Jerem_ ] Salut, Depuis ce matin, j'asseye de coter une classe MySQL pour mon site. La classe marche tr&#232;s bien quand je fait une requete INSERT, etc .. M Phpmyvisites et mysql [ par flopad ] Bonjour,J'ai r&#233;cup&#233;r&#233; phpmyvisites pour l'utiliser sur mon intranet.j'ai un soucis lors de l'installation, ca me dit "localhost" databa Erreur MySQL [ par coockiesch ] Salut! Je viens d'installer, sur mon ordi, Apache2, MySQL, PHP5 et PhpMyAdmin. On m'a demand&#233; de choisir l'extension mysqli, je choisi mysqli (pa Problème de code [ par stu76 ] Bonjour tout le monde ,Voil&#224; je planche sur un programme scolaire et j'ai un gros prob, je travaille sur un programme qui utilise trois base de d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.