Classe php4 de connexion à un sgbd

Contenu du snippet

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 />";

A voir également

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.