Aide pour ameliorer un code

audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008 - 29 oct. 2006 à 20:37
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 30 oct. 2006 à 15:20
Bonsoir,
J'essaye en ce moment de faire un système EBS (un système qui "agit" comme un serveur MySQL).
J'aimerai avoir vos avis pour l'amélioré (au niveau du codage) car je ne suis pas un pro (je le serai peut etre jamais) mais je veux avoir un code propre.

Donc autant prendre maintenant les bonnes habitudes !

Voici le code (et profitez des couleurs parce que c'est entièrement fait à la main lol)
<hr size="2" width="100%" /><?php
define('BASE', 'txt');// La Constante BASE défini la base (MySQL ou txt).
// Si on utilise une base MySQL il faut définir le serveur, les identifiants et la base.
define('LOCALHOST', '');// Serveur.
define('ROOT', '');// Utilisateur.
define('PASSWORD', '');// Mot de passe.
define('BASE', '');// Base.
class ebs {
    var $error = FALSE;// Variable empêchant le script d'envoyer les requêtes si un problème de connection à eu lieu (bool)
    var $logfun =FALSE; // Variable indiquant si la fonction log est activé(bool) Par défaut => FALSE.    var $logfile 'EBSLOG.txt'; // Variable indiquant le chemin du fichier log (string) Par défaut> EBSLOG.txt.    var $root './'; // Variable indiquant le dossier contenant les tables en format txt (string) Par défaut> ./    var $nb_query 0;// Variable indiquant le nombre de query effectué par ce script (int) Par défaut> 0.
    var $rows = array();// Variable indiquant les champs et les expressions d'une table en cours de modification (array).
    var $newrows = array(); // Variable indiquant les champs a vérifier pour la table en cours de modification (array).
    //---Fonction ebs----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    function ebs($logfun,$logfile,$root) {
        // Si $logfun equivaut à TRUE et que $logfile correspond à un fichier dans lequel on peut écrire => La fonction enregistre les paramètres dans les variables de la Class.
        if ($logfun === TRUE) {
            if (!empty($logfile)) $this->logfile = $logfile;
            $this->logfun = $logfun;
        }
        // Si la constante BASE équivaut à MySQL => La fonction tente de se connecter au serveur, en retournant TRUE en cas de succès ou FALSE en cas d'échec.
        if (BASE === 'MySQL') {
            if (mysql_connect(LOCALHOST,ROOT,PASSWORD)) {
                if (mysql_select_db(BASE)) return TRUE;
                else {
                    if ($this->logfun === TRUE) $this->log(1,'La connection à la base "'.BASE.'" du serveur "'.LOCALHOST.'" a échoué.');
                    $this->error = TRUE;
                    return FALSE;
                }
            }
            else {
                if ($this->logfun === TRUE) $this->log(1,'La connection au serveur "'.LOCALHOST.'" a échoué.');
                $this->error = TRUE;
                return FALSE;
            }
        }
        // Si la constante BASE équivaut à txt => la fonction vérifie si le dossier $root existe, si oui elle l'enregistre dans $this->root puis retourne TRUE, sinon elle retourne FALSE.
        elseif (BASE === 'txt') {
            if (empty($root)) $root = './';
            elseif (!ereg('/$',$root)) $root .= '/';
            if (is_dir($root)) {
                $this->root = $root;
                return TRUE;
                clearstatcache();
            }
            else {
                $this->log(1,'Le dossier "'.$root.'" n\'existe pas.');
                $this->error = TRUE;
                return FALSE;
            }
        }
    }
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
   
    //---Fonction log-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    function log($action,$text) {
        if ($this->logfun === TRUE) {
            // Si $action equivaut à 1 => la fonction enregistre $text à la suite du fichier $this->logfile en retournant TRUE en cas de succès ou FALSE en cas d'échec.
            if ($action === 1) {                $text .'> Le '.date('d-m-Y').' à '.date('H:i')."\n";
                if ($fp = fopen($this->logfile,'a')) {
                    fwrite($fp,$text);
                    fclose($fp);
                }
            }
            // Si $action equivaut à 2 => la fonction vide le fichier $this->logfile en retournant TRUE en cas de succès ou FALSE en cas d'échec.
            elseif ($action === 2) {
                if ($fp = fopen($this->logfile,'w')) {
                    fclose($fp);
                    return TRUE;
                }
                else return FALSE;
            }
            // Si $action equivaut à 3 => la fonction retourne le fichier $this->logfile ou FALSE en cas d'échec.
            elseif ($action === 3) {
                $text = '';
                if ($fp = fopen($this->logfile,'r')) {
                    while(!feof($fp)) $text .= fgets($fp,4096);
                    fclose($fp);
                    return $text;
                }
                else return FALSE;
            }
        }
    }
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
   
    //--Fonction query--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    function query($query) {
        if ($this->error === FALSE) {
            // Si la constante BASE équivaut à MySQL => la fonction envoie la query au serveur en retournant TRUE en cas de succès ou FALSE en cas d'échec.
            if (BASE === 'MySQL') {
                $this->nb_query++;
                if (mysql_query($query)) return TRUE;
                else {
                    $this->log(1,'La requête "'.$query.'" a échoué.');
                    return FALSE;
                }
            }
            // Si la constante BASE équivaut à text => La fonction à l'aide de preg_match_all décompose la query pour en appeller la fonction correspondante. Elle retourne ce que renvoie la fonction appellée.
            elseif (BASE === 'txt') {
                preg_match_all('`([[:alpha:]]+)`sim',$query,$type);
                switch($type[0][0]) {
                    case 'CREATE': preg_match_all('`CREATE TABLE [\`]?([[:alnum:]]+)[\`]? \((.+?)\);`sim',$query,$values);
                                   preg_match_all('`[\`]?([[:alnum:]]+)[\`]? (([[:alnum:]]*[ \_(\)][[:alnum:]]*)*)`sim',$values[2][0],$temp);
                                   $name = $values[1][0];
                                   $i = 0;
                                   while(isset($temp[1][$i])) {
                                        $temp[2][$i] = str_replace('NOT NULL','NOTNULL',$temp[2][$i]);
                                        preg_match_all('`VARCHAR\(([[:digit:]]+)\)`sim',$temp[2][$i],$values);
                                        $temp[2][$i] = preg_replace('`VARCHAR\(([[:digit:]]+)\)`sim','VARCHAR',$temp[2][$i]);
                                        $temp[2][$i] = explode(' ',$temp[2][$i]);
                                        if (!empty($values[1][0])) $temp[2][$i][] = $values[1][0];
                                        $rows[$i] = array($temp[1][$i],$temp[2][$i]);
                                        $i++;
                                   }
                                   if ($this->ebs_create($name,$rows) === TRUE) return TRUE;
                                   else return FALSE;
                                   break;
                    case 'INSERT': preg_match_all('`INSERT INTO [\`]?([[:alnum:]]+)[\`]? VALUES\((.+?)\)`sim',$query,$values);
                                   $values[2][0] = explode(',',$values[2][0]);
                                   $values[2][0] = str_replace('\'','',$values[2][0]);
                                   $values[2][0] = str_replace('"','',$values[2][0]);
                                   if ($this->ebs_insert($values[1][0],$values[2][0]) === TRUE)return TRUE;
                                   else return FALSE;
                                   break;
                    case 'UPDATE': $query = str_replace('¤','',$query);
                                   $query .= '¤';
                                   preg_match_all('`UPDATE ([[:alnum:]]+) SET (.+?) WHERE (.+?)¤`sim',$query,$values);
                                   $values[2][0] = str_replace('\'','',$values[2][0]);
                                   $values[2][0] = str_replace('"','',$values[2][0]);
                                   $values[2][0] = explode(',',$values[2][0]);
                                   $values[3][0] = str_replace('\'','',$values[3][0]);
                                   $values[3][0] = str_replace('"','',$values[3][0]);
                                   $values[3][0] = explode(',',$values[3][0]);
                                   $i = 0;
                                   while(isset($values[2][0][$i])) {
                                        $values[2][0][$i] = explode('=',$values[2][0][$i]);
                                        $i++;
                                   }
                                   $i = 0;
                                   while(isset($values[3][0][$i])) {
                                        $values[3][0][$i] = explode('=',$values[3][0][$i]);
                                        $i++;
                                   }
                                   // Appel de la fonction ebs_update
                                   break;
                }
            }
        }
        // Si $this->error équivaut à TRUE => La fonction n'execute pas la query et retourne FALSE.
        else {
            $this->log(1,'La connection a échoué. Aucune query ne peut être envoyée.');
            return FALSE;
        }
    }
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
   
    //---Fonction ebs_create---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    function ebs_create($name,$rows) {
        $this->nb_query++; // La fonction ajoute 1 dans $this->nb_query.
        $auto = FALSE; // Variable indiquant si un champs auto-incrementer a déjà été indiqué.
        $error = FALSE; // Variable indiquant si une erreur a été détecter.
        $i =0;
        $temp = ''; // Variable contenant la future table.
        while (isset($rows[$i]) AND $error === FALSE) {
            $temp .= '¤';
            if (!empty($rows[$i][0])) {
                $temp .= $rows[$i][0];
                $j =0;
                while (isset($rows[$i][1][$j]) AND $error === FALSE) {
                    if ($rows[$i][1][$j] === 'AUTO_INCREMENT' AND $auto === TRUE) {
                        $this->log(1,'La table "'.$name.'" n\'a pu être crée (le champs "'.$rows[$i][0].'" ne peut être auto-incrémenté car il y a déjà un champs auto-incrémenté).');
                        $error = TRUE;
                        return FALSE;
                    }
                    $temp .= '#='.$rows[$i][1][$j];
                    $j++;
                }
            }
            else {
                $this->log(1,'La table "'.$name.'" n\'a pu être crée (Un des champs de la table n\'a pas de nom).');
                $error = TRUE;
                return FALSE;
            }
            $i++;
        }
        if ($error === FALSE) {
            if (is_file($this->root.$name.'.txt')) {
                $this->log(1,'La table "'.$name.'" n\'a pu être crée (Elle existe déjà).');
                return FALSE;
            }
            else {
                if ($fp = fopen($this->root.$name.'.txt','w')) {
                    fwrite($fp,$temp."\n");
                    fclose($fp);
                    return TRUE;
                }
                else {
                    $this->log(1,'La table "'.$name.'" n\'a pu être crée (Son fichier n\'a pu être crée. Veuillez vérifier vos CHMOD).');
                    return FALSE;
                }
            }
        }
    }
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//

    //---Fonction expression----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    function expression($i) {
        // Expression NOT NULL
        if (array_search('NOTNULL',$this->rows[$i+1]) AND empty($this->newsrows[$i])) return FALSE;
        // Expression NULL
        elseif (array_search('NULL',$this->rows[$i+1]) AND $this->newsrows[$i] !== NULL) return FALSE;
        // Expression MEDIUMINT + UNSIGNED
        if (array_search('MEDIUMINT',$this->rows[$i+1]) AND array_search('UNSIGNED',$this->rows[$i+1]))
            if ($this->newsrows[$i] >= 0AND $this->newsrows[$i] <= 16777215) return TRUE;
            else return FALSE;
        // Expression MEDIUMINT
        elseif (array_search('MEDIUMINT',$this->rows[$i+1]))
            if (is_numeric($this->newsrows[$i]) AND $this->newsrows[$i] >=-8388608AND $this->newsrows[$i] <=8388607) return TRUE;
            else return FALSE;
        // Expression MEDIUMBLOB ou MEDIUM TEXT
        elseif (array_search('MEDIUMBLOB',$this->rows[$i+1]) OR array_search('MEDIUMTEXT',$this->rows[$i+1]))
            if (strlen($this->newsrows[$i]) <= 16000000) {
                $this->newsrows[$i] = str_replace('¤','',$this->newsrows[$i]);
                return TRUE;
            }
            else return FALSE;
        // Expression BLOB ou TEXT
        elseif (array_search('BLOB',$this->rows[$i+1]) OR array_search('TEXT',$this->rows[$i+1]))
            if (strlen($this->newsrows[$i]) <= 65535) {
                $this->newsrows[$i] = str_replace('¤','',$this->newsrows[$i]);
                return TRUE;
            }
            else return FALSE;
        // Expression TINYBLOB ou TINYTEXT
        elseif (array_search('TINYBLOB',$this->rows[$i+1]) OR array_search('TINYTEXT',$this->rows[$i+1]))
            if (strlen($this->newsrows[$i]) <= 255) {
                $this->newsrows[$i] = str_replace('¤','',$this->newsrows[$i]);
                return TRUE;
            }
            else return FALSE;
        // Expression VARCHAR ou CHAR
        elseif (array_search('VARCHAR',$this->rows[$i+1]) OR array_search('CHAR',$this->rows[$i+1])) {
            $nb = count($this->rows[$i+1]); $nb--;
            if (strlen($this->newsrows[$i]) <= $this->rows[$i+1][$nb]) {
                $this->newsrows[$i] = str_replace('¤','',$this->newsrows[$i]);
                return TRUE;
            }
            else return FALSE;
        }
    }
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
   
    //---Fonction ebs_insert--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
    function ebs_insert($name,$newrows) {
        $this->nb_query++; // La fonction ajoute 1 à $this->nb_query.
        $this->newsrows = $newrows;// La fonction copie $newrows dans $this->newsrows (pour que les données soit accessibles et modifiables entre fonctions).
        if (is_file($this->root.$name.'.txt')) {
            $file = file($this->root.$name.'.txt'); // La fonction ouvre le fichier grâce à file() qui va retourner le fichier sous forme d'un array.
            $nb_rows = count($rows); $nb_rows--;// La fonction compte le nombre de champs de la table (pour vérifier sa validité).
            $nb_newchamps = count($newrows); // La fonction compte le nombre de champs à inserer.
            if ($nb_rows < 1 AND $nb_rows !== $nb_newchamps) {
                $this->rows = explode('¤',$file[0]); // La fonction sépare ¤ de $this->rows pour séparer les différents champs.
                $i = 1;
                while(isset($this->rows[$i])) {
                    $this->rows[$i] = explode('#=',$this->rows[$i]);// La fonction sépare #= de $this->rows pour séparer le nom du champ de son ou ses expressions
                    $i++;
                }
                $auto = count($file); // La fonction compte le nombre de ligne du fichier pour l'utiliser sur le champs Auto-incrementé si il existe.
                $error = FALSE; // Variable indiquant si une erreur a été détecter.
                $temp = '';
                $i =0; // Variable contenant le futur champ.
                while(isset($newrows[$i]) AND $error === FALSE) {
                    $temp .= '¤';
                    if (array_search('AUTO_INCREMENTE',$this->rows[$i+1]) !== FALSE) $this->newsrows[$i] = $auto;
                    // La fonction appelle la fonction expression qui vérifie si le champs à insérer correspond bien à ou aux expressions du champs.
                    // Si la fonction renvoie TRUE => la fonction enregistre dans $temp la valeur du nouveau champs
                    if ($this->expression($i) === TRUE) $temp .= $this->newsrows[$i];
                    else {
                        $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Une expression d\'un des champs n\'est pas respecter ou n\'est pas reconnu)');
                        $error = TRUE;
                        return FALSE;
                    }
                    $i++;
                }
                if ($error === FALSE) {
                    if ($fp = fopen($this->root.$name.'.txt','a')) {
                        fwrite($fp,$temp."\n");
                        fclose($fp);
                        return TRUE;
                    }
                    else {
                        $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Son fichier n\'a pu être modifié. Veuillez vérifier vos CHMOD).');
                        return FALSE;
                    }
                }
            }
            // Si le nombre de champs de la table n'est supérieur à 1 et qu'elle est pas égale au nombre de champs à inserer => La fonction renvoie FALSE.
            else {
                $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Le nombre de champs indiqué et différent du nombre de champs de la table).');
                return FALSE;
            }
        }
        // Si le fichier n'existe pas => La fonction retourne FALSE.
        else {
            $this->log(1,'L\'insertition à la table "'.$name.'" n\'a pu être effectué (Le fichier "'.$this->root.$name.'.txt" n\'existe pas).');
            return FALSE;
        }
    }
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//
}
?>

For every choice, a consequence (Fable)

5 réponses

syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
30 oct. 2006 à 09:34
Ke de code !!!

Tu peux intégrer des Array dans tes str_replace mais je peux po t'en dire plus..

Bon courage

S.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 oct. 2006 à 11:00
Hello,

en vrac :

Méthode ebs() :
return TRUE;
clearstatcache();
Tu fais un return, donc tu n'iras jamais sur clearstatcache ()...

dans la méthode expression() je doute que tes conditions fonctionnent, vu qu'il manque des accolades :
if ()
    if () //
    else //
le premier if () n'a pas d'accolade et compte pourtant plusieurs lignes de traitements.

Dans ebs_insert (), cette ligne :
$nb_rows = count($rows); $nb_rows--;
tu le sors d'où, ton tableau $rows...?

Si tu utilises des constantes pour la connexion à la DB...Ok, mais dans ce cas, tu devrais plutôt utiliser une méthode à laquelle tu passes ces constantes, pour effectuer la connexion.
Plutôt que de demander la définition de constantes et de les utiliser directement dans ta classe, sans même vérifier si elles sont bien définies.
Quant à la constante BASE par exemple, ce devrait plutôt être une propriété de ta classe (modifiable, qui plus est...).

Tien d'ailleurs, je vois mal comment ça peut marcher, tu définis 2 fois la constante BASE.
Il te faut une propriété de type (mysql, txt...), et une constante pour le nom de la base si on est en type mysql.

ereg() pour vérifier si tu as un / en fin de chaîne, c'est un peu utiliser un tank pour flinguer des taupes (j'ai lu cette expression ici pour la même remarque, et j'ai bien aimé ;-) ).
En plus, ereg () est lent...
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
30 oct. 2006 à 14:10
Ben dis donc.. Il faut ke je file mon code à ta sagacité..LOL !!

S.
0
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
30 oct. 2006 à 14:53
"c'est un peu utiliser un tank pour flinguer des taupes" exelente la citation, il faut récompenser son auteur lol (en plus tu as raison (en même temps cela change pas :-P ) je vais retirer cette partie après tout cela coûte rien à l'utilisateur de mettre un "/")
J'ai corrigé le problème "clearstatcache()" en le passant avant le "return TRUE" (tiens une question en passant, je crois avoir lu un commentaire de FhX sur une des tes sources qui disait que un constructeur ne devait rien returner, donc il faut que j'enleve mes "return" ?), j'ai rajouté les accolades dans la fonction expression, et bien vu j'ai completement oublié de décomposer les champs donc il faut déplacer "$this->rows <gras>explode('¤',$file[0]);" quelques lignes après et placer cette ligne avant " $nb_rows</gras> count($rows); $nb_rows--; " et remplacer "$nb_rows = count($rows); $nb_rows--;" par ceci "$nb_rows = count($this->rows); $nb_rows--;"

Pour les "str_replace" cela apporte-t-il quelque chose si on mets en argument search un tableau ?

Sinon je capte pas trop le passage avec les constantes (c'est les vacances il faut y aller plus doucement mdr)

For every choice, a consequence (Fable)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 oct. 2006 à 15:20
En effet, ton constructeur ne doit rien renvoyer. Normalement.
Pour le str_replace : ça économis des lignes de code inutiles, et c'est plus rapide (tu ne rappelles pas str_replace à la mano pour chaque remplacement).
0
Rejoignez-nous