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) :
[b:2471b2bb46]Mysql :[/b:2471b2bb46] Comme expliquer plus, permet de construire et d'exécuté des requêtes.
Formulaire : Outil de création de formulaire selon la demande.
[b:2471b2bb46]Secure :[/b:2471b2bb46] 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.
[b:2471b2bb46]Fichier :[/b:2471b2bb46] 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...
[b:2471b2bb46]Contenu[/b:2471b2bb46] : 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.
[b:2471b2bb46]Archiver[/b:2471b2bb46] : 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 :)
[code:1:2471b2bb46]<?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;
}
}
}
?>
[/code:1:2471b2bb46]
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 :)