Lecture ecriture dans un fichier de configuration , données

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 300 fois - Téléchargée 26 fois

Contenu du snippet

Je viens de faire ces 2 fonctions dans le but d'écrire et lire des données en dur.
Ce script peut être utilisé dans différentes situations (fichier de configuration multi format (.ini,.conf, etc..), de stockage d'informations durant une session ou même un script, ).
ce script utilise 2 fonctions get_infile et set_infile.
La première recherche et renvoie une valeur correspondant à une clé , elle prend en paramètres 2 paramètres obligatoires et 2 paramètres facultatifs.
Avec ces 2 paramètres optionnels on peut indiquer à la fonction dans quel format le fichier est construit (par défaut .ini mais sans notions de blocs).
La 2ème fonction prend elle 3 paramètres obligatoires (fichier, clé et valeur) et 2 paramètres optionnels (séparateur et caractère de commentaire :par défaut separateur='=' et commmentaire=';').

Source / Exemple :


<?php

function get_infile ($fileName , $key , $separator = '=' , $commentchar = ';' )
{
  $i=0;
  $buffer = array();
  if ( file_exists ($fileName) ) {
    $p = fopen ($fileName , 'r' ) ;
    if($p) {
      //On charge le fichier en mémoire
      while ( !feof ($p) ) {
        $buffer[$i] = fgets ($p) ;
        $i++;
      }
    fclose($p);
    }
    $bufferlength = count ( $buffer );
    for( $a=0 ; $a < $bufferlength ; $a++ ) {
      $var = explode( $separator  , $buffer[$a] );
      
      if ( count ($var) > 1 )
        if ( $var[0][0] != $commentchar )//On trouve une ligne commentée: on zappe
          if( $var[0] == $key ){
            $var = explode ( $commentchar , $var[1] ); //On trouve une ligne commentée àla fin : on traite
            $var[0] = rtrim ( $var[0] , "\x00..\x1F" );
            return $var[0];//c'est la bonne clé on retourne la valeur
          }
    }
  }
  return NULL;
}

function set_infile($fileName , $inikey , $inival , $separator = '=' , $commentchar = ';'  )
{
  $update = false ; 
  $var = array();
  if ( get_infile ( $fileName , $inikey , $separator , $commentchar ) )
    $update = true ;
  $i = 0;
  
  if ( !$update ) {
    if ( file_exists ($fileName) ) 
      $p = fopen ( $fileName , 'a' );
    else $p = fopen ( $fileName , 'w' ); //le fichier est créé
    if ($p) {
      fwrite ( $p , $inikey.$separator.$inival."\r\n" );
      fclose ( $p );
    }
  }
  else {
    if ( file_exists ($fileName) ) {
      $p = fopen ( $fileName , 'r' ) ;
      if($p) {
        while ( !feof ( $p ) ) {
          $buffer[$i] = fgets ( $p );
          $buffer[$i] = rtrim ( $buffer[$i] , "\x00..\x1F" );
          $var = explode ( $separator , $buffer[$i] ) ;
          
          if ( count ( $var ) > 1 )
            if ( $var[0][0] != $commentchar )
              if ( $var[0] == $inikey ) {
                if ( isset ( $var[1] ) )
                  $var = explode ( $commentchar ,$var[1]);
                if ( isset ( $var[1] ) ){
                  if ( $var[1] != '' ){
                    $var[1]=ltrim($var[1],"\x00");
                    $buffer[$i] = $inikey.$separator.$inival."\t".$commentchar.$var[1];
                  }
                }
                else
                    $buffer[$i] = $inikey.$separator.$inival;
              }
          $i++;
        }
        fclose( $p );
      }
      $p = fopen ( $fileName , 'w' ) ;
      $i = 0;
      if ($p) {
        $bufferlength = count ( $buffer );
        while ( $i < $bufferlength ) {
          if( $buffer[$i] != '' )
            fwrite ( $p , $buffer[$i]."\r\n" );
          $i++;
        }
        
        fclose ($p);
      }
    }
  }
}

//$inifile = 'test.ini';
/*set_infile ( $inifile , 'daysinmonth', '30' ) ;//crée
set_infile ( $inifile , 'daysinmonth', '31' ) ;//modifie
set_infile ( $inifile , ';daysinweek', '10'   );
set_infile ( $inifile , 'daysinweek', '7'   ) ;//crée
set_infile ( $inifile , 'jourferie', 'dimanche' ) ;//crée
set_infile ( $inifile , ';jourferie', 'lundi' );

echo get_infile ( $inifile , 'jourferie');//affiche dimanche
echo get_infile ( $inifile , 'daysinmonth');//31*/

?>

Conclusion :


la fonction get_infile ne fait que lire le fichier et renvoie la valeur correspondante à la clé trouvée dans le fichier.
La fonction set_infile recherche si la clé entrée en paramètre existe, dans ce cas elle la met à jour sinon elle l'ajoute.
Les commentaires peuvent être insérées dans ce fichier en manuel ou par le biais de cette focntion :
voir l' exemple au bas du code en commentaires.
Ces 2 fonctions ont étés testées et fonctionnent parfaitement

A voir également

Ajouter un commentaire

Commentaires

octopus999
Messages postés
1
Date d'inscription
samedi 16 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
-
Merci beaucoup Guill76 pour ce code :)
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
Dernière réponse à tes remarques:

donc j'ai essayé de modifié les 40000 if pour n'en faire plus qu'un.
Résultat je me retrouve avec les bugs auxquels j'avais pensés lors de l'écriture des fonctions.Donc tous ces contrôles sont nécéssaires (helas peu esthétiques) .
Explications:
if (count($var)>1) -->assure que la ligne est de la forme 'clé=valeur' -->le cas ou la ligne serait 'cle' (sans =valeur) est géré par ce contôle. (j'ai prévu dans mes RG qu'on pouvait insérer des lignes manuellement dans le fichier sans que celui -ci ne soit vérolé ou provoque des bugs).
Les autres contrôles sont aussi nécessaires .
Mais tes remarques m'ont fait pensé que je n'ai pas géré le cas ou le fichier serait en lecture seule. Certes il n 'y aurait pas d'erreur fatale mais juste un warning .
Donc A voir avec is_writeable .
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
Au fait pour le if (file_exists) , je suis obligé de le tourner comme ça (en double) car il y aurait un traitement qui passerait à la trappe.
Oups une petite rectif dans mon dernier post :
'dans le cas ou $p=false' et pas '$p=-1' , pardon...
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
Au fait pour le $p=fopen c'est le même principe que pour la fonction get_infile.
si tu fais if ($p)
dans le cas ou $p=-1 ça passe pas donc c'est bon ,pas de fatal error .
Pour le reste je vais revoir pour les 4 tests peu élégants.
Merci
guill76
Messages postés
193
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
3 juin 2016
-
Ben voilà , j'ai lu avec intérêt tes remarques,
mais je sais pas si tu sais que dans le cas ou la fonction (get_infile) retournerait NULL la condition serait fausse .Donc ça marche, cette syntaxe est correcte ( comme en C ou C++ ).Alors pourquoi ne pas l'utiliser .Un prof m'avait enseigné que c'est complétement rébarbatif de faire if($toto!=NULL) alors que if($toto)revient au même.(Mais bon tu as peut être raison dans l'absolu avec PHP je dis pas).
Sinon pour le reste, merci, j'avais pas tilté que je faisais le même test(file_exists) pour les 2 conditions.
Rq :
Pour is_empty je pense que c'est une alternative à (=='') donc ça à mon avis ça revient au même non ?.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.