Nouveau sujet Répondre Imprimer Syndication RSS 2.0

Classe SQL

Votre avis sur ma première classe, soyez indulgents
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 10:55
Bonjour à tous,

J'aimerai avoir votre avis sur la première classe que j'ai faite en PHP (la POO pour moi c'est tout nouveau ::zzzz:: )...

Je précise de suite que normalement tout marche, je travaille sous PHP5 et que comme c'est un script perso la compatiblité avec les autres types de BD ne m'intéresse pas :S..

Voilà, j'aimerai vos avis, des trucs à changer, des trucs inutiles ;-)

<?php
class sql
  {
	var $error_db = 'Une erreur est survenue lors de la connection à  la base de donnée. Veuillez vérifier le nom de votre base de donnée.';
	var $error_connect = 'Une erreur est survenue lors de la connection au serveur SQL. Veuillez vérifier vos identifiants.';
	var $error_query = 'Une erreur est survenue lors de l\'exécution de la requête : ';
	var $error_mc = 'Vous devez être connecté à MySQL pour réaliser cette opération.';
	var $error_ic = 'Le nombre de colonnes diffère du nombre de valeurs.';
	var $connect = FALSE;
	var $requete;
	var $req;
	var $resultat;
	var $fetch;
	var $nbre_valeurs = 0;
	var $nbre_colonnes = 0;
	var $nbre_modifications = 0;
	
     function __construct($server,$username,$password,$database,$port=1186) // Constructeur (Connection BDD)
	   {
	      $server = ( $port == 1186 ) ? $server : $server.':'.$port;
	      $this->connect = @mysql_connect($server,$username,$password);
		  
		  if ( $this->connect !== FALSE )
		    {
			   $this->database = @mysql_select_db($database,$this->connect);
			   if ( $this->database === FALSE )
			     {
				   die($this->error_db);
				 }
			   $this->connect = TRUE;
			}
		  else
		    {
			  die($this->error_connect);
			}
	   }
	   
	 function sql_query($query) // Fonction permettant d'exécuter une requête (Tout type)
	   {
	      if ( $this->connect !== FALSE )
		    {
			  $this->req = @mysql_query($query);
			  if ( $this->req === FALSE )
			    {
				  die($this->error_query.$query);
				}
			  return $this->req;
			}
		  else
		    {
			  die($this->error_mc);
			}
	   }
	   
	 function sql_select($table,$elements,$where='') // Fonction permettant d'effectuer une sélection
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'SELECT ';
		     $this->requete .= $elements;
		     $this->requete .= ' FROM ';
		     $this->requete .= $table;
		     if ( $where )
		       {
		         $this->requete .= ' WHERE ';
			     $this->requete .= $where;
		       }
		     $this->resultat = $this->sql_query($this->requete);
		     return $this->resultat;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	 
	 function sql_assoc($ressource) // Fonction permettant de transformer les données issues de mysql_query en un tableau
	   {
	      $this->resultat = @mysql_fetch_assoc($ressource);
	      return $this->resultat;
	   }
	 
	 function sql_insert($table,array $colonnes,array $valeurs) // Fonction permettant d'insérer de nouvelles données
	   {
	     if ( $this->connect !== FALSE )
		   {
		     $this->nbre_valeurs = sizeof($valeurs);
			 $this->nbre_colonnes = sizeof($colonnes);
			 if ( $this->nbre_valeurs != $this->nbre_colonnes )
			   {
			     die($this->error_ic);
			   }
			 for ( $i=0;$i<$this->nbre_valeurs;$i++ )
			   {
			     $valeurs[$i] = '"'.$valeurs[$i].'"';
			   }
	         $this->requete = 'INSERT INTO ';
	         $this->requete .= $table;
	         $this->requete .= ' (';
			 $this->requete .= implode(',', $colonnes);
			 $this->requete .= ') ';
	         $this->requete .= 'VALUES(';
	         $this->requete .= implode(',', $valeurs);
	         $this->requete .= ');';
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	   
	 function sql_update($table,array $modifications,$where='') // Fonction permettant d'update des données
	   {
	     if ( $this->connect !== FALSE )
		   {
		     $this->nbre_modifications = sizeof($modifications);
	         $this->requete = 'UPDATE ';
	         $this->requete .= $table;
	         $this->requete .= ' SET ';
			 $i = 0;
			 foreach($modifications AS $cle => $valeur)
              {
			    $i++;
                $this->requete .= ( $i != $this->nbre_modifications ) ? $cle.' = "'.$valeur.'", ' : $cle.' = "'.$valeur.'" ';
              }
			 if ( $where )
			   {
	             $this->requete .= 'WHERE ';
	             $this->requete .= $where;
			   }
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	   
	 function sql_delete($table,$where='') // Fonction permettant de supprimer des données
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'DELETE FROM ';
	         $this->requete .= $table;
			 if ( $where )
			   {
	             $this->requete .= ' WHERE ';
	             $this->requete .= $where;
			   }
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	   
	 function sql_count($table,$where='') // Fonction permettant de retourner le nombre d'occurences
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'SELECT COUNT(*) AS count FROM ';
	         $this->requete .= $table;
			 if ( $where )
			   {
	             $this->requete .= ' WHERE ';
	             $this->requete .= $where;
			   }
	         $this->fetch = $this->sql_query($this->requete);
			 $this->resultat = $this->sql_assoc($this->fetch); 
	         return $this->resultat['count'];
		   }
		 else
		   {
		     die($this->error_mc);
		   }	     
	   }
  }
?>



Merci d'avance :fsb2_godgrace:


BaB'
 
Equipe graphique
Avatar de PhenX
  • Age : 23 ans
  • Messages : 463
  • Inscrit : 31 Octobre 2007
Message édité 1 fois, dernière édition par PhenX, 26 Décembre 2007, 11:08     Lien vers ce message 26 Décembre 2007, 11:00
Tu pourrai parfois utiliser
fonction(param1, param2) or die('message');

au lieu de tests, et la commande die arrete le programme non ? alors ca ne servirai a rien de mettre du code apres (mettre des variables a false, etc)


 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 11:09
Merci pour ton conseil :P Je change ça de suite (en effet ca allège quelque peu mon code) :

<?php
class sql
  {
	var $error_db = 'Une erreur est survenue lors de la connection à  la base de donnée. Veuillez vérifier le nom de votre base de donnée.';
	var $error_connect = 'Une erreur est survenue lors de la connection au serveur SQL. Veuillez vérifier vos identifiants.';
	var $error_query = 'Une erreur est survenue lors de l\'exécution de la requête : ';
	var $error_mc = 'Vous devez être connecté à MySQL pour réaliser cette opération.';
	var $error_ic = 'Le nombre de colonnes diffère du nombre de valeurs.';
	var $connect = FALSE;
	var $requete;
	var $req;
	var $resultat;
	var $fetch;
	var $nbre_valeurs = 0;
	var $nbre_colonnes = 0;
	var $nbre_modifications = 0;
	
     function __construct($server,$username,$password,$database,$port=1186) // Constructeur (Connection BDD)
	   {
	      $server = ( $port == 1186 ) ? $server : $server.':'.$port;
	      $this->connect = @mysql_connect($server,$username,$password) OR die($this->error_connect);
		  $this->database = @mysql_select_db($database,$this->connect) OR die($this->error_db);
		  $this->connect = TRUE;
	   }
	   
	 function sql_query($query) // Fonction permettant d'exécuter une requête (Tout type)
	   {
	      if ( $this->connect !== FALSE )
		    {
			  $this->req = @mysql_query($query) OR die($this->error.query.$query);
			  return $this->req;
			}
		  else
		    {
			  die($this->error_mc);
			}
	   }
	   
	 function sql_select($table,$elements,$where='') // Fonction permettant d'effectuer une sélection
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'SELECT ';
		     $this->requete .= $elements;
		     $this->requete .= ' FROM ';
		     $this->requete .= $table;
		     if ( $where )
		       {
		         $this->requete .= ' WHERE ';
			     $this->requete .= $where;
		       }
		     $this->resultat = $this->sql_query($this->requete);
		     return $this->resultat;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	 
	 function sql_assoc($ressource) // Fonction permettant de transformer les données issues de mysql_query en un tableau
	   {
	      $this->resultat = @mysql_fetch_assoc($ressource);
	      return $this->resultat;
	   }
	 
	 function sql_insert($table,array $colonnes,array $valeurs) // Fonction permettant d'insérer de nouvelles données
	   {
	     if ( $this->connect !== FALSE )
		   {
		     $this->nbre_valeurs = sizeof($valeurs);
			 $this->nbre_colonnes = sizeof($colonnes);
			 if ( $this->nbre_valeurs != $this->nbre_colonnes )
			   {
			     die($this->error_ic);
			   }
			 for ( $i=0;$i<$this->nbre_valeurs;$i++ )
			   {
			     $valeurs[$i] = '"'.$valeurs[$i].'"';
			   }
	         $this->requete = 'INSERT INTO ';
	         $this->requete .= $table;
	         $this->requete .= ' (';
			 $this->requete .= implode(',', $colonnes);
			 $this->requete .= ') ';
	         $this->requete .= 'VALUES(';
	         $this->requete .= implode(',', $valeurs);
	         $this->requete .= ');';
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	   
	 function sql_update($table,array $modifications,$where='') // Fonction permettant d'update des données
	   {
	     if ( $this->connect !== FALSE )
		   {
		     $this->nbre_modifications = sizeof($modifications);
	         $this->requete = 'UPDATE ';
	         $this->requete .= $table;
	         $this->requete .= ' SET ';
			 $i = 0;
			 foreach($modifications AS $cle => $valeur)
              {
			    $i++;
                $this->requete .= ( $i != $this->nbre_modifications ) ? $cle.' = "'.$valeur.'", ' : $cle.' = "'.$valeur.'" ';
              }
			 if ( $where )
			   {
	             $this->requete .= 'WHERE ';
	             $this->requete .= $where;
			   }
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	   
	 function sql_delete($table,$where='') // Fonction permettant de supprimer des données
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'DELETE FROM ';
	         $this->requete .= $table;
			 if ( $where )
			   {
	             $this->requete .= ' WHERE ';
	             $this->requete .= $where;
			   }
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die($this->error_mc);
		   }
	   }
	   
	 function sql_count($table,$where='') // Fonction permettant de retourner le nombre d'occurences
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'SELECT COUNT(*) AS count FROM ';
	         $this->requete .= $table;
			 if ( $where )
			   {
	             $this->requete .= ' WHERE ';
	             $this->requete .= $where;
			   }
	         $this->fetch = $this->sql_query($this->requete);
			 $this->resultat = $this->sql_assoc($this->fetch); 
	         return $this->resultat['count'];
		   }
		 else
		   {
		     die($this->error_mc);
		   }	     
	   }
  }
?>


BaB'
 
Equipe graphique
Avatar de PhenX
  • Age : 23 ans
  • Messages : 463
  • Inscrit : 31 Octobre 2007
  Lien vers ce message 26 Décembre 2007, 11:20
Je t'en prie :) effectivement ça allege pas mal ce genre de trucs :)


 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
Message édité 1 fois, dernière édition par Babacooll, 26 Décembre 2007, 12:48     Lien vers ce message 26 Décembre 2007, 11:49
Sur un autre forum on m'a recommendé d'utiliser les possibilités de PHP5 (const,private,public, etc ..).

Voici donc mon nouveau code (Est-ce vrai que pour utiliser une variable constante il faut faire self::nom et pas $this->nom ???) :

<?php
class sql
  {
	const error_db = 'Une erreur est survenue lors de la connection à  la base de donnée. Veuillez vérifier le nom de votre base de donnée.';
	const error_connect = 'Une erreur est survenue lors de la connection au serveur SQL. Veuillez vérifier vos identifiants.';
	const error_query = 'Une erreur est survenue lors de l\'exécution de la requête : ';
	const error_mc = 'Vous devez être connecté à MySQL pour réaliser cette opération.';
	const error_ic = 'Le nombre de colonnes diffère du nombre de valeurs.';
	private $connect = FALSE;
	private $requete;
	private $req;
	private $resultat;
	private $fetch;
	private $nbre_valeurs = 0;
	private $nbre_colonnes = 0;
	private $nbre_modifications = 0;
	
     public function __construct($server,$username,$password,$database,$port=1186) // Constructeur (Connection BDD)
	   {
	      $server = ( $port == 1186 ) ? $server : $server.':'.$port;
          $this->connect = @mysql_connect($server,$username,$password) OR die(self::error_connect);
          $this->database = @mysql_select_db($database,$this->connect) OR die(self::error_db);
		  $this->connect = TRUE;
	   }
	   
	 public function sql_query($query) // Fonction permettant d'exécuter une requête (Tout type)
	   {
	      if ( $this->connect !== FALSE )
		    {
			  $this->req = @mysql_query($query) OR die(self::error_query.$query);
			  return $this->req;
			}
		  else
		    {
			  die(self::error_mc);
			}
	   }
	   
	 public function sql_select($table,$elements,$where='') // Fonction permettant d'effectuer une sélection
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'SELECT ';
		     $this->requete .= $elements;
		     $this->requete .= ' FROM ';
		     $this->requete .= $table;
		     if ( $where )
		       {
		         $this->requete .= ' WHERE ';
			     $this->requete .= $where;
		       }
		     $this->resultat = $this->sql_query($this->requete);
		     return $this->resultat;
		   }
		 else
		   {
		     die(self::error_mc);
		   }
	   }
	 
	 public function sql_assoc($ressource) // Fonction permettant de transformer les données issues de mysql_query en un tableau
	   {
	      $this->resultat = @mysql_fetch_assoc($ressource);
	      return $this->resultat;
	   }
	 
	 public function sql_insert($table,array $colonnes,array $valeurs) // Fonction permettant d'insérer de nouvelles données
	   {
	     if ( $this->connect !== FALSE )
		   {
		     $this->nbre_valeurs = sizeof($valeurs);
			 $this->nbre_colonnes = sizeof($colonnes);
			 if ( $this->nbre_valeurs != $this->nbre_colonnes )
			   {
			     die($this->error_ic);
			   }
			 for ( $i=0;$i<$this->nbre_valeurs;$i++ )
			   {
			     $valeurs[$i] = '"'.$valeurs[$i].'"';
			   }
	         $this->requete = 'INSERT INTO ';
	         $this->requete .= $table;
	         $this->requete .= ' (';
			 $this->requete .= implode(',', $colonnes);
			 $this->requete .= ') ';
	         $this->requete .= 'VALUES(';
	         $this->requete .= implode(',', $valeurs);
	         $this->requete .= ');';
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die(self::error_mc);
		   }
	   }
	   
	 public function sql_update($table,array $modifications,$where='') // Fonction permettant d'update des données
	   {
	     if ( $this->connect !== FALSE )
		   {
		     $this->nbre_modifications = sizeof($modifications);
	         $this->requete = 'UPDATE ';
	         $this->requete .= $table;
	         $this->requete .= ' SET ';
			 $i = 0;
			 foreach($modifications AS $cle => $valeur)
              {
			    $i++;
                $this->requete .= ( $i != $this->nbre_modifications ) ? $cle.' = "'.$valeur.'", ' : $cle.' = "'.$valeur.'" ';
              }
			 if ( $where )
			   {
	             $this->requete .= 'WHERE ';
	             $this->requete .= $where;
			   }
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die(self::error_mc);
		   }
	   }
	   
	 public function sql_delete($table,$where='') // Fonction permettant de supprimer des données
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'DELETE FROM ';
	         $this->requete .= $table;
			 if ( $where )
			   {
	             $this->requete .= ' WHERE ';
	             $this->requete .= $where;
			   }
	         $this->resultat = $this->sql_query($this->requete);
	         return TRUE;
		   }
		 else
		   {
		     die(self::error_mc);
		   }
	   }
	   
	 public function sql_count($table,$where='') // Fonction permettant de retourner le nombre d'occurences
	   {
	     if ( $this->connect !== FALSE )
		   {
	         $this->requete = 'SELECT COUNT(*) AS count FROM ';
	         $this->requete .= $table;
			 if ( $where )
			   {
	             $this->requete .= ' WHERE ';
	             $this->requete .= $where;
			   }
	         $this->fetch = $this->sql_query($this->requete);
			 $this->resultat = $this->sql_assoc($this->fetch); 
	         return $this->resultat['count'];
		   }
		 else
		   {
		     die(self::error_mc);
		   }	     
	   }
  }
?>


BaB'
 
Volcan
Avatar de Sékiltoyai
  • Age : 20 ans
  • Messages : 1033
  • Inscrit : 19 Septembre 2006
  Lien vers ce message 26 Décembre 2007, 12:15
C'est pas mal comme début.

Pour une constante, en effet on doit l'appeler de manière statique : self::constant, cette structure indique que l'on s'adresse à la classe courante (self) et non un objet, parce qu'une constante est évidemment relative à la classe et non à un objet précis.

Ensuite pour les die(), la plupart du temps, tu les as mis lorsque quelquechose ne marchait pas (une erreur de connexion, une erreur sql), c'est une vieille (mauvaise) habitude de programmation impérative, puisque lorsque tu crées ta classe, tu n'es pas sur qu'à chaque fois qu'il y a un problème de connexion, tu as envie de tuer le script. Ce genre d'erreurs se gèrent, il suffit juste de mettre $connect à FALSE pour indiquer que la connexion ne s'est pas faite correctement (ici tu ne l'exploites pas beaucoup) ou comme moi d'utiliser des exceptions en cas d'erreur.
Lors de la requète, c'est la même chose, si tu as une erreur SQL, c'est une erreur que tu ne peux pas gérer aussi facilement avec un die(). Par exemple, en production, tu vas afficher l'erreur SQL au visiteur qui croira que le monde s'est écroulé devant lui ? Il faut être plus subtil, l'internaute n'a pas à savoir que "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax", il a juste à savoir qu'il y a un problème et que l'équipe s'excuse des désagréments causés et fait son maximum pour remettre les choses en marche. Et dans ce cas, tu enregistres l'erreur dans un fichier pour pouvoir savoir ce qui s'est passé même si tu n'étais pas là quand ca s'est passé (et je conseille la même chose pour les erreurs, c'est à dire utiliser un gestionnaire d'erreur (en utilisant trigger_error) et enregistrer les erreurs dans un fichier…).


http://www.phpfrance.com : Support francophone PHP et Web.
http://sekil.labrute.fr/
 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 12:27
Merci pour toutes tes remarques, je vais chercher pour le trigger_error et la mauvaise gestion de mes erreurs ..

Par contre je ne comprends pas ce que tu veux dire par "exceptions en cas d'erreur".

Merci à toi ;-)


BaB'
 
Equipe graphique
Avatar de PhenX
  • Age : 23 ans
  • Messages : 463
  • Inscrit : 31 Octobre 2007
  Lien vers ce message 26 Décembre 2007, 12:28
regarde "gestion des exceptions en PHP" ;)
c'est un concept objet aussi, et très interessant !!


 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 12:45
J'ai trouvé cette explication-ci : http://www.siteduzero.com/tuto...es-erreurs.html

Mais ce n'est pas terrible il parait.. Ca n'utilise pas les exceptions? Or j'utilise PHP5 et il faudrait que j'utilise toutes ses possibilités ..

Je n'ai en tout cas rien trouvé de clair sur les exceptions :S

N'auriez vous pas un bon tuto bien clair? =\ Parce que les exemples avec les niveau d'essence dans les voitures (50% des tutos sur la POO c'est ca =D) ca m'aide pas =P


BaB'
 
Equipe graphique
Avatar de PhenX
  • Age : 23 ans
  • Messages : 463
  • Inscrit : 31 Octobre 2007
  Lien vers ce message 26 Décembre 2007, 12:55
tu as regardé la ? http://classes.scriptsphp.org/...-les-exceptions


 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 12:56
Wow j'étais passé au-dessus sur Google =O

Vraiment désolé d't'avoir réembêté =P Jvais regarder ça et si j'ai un problème jreviens vous voir :D


BaB'
 
Equipe graphique
Avatar de PhenX
  • Age : 23 ans
  • Messages : 463
  • Inscrit : 31 Octobre 2007
  Lien vers ce message 26 Décembre 2007, 12:58
pas de probleme !


 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 13:22
Voilà, j'ai lu le tout et j'espère avoir compris =S..

Est-ce que quelqu'un pourrait me faire un exemple d'exception avec mon code pour voir si j'ai tout pigé?

Merci


BaB'
 
Equipe graphique
Avatar de PhenX
  • Age : 23 ans
  • Messages : 463
  • Inscrit : 31 Octobre 2007
Message édité 1 fois, dernière édition par PhenX, 26 Décembre 2007, 13:33     Lien vers ce message 26 Décembre 2007, 13:31
je ferais ca sur une de tes classes méthodes si tu veux


 
Feu follet
Avatar de Babacooll
  • Age : 18 ans
  • Messages : 148
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 26 Décembre 2007, 13:39
Un grand merci à toi, je veux bien oui :P


BaB'
 
Répondre


.