the_bigboo | voila j'ai fait cette petite class en PHP5 car je trouve que meme si c'est assez facile de gérer ses requetes SQL, c'est bien pratique car le code en est d'autant plus simplifié. Elle fait tout de meme 650 lignes
donc l'avantage ,c'est qu'au lieu de faire :
Code :
- $SQL = mysql_connect('localhost','root','') or die (mysql_error()) ;
- mysql_select_db('base_sql',$SQL) or die(mysql_error()) ;
- // Requete SQL
- $Query = 'SELECT champ_1,champ_2,champ_3 FROM ma_table WHERE champ_4 > 5 AND champ_5="valeur" ORDER BY champ_1 DESC LIMIT 10,20' ;
- $ExeSQL = mysql_query($Query) or die(mysql_error()) ;
- // Exploitation des résultat
- while ( $Data = mysql_fetch_array($ExeSQL) )
- {
- .............................. // Code
- }
|
vous ferez :
Code :
- $GetData = new MySQL_select ;
- $GetData->From('ma_table');
- $GetData->SetFilter('champ_4','>',5) ;
- $GetData->SetFilter('champ_5','=','valeur') ;
- $GetData->SQLOrder('champ_1','DESC') ;
- $GetData->SetStart(10) ;
- $GetData->SetLimit(20) ;
- // On veux récupérer un tableau de donnée
- $GetData->ReturnValue('rows') ;
- // Récupération des données
- $RecupData = $GetData->Make() ;
|
Le gain ne se situe pas sur la longueur du code qui ne change que tres peu, ca permet surtout un évolution nettement plus facile
Les procédures sont sensiblements les memes pour les autres classes, le gain de se fait pas sur la compacité du code mais sur sa facilité a évoluer.
Code :
- <?php
- // Librairie MySQL optimisée PHP5
- class MySQL {
- // Déclaration des variables de parametres
- private $MySQLServer = '' ;
- private $MySQLLogin = '' ;
- private $MySQLPasswd = '' ;
- // Base de donnée(s)
- private $MySQLBdd = '' ;
- // Options
- private $OptLog = false ;
- // Variables techniques
- static $MySQLHandle ;
- static $MySQLNbQueries ;
- static $MySQLResult = array() ;
- // Fin de déclaration des variables
- // Déclaration des constructeurs/destructeurs de class
- // Constructeur
- function __construct()
- {
- // Connexion a la base
- $this->OpenSQLAccess() ;
- }
- // Destructeur
- function __destruct()
- {
- }
- // Fin de déclaration des constructeurs/destructeurs de class
- // Déclaration des procédures privées
- // Connexion base de donnée
- private function OpenSQLAccess()
- {
- // Instanciation de la connexion
- $this->MySQLHandle = mysql_connect($this->MySQLServer,$this->MySQLLogin,$this->MySQLPasswd) ;
- // Selection de la base de donnée
- mysql_select_db($this->MySQLBdd,$this->MySQLHandle) ;
- }
- // Fermeture de connexion base de donnée
- private function CloseSQLAccess()
- {
- // Fermeture de connexion SQL
- mysql_close($this->MySQLHandle) ;
- // Valeur de retour
- return true ;
- }
- // Type de requetes
- private function QueryType($Query)
- {
- if(ereg("^UPDATE",$Query))
- $return = "UPD" ;
- elseif(ereg("^INSERT",$Query))
- $return = "INS" ;
- elseif(ereg("^DELETE",$Query))
- $return = "DEL" ;
- else
- $return = "SEL" ;
- // Retour final
- return $return ;
- }
- //Déclaration des procédures publiques
- // Execution des requetes
- public function Execute($SQLQuery,$Back)
- {
- // $Return (rows|res|null)
- if(!is_array($SQLQuery))
- {
- $SQL = $SQLQuery ;
- $SQLQuery = array($SQL) ;
- // Réexecution de la procédure
- $this->Execute($SQLQuery,$Back) ;
- }
- else
- {
- // On execute en boucle
- foreach($SQLQuery As $Query)
- {
- // Execution de la requete
- $ExecuteQuery = mysql_query($Query,$this->MySQLHandle) ;
- // Type de requete
- $QueryType = $this->QueryType($Query);
- // Switch de retour
- // switch sur la fonction a renvoyer
- switch($QueryType)
- {
- // Select
- case 'SEL':
- // Switch de back
- switch(strtoupper($Back))
- {
- case 'RES': $return = mysql_num_rows($ExecuteQuery) ; break ;
- case 'ROWS' : $return = mysql_fetch_array($ExecuteQuery) ; break ;
- default : $return = mysql_num_rows($ExecuteQuery) ; break ;
- }
- break ;
- // Update
- case 'UPD':
- $return = mysql_affected_rows($this->MySQLHandle) ;
- break ;
- // Delete
- case 'DEL':
- $return = mysql_affected_rows($this->MySQLHandle) ;
- break ;
- // Insert
- case 'INS':
- switch($Back)
- {
- case 'RES': $return = mysql_affected_rows($this->MySQLHandle) ; break ;
- case 'ID' : $return = mysql_insert_id(MySQL::$MySQLHandle) ; break ;
- default : $return = mysql_affected_rows($this->MySQLHandle) ; break ;
- }
- break ;
- case 'NULL':
- $return = true ;
- break ;
- }
- }
- }
- // Incrémentation des requetes
- MySQL::$MySQLNbQueries++ ;
- // Sauvegarde des résultats de la requete
- MySQL::$MySQLResult[] = $return ;
- // Renvoi final
- return $return ;
- }
- // Fonction de log
- public function LogEvent($Text)
- {
- // Si option activée
- if( $this->OptLog )
- {
- // Ouverture
- $fichier=fopen('mysql.log','w');
- // Ecriture
- fwrite($fichier,"[".date("d-m-Y H:i:s" )."] ".$Text."\n" );
- fclose($fichier);
- }
- }
- }
- // Class annexes - Insert
- class MySQL_insert extends MySQL {
- // Déclaration des variables statiques
- static $AllInsertQueries = array() ;
- // Déclaration des variables privéres
- private $SQLTable ;
- private $FieldsToUse ;
- private $Options ;
- private $Return = 'NULL' ;
- // Déclaration des procédures privées
- // Fonction de création de la requete SQL
- private function BuildSQLQuery()
- {
- // On commence par verifier qu'on a toutes les informations en notre possession
- if( empty( $this->SQLTable) )
- {
- // Le nom de la table SQL est vide - on log
- $this->LogEvent('Impossible de construire la requete SQL, le nom de la table a utiliser non précisé');
- // Renvoi faux
- $return = false ;
- }
- // Ou si la liste des champs a insérer est vide
- elseif( sizeof( $this->FieldsToUse ) == 0 )
- {
- // On log
- $this->LogEvent('Liste des champs a insérer vide');
- // Renvoi faux
- $return = false ;
- }
- // Sinon tout est OK
- else
- {
- // Début de la requete :
- $SQLQuery = 'INSERT INTO '.$this->SQLTable.' (' ;
- // On colle la liste des champs
- $SQLQuery .= implode(',',array_keys($this->FieldsToUse)) ;
- // Fermeture du nom des champs
- $SQLQuery .= ') VALUES ("' ;
- // Liste des valeurs de champs
- $SQLQuery .= implode( '","',$this->FieldsToUse ) ;
- // Fin de la requete
- $SQLQuery .= '" )' ;
- // On renvoie la requete
- $return = $SQLQuery ;
- }
- // Renvoi final
- return $return ;
- }
- // Déclaration des procédures publiques
- // Selection de la table
- public function Into($TblName)
- {
- if(!ereg("^([:alnum:]+)$",$TblName))
- {
- // Nom de table uniquement alphanumérique
- $this->LogEvent('Table SQL non alphanumerique');
- // Renvoi faux
- $return = false ;
- }
- else
- {
- // On enregistre le nom de la table
- $this->SQLTable = strtolower($TblName) ;
- // Renvoi vrai
- $return = true ;
- }
- // Renvoi final
- return $return ;
- }
- // Ajouts des paramètres
- public function SetValue($FieldName,$Value)
- {
- if(ereg("^([:alnum:]+)$",$FieldName))
- {
- // S'assure que ca ne soit pas vide
- $this->FieldsToUse[] = array('Name' =>$FieldName,
- 'Value' =>str_replace('"','\"',$Value) );
- // Renvoi vrai
- $return = true ;
- }
- else
- {
- // Le nom du champ est vide, on log une erreur
- $this->LogEvent('Parametre des champs a ajouter sont vides ou ne sont pas alphanumeriques');
- // Renvoi final
- $return = false ;
- }
- // Renvoi final
- return $return ;
- } //
- // Application des options
- public function Option($Field,$ArrayOfFunctions)
- {
- // On vérifie que le champ a été répertorié
- if(!isset($this->FieldsToUse[$Field]))
- {
- // On logue mais on ne bloque pas la procédure
- $this->LogEvent('Impossible d\'utiliser des fontions sur le champ '.$Field.' car celui ci n\'est pas répertorié');
- }
- else
- {
- // on applique la/les options
- if( is_array($ArrayOfFunctions) )
- {
- // On fait une boucle
- foreach($ArrayOfFunctions As $Function)
- {
- // Si la fonction existe
- if(function_exists($Function))
- {
- // On applique la fonction
- $this->FieldsToUse[$Field] = $Function($this->FieldsToUse[$Field]) ;
- }
- else
- {
- // On logue mais on bloque pas
- $this->LogEvent('Fonction '.$Function.' non déclarée');
- }
- }
- }
- }
- }
- // Attribution de la valeur de retour
- public function ReturnValue($Choice)
- {
- // rows|res|id|null
- $AcceptedValues = array('ROWS','RES','ID','NULL') ;
- // Si ce n'est pas dans les valeur acceptées, on log mais on ne bloque pas
- if( in_array($Choice,$AcceptedValues))
- {
- $this->Return = strtoupper($Choice) ;
- // Renvoi vrai
- $return = true ;
- }
- else
- {
- // On log
- $this->LogEvent('Valeur de retour non acceptée : '.$Choice.' dans la procérure ReturnValue()');
- // renvoi faux
- $return = false ;
- }
- // renvoi final
- return $return ;
- }
- // Execution de la requete
- public function Make()
- {
- // On commence par générer la requete
- $SQLQuery = $this->BuildSQLQuery() ;
- MySQL_insert::$AllInsertQueries[] = $SQLQuery ;
- // On verifie que le résultat n'est pas 'false'
- if( $SQLQuery == false )
- {
- // Une erreur s'est produite - elle est loguée de toute facon
- $this->LogEvent('Arret de procédure Make(), class MySQL_insert');
- // Renvoi faux
- $return = false ;
- }
- else
- {
- // On execute la requete
- $return = $this->Execute($SQLQuery,$this->Return) ;
- // Prendra faux automatiquement en cas d'erreur
- }
- // renvoi final
- return $return ;
- }
- }
- // Class annexes - Select
- class MySQL_select extends MySQL {
- // Declaration des variables statiques
- static $AllSelectQueries ;
- // Declaration des variables privées
- private $SQLTable ;
- private $SQLFilters ;
- private $SQLExtractionFields ;
- private $SQLOrder = array ('field'=>'' , 'sens'=>'' );
- private $SQLLimit = array('start'=> false , 'lenght' => false ) ;
- private $Return = 'ROWS' ;
- // Déclaration des procédures privées
- private function BuildSQLQuery()
- {
- // Debut de la requete
- $SQLQuery = 'SELECT ' ;
- // Liste des champs a extraire
- $SQLQuery .= implode(',',$this->SQLExtractionFields) ;
- // Nom de la table
- $SQLQuery .= ' FROM '.$this->SQLTable ;
- // Ajout des clauses de conditions si nécessaire
- if( sizeof( $this->SQLExtractionFields ) > 0 )
- {
- $EachFilter = array() ;
- // Continuation de la mise en forme de la requete
- $SQLQuery .= ' WHERE ' ;
- // On met en forme les filtres
- foreach( $this->SQLFilters As $Filter )
- {
- if(!ereg("^[0-9]$",$Filter['value']))
- {
- $Filter['value'] = '"'.$Filter['value'].'"' ;
- }
- // On ajoute le filtre
- $EachFilter[] = $Filter['field'].$Filter['op'].$Filter['value'] ;
- }
- // On colle les filtres avec du implode
- $SQLQuery .= implode(' AND ',$EachFilter) ;
- // On rajoute une clause eventuelle d'ordre
- if( strlen($this->SQLOrder['field']) > 0 )
- {
- // On rajoute la clause
- $SQLQuery .= ' ORDER BY '.$this->SQLOrder['field'] ;
- // Si le sens est précisé on le rajoute
- if( strlen($this->SQLOrder['sens']) > 0 )
- {
- $SQLQuery .= ' '.$this->SQLOrder['sens'] ;
- }
- }
- // On vérifie l'attribut LIMIT
- if($this->SQLLimit['lenght']!=false && $this->SQLLimit['start']!=false)
- {
- // LIMIT complet
- $SQLQuery .= ' LIMIT '.$this->SQLLimit['start'].','.$this->SQLLimit['lenght'] ;
- }
- elseif($this->SQLLimit['lenght']!=false && $this->SQLLimit['start']==false )
- {
- // LIMIT semi-complet
- $SQLQuery .= ' LIMIT '.$this->SQLLimit['lenght'] ;
- }
- // Requete SQL Complete
- $return = $SQLQuery ;
- }
- else
- {
- // Aucun champ a extraire
- $this->LogEvent('Aucun champ a extraire dans MySQL_select');
- // Renvoi faux
- $return = false ;
- }
- // Renvoi final
- return $return ;
- }
- // Fin de déclaration des procédures privées
- // Déclaration des procédures publiques
- // Selection de la table SQL
- public function From($TblName)
- {
- if(!ereg("^([:alnum:]+)$",$TblName))
- {
- // Nom de table uniquement alphanumérique
- $this->LogEvent('Table SQL non alphanumerique');
- // Renvoi faux
- $return = false ;
- }
- else
- {
- // On enregistre le nom de la table
- $this->SQLTable = strtolower($TblName) ;
- // Renvoi vrai
- $return = true ;
- }
- // Renvoi final
- return $return ;
- }
- // Mise en place des filtres
- public function SetFilter($Field,$Op,$Value)
- {
- // Operateurs acceptés
- $AcceptedOperators = array('>','<','<=','>=','==','!=') ;
- // Si $Value est un chiffre on ne met pas de guillemets
- if(!ereg("^[0-9]$",$Value)){ $PutFilterValue = '"'.$Value.'"' ; }else{ $PutFilterValue = $Value ; }
- // Si l'opérateur n'est pas reconnu
- if( in_array($Op,$AcceptedOperators))
- {
- // On log
- $this->SQLFilters[] = array('field'=>$Field,'op'=>$Op,'value'=>$PutFilterValue) ;
- }
- else
- {
- // On log
- $this->LogEvent('Operateur logique non reconnu');
- // Renvoi faux
- $return = false ;
- }
- // renvoi final
- return $return ;
- }
- // Longueur de l'extraction
- public function SetLimit($Int)
- {
- if(!ereg("^[0-9]$",$Int))
- {
- // ce n'est pas un chiffre
- $this->LogEvent('La limit doit etre de type Integer');
- // renvoi faux
- $return = false ;
- }
- else
- {
- $this->SQLLimit['lenght'] = $Int ;
- // Renvoi vrai
- $return = true ;
- }
- // renvoi final
- return $return ;
- }
- // Debut de l'xtraction
- public function SetStart($Int)
- {
- if(!ereg("^[0-9]$",$Int))
- {
- // ce n'est pas un chiffre
- $this->LogEvent('La limit de début doit etre de type Integer');
- // renvoi faux
- $return = false ;
- }
- else
- {
- $this->SQLLimit['start'] = $Int ;
- // Renvoi vrai
- $return = true ;
- }
- // renvoi final
- return $return ;
- }
- // Attribution de la valeur de retour
- public function ReturnValue($Choice)
- {
- // rows|res|id|null
- $AcceptedValues = array('ROWS','RES','ID','NULL') ;
- // Si ce n'est pas dans les valeur acceptées, on log mais on ne bloque pas
- if( in_array($Choice,$AcceptedValues))
- {
- $this->Return = strtoupper($Choice) ;
- // Renvoi vrai
- $return = true ;
- }
- else
- {
- // On log
- $this->LogEvent('Valeur de retour non acceptée : '.$Choice.' dans la procérure ReturnValue()');
- // renvoi faux
- $return = false ;
- }
- // renvoi final
- return $return ;
- }
- // Execution de la requete
- public function Make()
- {
- // On commence par générer la requete
- $SQLQuery = $this->BuildSQLQuery() ;
- MySQL_select::$AllSelectQueries[] = $SQLQuery ;
- // On verifie que le résultat n'est pas 'false'
- if( $SQLQuery == false )
- {
- // Une erreur s'est produite - elle est loguée de toute facon
- $this->LogEvent('Arret de procédure Make(), class MySQL_insert');
- // Renvoi faux
- $return = false ;
- }
- else
- {
- // On execute la requete
- $return = $this->Execute($SQLQuery,$this->Return) ;
- // Prendra faux automatiquement en cas d'erreur
- }
- // renvoi final
- return $return ;
- }
- // Fin de déclaration des procédures publiques
- }
- // Class annexes - Update
- class MySQL_update extends MySQL {
- // Déclaration des variables statiques
- static $AllUpdatesQueries ;
- // Déclaration des variables privées
- private $SQLtable ;
- private $SQLFilters = array() ;
- private $SQLLimit = false ;
- private $SQLUpdateFields = array();
- private $Return = 'NULL';
- // Déclaration des procédures privées
- private function BuildSQLQuery()
- {
- // Début de la requete
- $EachFieldToUpdate = array() ;
- $EachFilterToSet = array() ;
- // Vérification de la présence de toutes les informations
- if(!empty($this->SQLtable))
- {
- // On vérifie qu'un champ au moins est a mettre a jour
- if( sizeof($this->SQLUpdateFields) > 0 )
- {
- $SQLQuery = 'UPDATE '.$this->SQLtable.' SET ' ;
- // On créé un tableau pour coller tous les éléments de la requete
- foreach( $this->SQLUpdateFields As $Update )
- {
- $EachFieldToUpdate[] = $Update['field'].'="'.$Update['value'].'"' ;
- }
- // On colle les champs a mettre a jours
- $SQLQuery .= implode(', ',$EachFieldToUpdate) ;
- // On regarde ou non la présence d'une clause WHERE
- if( sizeof($this->SQLFilters) > 0 )
- {
- // On ajoute la clause WHERE dans la raquete SQL
- $SQLQuery .= ' WHERE ' ;
- // Boucle pour créer les éléments de la boucle
- foreach( $this->SQLFilters As $Filter )
- {
- $EachFilterToSet[] = $Filter['field'].$Filter['op'].$Filter['value'] ;
- }
- // On colle les conditions
- $SQLQuery .= implode(' AND ',$EachFilterToSet) ;
- }
- // Ajout des attributs de LIMIT
- if( $this->SQLLimit != false )
- {
- $SQLQuery .= ' LIMIT '.$this->SQLLimit ;
- }
- // Renvoi final
- $return = $SQLQuery ;
- }
- else
- {
- // Aucun champ a mettre a jour
- $this->LogEvent('Aucun champ a mettre à jour');
- // Renvoi faux
- $return = false ;
- }
- }
- else
- {
- // Nom de table non renseigné
- $this->LogEvent('Nom de table non renseigné');
- // Renvoi faux
- $return = false ;
- }
- // Renvoi global
- return $return ;
- }
- // Mise en place des filtres
- public function SetFilter($Field,$Op,$Value)
- {
- // Operateurs acceptés
- $AcceptedOperators = array('>','<','<=','>=','==','!=') ;
- // Si $Value est un chiffre on ne met pas de guillemets
- if(!ereg("^[0-9]$",$Value)){ $PutFilterValue = '"'.$Value.'"' ; }else{ $PutFilterValue = $Value ; }
- // Si l'opérateur n'est pas reconnu
- if( in_array($Op,$AcceptedOperators))
- {
- // On log
- $this->SQLFilters[] = array('field'=>$Field,'op'=>$Op,'value'=>$PutFilterValue) ;
- }
- else
- {
- // On log
- $this->LogEvent('Operateur logique non reconnu');
- // Renvoi faux
- $return = false ;
- }
- // renvoi final
- return $return ;
- }
- // Mise en place de la limit
- public function SetLimit($Int)
- {
- // Uniquement un chiffre
- if(ereg("^[:alnum:]$",$Int))
- {
- // On enregistre la limite
- $this->SQLLimit = $Int ;
- // renvoi vrai
- $return = true ;
- }
- else
- {
- // N'est pas un chiffre
- $this->LogEvent('La limite n\'est pas de type numérique, action ignorée');
- // Renvoi faux ;
- $return = false ;
- }
- // renvoi final
- return $return ;
- }
- // Execution de la requete
- public function Make()
- {
- // On commence par générer la requete
- $SQLQuery = $this->BuildSQLQuery() ;
- MySQL_update::$AllUpdatesQueries[] = $SQLQuery ;
- // On verifie que le résultat n'est pas 'false'
- if( $SQLQuery == false )
- {
- // Une erreur s'est produite - elle est loguée de toute facon
- $this->LogEvent('Arret de procédure Make(), class MySQL_update');
- // Renvoi faux
- $return = false ;
- }
- else
- {
- // On execute la requete
- $return = $this->Execute($SQLQuery,$this->Return) ;
- // Prendra faux automatiquement en cas d'erreur
- }
- // renvoi final
- return $return ;
- }
- }
- ?>
|
En espérant que ca vous aidera autant que ca m'aide, j'integrerai sous peu les jointures dans la class SELECT
En passant j'aimerais avoir des suggestions d'optimisation ou des idées, bref des avis... |