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
dans config.php il y'avait ca
$dbcfg['host'] = 'localhost';
$dbcfg['database'] = 'base';
$dbcfg['user'] = 'root';
$dbcfg['passsword'] = '';
et, terreaultguy, config.ini c ton propre fichier où tu indiques login/ password de ta connexion Mysql à toi :))
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
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.