IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Lire des define dans une boucle


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Lire des define dans une boucle
    Bonjour
    Est il possible de lire dans une boucle les valeurs d'un fichier contenant que des define pour faire un traitement dessus?

    Je souhaite récupérer le nom de la constante et la valeur.
    Merci
    Cordialement

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    C'est bizarre un peu comme question, car si juste au dessus on a créer des constantes avec des define(), c'est que leurs noms et valeurs sont connues, non ?
    Pourquoi vouloir boucler ?

    Ceci dit, tu peux utiliser une lecture du fichier (fopen, fgets), ligne par ligne et récupérer/extraire tour à tour leur nom/valeur, voir modifier les contenu du fichier.

    Il y a get_defined_constants(), mais ça retourne toutes les constantes dans un tableau, mais alors toutes.

    Il y tout de même la fonction constant('NOM_DE_LA_CONSTANTE') qui retourne sa valeur, mais faut connaitre son nom.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour
    Oui je sais la demande est un peu particulière.
    Par contre, vous avez devancer ma question d'après, a savoir, peut ont les modifier après.
    Sauf erreur de ma part la fonction get_defined_constants ne permet pas de modifier la valeur, la constante je la garde tel qu'elle est.

    Comment modifier la valeur de la constante, avons nous une commande pour le faire?

    Cordialement
    Citation Envoyé par RunCodePhp Voir le message
    Salut

    C'est bizarre un peu comme question, car si juste au dessus on a créer des constantes avec des define(), c'est que leurs noms et valeurs sont connues, non ?
    Pourquoi vouloir boucler ?

    Ceci dit, tu peux utiliser une lecture du fichier (fopen, fgets), ligne par ligne et récupérer/extraire tour à tour leur nom/valeur, voir modifier les contenu du fichier.

    Il y a get_defined_constants(), mais ça retourne toutes les constantes dans un tableau, mais alors toutes.

    Il y tout de même la fonction constant('NOM_DE_LA_CONSTANTE') qui retourne sa valeur, mais faut connaitre son nom.

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par William210
    Par contre, vous avez devancer ma question d'après, a savoir, peut ont les modifier après.
    Sauf erreur de ma part la fonction get_defined_constants ne permet pas de modifier la valeur, la constante je la garde tel qu'elle est.

    Comment modifier la valeur de la constante, avons nous une commande pour le faire?
    Oui, le get_defined_constants() ne fait que retourner les couples nom/valeurs, impossible de les modifier ainsi.

    Ensuite, à partir du moment où le fichier des constantes (des define()) sera interprété par Php, il ne sera plus possible de modifier les constantes, car par définition une constante ne peut varier.

    Le seul moyen, c'est de traiter/modifier le fichier contenant ces define() comme tout autre fichier, de modifier dynamiquement le code php, ceci avant qu'il soit interprété.
    En gros, on récupère le contenu, on y modifie ce qui doit l'être, on re-génère le code php, les define(), on écrase le fichier au final par le nouveau contenu.

    Enfin, si j'ai bien compris le but.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Re
    Avez vous reçu mon mp qui vous donne la raison de cette recherche?
    Je réfléchis et reviens vous voir.
    Cordialement

    Citation Envoyé par RunCodePhp Voir le message
    Oui, le get_defined_constants() ne fait que retourner les couples nom/valeurs, impossible de les modifier ainsi.

    Ensuite, à partir du moment où le fichier des constantes (des define()) sera interprété par Php, il ne sera plus possible de modifier les constantes, car par définition une constante ne peut varier.

    Le seul moyen, c'est de traiter/modifier le fichier contenant ces define() comme tout autre fichier, de modifier dynamiquement le code php, ceci avant qu'il soit interprété.
    En gros, on récupère le contenu, on y modifie ce qui doit l'être, on re-génère le code php, les define(), on écrase le fichier au final par le nouveau contenu.

    Enfin, si j'ai bien compris le but.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Bonjour,

    J'utilise ce code pour charger dynamiquement un ensemble de paramètre sous forme de constantes. Je lis d'abord un fichier et ensuite dans une table de base de données. Si un paramètre est défini dans les 2, c'est la valeur lue dans le fichier qui fait foi car elle est définie en premier lieu à partir du fichier.

    Ce système permet d'avoir des valeurs par défaut définies en base et et des valeurs spécialisables dans un fichier de conf propre à chaque serveur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    $path = pathinfo(__FILE__);
    $filename = $path['dirname'] . DIRECTORY_SEPARATOR . 'params.csv';
     
    /***********************************************/
    /*   Récupération des valeurs depuis fichier   */
    /***********************************************/
     
    if (is_file($filename))
    {
        $fp = fopen($filename,'r', true);    
        if ($fp)
        {
            while($data = fgetcsv($fp,0,';')) {
                define($data[0], $data[1]);
            }
            fclose($fp);
        }
    }
     
    require_once('config/si_database.php');
     
    /***********************************************/
    /*     Récupération des valeurs depuis BDD     */
    /***********************************************/
     
    $dbConfig = new SI_DB_CONFIG();
    $db = $dbConfig->paramConn();                   
    $query = 'SELECT NOM_PARAMETRE, VALEUR FROM params';
    $stmt = $db->query($query);
    while($param = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        //Si le paramètre n'est pas déjà défini en fichier...
        if (!defined($param['NOM_PARAMETRE']))
            define($param['NOM_PARAMETRE'], $param['VALEUR']);
    }
    $stmt->closeCursor();

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Avez vous reçu mon mp qui vous donne la raison de cette recherche?
    Oui, et je n'est vraiment pas vu de quoi le faire par MP, rien vu de si confidentiel que ça, t'aurais très bien pu te contenter d'ajouter cet info dans ton 1er post.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Oups!!!!


    Citation Envoyé par RunCodePhp Voir le message
    Oui, et je n'est vraiment pas vu de quoi le faire par MP, rien vu de si confidentiel que ça, t'aurais très bien pu te contenter d'ajouter cet info dans ton 1er post.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonsoir
    Merci pour le bout de code.
    Avec la fonction get_defined_constants je peux récupérer le couple constante/valeur mais pour aller au bout de mon traitement il faudrait pouvoir modifier la valeur?
    Vous ne connaissez pas une commande pour le faire?

    Sinon je vais être obligé de recrer complètement le fichier et alors je vais perdre les commentaires et autres annotations du fichier et cela me gène.


    Cordialement

    Citation Envoyé par pc.bertineau Voir le message
    Bonjour,

    J'utilise ce code pour charger dynamiquement un ensemble de paramètre sous forme de constantes. Je lis d'abord un fichier et ensuite dans une table de base de données. Si un paramètre est défini dans les 2, c'est la valeur lue dans le fichier qui fait foi car elle est définie en premier lieu à partir du fichier.

    Ce système permet d'avoir des valeurs par défaut définies en base et et des valeurs spécialisables dans un fichier de conf propre à chaque serveur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    $path = pathinfo(__FILE__);
    $filename = $path['dirname'] . DIRECTORY_SEPARATOR . 'params.csv';
     
    /***********************************************/
    /*   Récupération des valeurs depuis fichier   */
    /***********************************************/
     
    if (is_file($filename))
    {
        $fp = fopen($filename,'r', true);    
        if ($fp)
        {
            while($data = fgetcsv($fp,0,';')) {
                define($data[0], $data[1]);
            }
            fclose($fp);
        }
    }
     
    require_once('config/si_database.php');
     
    /***********************************************/
    /*     Récupération des valeurs depuis BDD     */
    /***********************************************/
     
    $dbConfig = new SI_DB_CONFIG();
    $db = $dbConfig->paramConn();                   
    $query = 'SELECT NOM_PARAMETRE, VALEUR FROM params';
    $stmt = $db->query($query);
    while($param = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        //Si le paramètre n'est pas déjà défini en fichier...
        if (!defined($param['NOM_PARAMETRE']))
            define($param['NOM_PARAMETRE'], $param['VALEUR']);
    }
    $stmt->closeCursor();

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Une fois définie, il n'est pas possible de modifier la valeur d'une constante. Pas la peine de chercher plus loin.

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    A moins d'avoir l'extension runkit à disposition ?

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    ahh! on en apprend tous les jours !

    En plus ça n'a pas l'air si exotique puisque Wamp 2.0 l'embarque pour Windows !
    Après en prod sous Linux il faut voir...

  13. #13
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    ahh! on en apprend tous les jours !
    +1
    Je ne connaissais pas du tout non plus, jamais entendu parlé.

    Sur Wamp2.0, j'ai essayé ... ça marche pô
    J'ai fouillé un peu (vite fait, faut dire), j'ai rien de PECL dans les parage.
    Elle serait installée où cette bibliothèque ?

    Idem sur un Xubuntu + Xampp.
    Impossible de lancer un runkit_constant_redefine().


    A voir les fonctions, bluffant ce runkit tout de même.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sinon je vais être obligé de recrer complètement le fichier et alors je vais perdre les commentaires et autres annotations du fichier et cela me gène.
    Pas forcement.
    Faudrait ouvrir le fichier, le parser ligne par ligne, stocker les lignes (le contenu) dans une variable.
    Lorsqu'on rencontre une ligne ou il y un code contenant la chaine -> define, et bien faut extraire son nom pour savoir s'il faut ou non le modifier.
    Si c'est le cas, alors faut supprimer sa valeur et la remplacer par la nouvelle.
    Il n'y a pas à toucher aux commentaires, faut les conserver.
    Au bout, la variable contiendra l'intégralité du fichier, et des nouvelles valeurs des constantes, et on "écrase" le fichier avec les données de cette variable.

    Bon, faut espérer que le fichier soit un minimum structuré pour faciliter la recherche des define().
    Puis il faut aussi que cette routine (une réécriture en somme) soit faite avant d'inclure le fichier, sinon c'est le serpent qui se mord la queue.


    A coté de ça, si cette bibliothèque PECL runkit est installée, alors là faut pas chercher plus loin. This is THE solution à mon avis.

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Erf, avec PHP 5.3.1 et en compilant la version svn de runkit en dynamique ça crashe sur une constante - mais pas sur une redéfinition de fonction.

    Mais il faut l'installer (ou plutôt la compiler) pour jouer avec Donc, en "mutualisé", peu de chance qu'elle soit disponible.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonsoir
    Oui oui cela devrait marcher
    Maintenant faut que j'aille le coder
    Bonne soirée à tous

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/02/2008, 00h24
  2. [MySQL] récupérer les dimensions des images dans une boucle while
    Par Navyel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/08/2007, 11h09
  3. [FPDF] tracer des lignes dans une boucle
    Par marielaure2805 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/06/2007, 14h17
  4. Afectation des variables dans une boucle
    Par Yoni Lebene dans le forum Delphi
    Réponses: 3
    Dernier message: 05/01/2007, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo