[POO] classes connection et mysqli - gtsoul - 13-11-2006
Voici un exemple de classe de connection dont je me sers.
La classe BD.class est une classe de connection standard, indépendante du type de base, elle catche les exceptions et sert d'interface aux classes spécialisées.
La classe BDMysql.class est une classe de connection pour mysql, elle hérite de BD.class
La classe SQLException.class traite les exceptions catchées par BD.class. Incluez-la sur un poste de développement mais rendez ses méthodes abstraites dès que vous la mettez en production (question de sécurité).
La classe Mysqli.class est une émulation de la classe mysql standard, mais surchargeant des fonctions propres à mysqli. Elle n'a d'utilité que si vous souhaitez développer pour mysqli mais que votre hébergeur actuel ne le supporte pas.
Exemple de connection
Code PHP : <?php
//declaration des constantes de connection
define("SERVER", "localhost");
define("USERNAME", "root");
define("PASSWORD", "XXXXX");
define("BDD", "jeu");
//insertion des classes
require_once('BDMysql.class');
//on se connecte
$bd1 = new BDMySQL(USERNAME, PASSWORD, BDD, SERVER);
//exemple de requete
$res = $bd1->execRequete("SELECT ..... ");
J'avais fait un tuto ici : http://jeuphp.forumactif.com/ftopic1808.POO-classe-connection.htm
Mais je le ressors suite à une demande et parce que cette classe simplifie la vie du développeur tout en accroissant les performances de l'application. Elle affiche par exemple, la requete générée lorsque celle-ci présente des erreurs (comme phpmyadmin).
Voici les scripts à recopier :
BD.class
Code PHP : <?php
// Classe abstraite définissant une interface générique d'accès
// à une base de données. Version complète
// Exceptions SQL
require_once ("SQLException.class.php5");
abstract class BD
{
// ---- Partie privée : les propriétés
protected $sgbd, $connexion, $nom_base;
protected $code_erreur, $message_erreur;
// Constructeur de la classe
function BD ($login, $mot_de_passe, $base, $serveur)
{
// Initialisations
/*$login=USERNAME;
$mot_de_passe=PASSWORD;
$base=BDD;
$serveur=SERVER;*/
$this->nom_base = $base;
$this->code_erreur = 0;
$this->message_erreur = "";
$this->sgbd = "Inconnu?";
// Connexion au serveur par appel à une méthode privée
$this->connexion = $this->connect($login, $mot_de_passe,
$base, $serveur);
// Lancé d'exception en cas d'erreur
if ($this->connexion == 0)
throw new SQLException ("Erreur de connexion au SGBD",
$this->sgbd, $this->code_erreur);
// Fin du constructeur
}
// Méthodes privées
abstract protected function connect ($login, $mot_de_passe, $base, $serveur);
abstract protected function exec ($requete);
// Méthodes publiques
// Méthode d'exécution d'une requête
public function execRequete ($requete)
{
global $nbrequest;
$nbrequest++;
if (!$resultat = $this->exec ($requete))
throw new SQLException
("Problème dans l'exécution de la requête : $requete.<br> "
. $this->messageSGBD(), $this->sgbd, $this->code_erreur);
return $resultat;
}
// Méthodes abstraites
// Accès à la ligne suivante, sous forme d'objet
abstract public function objetSuivant ($resultat);
// Accès à la ligne suivante, sous forme de tableau associatif
abstract public function ligneSuivante ($resultat);
// Accès à la ligne suivante, sous forme de tableau indicé
abstract public function tableauSuivant ($resultat);
// Echappement des apostrophes et autres préparations à l'insertion
abstract public function prepareChaine($chaine);
// Génération d'un identifiant
abstract public function genereID($nom_sequence);
// Méthode indiquant le nombre d'attributs dans le résultat
abstract function nbAttributs ($res);
// Méthode donnant le nom d'un attribut dans un résultat
abstract function nomAttribut ($res, $position);
// Retour du message d'erreur
abstract public function messageSGBD ();
// Nom du SGBD
public function getSGBD()
{ return $this->sgbd; }
protected function setSGBD($sgbd)
{ $this->sgbd = $sgbd; }
// Fin de la classe
}
?>
BDMysql.class
Code PHP : <?php
// Sous-classe de la classe abstraite BD, implantant l'accès à MySQL
require_once("BD.class.php5");
class BDMySQL extends BD
{
// Pas de propriétés: elles sont héritées de la classe BD
// Pas de constructeur: lui aussi est hérité
// Méthode connect: connexion à MySQL
/*protected function connect ($login, $mot_de_passe, $base, $serveur)
{
// Connexion au serveur MySQL
if (!$this->connexion = mysql_connect (SERVER, USERNAME, PASSWORD))
return 0;
// Connexion à la base
if (!mysql_select_db ($this->nom_base, $this->connexion))
return 0;
$this->setSGBD("MySQL");
return $this->connexion;
} */
/*function BDMySQL($login, $mot_de_passe, $base, $serveur)
{
parent::BD($login, $mot_de_passe, $base, $serveur);
}*/
protected function connect ($login, $mot_de_passe, $base, $serveur)
{
// Connexion au serveur MySQL
//$mysqli = new mysqli($serveur, $login, $mot_de_passe, $base);
if (!$this->connexion = new mysqli($serveur, $login, $mot_de_passe, $base))
return 0;
// Connexion à la base
//if (!mysqli_select_db ($this->nom_base, $this->connexion))
//return 0;
$this->setSGBD("MySQL");
return $this->connexion;
}
// Méthode d'exécution d'une requête.
protected function exec ($requete) {
return @$this->connexion->query ($requete);
}
// Partie publique: implantation des méthodes abstraites
// Accès à la ligne suivante, sous forme d'objet
public function objetSuivant ($resultat){
return mysql_fetch_object ($resultat);
}
// Accès à la ligne suivante, sous forme de tableau associatif
public function ligneSuivante ($resultat){
return mysql_fetch_assoc ($resultat);
}
// Accès à la ligne suivante, sous forme de tableau indicé
public function tableauSuivant ($resultat){
return mysql_fetch_row ($resultat);
}
// Echappement des apostrophes et autres préparation à l'insertion
public function prepareChaine($chaine) {
return mysql_real_escape_string($chaine);
}
// Génération d'un identifiant
public function genereID($nom_sequence) {
// Insertion d'un ligne pour obtenir l'auto-incrémentation
$this->execRequete("INSERT INTO $nom_sequence VALUES()");
// Si quelque chose s'est mal passé, on a levé une exception,
// sinon on retourne l'identifiant
return mysql_insert_id();
}
// Retour du message d'erreur
public function messageSGBD () {
return mysql_error($this->connexion);
}
// Méthode ajoutée: renvoie le schéma d'une table
public function schemaTable($nom_table)
{
// Recherche de la liste des attributs de la table
$listeAttr = @mysql_list_fields($this->nom_base, $nom_table, $this->connexion);
if (!$listeAttr) throw new Exception ("Pb d'analyse de $nom_table");
// Recherche des attributs et stockage dans le tableau
for ($i = 0; $i < mysql_num_fields($listeAttr); $i++) {
$nom = mysql_field_name($listeAttr, $i);
$schema[$nom]['longueur'] = mysql_field_len($listeAttr, $i);
$schema[$nom]['type'] = mysql_field_type($listeAttr, $i);
$schema[$nom]['clePrimaire'] =
substr_count(mysql_field_flags($listeAttr, $i), "primary_key");
$schema[$nom]['notNull'] =
substr_count(mysql_field_flags($listeAttr, $i), "not_null");
}
return $schema;
}
// Fonctions décrivant le résultat d'une requête
public function nbAttributs($resultat) {
return mysql_num_fields($resultat);
}
public function nomAttribut($resultat, $pos) {
return mysql_field_name ($resultat, $pos);
}
public function resultat($resultat) { // si un seul champ retourne sa valeur
$resultat=$resultat->fetch_row();
return $resultat[0];
}
public function connecter_bdd() {
$bd = new BDMySQL(USERNAME, PASSWORD, BDD, SERVER);
return $bd;
}
// Destructeur de la classe: on se déconnecte
public function __destruct (){
if ($this->connexion) @mysql_close ($this->connexion);
}
// Fin de la classe
}
?>
Mysqli.class
Code PHP : <?php
class mysqli {
var $link;
var $name;
var $transaction = FALSE;
function _connect( $host, $user, $pass) {
$this->link = mysql_connect( $host, $user, $pass);
return $this->link;
}
function mysqli( $host, $user, $pass, $name ) {
if( !$this->_connect( $host, $user, $pass ) )
return FALSE;
else
return $this->select_db( $name );
}
function select_db( $name ) {
$this->name = $name;
return mysql_select_db( $name, $this->link );
}
function list_dbs() {
return new mysqli_result( mysql_list_dbs( $this->link ) );
}
function change_user( $user, $pass, $name = NULL) {
$this->name = (NULL !== $name) ? $name : $this->name;
return mysql_change_user( $user, $pass, $name, $this->link );
}
function errno() {
return mysql_errno( $this->link );
}
function error() {
return mysql_error( $this->link );
}
function info() {
return mysql_info( $this->link );
}
function thread_id() {
return mysql_thread_id( $this->link );
}
function kill( $thread ) {
return $this->query('kill ' . $thread );
}
function options( $key, $value ) {
return $this->query( $key.'='.$value );
}
function ping() {
return mysql_ping( $this->link );
}
function prepare( $sql ) {
$args = func_get_args();
for( $i=1; $i<count($args); $i++ ) {
$args[$i] = $this->espace_string($args[$i]);
}
return call_user_func_array('sprintf', $args);
}
function query( $sql ) {
return new mysqli_result( $this->link, mysql_query( $sql, $this->link ) );
}
function insert_id() {
return mysql_insert_id( $this->link );
}
function autocommit( $mode = TRUE ) {
$this->transaction = mysql_query('SET autocommit='.intval($mode), $this->link );
return $this->transaction;
}
function rollback() {
return $this->transaction ? mysql_query('ROLLBACK') : FALSE;
}
function commit() {
if ($this->transaction) {
if( $this->transaction = mysql_query('COMMIT') )
return TRUE;
else
return $this->rollback();
}
}
function escape_string( $string ) {
return mysql_escape_string($string);
}
function close() {
return mysql_close($this->link);
}
}
class mysqli_result {
var $link;
var $result;
function mysqli_result( &$link, &$result ) {
$this->result = $result;
}
function fetch( $type = MYSQL_ASSOC ) {
return mysql_fetch_array($this->result, $type);
}
function fetch_assoc() {
return mysql_fetch_assoc($this->result );
}
function fetch_array( $type = MYSQL_ASSOC ) {
return mysql_fetch_array($this->result, $type);
}
function fetch_row() {
return mysql_fetch_row($this->result);
}
function data_seek( $row ) {
return @mysql_data_seek($this->link, $row);
}
function field_count() {
return mysql_num_fields($this->result);
}
function num_rows() {
return $this->result ? mysql_num_rows($this->result) : 0;
}
function fetch_fields() {
return mysql_fetch_fields( $this->result );
}
function fetch_lengths() {
return mysql_fetch_lengths( $this->result );
}
function close() {
return mysql_free_result($this->result);
}
}
?>
SQLException.class
Code PHP : <?php
// Sous-classe de la classe exception, spécialisée pour
// les erreurs soulevées par un SGBD
class SQLException extends Exception
{
// Propriétés
private $sgbd; // nom du SGBD utilisé
private $code_erreur; // code d'erreur du SGBD
// Constructeur
function SQLException ($message, $sgbd, $code_erreur=0)
{
// Appel du constructeur de la classe parente
parent::__construct($message);
// Affectation aux propriétés de la sous-classe
$this->sgbd = $sgbd;
$this->code_erreur = $code_erreur;
}
// Méthode renvoyant le SGBD qui a levé l'erreur
public function getSGBD()
{
return $this->sgbd;
}
// Méthode renvoyant le code d'erreur du SGBD
public function getCodeErreur()
{
return $this->code_erreur;
}
}
?>
RE: [POO] classes connection et mysqli - orditeck - 20-11-2006
L'aide pour ce script ce trouve à cette adresse :
http://www.jeuweb.org/board/showthread.php?tid=698
|