Cette classe relativement simple n'est pas non plus très original étant donné qu'il en existe de nombreuses sur le sujet.
Elle permet la connexion et l'exécution de requête sur n'importe quel SGBD en réécrivant la classe fille adaptée et en ajoutant une instruction à la fonction connexion().
Je n'est pour l'instant qu'écrit une sous classe pour MySQL.
Elle est écris pour PHP4.
Les erreurs peuvent soit être traitées avec une gestion personnalisée, soit au cas par cas.
J'aimerais savoir ce que vous en pensez
Source / Exemple :
<?php
// Classe abstraite définissant une interface générique d'accès à une base de données
class BASE
{
// propriétés protégée
var $connexion;
var $messExplicatif;
var $codeErreur;
var $messErreur;
var $SGBD;
// Constructeur de la classe
function BASE($login, $motDePasse, $base, $serveur)
{
// Initialisations
$this -> messExplicatif = "";
$this -> codeErreur = 0;
$this -> messErreur = "";
$this -> sgbd = "Indefini";
// Connexion au serveur par appel à une méthode privée
if (!$this -> connexion = $this->connect($login, $motDePasse, $base, $serveur))
{
$this -> messExplicatif = "Erreur de connexion au SGBD " . $this->sgbd . ": <BR> " . $this->messageSGBD();
}
}
// Fin du constructeur
// Méthodes privées
// Méthodes abstraites
function connect($login, $motDePasse, $base, $serveur) {}
function exe ($requete) {}
// Méthode de mise en forme du message d'erreur du SGBD
function messageSGBD ()
{
return "Libelle erreur : ".$this->messErreur."<BR />Num erreur :".$this->codeErreur;
}
// Méthodes publiques
// Méthode d'exécution d'une requête
function exeRequete ($requete)
{
if (!$resultat = $this -> exe ($requete))
{
$this -> messExplicatif = "Problème dans l'exécution de la requête : " . $requete . "<BR> " . $this->messageSGBD();
}
else
{
return $resultat;
}
}
// Retour du message d'erreur
function messageExplicatif ()
{
return $this->messExplicatif;
}
// Méthodes abstraites
// Accès à la ligne suivante, sous forme d'objet
function objetSuivant ($resultat) {}
// Accès à la ligne suivante, sous forme de tableau associatif
function ligneSuivante ($resultat) {}
// Accès à la ligne suivante, sous forme de tableau indicé
function tableauSuivant ($resultat) {}
// Renvoie nombre de ligne de la requête
function nbLigne($resultat){}
// Echappement des apostrophes et autres préparations à l'insertion
function prepareChaine($chaine) {}
// Acesseur pour les propirétés propore à chaque SGBD
// Nom du SGBD
function getSGBD()
{
return $this->sgbd;
}
function setSGBD($sgbd)
{
$this->sgbd = $sgbd;
}
// Code erreur du SGBD
function getCodeErreur()
{
return $this->codeErreur;
}
function setCodeErreur($codeErreur)
{
$this->codeErreur = $codeErreur;
}
// Message d'erreur du SGBD
function getMessErreur()
{
return $this->messErreur;
}
function setMessErreur($messErreur)
{
$this->messErreur = $messErreur;
}
// Fin de la classe
}
?>
<?php
// Sous-classe de la classe abstraite BASE, pour l'accès à MySQL
require_once("base.class.php");
class BASE_MYSQL extends BASE
{
// Pas de propriétés ou de constructeur: ils sont héritées de la classe BASE
// Partie privée: surcharge des méthodes
// Méthode connect: connexion à MySQL
function connect($login, $mdp, $base, $serveur)
{
// Connexion au serveur MySQL
if (!$this -> connexion = @mysql_pconnect($serveur, $login, $mdp) or !@mysql_select_db($base, $this->connexion))
{
$this -> sgbd = "MySQL";
$this -> defErreur();
return false;
}
else
{
return $this -> connexion;
}
}
// Méthode d'exécution d'une requête.
function exe ($requete)
{
if (!$resultat = @mysql_query ($requete, $this -> connexion))
{
$this -> defErreur();
return false;
}
else
{
return $resultat;
}
}
// Méthode defErreur: détermine les codes d'erreurs propres à MySQL
function defErreur()
{
$this -> messErreur = mysql_error();
$this -> codeErreur = mysql_errno();
}
// Partie publique: surcharge des méthodes abstraites
// Accès à la ligne suivante, sous forme d'objet
function objetSuivant($resultat)
{ return mysql_fetch_object($resultat); }
// Accès à la ligne suivante, sous forme de tableau associatif
function ligneSuivante($resultat)
{ return mysql_fetch_assoc($resultat); }
// Accès à la ligne suivante, sous forme de tableau indicé
function tableauSuivant($resultat)
{ return mysql_fetch_row($resultat); }
// Renvoie nombre de ligne de la requête
function nbLigne($resultat)
{ return mysql_num_rows($resultat); }
// Echappement des apostrophes pour préparation à l'insertion ou à consultation
function prepareChaine($chaine)
{ return mysql_real_escape_string($chaine); }
// Destructeur de la classe: on se déconnecte
function __destruct ()
{
if (!$this -> connexion = @mysql_close ($this->connexion))
return false;
}
// Fin de la classe
}
?>
// Fonctions pour connexion à la base en fonction du SGBD
// arguments par valeur : $login, $passe, $base, $serveur -> paramètre de connexion à la base
// arguments par adresse : aucun
// retourne : $bd -> objet intance de la sous-classe utilisée
function connexion ($login, $mdp, $base, $serveur)
{
define ("SGBD", "MySQL"); // A definir en fonction du SGBD utilisé
// Instanciation d'un objet instance de BASE.
// Choix de la sous-classe en fonction du SGBD
switch (SGBD)
{
case "PostgreSQL":
$bd = new BASE_POSTGRESQL ($login, $mdp, $base, $serveur); // Exemple à definir
break;
case "SQLite":
$bd = new BASE_SQLITE ($login, $mdp, $base, $serveur); // Exemple à definir
break;
default: // MySQL par défaut
$bd = new BASE_MYSQL ($login, $mdp, $base, $serveur);
break;
}
return $bd;
}
Conclusion :
Voici un exemple simple d'utilisation
$base = connexion (NOM, MDP, BASE, SERVEUR);
$resultat = $base -> exeRequete ("SELECT * FROM Produit");
while ($obj = $base -> objetSuivant($resultat))
echo $obj -> nomPdt."<BR />";
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.