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 844 fois - Téléchargée 818 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

phpAnonyme
Messages postés
403
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
13 -
Avec un coup d'oeil rapide; Ta classe n'est pas vraiment intéressante dans le sens où celà ressemble plus à une translation des fonctions mysql_* en PHP>5. En somme les fonctions de ta classe existe déjà en natives. Peut-être que c'était le but ?
devil_may_cry
Messages postés
195
Date d'inscription
dimanche 18 mars 2007
Statut
Membre
Dernière intervention
11 juillet 2015
-
Merci d'avoir pris le temps de jeter un coup d’œil !
je suis peut être d'accord avec toi sur le faite que les fonctions existe en native mais le fait que la class n'est pas intéressante je ne crois pas qu'on est en phase sur ça puisque la class simplifie la gestion des requête préparer même si cela existe avec l'extension mysqli_* en plus d'offrir deux mode de gestion d'erreur (exception,warning)et met en évidence l'approche singleton.
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
Bonjour
pourquoi n'utilises tu pas le constructeur en public ?
et passes tu par connect
devil_may_cry
Messages postés
195
Date d'inscription
dimanche 18 mars 2007
Statut
Membre
Dernière intervention
11 juillet 2015
-
si je passe le constructeur en public on pourra donc avoir plusieurs instance de la class en utilisant new ce qui faussera mon approche singleton qui est la pour éviter cela :)
phpAnonyme
Messages postés
403
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
13 -
Je ne vois pas en crois ta classe simplifie la gestion des requêtes préparés, puisque tu sembles te baser sur PDO et PDOSTATEMENT. Ce que je veux te faire comprendre c'est que tu réinventes PDO avec des fonctions mysql_*. D'où à mon sens il n'y a pas de grand intérêt. Je ne crache pas sur ton boulot, ce n'est pas mon genre, mais je ne comprend pas le pourquoi.

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)