Class mysql 5/php5 avec gestion des exception et des requêtes préparés

Soyez le premier à donner votre avis sur cette source.

Vue 6 982 fois - Téléchargée 834 fois

Description

Tout est dans le titre cette class vous offre la possibilité d'utiliser les requêtes préparés et aussi de choisir le gestionnaire des erreurs par les exceptions ou les erreur standard voici quelques exemples d'utilisation :
// Exemple d'utilisation
// Creation d'une nouvelle instance
$dbcfg['host'] = 'localhost';
$dbcfg['database'] = 'rimzik';
$dbcfg['user'] = 'root';
$dbcfg['password'] = '';
$options = array('ATTR_PERSISTENCY' => true,
'ATTR_ERRMODE' => DATABASE::ERRMODE_EXCEPTION);
// Requete Simple
$db = DATABASE::connect($dbcfg,$options);
try {

// Execution d'une requete SQL
$resultats = $db->Query("SELECT * FROM table");
// Nombre de results de la requete SQL;
$nbresults = $db->rowCount($resultats);
// Recuperation du resultat de la requete
while($row = $db->fetchAssoc($resultats) ) {
//
}
//liberation des ressources
$db->closeCursor($resultats);
//fermeture de la connexion
$db->close();
} catch (Exception $e ) {
echo $e->getMessage();
}
// Requete PREPARE
$db = DATABASE::connect($dbcfg,$options);
try {

// Execution d'une requete SQL
$stmt = $db->prepare("SELECT * FROM tables WHERE id=?");
$resultats = $db->execute(array(1),$stmt);
// Nombre de results de la requete SQL;
$nbresults = $db->rowCount($resultats);
// Recuperation du resultat de la requete
while( $row = $db->fetchObject($resultats) ) {
//
}
//liberation des ressources
$db->closeCursor($resultats);
//fermeture de la connexion
$db->close();
} catch (Exception $e ) {
echo $e->getMessage();
}
$db = DATABASE::connect($dbcfg,$options);
try {

$db->Begin();
// Execution d'une requete SQL
$resultats = $db->Query("INSERT INTO table(champ) values('value')");
//fermeture de la connexion
$db->Commit();
$db->close();
} catch (Exception $e ) {
$db->RollBack();
echo $e->getMessage();
}
// securisé une variable
//utiliser
$var = '<script type="text/javascript">alert("ok")</script>';
$var = $db->quote($var,DATABASE::PARAM_STR); // STRING
$var = $db->quote($var,DATABASE::PARAM_INT); // INTEGER
$var = $db->quote($var,DATABASE::PARAM_FLOAT); // FLOAT
$var = $db->quote($var,DATABASE::PARAM_BOOL); // BOOL
echo $var;
//dans une requête ne l'entourer pas de double quote

Source / Exemple :


<?php
include 'config.php';

class DATABASE {
	// Hote
	private $host = 'localhost';
	// User
	private $user = '';
	// Password
	private $password = '';
	// Databse
	private $database = '';
	// Persistency
	private $persistency = false;
	// Port
	private $port = NULL;
	// Connexion id
	private $connid = NULL;
	
	// Constante pour la methode quote 
	const PARAM_STR = 1; // Cast du type STR;
	const PARAM_INT = 2; // Cast du type INT
	const PARAM_FLOAT = 3; // Cast du FLOAT
	const PARAM_BOOL = 4; // Cast du type BOOL
	
	// Constante pour le type d'eereur
	const ERRMODE_EXCEPTION = 'E_EXCEPTION';
	const ERRMODE_WARNING   = 'E_WARNING';
	// Execetion
	private $exception = true;
	// Instance 
	protected static $instance;
	
   /***

  • - @desc : Constructor
  • - @params : Array $host,$user,$password,$database,$persistency,$port
  • - @return : none
  • /
protected function __construct($params,$options=array()) { $this->host = array_key_exists('host', $params) ? $params['host'] : 'localhost'; $this->user = array_key_exists('user', $params) ? $params['user'] : ''; $this->password = array_key_exists('password',$params) ? $params['password'] : ''; $this->database = array_key_exists('database',$params) ? $params['database'] : ''; $this->port = array_key_exists('port',$params) ? $params['port'] : ''; // Detection du port $this->host = !empty($this->port) ? $this->host.':'.$this->port : $this->host; if( !empty($options) ) { // On cherche le type de handler choisit par l'utilisateur if( array_key_exists('ATTR_ERRMODE', $options) ) { // Gestion des erreurs avec les exceptions disponible seulement avec PHP 5 if( strtoupper($options['ATTR_ERRMODE']) == self::ERRMODE_EXCEPTION ) { if( version_compare(PHP_VERSION, '5.0.0', '<')) { $this->exception = false; trigger_error("La version ".PHP_VERSION." que vous utiliser ne supporte pas les exceptions",E_USER_ERROR); } else { $this->exception = true;; } // Gestion des erreur en mode standard } elseif( strtoupper($options['ATTR_ERRMODE']) == self::ERRMODE_WARNING ) { $this->exception = false; // Le mode de gestion des erreur est inconue } else { trigger_error(__CLASS__.' :: impossible d\'activer le mode de gestion d\'erreur définit',E_USER_ERROR); } // Demande connexion persistente $this->persistency = array_key_exists('ATTR_PERSISTENCY',$options) ? $options['ATTR_PERSISTENCY'] : false; } else { // On définit les Exceptions comme mode d'erreur par default $this->exception = true; } } // Connexion persistente if( ($this->persistency) ) { $this->connid = mysql_pconnect($this->host,$this->user,$this->password); } else { echo 'lon'; $this->connid = @mysql_connect($this->host,$this->user,$this->password); } // Selection de la base de données if( is_resource($this->connid) ) { if( @mysql_select_db($this->database,$this->connid) ) { //activation du support utf-8 mysql_query("SET NAMES 'utf8'", $this->connid); return $this->connid; } else { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else trigger_error(mysql_error($this->connid),E_USER_ERROR); } } else { if( $this->exception ) throw new Exception(mysql_error(),mysql_errno()); else trigger_error(mysql_error(),E_USER_ERROR); } } /***
  • - @desc : Connect
  • - @params : Array $params,Array $options
  • - @return : none
  • /
public static function connect($params,$options) { if (!isset(self::$instance)) { self::$instance = new self($params,$options); } return self::$instance; } /***
  • - @desc : Execute une requête SQL
  • - @params : String $sql
  • - @return : none
  • /
public function Query($sql) { $this->sql = $sql; $query = mysql_query($sql,$this->connid); if( !$query ) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } else { return $query; } } /***
  • - @desc : Active ou désactive la validation automatique des requêtes
  • - @params : Bool $autocommit
  • - @return : Bool
  • /
public function AutoCommit($autocommit = true) { $auto = ( $autocommit ) ? 1 : 0; $query = @mysql_query('SET autocommit = '.$auto); if( !$query ) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } else { return true; } } /***
  • - @desc : Demarre la transaction
  • - @params : None
  • - @return : Bool
  • /
public function Begin() { $query = @mysql_query("BEGIN",$this->connid); if( !$query ) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } else { return true; } } /***
  • - @desc : Valide une transaction en cours
  • - @params : None
  • - @return : Bool
  • /
public function Commit() { $query = @mysql_query("COMMIT",$this->connid); if( !$query ) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } else { return $query; } } /***
  • - @desc : Annulle une transaction en cours
  • - @params : None
  • - @return : Bool
  • /
public function RollBack() { $query = @mysql_query("ROLLBACK",$this->connid); if( !$query ) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } else { return $query; } } /***
  • - @desc : Prepare une requête
  • - @params : String $query
  • - @return : Bool False || Statement
  • /
public function prepare($query) { $stmt = uniqid(mysql_thread_id()); $this->sql = $query; $prep = sprintf('PREPARE `%s` FROM \'%s\'', $stmt, mysql_real_escape_string($query,$this->connid)); if( @mysql_query($prep)) { return $stmt; } else { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } } /***
  • - @desc : Execute une requête preparé
  • - @params : Array $varArray, Statement $stmt
  • - @return : BOOL False || QueryResult
  • /
public function execute($varArray,$stmt) { foreach($varArray as $id => $val) { $key = sprintf('@`%s`', $id); if( is_numeric($val)) { $sf = '@`%s` = %s'; } else { $sf = '@`%s` = \'%s\''; } $sets[$key] = sprintf($sf, $id, $this->quote((string) $val)); } if( !empty($sets)) { $set = sprintf('SET %s', implode(', ', $sets)); if( mysql_query($set,$this->connid) === false) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } $ext = sprintf('EXECUTE `%s` USING %s', $stmt, implode(', ', array_keys($sets))); } else { $ext = sprintf('EXECUTE `%s`', $stmt); } $query = mysql_query($ext,$this->connid); if( !$query ) { if( $this->exception ) throw new Exception(mysql_error($this->connid),mysql_errno($this->connid)); else return false; } else { return $query; } } /***
  • - @desc : Protege les variables utilisés dans les requêtes
  • - @params : String $value, TYPE = PARAM_STR,PARAM_INT ...
  • - @return : value
  • /
public function quote($value,$type=self::PARAM_STR) { switch($type) { case self::PARAM_INT : $value = intval($value); break; case self::PARAM_FLOAT : $value = (float) $value; break; case self::PARAM_BOOL : $value = (bool) $value; break; default: if( (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc() ) || ini_get('magic_quotes_sybase') ) { $value = stripslashes($value); } $value = mysql_real_escape_string(htmlentities($value, ENT_QUOTES, 'UTF-8', false),$this->connid); break; } return "'".$value."'"; } /***
  • - @desc : Fecth Mode Associatif
  • - @params : Resource query result
  • - @return : query result rows
  • /
public function fetchAssoc($results) { return @mysql_fetch_assoc($results); } /***
  • - @desc : Fecth Mode Object
  • - @params : Resource query result
  • - @return : query result rows
  • /
public function fetchObject($results) { return @mysql_fetch_object($results); } /***
  • - @desc : Fecth Mode NumRows
  • - @params : Resource query result
  • - @return : query result rows
  • /
public function fetchRow($results) { return @mysql_fetch_row($results); } /***
  • - @desc : Fecth Mode Array
  • - @params : Resource query result
  • - @return : query result rows
  • /
public function fetchArray($results) { return @mysql_fetch_array($results); } /***
  • - @desc : Simule le FetchAll de PDO
  • - @params : Query result
  • - @return : Array $results
  • /
public function fetchAll($result) { $results = array(); while($row = @mysql_fetch_array($result) ) { $results[] = $row; } return $results; } /***
  • - @desc : Rettourne le nombre de rsultat d'une requête ou le nombre de champs affecter par une requête de type INSERT,UPDATE
  • - @params : Resource query result
  • - @return : Int numrows
  • / public function rowCount($results) {
if( strpos(strtoupper($this->sql),"SELECT") == 0 ) { return @mysql_num_rows($results); } else { return @mysql_affected_rows($this->connid); } } /***
  • - @desc : Retourne l'id du dernier enregistrement
  • - @params : Void
  • - @return : Int id
  • /
public function lastInsertId() { return @mysql_insert_id($this->connid); } /***
  • - @desc : Librer les resultats de la requête
  • - @params : results
  • - @return : Bool
  • /
public function closeCursor($results) { return mysql_free_result($results); } /***
  • - @desc : Erreur
  • - @params : void
  • - @return : String errorInfo
  • /
public function errorInfo() { return ( $this->connid ) ? mysql_error($this->connid): mysql_error(); } /***
  • - @desc : Erreur Code
  • - @params : void
  • - @return : String errorCode
  • /
public function errorCode() { return ( $this->connid ) ? mysql_errno($this->connid): mysql_errno(); } /***
  • - @desc : Fermeture de la connexion
  • - @params : void
  • - @return : Bool
  • /
public function close() { return ( $this->connid ) ? mysql_close($this->connid): mysql_close(); } } ?>

Conclusion :


Toute remarque ou suggestion est la bienvenue

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

devil_may_cry
Messages postés
194
Date d'inscription
dimanche 18 mars 2007
Statut
Membre
Dernière intervention
11 juillet 2015

désolé j'avait manqué cette partie :)
dans config.php il y'avait ca

$dbcfg['host'] = 'localhost';
$dbcfg['database'] = 'base';
$dbcfg['user'] = 'root';
$dbcfg['passsword'] = '';
tinalestate
Messages postés
4
Date d'inscription
mercredi 10 décembre 2008
Statut
Membre
Dernière intervention
30 septembre 2017

Un bel exemple de savoir mais c se compliquer la vie ...
et, terreaultguy, config.ini c ton propre fichier où tu indiques login/ password de ta connexion Mysql à toi :))
terreaultguy
Messages postés
1
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
11 septembre 2011

Bonjour
La premiere de code est:

include 'config.php';

mais dans les explications ou le .zip ce fichier n'existe pas
Est-ce un générique ou est particulier a cette example.

Quand je récolte des exemples par d'autres les include sont souvent fournie

Merci,
Guy
devil_may_cry
Messages postés
194
Date d'inscription
dimanche 18 mars 2007
Statut
Membre
Dernière intervention
11 juillet 2015

j'avais pas encore explorer son utilisation dans un wrapper donc je ne saurai en mesure de te donné une réponse sur le sujet
cod57
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
10
j'ai lu ça avant dans le manuel

http://www.php.net/manual/fr/language.oop5.patterns.php
Le pattern Singleton est l'un des plus controversés. Les critiques indiquent que le singleton crée un contexte global dans l'application et couple fortement le singleton à d'autres classes. Ceci mène vers des dépendances cachées et des effets de bord désagréables, le code devient ainsi plus difficile à maintenir et à tester.

Les critiques pointent aussi l'inutilité d'un singleton dans un environnement isolé comme PHP où les objets ne sont pas persistents entre les requêtes. Il est plus simple et propre de créer son graphe d'objets en utilisant des monteurs ou des fabriques, en début de requête.

Les singletons violent aussi plusieurs principes "SOLID" et la loi de Demeter. Les singletons ne peuvent être sérialisés. Il ne peuvent être surchargés (avant PHP 5.3) et ne seront pas nettoyés par le collecteur car une instance est toujours présente en mémoire, dans le singleton lui-même.

pensez vous que le singleton soit sur dans un wrapper quelconque ?

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.

Du même auteur (devil_may_cry)