class

Eléphant du PHP | 110 Messages

03 mai 2008, 16:01

bonjours
je viens de coder une class qui me serre a renvoyer le contenu d'une BD mysql en fichier xml, elle fonctionne, mais comme mon experience en POO est récente j'aimerais savoir si elle est codé de manière propre , et la j'ai des doutes :wink:

je vous la joints; elle est bien entendu ,pour ceux qui voudrais l'utiliser ou l'améliorer entièrement disponible.

merci par avance pour vos conseils qui sont tjrs forts enrichissants , et merci a tous les dev qui donne de leur tps et de leur expérience.
<?php
/* class recuperation BD mysql en format XML
*cette classe recupere les informations sur une BD mysql et les retourne en XML dans l
*'entete httpp
* le nom de la base est utilisé pour la racine du doc xml, le nom de la	table 
*est utilisé pour les parent du doc xml

---- argument du constructeur  ------

$dbhost: nom du serveur 
$dbusername: nom de l'utilisateur 
$dbpass: pass utilisateur 
$dbname: nom bas de données utilisé pour la racine du doc xml
$table: nom de la table utilisé pour les parent du doc xml
$requete: requete adressée a la  base 

*/
class sql_xml{
	
	
public function __construct($dbhost,$dbusername,$dbpass,$dbname,$table,$requete)
{
		
		        $connexion = mysql_connect($dbhost, $dbusername, $dbpass);
		
        if (!$connexion) {  die('There was a problem with the database, please try back later db.php'); }
		else{
        $selection_BD=mysql_select_db($dbname, $connexion);
				if( $selection_BD){
//echo "selection de la base OK<br>";
		
					// selectionne les champs de la table {$table} 
					$RST=mysql_query("SELECT * FROM {$table}");
					
//echo mysql_num_fields($RST);
					
					// initialise une var $TT resultat du nombre de champs 
					$TT=(mysql_num_fields($RST)-1);
					
					// initialise un tableau $tab  charge ce tableau avec les noms de champs
					$tab=array();
					// boucle de chargement 
					for ($i=0;$i<=$TT;$i++){
					//initialise une var $nom_champ qui recupere les nom de champs
					$test[$i]=mysql_field_name($RST,$i);
					
					
//echo $test[$i];
	
											}// fin for 
					
					
											
					// inialisation de l'entete pour qu'il recoive les donnée XML
					
						header('Content-type: text/xml');
						header('Pragma: public');        
						header('Cache-control: private');
						header('Expires: -1');
						// initialisation de la var $xml qui vas recevoir les données xml
						$xml="<?xml version=\"1.0\" encoding=\"utf-8\"?> \n<$dbname>\n";
						// requete
						$Requete=mysql_query($requete);
						// boucle qui ecrit les données ds la var $xml
						while($resultat=mysql_fetch_array($Requete,MYSQL_ASSOC)){
			 
							$xml.="<$table>\n";
							
							foreach($test as $key => $value)
							{
							$xml.="<$value>{$resultat[$value]}</$value>\n";
							}// foreach
							
							$xml.="</$table>\n";
						
						}//fin while
						
						$xml.="</$dbname>";
			
						}// fin if selection base
						// renvois l'ensemble des données formater en XML
						echo $xml;
						}// fin else connexion  
					



}// fin constructeur 
}// fin class

//-------------- TRAITEMENT-----------------------------------------//
$requete="SELECT * FROM employes";
$test=new sql_xml("localhost","root","","bruno2","employes",$requete);

?>

Mammouth du PHP | 1668 Messages

03 mai 2008, 16:15

J'éviterais les die() si j'étais toi, et si tu as plusieurs requêtes à faire il me semble que cette manière de procédés n'est pas bonne...

N'oublie pas de fermer ta connexion à la fin :roll:
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 19672 Messages

03 mai 2008, 16:27

Quelques suggestions :
-1- aère et indente un peu ton code de façon cohérente, ça facilitera la lecture.
-2- Pour les commentaires, je suggère la syntaxe PHPDoc

Avant le point suivant, voici ce que ça donneraient pour ces deux-là :
<?php
/**
 * Classe recuperation BD mysql en format XML.
 * 
 * Cette classe recupere les informations sur une BD mysql et les retourne en 
 * XML dans l'entete http
 * Le nom de la base est utilisé pour la racine du doc xml, le nom de la    table
 * est utilisé pour les parent du doc xml
 */
class sql_xml
{
    /**
     * Constructeur.
     *
     * @param String $dbhost      nom du serveur
     * @param String $dbusername  nom de l'utilisateur
     * @param String $dbpass      pass utilisateur
     * @param String $dbname      nom base de données utilisé pour la racine du doc xml
     * @param String $table       nom de la table utilisé pour les parent du doc xml
     * @param String $requete     requete adressée a la  base
     */
    public function __construct($dbhost,$dbusername,$dbpass,$dbname,$table,$requete)
    {

        $connexion = mysql_connect($dbhost, $dbusername, $dbpass);

        if (!$connexion)
        {
            die('There was a problem with the database, please try back later db.php');
        }
        else
        {
            $selection_BD = mysql_select_db($dbname, $connexion);
            if( $selection_BD)
            {
                //echo "selection de la base OK<br>";

                // selectionne les champs de la table {$table}
                $RST = mysql_query("SELECT * FROM ". $table);

                //echo mysql_num_fields($RST);

                // initialise une var $TT resultat du nombre de champs
                $TT = (mysql_num_fields($RST)-1);

                // initialise un tableau $tab  charge ce tableau avec les noms de champs
                $test = array();
                // boucle de chargement
                for ($i = 0; $i <= $TT; $i++)
                {
                    //initialise une var $nom_champ qui recupere les nom de champs
                    $test[$i] = mysql_field_name($RST,$i);

                    //echo $test[$i];
                }// fin for

                // inialisation de l'entete pour qu'il recoive les donnée XML

                header('Content-type: text/xml');
                header('Pragma: public');
                header('Cache-control: private');
                header('Expires: -1');
                // initialisation de la var $xml qui vas recevoir les données xml
                $xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?> \n<". $dbname .">\n";
                // requete
                $Requete = mysql_query($requete);
                // boucle qui ecrit les données ds la var $xml
                while(false != ($resultat = mysql_fetch_array($Requete, MYSQL_ASSOC)))
                {
                    $xml .= "<". $table .">\n";

                    foreach($test as $key => $value)
                    {
                        $xml.="<". $value .">". $resultat[$value] ."</". $value .">\n";
                    }// foreach

                    $xml .= "</". $table .">\n";
                }//fin while

                $xml.="</". $dbname .">";
            }// fin if selection base
            // renvois l'ensemble des données formater en XML
            echo $xml;
        }// fin else connexion
    }// fin constructeur
}// fin class

//-------------- TRAITEMENT-----------------------------------------//
$requete="SELECT * FROM employes";
$test = new sql_xml("localhost","root","","bruno2","employes",$requete);
?>
-3- là, c'est plus profond comme problème : ta classe est à usage unique. Tu pourrais avantageusement dissocier certains éléments dans des méthodes spécifiques. L'intérêt de l'objet, c'est de pouvoir en manipuler certaines propriétés pour obtenir des variantes dans le résultat.

Ainsi,tu pourrais juste avoir la connexion à la base dans ton constructeur, mais tu pourrais définir la table et la requête dans une autre méthode et la création xml dans une troisième. De cette manière, sans supprimer ton objet, tu pourrais obtenir le même résultat sur une autre table avec une autre requête en envoyant une autre table et une autre requête.

Enfin sur le code lui-même : tu envoies en paramètre le nom de la table ET la requête : j'aurais plutôt envoyé la table d'une part, et une liste de colonnes sous forme de tableau d'autre part, ça m'aurait semblé moins redondant. :-k

Je te laisse mijoter un peu tout ça, tu es sur une voie intéressante :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

03 mai 2008, 16:28

N'oublie pas de fermer ta connexion à la fin :roll:
Pas obligatoire dans ce cas, c'est implicite en PHP avec MySQL.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1668 Messages

03 mai 2008, 16:33

1. J'aimerais que tu arrête de me pourchasser
2. Moi on m'a apprit à fermer la connexion, donc je ferme toujours ma connexion, même si c'est implicite...

Chacun ses habitudes :roll:
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 mai 2008, 16:55

-3- là, c'est plus profond comme problème : ta classe est à usage unique. Tu pourrais avantageusement dissocier certains éléments dans des méthodes spécifiques. L'intérêt de l'objet, c'est de pouvoir en manipuler certaines propriétés pour obtenir des variantes dans le résultat.
++++++

LE énorme avantage de la POO, c'est la réutilisabilité.
En découpant ton traitement en section simple et distincte (récupération des donnée en base, affiche), tu peux remplacer ou réutiliser ces méthodes pour d'autres traitements sans dupliquer de code
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 110 Messages

03 mai 2008, 16:56

merci pour vos conseils

pour ce qui est de fermer la connexion , je crois pouvoir vous mettre d'accord et la j'en serait très fier :wink:

que pensez vous de détruire le constrcuteur avec __destruct (j'ai lu ça quelque part mais je retrouve pas , c'est çà quand on veux faire le mariol :wink: )

pour ce qui est des autres conseils je suis d'accord sur le fait que je pourrais me servir d'autres méthodes pour récupérer les noms de champs et générer le fichier xml en laissant le constructeur pour la connexion
pour la notation j'adopterais la methode recommandée
merci A+
ps je vais essayer de retrouver le tut sur __destruct

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 mai 2008, 16:57

1. J'aimerais que tu arrête de me pourchasser
Il ne te pourchasse pas, il répond à une question et rebondi sur une réponse.
2. Moi on m'a apprit à fermer la connexion, donc je ferme toujours ma connexion, même si c'est implicite...
Donc, tu dois dire "il est mieux de fermer la connexion", pas "il faut fermer la connexion"
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 19672 Messages

03 mai 2008, 16:58

Le destructeur est automatique en PHP5. Ce que tu peux faire en revanche, c'est spécifier des actions particulières. Mais l'objet instancié sera détruit dès qu'il ne sera plus utilisé.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1668 Messages

03 mai 2008, 17:23

Donc, tu dois dire "il est mieux de fermer la connexion", pas "il faut fermer la connexion"
Donc, toi aussi tu me pourchasse (:p)
Bref,
Si tu relis mon post, je n'ais jamais dis : il faut fermer la connexion j'ai dis n'oublie pas de fermer la connexion
Voilà

Bon si PHP5 est SI automatique que ça, il peut se coder tout seul :roll:

PS : Je ne me fis jamais a personne et encore moins aux automatismes des langages, voilà tout...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 2291 Messages

03 mai 2008, 18:27

Et moi qui pensait être suceptible :wink:
Oui bon ok je suis déjà dehors
Modifié en dernier par dunbar le 03 mai 2008, 20:22, modifié 1 fois.

Mammouth du PHP | 19672 Messages

03 mai 2008, 19:08

Donc, toi aussi tu me pourchasse
Ben ouais, on s'y met à deux. À nous deux, on totalise plus de 26000 interventions dans ces forums, ce qui représente tout de même plus de 10% du total des messages postés sur PHPFrance. Avec tes 140 messages, je me demande si tu réalises que tu es loin d'avoir gagné en crédibilité ici...

Note bien un truc : on essaye pas de montrer à qui que ce soit qu'on est meilleurs ou qu'on sait tout : on a des connaissances acquises avec de l'expérience et du métier et on les fait partager à ceux qui sont ouverts à l'apprentissage et demandent un coup de main. Mais justement, ces connaissances, on aime pas beaucoup qu'elles soient remises en causes avec des affirmations gratuites par le premier venu. Tu as une objection à émettre sur un point ? Alors argumente ta réponse avec des points techniques vérifiables dans une doc par exemple, ajoute des liens. Si tu as des réponses à apporter, n'apporte pas du code tout prêt : ça n'aide pas vraiment celui qui le demande. Montre plutôt le chemin pour qu'il trouve de lui-même la solution. Il en sera d'autant plus satisfait et fier de sa réussite. Et surtout, n'attends absolument aucun retour. Tant mieux si tu en as un, mais ce ne pourra être qu'un bonus. Et puis ce que tu apportes maintenant, c'est le retour de ce que tu as reçu lorsque toi-même apprenais.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 mai 2008, 20:25

Donc, toi aussi tu me pourchasse
Ben ouais, on s'y met à deux. À nous deux, on totalise plus de 26000 interventions dans ces forums, ce qui représente tout de même plus de 10% du total des messages postés sur PHPFrance. Avec tes 140 messages, je me demande si tu réalises que tu es loin d'avoir gagné en crédibilité ici...
Selon moi, cet argument n'est pas recevable.
On apporte des conseils, on essaye de résoudre des soucis, on utilise notre expérience pour cela.
Les membres qui viennent sur ce forum doivent pouvoir recevoir des conseils de tout le monde, du simple visiteur à l'administrateur.

Là où je suis bien d'accord avec toi, c'est que nous argumentons nos réponse, ou alors nous soulevons juste une suggestion.
Mais je ne me rappelle pas avoir imposé une de mes manières de faire.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
AB
ViPHP | 5818 Messages

05 mai 2008, 01:30

N'oublie pas de fermer ta connexion à la fin :roll:
Pas obligatoire dans ce cas, c'est implicite en PHP avec MySQL.
@katagoto,
Cette remarque de Cyrano peut se comprendre.
A un moment j'avais pris le parti de fermer ma connexion MySQL pour faire les choses "proprement". Mais dans certains scripts, ça m'a posé problème. Ayant ensuite lu pas mal de documentation sur le sujet, finalement je fais plutôt attention à libérer les ressources de chaque requête et je laisse php fermer la connexion automatiquement.

Disons que d'après mon expérience avec PHP/MySQL je ne pourrais pas donné comme conseil "systématique" de "ne pas oublier de fermer la connexion" Et je ne pourrai pas non plus conseiller systématiquement l'avis contraire. Mais ce que je peux dire c'est que la déconnexion automatique ne m'a encore jamais posé de problème jusqu'à présent :wink:

Eléphant du PHP | 353 Messages

05 mai 2008, 15:56

Je pense aussi qu'il est préférable de fermer la connexion mysql lorsqu'on n'en a plus besoin. Sur un petit site, cela ne changera pas grand chose mais sur un site à fort audience cela permettrra de soulager quelque peu le serveur de base de données et de ne pas atteindre trop souvent le nombre maximum de requêtes simultanées.