JeuWeb - Crée ton jeu par navigateur
[POO] classes connection et mysqli - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [POO] classes connection et mysqli (/showthread.php?tid=435)



[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