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 !

CLASSE DE CONNEXION MYSQL EN PHP5


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : classe, mysql, connexion Niveau : Débutant Date de création : 22/02/2008 Date de mise à jour : 24/02/2008 16:36:08 Vu : 5 971

Note :
Aucune note

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

Description

Il s'agit d'une petite classe en PHP5 qui permet de géré simplement les requêtes SQL pour MySQL.


Utilisation:

Mysql = new Mysql(); // Instantiation
Mysql->Connexion(); //Connexion à la base de donnée



//Requete ne retournant pas de resultat
try {
    $NombreLignesAffecte = Mysql->ExecuteSQL('Requete SQL');
}
catch (Erreur $e) {
    echo $e -> RetourneErreur();
}




//Requetes retournant un/plusieurs résultat(s)

//Requete ne retournant pas de resultat
try {
    $TableResultats=Mysql->TabResSQL('Requete SQL');  
}
catch (Erreur $e) {
    echo $e -> RetourneErreur();
}



//Utilisation des résultats avec for
$NombreResultats=sizeof($TableResultats);
for($i=0;$i<$NombreResultats;$i++)
{
    echo $TableResultats[$i]['Champ1'];
    echo $TableResultats[$i]['Champ2'];
}


//Utilisation des résultats avec foreach
foreach ($TableResultats as $Valeur) {
    echo $Valeur['Champ1'];
    echo $Valeur['Champ2'];
}


// Une seul ligne retourné
echo $TableResultats[0]['Champ'];






 

Source

  • <?php
  • /*
  • // Nom : Classe MySQL
  • // Langage : PHP5
  • // Auteur : ONFROY Rudy
  • */
  • class Erreur extends Exception {
  • public function __construct($Msg) {
  • parent :: __construct($Msg);
  • }
  • public function RetourneErreur() {
  • $msg = '<div><strong>' . $this->getMessage() . '</strong>';
  • $msg .= ' Ligne : ' . $this->getLine() . '</div>';
  • return $msg;
  • }
  • }
  • Class Mysql
  • {
  • private
  • $Serveur = '',
  • $Bdd = '',
  • $Identifiant = '',
  • $Mdp = '',
  • $Lien = '',
  • $Debogue = true,
  • $NbRequetes = 0;
  • public
  • function __construct($Serveur = 'localhost', $Bdd = 'base', $Identifiant = 'root', $Mdp = '')
  • {
  • $this->Serveur = $Serveur;
  • $this->Bdd = $Bdd;
  • $this->Identifiant = $Identifiant;
  • $this->Mdp = $Mdp;
  • $this->Lien=mysql_connect($this->Serveur, $this->Identifiant, $this->Mdp);
  • if (!$this->Lien && $this->Debogue) throw new Erreur ('Erreur de connexion au serveur MySql!!!');
  • $Base = mysql_select_db($this->Bdd,$this->Lien);
  • if (!$Base && $this->Debogue) throw new Erreur ('Erreur de connexion à la base de donnees!!!');
  • }
  • public
  • function RetourneNbRequetes()
  • {
  • return $this->NbRequetes;
  • }
  • public
  • function TabResSQL($Requete)
  • {
  • $i = 0;
  • $Ressource = mysql_query($Requete,$this->Lien);
  • $TabResultat=array();
  • if (!$Ressource and $this->Debogue) throw new Erreur ('Erreur de requête SQL!!!');
  • while ($Ligne = mysql_fetch_assoc($Ressource))
  • {
  • foreach ($Ligne as $clef => $valeur) $TabResultat[$i][$clef] = $valeur;
  • $i++;
  • }
  • mysql_free_result($Ressource);
  • $this->NbRequetes++;
  • return $TabResultat;
  • }
  • public
  • function DernierId()
  • {
  • return mysql_insert_id($this->Lien);
  • }
  • public
  • function ExecuteSQL($Requete)
  • {
  • $Ressource = mysql_query($Requete,$this->Lien);
  • if (!$Ressource and $this->Debogue) throw new Erreur ('Erreur de requête SQL!!!');
  • $this->NbRequetes++;
  • $NbAffectee = mysql_affected_rows();
  • return $NbAffectee;
  • }
  • }
  • ?>
<?php
/* 
	//	Nom     : Classe MySQL    
	//	Langage : PHP5         
	//	Auteur  : ONFROY Rudy  
*/ 
class Erreur  extends Exception {
    
    public function __construct($Msg) {
        parent :: __construct($Msg);
    }
    
    public function RetourneErreur() {
        $msg  = '<div><strong>' . $this->getMessage() . '</strong>';
        $msg .= ' Ligne : ' . $this->getLine() . '</div>';
        return $msg;
    }
}

Class Mysql
{
	private
		$Serveur     = '',
		$Bdd         = '',
		$Identifiant = '',
		$Mdp         = '',
		$Lien        = '',	
		$Debogue     = true,	
		$NbRequetes  = 0;

	public
		function __construct($Serveur = 'localhost', $Bdd = 'base', $Identifiant = 'root', $Mdp = '') 
		{
			$this->Serveur     = $Serveur;
			$this->Bdd         = $Bdd;
			$this->Identifiant = $Identifiant;
			$this->Mdp         = $Mdp;

			$this->Lien=mysql_connect($this->Serveur, $this->Identifiant, $this->Mdp);
     		
			if (!$this->Lien && $this->Debogue) throw new Erreur ('Erreur de connexion au serveur MySql!!!');				
				
			$Base = mysql_select_db($this->Bdd,$this->Lien);
     		
			if (!$Base && $this->Debogue) throw new Erreur ('Erreur de connexion à la base de donnees!!!');
		}
		
	public
		function RetourneNbRequetes() 
		{
			return $this->NbRequetes;
		}

	public
		function TabResSQL($Requete)
		{
			$i = 0;
	
			$Ressource = mysql_query($Requete,$this->Lien);
			
     		$TabResultat=array();

     		if (!$Ressource and $this->Debogue) throw new Erreur ('Erreur de requête SQL!!!');
			while ($Ligne = mysql_fetch_assoc($Ressource))
			{
				foreach ($Ligne as $clef => $valeur) $TabResultat[$i][$clef] = $valeur;
				$i++;
			}

			mysql_free_result($Ressource);
			
			$this->NbRequetes++;
			
			return $TabResultat;
		}
		
	public
		function DernierId()
		{	
			return mysql_insert_id($this->Lien);
		}
	
	public
		function ExecuteSQL($Requete)
		{
			$Ressource = mysql_query($Requete,$this->Lien);
			
     		if (!$Ressource and $this->Debogue) throw new Erreur ('Erreur de requête SQL!!!');
			
			$this->NbRequetes++;
            $NbAffectee = mysql_affected_rows();		
			return $NbAffectee;			
		}		
}
?>

Conclusion

Si vous avez des questions où des propositions d'amélioration.
 

Historique

22 février 2008 14:59:25 :
Petite correction du code ^^
22 février 2008 20:37:01 :
Modification de la source en essayant de gérer les exceptions.
24 février 2008 00:27:21 :
Petite mise à jours toute petite.
24 février 2008 16:36:09 :
<?php "Encore une petite amélioration, mais c\'est pas fini"; ?>

Commentaires et avis

signaler à un administrateur
Commentaire de yoman64 le 22/02/2008 16:27:28

Oulala, une classe d'abstraction littéralement remplis de die() et de html, j'ai envi de pleurer :'(

De plus, dans ExecuteSQL pourquoi appel tu  mysql_affected_rows ? Il est tout à fait possible qu'on en ait même pas besoin, ce qui ferait un appel de fonction pour rien.

Ce genre de code est souvent très utile quand on peut s'en servire comme singleton, ça élargie beaucoup son champs d'action si on gère un gros projet avec de multiples classes/modules.

Enfin bref, ça manque cruellement de fonctionnalité, d'optimisation (on peut tout refaire en 2-3 fois moin de lignes...) du déja vu et en beaucoup mieu. Je m'abstiens donc de noter.

Je sais, c'est un peu dur comme commentaire, mais c'est comme ça qu'on progresse, prends le pas mal :)

signaler à un administrateur
Commentaire de crocxx2 le 22/02/2008 17:57:43

Ok merci du commentaire ;)
pourrais tu précisé un peu plus les optimisation et les fonctionnalité que je pourrait apporter?

J'ai aussi quelque question:
- Pourquoi les die() c'est mal?
- je vérifie le nombre de lignes que j'ai affecté pour vérifier qu'il n'y a pas d'erreur c'est mal de le faire a chaque fois?

Pas de soucis pour le commentaire, tend qu'il y a les explication je le prend pas mal. ;)

signaler à un administrateur
Commentaire de coucou747 le 22/02/2008 17:59:31

l'utilisation des Exceptions aurait ete preferable

signaler à un administrateur
Commentaire de yoman64 le 22/02/2008 18:18:14

Les die() c'est mal parce que c'est pas à ta classe de geré l'arrêt d'un script. et de plus une classe ne devrait pas renvoyer de html, encore une fois c'est pas le travail de ta classe de formater les erreurs.

Et puis dans la fonction ExecuteSQL, son role normallement devrait être d'executer une requete tout simplement, et de lancer une exception si on est en mode debug et que la requête échoue par exemple, pas de calculer le nombre de lignes affectées.

signaler à un administrateur
Commentaire de crocxx2 le 22/02/2008 18:56:24

Ok merci je vais faire des recherche sur les exceptions, prendre des cours et corriger ma source ^^

signaler à un administrateur
Commentaire de codefalse le 22/02/2008 19:58:35 administrateur CS

@yoman64 : Ce code n'est pas une classe d'abstraction. Une abstraction de base de donnée (ou abstraction tout court) permet de .... s'abstraire... du support utilisé (en l'occurence d'une base de donnée). Un abstraction de base de donnée permettra d'utiliser pgsql aussi bien que mysql ou mssql (et j'en passe) le tout sans modifier des lignes de code. Or ce n'est pas le cas ici puisque chaque fonctions utilisent mysql_*.

@crocxx2 : Comme l'a déjà été dit avant, les die sont déconseillés, et à remplacer par des throw new Exception (ou une exception personnalisée). Pourquoi ? Comme te l'a dit Yoman et Coucou, ta class ne doit pas retourner de html (comment je fait si j'utilise ta classe pour générer du pdf ?).
Par ailleur, au vue de ton code j'en déduit qu'il ne fonctionne uniquement sous Php5 (attributs private, méthodes magiques), mais malheureusement tu fait de la redondance avec ton code. La méthode TabResSQL boucle pour retourner un tableau, et ensuite dans ton code tu re parcours le tableau pour afficher les données. Tu fait travailler ton serveur plus que ce qu'il n'en faut ! Regarde du coté de la Spl et des codes déjà présents ici (la couche d'abstraction de Malalam, celle de Fhx et la mienne sont des bons exemples, pour ce cas là en tout cas ;)).
Par ailleur tu n'indique pas la portée de tes méthodes. Bon, tu me dira que c'est du publique implicitement, mais explicitement, c'est plus beau, plus simple, pérènne et surtout ca t'évite un casse tête quand tu relira ton code plus tard (sais-t-on jamais :p).

Enfin, donne des noms cohérents à tes fonctions (notament TabResSQL) et commente ton code.

signaler à un administrateur
Commentaire de yoman64 le 22/02/2008 20:02:27

C'est vrai que j'ai un peu trop pensé à une classe d'abstraction, néanmoin dans l'état je trouve que cette classe est plutôt inutile, et vraiment incomplète/incohérente pour une classe de gestion mysql. C'est plus la que je voulais en venir en fait, désolé du mal entendu. Mais ça reste que la plupart de mes commentaires s'appliquent toujours, ce genre de classe est toujours appréciable de pouvoir l'utiliser comme singleton, et puis je comprends toujours pas le "besoin" davoir num_rows après chaque requêtes :(

signaler à un administrateur
Commentaire de codefalse le 22/02/2008 20:16:36 administrateur CS

T'inquiete pas, j'avais compris et je suis d'accord avec toi.
Personnellement je laisse la source pour montrer aux autres ce qu'il est déconseillé de faire et pourquoi. Maintenant si Malalam passe par ici, peut-être la supprimera-t-il ?

@crocxx2 : Ton code peut-etre améliorer, tu peux arriver à quelque chose de très complet et tres utile. On ne te demande pas de nous sortir une abstraction de base de donnée, mais un système pouvant s'en approcher, plus performant que ton code actuel sera dans tous les cas meilleur.
Je compte sur toi ?

signaler à un administrateur
Commentaire de crocxx2 le 22/02/2008 20:27:15

Je vais essayer de faire mieux ;)

signaler à un administrateur
Commentaire de crocxx2 le 22/02/2008 20:38:47

J'ai modifier un peu la source pour gérer les exception, sa doit être un peu mieux la?

signaler à un administrateur
Commentaire de coucou747 le 22/02/2008 20:50:13

une exception, ca se personalise :

http://www.phpcs.com/codes/EXCEPTION-EXCEPTION-MYSQL-FILEEXCEPTION_43064.aspx

signaler à un administrateur
Commentaire de malalam le 24/02/2008 10:48:40 administrateur CS

Hello,

bon, je me décide à commenter un peu aussi, après les modifications faites.
Difficile de parler d'un tel code en ne faisant référence qu'à la manière dont il est codé...sans parler de son intérêt.
Parce que...quel est l'intérêt de créer une classe surchargeant les fonctions/méthodes liées à notre db ? Ici, il n'est pas question d'abstraction : on prend uniquement mysql et on crée une classe avec des méthodes censées faciliter son utilisation.
Pourquoi pas...même si pour moi les deux seuls types de classes DB vraiment utilses sont :
- les classes permettant d'abstraire le moteur db utilisé
- les classes spécialisées (j'ai un objet "user", je lui adjoint des méthodes d'acces db spécialisées pour lui).
Maintenant, ajouter des fonctionnalités utiles facilitant l'accès à certaines choses à l'extension mysql, pourquoi pas...
Mais encore faut-il bien le faire.

1ère remarque : je ne comprends pas ta façon de déclarer la portée de tes méthodes/propriétés. C'est peut-être une notation que je ne connais pas en php hein...mais bon...j'en doute :
private
$var1;
$var2;
$var3;
Je suppose que tu veux dire que ces 3 propriétés sont privées...mais si c'est une notation existante, je ne la connaissais pas.
Dans ton code, à mon avis, seule ta première propriété est privée, les autres sont publiques, là.

Faciliter les fonctionnalités existantes et en ajouter :
- ton constructeur : autorise le à se connecter automatiquement, par défaut. Parce que là il me faut 2 lignes pour me connecter alors que j'ai donné toutes les infos nécessaires à l'instanciation de mon objet.
- retourneNbRequetes : ça, pour moi, c'est une fonctionnalité inutile. Dans le cadre d'un mode "debug", je veux bien l'avoir, avec en plus les requêtes en entier, et le temps qu'elles ont mis à s'exécuter. Mais dans le cadre d'un debug uniquement. A part ça, je ne vois pas...
- connexion : ok, sauf que je préfère séparer la connexion et la sélection de la db. Encore une fois, laisse le choix, en mettant par défaut (sans précision de ma part) la connexion directe au serveur sur la db passée en paramètres. Mais je dois pouvoir changer de db si je le veux...en gardant ma connexion.
- TabResSql : là, y a du boulot...si mysql_num_rows et mysql_fetch_assoc sont séparées, il y a une raison. Je n'ai pas forcément le besoin de faire appel systématiquement à mysql_num_rows, certes, comme te le disent les autres. Mais le problème pour moi n'est pas là : ta méthode renvoie un tableau tout prêt. Bien, pourquoi pas. C 'est une fonctionnalité absente de l'extension mysql, ça, donc ok. Mais un tableau a une taille...donc je peux si je veux vérifier sa taille via count() ou sizeof(), je n'ai absolument pas besoin que tu appelles mysql_num_rows(). Ainsi, soit je veux vérifier, soit je ne veux pas. D'autre part, SI tu veux l'utiliser...tu fais une erreur de coneception : puisque tu as cette données, pourquoi ne vas tu pas faire un mysql_fetch_assoc() QUE SI mysql_num_rows() renvoie quelque chose...? Tu économiserais des appels inutiles.
Pour continuer sur cette méthode : tu obliges à passer 2 variables (tu les prends par référence). Je me doute que tu connais return, et que tu l'as fait parce que tu avais 2 éléments différents à retourner. Néanmoins, cela m'oblige à définir ces 2 variables au préalable, ce qui me fait 3 lignes de code pour appeler ta méthode. Il y a un tas de façons de contourner ça.
Sans compter que tu obliges ici à récupérer les données d'une seule manière : un tableau indexé numériquement, dont chaque clef fait référence à un tableau indexé associativement. Ce qui serait réellement intéressant, c'est de pouvoir formatter le retour. Ma classe par exemple (dans sa dernière version, non présente ici) permet de récupérer les données normalement (indexées numériquement, associativement, ou les deux), mais aussi de faire des regroupements sur le 1er champ (id => array(valeurs), ou id => array(array(valeurs)), ou num => id => array(valeurs) etc...), ce qui permet de faire des choses que l'on ne peut pas faire en sql.
Encore une fois, à mon sens, tu ne devrais que faire un return $tab. Le mysql_num_rows() n'a rien à faire là.
- executeSql : même problème, tu forces l'utilisation d'une fonction dont on a pas forcément besoin.

Au final, ta classe n'apporte que peu de fonctionnalités intéressantes, et ne fait qu'ajouter de la lourdeur à l'utilisation de l'extension mysql. Tu n'apportes pas assez pour que ce soit intéressant (je sais pas moi : une méthode permettant de vérifier si une table existe, une permettant de retourner la définition d'une table, une permettant de savoir quel champ est la clef primaire de la table, etc...), et les idées éventuellement intéressantes sont mal implémentées.

Cherche plus loin ! C'est en utilisant une db en php qu'on finit par trouver des idées qui nous faciliterait la vie. Et on ne se facilite pas la vie en se contenant de créer une méthode "connect" qui ne fait qu'un "mysql_connect". Ca ne sert à rien. C'est comme créer une fonction say() qui ne ferait que remplacer echo. C'est inutile et ça fait plus travailler php pour rien.
Réflêchis plutôt à ce qui est vraiment long et pénible à faire sur une DB...et propose des méthodes qui facilitent ces choses.

signaler à un administrateur
Commentaire de crocxx2 le 24/02/2008 13:46:27

Je suis toute a fait d'accord avec tes remarque, sauf pour la déclaration des propriété, j'utilise:

private $var1, $var2, $var3;

et non

private $var1; $var2; $var3;

Chaque propriété et donc déclaré comme privé.

;) Mais je prend note de tes commentaires pour de future améliorations.

signaler à un administrateur
Commentaire de malalam le 24/02/2008 14:12:19 administrateur CS

Ok, je n'avais pas fait attention aux virgules :-) Je retire cette partie!

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Parametre de ma classe connexion et connexion/deconnexion [ par sebos63 ] Bonjour, 1. J'ai une classe de connexion et je souhaiterais savoir où il est judicieux de spécifier les paramètres d'une connexion. (Dans mon construc connexion mysql avec mot de passe crypté [ par vincenteraptor ] Bonjour,J aurai voulu savoir sil etait possible de se connecter à un base de données via un password déja crypté avec le cryptage de mysql??exemple : Problème de création de table Mysql [ par perig ] BonjourVoilà je cherche à créer une table dans ma base Mysql (je suis chez free).Mon programme fonctionne (je consulte tous les codes d'erreur et tout Pb de script entre php et mysql pour afficher une table [ par FloTheShark ] Salut à tous Voilà g free, donc host, sql.free.fr et ainsi de suite je veux faire afficher une table(ce qu'il y a à l'intérie besoin d'1 info sur connexion/deconnexion a mysql [ par simsai ] Hello a tous,Je suis entrain de réaliser un site web en php dans lequel j'appelle des fonctions php d'insertion,suppression,update,...Pour chacune de tjr probleme de sessions. [ par Zebra1928 ] Hi all;j'ai toujours un probleme de sessions.qlq peut m'aider SVP ??, mon code est le suivant:******************************************************** probleme de connexion [ par gromito ] Je suis chez multimania et j ai un petit probleme de connexion a ma base de donn&#233;e si quelqu u n pouveit m aider. Mon code est le suivant: &lt; probleme de connexion à base mysql [ par loutwice ] salut!ben voilà le problème:j'ai fait des pages en php gérant les sesions et tout et tout....et quan je veux les réutiliser dans un autre site, et bie 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 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


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,265 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é.