Classe de connexion mysql en php5

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 012 fois - Téléchargée 18 fois

Contenu du snippet

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 / Exemple :


<?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.

A voir également

Ajouter un commentaire Commentaires
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Ok, je n'avais pas fait attention aux virgules :-) Je retire cette partie!
Messages postés
13
Date d'inscription
mardi 19 juin 2007
Statut
Membre
Dernière intervention
7 mars 2008

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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
40
Messages postés
13
Date d'inscription
mardi 19 juin 2007
Statut
Membre
Dernière intervention
7 mars 2008

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.