S'enregistrer | Rechercher | FAQ | Liste des Membres | Groupes d'utilisateurs | Connexion

  Nom d'utilisateur:    Mot de passe:       

  

Poster un nouveau sujet   Répondre au sujet Page 1 sur 1
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
MessagePosté le: Ven Mai 06, 2011 10:34 pm    Sujet du message: Projet de CMS personnel Répondre en citant

SPARADRAP
Projets


 
Inscrit le: 06 Mai 2011
Messages: 4



Salut !

Alors, comme promis dans ma présentation, je vais dans ce post vous partagez mon travail, pour qu'il soit entre autre confronté à des yeux averti.

L'idée de départ c'est de pouvoir réduire un maximum le chose que je dois taper et re-taper réguliÚrement, ce qui est vraiment trÚs lourd quand on vient de taper sa 50Úme requete SQL par exemple.

J'ai donc commencer par une classe qui me permettrait simplement d'avoir accĂšs facilement Ă  un outils qui me construise lui mĂȘme mes requĂȘtes selon mes directives.
J'ai pas mal découvert l'utilisation des tableau d'ailleurs (vraiment utile ! mangez en !)

En y rĂ©flĂ©chissant, je me suis dit que si il Ă©tait possible d'automatiser la construction de requĂȘtes SQL, il devrait ĂȘtre assez simple de crĂ©er un constructeur de formulaire aussi ! Et paf, me voilĂ  lancĂ© dans une autre classe appelĂ©e simplement "Formulaire".

Bref, j'en suis venu à la conclusion qu'avec du temps je pourrais construire un systÚme qui me permettent de géré pas mal de chose, alors je me suis fait une petite liste de d'outils à créer et en voici la liste (je mettrais le code au fur et à mesure de l'avancement du projet) :

Mysql : Comme expliquer plus, permet de construire et d'exĂ©cutĂ© des requĂȘtes.
Formulaire : Outil de création de formulaire selon la demande.
Secure : Outil qui permettra d'analyser et de protéger toutes les données venant de l'utilisateur ou de la base de données. Mais aussi quelques fonctions importante comme un captcha, fonction anti brute force, etc... C'est l'outil de sécurisation du systÚme.
Fichier : Outil qui permettra la gestion de tout types de fichier, mais également la connexion FTP, génération d'image aléatoire (trop envie d'étudier la création d'image en php !), etc...
Contenu : Alors cet outils lĂ , se sert de Mysql, Secure et Formulaire. Il s'arrange pour recevoir les donnĂ©es (via Formulaire ou Mysql), les protĂ©gĂ©es (via secure) et de les renvoyĂ©es, au module qui Ă  requit des donnĂ©es, rangĂ©es et prĂȘte Ă  l'affichage.
Archiver : Un outil que j'ai envie de crĂ©er, un truc simple, qui permet d'archiver automatiquement des donnĂ©es quand une table dĂ©passe un certains nombre d'entrĂ©e. Il permettra donc l'allĂ©gĂ© les tables et donc, d'optimiser les requĂȘtes SQL (en thĂ©orie).

Aller ! un peu de code, voici ma classe Mysql, le reste suivra avec le temps Smile


Code:
<?php

//----------------------------------------------------------------------\\
//                           \\
// Classe Mysql :                     \\
// Auteur : Sparadrap                     \\
//                           \\
// RĂŽle :                        \\
// Cette classe permet de gĂ©nĂ©rer des requĂȘtes SQL simplement et   \\
// directement de les traitĂ©es.                  \\
//                            \\
// Son rĂŽle est de transmettre ou de recevoir les donnĂ©es de la base   \\
// en les organisant directement selon la demande et le niveau de    \\
// l'utilisateur.                     \\
//                            \\
//----------------------------------------------------------------------\\
class Mysql
{
   //--------------------------------------------------------------\\
   //                        \\
   // Fonction d'execution :                \\
   // Lorsqu'on a crĂ©er notre requete sql, elle sera traitĂ©e ici   \\
   // dans cette fonction.                  \\
   //                        \\
   // Il y a plusieurs parametres Ă  la fonction :         \\
   //                        \\
   // $requete -> La requete qu'on vient de crĂ©er.         \\
   //                        \\
   // $opt -> le type de requete, si c'est un select on fera un    \\
   // query(), sinon on fait un exec(). Donc il suffit de prĂ©ciser \\
   // QUERY ou EXEC                  \\
   //                        \\
   //--------------------------------------------------------------\\

   private function mysql_execute($requete, $champ, $opt)
   {
      try
      {
         // DĂ©claration type d'un appel Ă  connexion en PDO
            $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
         $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
   
         // On vĂ©rifie le type d'action voulue :
         // Si c'est une requĂȘte pour rĂ©cupĂ©rĂ© des donnĂ©es
         if($opt == 'QUERY')
         {

            // DĂ©claration des tableaux, qui contiendront les donnĂ©es transmises par la base.
            $i = 0;
            $tableau = NULL;
            $tableau2 = NULL;
            $reponse = $bdd->query(''. $requete .'');

            // On met les donnĂ©es dans les tableaux.
            // PremiĂšre boucle while qui permet la crĂ©ation d'une premiĂšre ligne de donnĂ©es.
            while($donnees = $reponse->fetch())
            {
               // Seconde boucle qui reprend le nom des champs (via le tableau $champ transmis dans la fonction)
               // Elle crĂ©e les colonnes.
               foreach($champ as $cle => $element)
               {
                  // Et on tape les donnĂ©es dans les cases :)
                  $tableau[$cle] = $donnees[$cle];
               }
               $tableau2[$i] = $tableau;
               $i++;
            }
            
            return $tableau2;

         }
         // Si c'est une requĂȘte pour exĂ©cutĂ© un envoi, une Ă©dition ou une suppression de donnĂ©es
         if($opt == 'EXEC')
         {
                $bdd->exec(''. $requete .'');
            return TRUE;
         }
         // Sinon, erreur, soit le paramĂštre est faux ou absent.
         else
         {
            die('Erreur : pas de parametre !');
            return FALSE;
         }

   
      }
      catch(Exception $e)
      {
             die('Erreur : '.$e->getMessage());
         return FALSE;
      }
      // Commentaire sur cette fonction :
      // Je sais que je dois retravailler cette fonction dans la gestion des tableau.
   }

   //--------------------------------------------------------------\\
   //                        \\
   // Les paramĂštres des fonctions :            \\
   //                        \\
   // $table -> nom de la table sur laquelle on doit agir.      \\
   //                        \\
   // $champ -> tableau contenant le nom des champs ET leur valeurs\\
   // analysĂ© et sĂ©curisĂ© au prĂ©alable bien entendu :)      \\
   //                        \\
   // $opt -> contient les diffĂ©rentes conditions dont on aurait   \\
   // Ă©ventuellement besoin (WHERE, AND, etc...). Pour $opt les    \\
   // condition sql doivent ĂȘtre Ă©crite complĂštement.      \\
   //                        \\
   // $acces -> accrĂ©ditation de l'utilisateur, une vĂ©rification    \\
   // est faite, si $acces est diffĂ©rent de TRUE alors on empĂȘche   \\
   // la crĂ©ation de la requĂȘte et on affiche un message d'erreur. \\
   //                        \\
   //--------------------------------------------------------------\\

   public function mysql_envoi($table, $champ, $acces)
   {
      if($acces != TRUE)
      {
         echo '<center><strong>Vous n\'ĂȘtes pas autorisĂ© Ă  faire cette action.</strong></center><br />';
      }
      else
      {
         $a = NULL;
         $nbr_champ = NULL;
   
         // Calcul du nombre de champ
         foreach($champ as $nbr)
         {
            $nbr_champ++;
         }

         // PrĂ©paration des deux partie de la requete.
         // Premiere partie de la requete tous les champs qui doivent etre traitĂ©.
         $requete = 'INSERT INTO '.$table.' (';

         // Deuxieme partie de la requete, toutes les valeurs.
         $requete2 = ') VALUES(';
      
         // ConcatĂ©nation des donnĂ©es.
         foreach($champ as $cle => $element)
         {
            // D'abord la premiere partie de la requete.
            // On concatĂšne les noms des champs.
            $requete = $requete.$cle;
   
            if($a != ($nbr_champ - 1))
            {
               $requete = $requete.', ';
            }

            // Ensuite la deuxieme partie de la requete.
            // On concatĂšne les valeurs des champs.
            $requete2 = $requete2.'\''. $element .'\'';

            if($a != ($nbr_champ - 1))
            {
               $requete2 = $requete2.', ';
            }

            $a++;
         }
      
         // Pour finir on concatĂšne les deux partie de la requete et les options Ă©ventuelle.
         $requete = $requete.$requete2.')';

         Mysql::mysql_execute($requete, NULL, 'EXEC');
         return TRUE;
      }
      
   }

   public function mysql_recuperation($table, $champ, $opt, $acces)
   {
      if($acces != TRUE)
      {
         echo '<center><strong>Vous n\'ĂȘtes pas autorisĂ© Ă  faire cette action.</strong></center><br />';
      }
      else
      {
         $a = NULL;
         $nbr_champ = NULL;

         // Construction de la requete.
         // On veut rĂ©cupĂ©rĂ© des donnĂ©es, donc on opĂšre sur un SELECT.

         $requete = 'SELECT ';
      
         foreach($champ as $nbr)
         {
            $nbr_champ++;
         }
         // Boucle de concatĂ©nation des champ sur lesquels ont doit agir.
         foreach($champ as $cle => $element)
         {
            $requete = $requete.$cle;

            if($a != ($nbr_champ - 1))
            {
               $requete = $requete.', ';
            }

            $a++;
         }

         // On dĂ©fini la table sur laquelle agir.
         $requete = $requete.' FROM '.$table.' ';
      
         // ConcatĂ©nation des conditions.
         if($opt != NULL)
         {
            $requete = $requete.$opt;
         }
         $donnees = Mysql::mysql_execute($requete, $champ, 'QUERY');
         return $donnees;
      }
   }

   public function mysql_edition($table, $champ, $opt, $acces)
   {
      if($acces != TRUE)
      {
         echo '<center><strong>Vous n\'ĂȘtes pas autorisĂ© Ă  faire cette action.</strong></center><br />';
      }
      else
      {
         $a = NULL;
         $nbr_champ = NULL;

         $requete = 'UPDATE '.$table.' SET ';
      
         foreach($champ as $nbr)
         {
            $nbr_champ++;
         }

         foreach($champ as $cle => $element)
         {
            $requete = $requete.$cle.' = \''. $element .'\'';

            if($a != ($nbr_champ - 1))
            {
               $requete = $requete.', ';
            }

            $a++;
         }

         $requete = $requete.' '.$opt;
         Mysql::mysql_execute($requete, NULL, 'EXEC');
         return TRUE;
      }
   }

   public function mysql_suppression($table, $opt, $acces)
   {
      if($acces != TRUE)
      {
         echo '<center><strong>Vous n\'ĂȘtes pas autorisĂ© Ă  faire cette action.</strong></center><br />';
      }
      else
      {
         $requete = 'DELETE FROM '.$table.' '.$opt;
         Mysql::mysql_execute($requete, NULL, 'EXEC');
         return TRUE;
      }
   }
}

?>


Voilà, je pense vraiment pas que ce soit parfait. Par exemple j'aurais pu fusionné les fonctions et analysé simplement la demande (je veux une requete SELECT ou une UPDATE) à passer en parametre de fonction, mais je voulais d'abord une bonne lecture de chaque type de requete.

Si vous avez des suggestions, des améliorations, ou autre, n'hésitez surtout pas !

Bien Ă  vous,

Sparadrap Smile
Voir le profil de l'utilisateur Envoyer un message privés
MessagePosté le: Sam Mai 07, 2011 9:17 am    Sujet du message: Répondre en citant

TorTukiTu
Site Admin


 
Inscrit le: 07 Fév 2008
Messages: 1960
Localisation: Devant son pc durant la redaction de ce message



En gros, tu découvres la conception quoi...

Je te conseille de te renseigner sur les modĂšles de conception, MVC par exemple, les designs patterns et l'UML.

Pour commenter ton code, va plutot voir du cÎté de Doxygen ou JavaDoc.

Tortue 974.
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur Compte AIM MSN Messenger Numéro ICQ
MessagePosté le: Sam Mai 07, 2011 11:17 am    Sujet du message: Répondre en citant

SPARADRAP
Projets


 
Inscrit le: 06 Mai 2011
Messages: 4



Heu.. effectivement, je découvre la conception, c'est en majeure partie pour ça que je viens sur ce forum, pour pouvoir avoir une certaine structure via des réflexions, des commentaires, des suggestions, conseils.
Je dois apprendre tout seul, j'ai pas la thune pour suivre des formations professionnelles, ni de diplÎme pour aller dans une haute école ou une université.

J'avais déjà effectivement reçu le conseil de m'intéresser au MVC et design pattern, je n'avais par contre pas connaissance de l'UML.

Je tente donc de faire mon ModÚle (via Contenu, qui offre un modÚle de gestion de contenu), le contrÎleur (Secure) et la vue, qui sera simplement les modules permettant des actions bien précises pour l'utilisateur.
Je ne sais pas si je fonctionne dans la bonne voie, je test, voir comment ça marche et si ça fonctionne, j'essaye d'améliorer.

Merci pour Doxygen, ça à l'air intéressant Smile (et faciliterait pas mal la tùche pour une future documentation).
Merci !

Sparadrap
Voir le profil de l'utilisateur Envoyer un message privés
MessagePosté le: Sam Mai 07, 2011 3:35 pm    Sujet du message: Répondre en citant

TorTukiTu
Site Admin


 
Inscrit le: 07 Fév 2008
Messages: 1960
Localisation: Devant son pc durant la redaction de ce message



Citation:
Je dois apprendre tout seul, j'ai pas la thune pour suivre des formations professionnelles, ni de diplÎme pour aller dans une haute école ou une université.


Oula, sache que si tu n'as pas de diplome, aussi bon que tu sois, tu seras probablement payé au smic, (et avec de trÚs trÚs nombreuses heures sup non payées [Merci la Syntec], ce qui est une constante dans le domaine de l'informatique) pour ton travail. C'est comme ça que ça marche en France.

Qui plus est, faire du code tranquillement dans son coin est une chose, en faire son métier en est une autre. Tu as des grosses contraintes de temps et surtout tu devras avoir une rigueur qui ne s'invente pas.

Donc, sans vouloir te décourager, je te conseille d'oublier l'idée de te lancer professionellement là dedans sans faire de formation.

Tortue 974.
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur Compte AIM MSN Messenger Numéro ICQ
Poster un nouveau sujet   Répondre au sujet Page 1 sur 1

  


 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum



113974 Attacks blocked