J'avais fait un peu de programmation objet en Java et j'ai voulu m'y mettre en PHP.
J'ai donc décidé de faire une interface de manipulation de base de donnée et une classe Mysql l'implémentant pour deux raisons :
- but pédagogique (voir la plupart de ce que l'on peut faire en PHP en objet)
- créer une interface qui peut être complétée par d'autres classe l'implémentant pour l'accès à d'autres bases de données (il ne me semble pas que ce soit présent sur ce site)
La classe Mysql utilise la classe mysqli (je l'utilise pour créer des méthodes qui me sembles utiles à la manipulation de base de données). Pourquoi avoir fait une classe utilisant une autre classe? Pour ne pas être limiter à mysqli (je peux toujours changer ma classe mysql sans changer les scriptes qui l'utilise) et pouvoir créer des méthodes qui répondent à mes besoins de manière plus précise et conforme à l'interface (même méthodes pour la manipulations de différentes bases de données).
Voilà :-D
J'espère que mes première lignes de code objet en PHP vous plairont (c'est ma première source également lol) ;-)
Source / Exemple :
//Fichier Db.php
<?php
/************************************************************************
Interface Database - David "Davjack" Bellanca
Creer le 27 janvier 2008
Modifie le 28 janvier 2008
Compatible PHP5
interface Db
{
/*-------------------------------------
Partie de connexion a la base de donnee
-------------------------------------*/
//__construct utilise db_connect pour se connecter a la base de donnees
/*
$db_host : nom de l'hote, par exemple localhost
$db_user : nom de l'utilisateur
$db_pass : mot de passe
$db_name : nom de la base de donnees
public function __construct($db_host,$db_user,$db_pass,$db_name);
public function db_connect($db_host,$db_user,$db_pass,$db_name);
//Verification de la connexion (retourne l'erreur si il y en a une, sinon null)
//public function db_connectError();
// Fermer la connexion
public function db_close();
// Lors de la destruction de la classe, on ferme la connexion
public function __destruct();
//Desactiver / Activer l'autocommit
public function db_autocommit($TrueFalse);
//Retourne la version du serveur
public function db_version();
/*-------------------------------------------
Partie de manipulations de la base de donnees
-------------------------------------------*/
//Envoie d'une requete
public function sql_query($query);
//Valide une requete
public function sql_commit();
//Annuler une requete
public function sql_rollback();
//Retourne le resultat de la derniere requete sous forme d'un tableau associatif (une ligne)
public function sql_arrayAssocResult();
//Retourne le resultat de la derniere requete sous forme d'un tableau indexe numeriquement (une ligne)
public function sql_arrayNumResult();
//Retourne les resultats de la derniere requete sous forme d'un tableau associatif (plusieurs lignes)
public function sql_arrayAssocResults();
//Retourne les resultats de la derniere requete sous forme d'un tableau indexe numeriquement (plusieurs lignes)
public function sql_arrayNumResults();
//Retourne le nombre de lignes affectees par la derniere requete
public function sql_numRows();
//Retourne le nombre de colonnes de la derniere requete
public function sql_numCols();
//Retourne la PK auto-incremente/sequence de la derniere requete
public function sql_lastPKIncremented();
//Retourne la liste de toutes les tables de la base de donnees dans un tableau
public function sql_listTables();
}
?>
//Fichier Mysql.php
<?php
/************************************************************************
Classe Mysql - David "Davjack" Bellanca
Creer le 27 janvier 2008
Modifie le 28 janvier 2008
Compatible PHP5
require_once 'Db.php';
class Mysql implements Db
{
private $mysqli;
private $result;
private $db_name;
//--------
//Methodes
//--------
//__construct utilise db_connect pour se connecter a la base de donnees
public function __construct($db_host,$db_user,$db_pass,$db_name)
{
$this->db_connect($db_host,$db_user,$db_pass,$db_name);
}
public function db_connect($db_host,$db_user,$db_pass,$db_name)
{
unset($this->result);
unset($this->mysqli);
$this->db_name = $db_name;
$this->mysqli = new mysqli($db_host,$db_user,$db_pass,$db_name);
if (mysqli_connect_errno())
{
throw new Exception("Echec de la connexion");
//throw new Exception("Echec de la connexion : ".mysqli_connect_error());
}
}
// Fermer la connexion
public function db_close()
{
$this->mysqli->close();
}
// Lors de la destruction de la classe, on ferme la connexion
public function __destruct()
{
$this->db_close;
}
//Desactiver / Activer l'autocommit
//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
public function db_autocommit($TrueFalse)
{
if (is_bool($TrueFalse))
{
$this->mysqli->autocommit($TrueFalse);
//On verifie que l'autocommit a bien ete active/desactive
if ($TrueFalse)
{
$this->sql_query("SELECT @@autocommit");
$autocommit = $this->sql_arrayNumResult();
if ($autocommit[0][0] != 1)
throw new Exception("Erreur : l'autocommit n'a pas été activé");
}
else
{
$this->sql_query("SELECT @@autocommit");
$autocommit = $this->sql_arrayNumResult();
if ($autocommit[0][0] != 0)
throw new Exception("Erreur : l'autocommit n'a pas été désactivé");
}
}
else
{
throw new Exception("Vous devez entrer un booléen en paramètre");
}
}
//Retourne la version du serveur
public function db_version()
{
return $this->mysqli->get_server_info();
}
/*-------------------------------------------
Partie de manipulations de la base de donnees
-------------------------------------------*/
//Envoie d'une requete
public function sql_query($query)
{
if (!$this->result = $this->mysqli->query($query))
{
throw new Exception("Erreur de requête SQL : ".$this->mysqli->error);
//throw new Exception("Erreur de requête SQL");
}
}
//Valide une requete
public function sql_commit()
{
$this->mysqli->commit();
}
//Annuler une requete
public function sql_rollback()
{
if(!$this->mysqli->rollback())
throw new Exception("Erreur rollback");
}
//Retourne le resultat de la derniere requete sous forme d'un tableau associatif (une ligne)
public function sql_arrayAssocResult()
{
if ($this->result)
{
$result = $this->result->fetch_array(MYSQLI_ASSOC);
return $result;
}
else
{
throw new Exception("Aucune requête n'a été exécutée");
}
}
//Retourne le resultat de la derniere requete sous forme d'un tableau indexe numeriquement (une ligne)
public function sql_arrayNumResult()
{
if ($this->result)
{
$result = $this->result->fetch_array(MYSQLI_NUM);
return $result;
}
else
{
throw new Exception("Aucune requête n'a été exécutée");
}
}
//Retourne les resultats de la derniere requete sous forme d'un tableau associatif (plusieurs lignes)
public function sql_arrayAssocResults()
{
if ($this->result)
{
$i = 0;
while ($temp = $this->result->fetch_array(MYSQLI_ASSOC))
{
$result[$i] = $temp;
$i++;
}
return $result;
}
else
{
throw new Exception("Aucune requête n'a été exécutée");
}
}
//Retourne les resultats de la derniere requete sous forme d'un tableau indexe numeriquement (plusieurs lignes)
public function sql_arrayNumResults()
{
if ($this->result)
{
$i = 0;
while ($temp = $this->result->fetch_array(MYSQLI_NUM))
{
$result[$i] = $temp;
$i++;
}
return $result;
}
else
{
throw new Exception("Aucune requête n'a été exécutée");
}
}
//Retourne le nombre de lignes affectees par la derniere requete
public function sql_numRows()
{
return $this->mysqli->affected_rows;
}
//Retourne le nombre de colonnes de la derniere requete
public function sql_numCols()
{
return $this->mysqli->field_count;
}
//Retourne la PK auto-incremente/sequence de la derniere requete
public function sql_lastPKIncremented()
{
return $this->mysqli->insert_id;
}
//Retourne la liste de toutes les tables de la base de donnees dans un tableau
public function sql_listTables()
{
$this->sql_query("SHOW TABLES FROM ".$this->db_name);
$listTemp = $this->sql_arrayNumResults();
$i = 0;
foreach($listTemp as $cle=>$valeur)
{
foreach($valeur as $cle2=>$table)
{
$result[$i] = $table;
$i++;
}
}
return $result;
}
}
?>
//Fichier utilisation.php
<?php
/************************************************************************
Utilisation de la classe Mysql - David "Davjack" Bellanca
try{
//require_once 'myPHPException.php';
//Pour ne pas afficher les erreurs si vous n'avez pas acces a php.ini.
//A commenter pendant le developpement
ini_set('display_errors','Off');
require_once 'Mysql.php';
//Creation d'une connexion a une base MySQL - Instanciation de la classe
$db = new Mysql('host','login','mot de passe','base de donnee');
//Affiche la version du serveur MySQL
echo $db->db_version()."<br />";
//FALSE pour arreter l'autocommit et TRUE pour l'activer
//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
$db->db_autocommit(FALSE);
$db->sql_query("delete from table");
//Annule les
//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
//et si l'autocommit est desactive
$db->sql_rollback();
$requete = "INSERT INTO table (...)
VALUES (...)";
$db->sql_query($requete);
//Affichage de la valeur de l'auto-incrementation de la derniere requete
echo "PK : ".$db->sql_lastPKIncremented()."<br />";
//!!! Ne fonctionne que sur le tables transactionnelles (comme InnoDB)
//et si l'autocommit est desactive
$db->sql_commit();
//Requete renvoyant plusieurs lignes
$db->sql_query("select * from table");
//Affichage du nombre de lignes affectees par la derniere requete
echo "Nb lignes : ".$db->sql_numRows()."<br />";
//Affichage du nombre de colonnes de la derniere requete
echo "Nb colonnes : ".$db->sql_numCols()."<br />";
//Parcours des resultats (plusieurs lignes) de la derniere requete
foreach($db->sql_arrayNumResults() as $val) //ou $db->sql_arrayAssocResults();
{
foreach($val as $cle=>$valeur)
{
echo $cle.' : '.$valeur.'<br />';
}
echo "<br />";
}
//Requete renvoyant une ligne
$db->sql_query("select * from table where num = 1");
//Affichage de la ligne de resultat
foreach($db->sql_arrayAssocResult() as $cle=>$valeur) //ou $db->sql_arrayNumResult()
{
echo $cle.' : '.$valeur.'<br />';
}
//Affichage de toutes les tables de la base
foreach($db->sql_listTables('test') as $valeur)
{
echo $valeur.'<br />';
}
//Fermeture de la derniere connexion
$db->db_close();
}
catch (Exception $e)
{
//Gestion des exceptions renvoyees par la classe
echo $e->getMessage();
}
?>
Conclusion :
Pour l'utilisation de la classe, regardez le code de utilisation.php
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.