begin process at 2012 05 27 21:57:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > LECTURE ECRITURE DANS UN FICHIER DE CONFIGURATION , DONNÉES

LECTURE ECRITURE DANS UN FICHIER DE CONFIGURATION , DONNÉES


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :configuration, ini, stockage, lecture, écriture Niveau :Débutant Date de création :27/11/2005 Vu :7 853

Auteur : guill76

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

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

  • <?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*/
  • ?>
<?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


 Sources du même auteur

CLASSE FEUILLE DE TEMPS PHP5
PHP 5 CLASSES DE REDIRECTION DES EXCEPTIONS DANS UN SYSTÈME...
[PHP5]AUTHENTICATION MANAGER
Source avec Zip Source avec une capture PHP 5 CLASSE CALENDRIER QUI RENVOIE LA DATE CLIQUÉE DANS 1 É...
Source avec Zip Source avec une capture PHP5 CLASSE ARBRE INVERSÉ (HUFFMAN) COMPRESSION DECOMPRESSIO...

 Sources de la même categorie

SUPPRESSION AUTOMATIQUE DES FICHIERS RAW ORPHELINS APRÈS UN ... par malokaff
UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
FONCTION RECURSIVE DE DOSSIERS par tefa24600
Source avec Zip CONVERSION DES UNITÉS INFORMATIQUE (O, KIO, MIO, GIO, TIO...... par genetApt151

 Sources en rapport avec celle ci

COURTE ET SIMPLE FONCTION RÉCURSIVE POUR LECTURE DE RÉPERTOI... par mbdx
Source avec Zip Source avec une capture CLASSE LECTUREENLIGNE - POUR LES SITES DE SCANTRAD OU ... par tiger222
Source avec Zip CLASSE COMPLÈTE DE GESTION DES FICHIERS DE CONFIGURATION INI... par LocalStone
Source avec Zip GÉRER DES FICHIERS DE CONFIGURATION INI [POO] par grandvizir
GESTION D'UN FICHIER DE CONFIGURATION par pablor44

Commentaires et avis

Commentaire de stailer le 28/11/2005 03:55:32

J'ai pas lu le code et j'ai pas testé, mais je comprends pas la logique de ton exemple.
Ceci :
# set_infile ( $inifile , 'daysinmonth', '30' ) ;//crée
# set_infile ( $inifile , 'daysinmonth', '31' ) ;//modifie

retourne 31 si j'ai bien compris... Mais ceci :
# set_infile ( $inifile , 'jourferie', 'dimanche' ) ;//crée
# set_infile ( $inifile , ';jourferie', 'lundi' );

tu dis que ça retourne "dimanche". Mais en fait ça devrait retourner "lundi" non ?

Commentaire de stailer le 28/11/2005 03:56:48

non rien, j'avais pas vu le ";"

Commentaire de guill76 le 28/11/2005 08:12:47

Suggestion aux développeurs de phpcs pour améliorer l'affichage des codes:
J'ai collé un script qui était à l'origine bien indenté, mais l'entete de la fonction set_infile étant sur 2 lignes , l'indentation se retrouve complètement supprimée.

Commentaire de FhX le 28/11/2005 13:25:42

C'est pas nouveau, tu n'apprends rien à personne ;)

Commentaire de malalam le 29/11/2005 08:41:16 administrateur CS

Hello,

suggestion à Guill76 : envoie donc ce message dans la boîte des admins, les développeurs auront plus de chances devoir ta réclamation.
Parce que bon, faut pas croire que les développeurs (ou les admins), regardent tous les commentaires de tous les codes en détail...(ça ferait beaucoup...!)

Commentaire de FhX le 01/12/2005 14:04:47

Enfin :)

"if ( get_infile ( $fileName , $inikey , $separator , $commentchar ) )"

Comment peut tu prévoir le fait que get_infile() va te sortir un TRUE alors que les seuls RETURN possibles dans ta fonction sont : $var[0] (string), ou NULL.   ?

A la limite, tu tournes ton if autrement :
$update = ( get_infile($fileName...) === NULL ) ? false : true;
ou :
$update = ( get_infile($fileName...) !== NULL ) ? true : false;

La c'est mieux, parce que tu sais ce à quoi tu va t'attendre.
Tu a créer une fonction qui renvoit tout et n'importe quoi, de ce fait, tu ne sais même plus comment tester sa condition.

Je continu :
"#  if ( file_exists ($fileName) )
# $p = fopen ( $fileName , 'a' );
# else $p = fopen ( $fileName , 'w' ); //le fichier est créé
# if ($p) {"
Beurk ... Tu fais : $p = fopen... <== si le fichier ne se charge pas, y'aura un beau fatal error, donc ta condition ne sert pas à grand chose la.

"#  else {
# if ( file_exists ($fileName) ) {
# $p = fopen ( $fileName , 'r' ) ;"
Beurk², ta methode de test est mauvaise car tu réécris ton code pour rien. Tu fait : if ( !$update ) { file_exist()... } else { file_exist() ... }
Pourquoi taper du code en double ?

==>
<?php
if ( file_exist() ... ) {
    if ( !$update ) {
    //
    } else {
    //
    }
}
?>

Ensuite :
"#  if ( count ( $var ) > 1 )
# if ( $var[0][0] != $commentchar )
# if ( $var[0] == $inikey ) {
# if ( isset ( $var[1] ) )"
40000 if alors qu'un seul aurait pu suffir ? C'est que ca deviendrait presque illisible :p

Et pour finir :
"#  if ( $var[1] != '' ){"
if ( !empty($var[1]) ) ... !

Commentaire de guill76 le 03/12/2005 14:36:23

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 ?.

Commentaire de guill76 le 03/12/2005 15:48:55

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

Commentaire de guill76 le 04/12/2005 18:06:06

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...

Commentaire de guill76 le 04/12/2005 23:01:13

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 .

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

configuration php.ini pour mail [ par dam_37 ] Avis &#224; tous ceux qui savent,Malgr&#233; le nombre important d'infos sur l'envoi de mail, j'ai toujours le m&#234;me probl&#232;me:Ma fonction mai Lecture/écriture dans un fichier [ par FhX ] Voila, rare quand j'ai un probl&#232;me, mais la ca devient un peu lourd :) Voici donc mon script : &lt;?php $filename = 'log.txt'; $write = 'Chaine apache et lecture du php.ini [ par guth42 ] Bonjour, je suis sur le probleme de ma fonction mail() qui ne fonctionnait pas depuis 2 jours... Finalement je viens de me rendre compte que mes page lecture lien [ par jojo545 ] Suite &#224; mon ancien message, je n'ai pas trop compris:Existe il un code en php qui puisse r&#233;cup&#233;rer les liens d'une page quelqonque ( ex configuration de RAID 5 [ par foblar ] foblarje souhaite savoir comment configurer le syst&#232;me RAID 5&nbsp;de mon serveur.il a 4 disques donc 1 disque&nbsp;de 30Go et trois autre&nbsp;d Stockage dimage sur serveur MySQL (pour gestion d'avatar) [ par bricethenetman ] Salut &#224; tous j'ai commenc&#233; &#224; cr&#233;er un syst&#232;me d'espace membres s&#233;curis&#233; doit je suis plut&#244;t fier. J'aimerais l Lecture fichier texte chez l'utilisateur [ par Gandalf5798 ] Bonjour,la question est contenu dans le titre :est-il possible de lire le contenu d'un fichier situ&#233; sur le disque dur de l'utilisateur ?J'ai d&# Probleme mysql>Pour serveur Apache sous win [ par RoX5 ] Bonjour &#224; tous, J'ai installer sous windows xp mon serveur web apache et jai aussi mis le module php mais maintenant c au tour de mysql :x Sa fai php.ini [ par henri12 ] salut je viens d'envoyer un email avec easyephp je trouve pas de fichier php.ini j ai trouver phpsafe.ini dans le repertoire de easyphp es celui la lecture du port com du PC [ par kisaka ] Bonjour, j'essaye de lire le port COM1 de mon PC(des données venant d'un GPS y arrivent) avec le code suivant et j'obtiens comme erreur '...failed


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales