Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Langage, bibliothèques et fonctions > Enregistrer et lire des données de fichiers .ini > Une page de gestion des fichiers .ini > Notre objet INI > Lecture du tutoriel

Notre objet INI

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : Kyle Katarn
Visualisations : 430

Plus d'informations Plus d'informations
Nous allons maintenant établir le rôle de chacune des méthodes dont nous aurons besoin et je vous fournirai le code PHP correspondant. Dans la dernière partie, je propose une organisation en héritage pour trier les méthodes par genre.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les méthodes une à une

Voici d'abord nos variables :
$fichier, $groupe, $item, $valeur, $fichier_ini. Les 3 premières sont respectivement les noms du fichier, du groupe et de l'item, $valeur est la valeur courante à la position donnée par les coordonnées et $fichier_ini est l'array contenant tout le .ini :
Code : PHP
1
2
3
4
5
6
7
8
<?php
class ini
{
  var $fichier="";
  var $groupe="";
  var $item="";
  var $valeur="";
  var $fichier_ini=array();


m_fichier()



Cette méthode reçoit en paramètre l'adresse du fichier à lire et elle transforme le fichier en array qu'il stocke dans $fichier_ini :
Code : PHP
 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
<?php
  function m_fichier($arg)
  {
     $this->fichier=$arg;
     $this->fichier_ini=null;
     $this->fichier_ini=array();
     // Pour utiliser parse_ini_file() par défaut, enlevez /* et */, sinon supprimez ce commentaire (conseillé)
     /*if(false!==($array=@parse_ini_file($arg, TRUE)))
     {
        $this->fichier_ini=$array;
     }
     else*/if(file_exists($arg) && $fichier_lecture=file($arg))
     {
       foreach($fichier_lecture as $ligne)
       {
         if(preg_match("#^\[(.+)\]\s*$#",$ligne,$matches))
         {
           $groupe_curseur=$matches[1];
         }
         else
         {
           if($ligne[0]!=';' && $tableau=explode("=",$ligne,2))
           {
             $this->fichier_ini[$groupe_curseur][$tableau[0]]=preg_replace("#\s$#","",$tableau[1]);
           }
         }
       }
     }
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
  }
?>

J'en profite pour vous parler de la fonction parse_ini_file() qui fait cette opération que je vous conseille de ne pas utiliser, car elle ne récupère pas l'intégralité d'un item : s'il trouve le signe '=' dans une valeur, la fonction ne renverra que ce qu'il y a avant. Cela est rarement un avantage et si jamais vous vouliez uniquement récupérer ce qu'il y a avant le premier = d'une valeur, il y a un moyen simple de le faire :
Code : PHP
1
<?php $valeur_avant_egal=reset(explode("=",$valeur_initiale)); ?>

De plus la fonction parse_ini_file() est à usage unique alors que la fonction m_fichier (ci-dessus) est adaptable, c'est à dire que vous pouvez décidez que, chez vous, les commentaires commencent par # et non par ; ou encore que votre array a un niveau de plus et donc que le fichier contient des sous-groupe délimités par {groupe} ou <groupe>. Et enfin dans certains cas, le type des données stockées peut être important. Alors des préfixes comme i:, f:, s: peuvent indiquer si la valeur est un nombre entier, décimal ou une chaîne de caractères. Bref, le stockage d'un array dans un fichier ne se limite pas à la technique des fichiers .ini, il n'a de limite que votre imagination. :D

m_groupe()



Pour sélectionner un groupe :
Code : PHP
1
2
3
4
5
6
7
8
<?php
  function m_groupe($arg)
  {
     $this->groupe=$arg;
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
     return true;
  }
?>


m_item()



Pour sélectionner un item :
Code : PHP
1
2
3
4
5
6
7
8
<?php
  function m_item($arg)
  {
     $this->item=$arg;
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
     return true;
  }
?>


m_put()



Pour changer une valeur. Avec 1 paramètre, la valeur est insérée dans l'item sélectionné et le groupe sélectionné. Les paramètres suivants sont optionnels : il s'agit dans l'ordre de l'item, du groupe et du fichier qui sont sélectionnés si les paramètres correspondants sont fournis :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
  function m_put($arg, $arg_i=false, $arg_g=false, $arg_f=false)
  {
     if($arg_f!==false) $this->m_fichier($arg_f);
     if($arg_g!==false) $this->m_groupe($arg_g);
     if($arg_i!==false) $this->m_item($arg_i);
     $this->fichier_ini[$this->groupe][$this->item]=$arg;
     $this->valeur=$arg;
     return $this->fichier." ==> [".$this->groupe."] ".$this->item."=".$this->valeur;
  }
?>


m_count()



Si aucun paramètre n'est fourni, m_count renvoie un array contenant à l'entrée 0 le nombre total d'éléments dans le fichier .ini, à l'entrée 1 le nombre de groupes dans le fichier et à l'entrée 2 le nombre d'items.
Si un paramètre est fourni, m_count renvoie le nombre d'items dans le groupe fourni en paramètre.
Code : PHP
1
2
3
4
5
6
7
8
9
<?php
  function m_count($arg_gr=false)
  {
     if($arg_gr===false)
     return array(1=>$gr_cou=count($this->fichier_ini), 0=>$itgr_cou=count($this->fichier_ini, COUNT_RECURSIVE), 2=>$itgr_cou-$gr_cou);
     else
     return count($this->fichier_ini[$arg_gr]);
  }
?>


array_groupe()



Si un paramètre est fourni, array_groupe renvoie un array associatif contenant les items du groupe fourni en paramètre :
Code : PHP
1
2
3
4
5
6
7
8
<?php
  function array_groupe($arg_gr=false)
  {
     if($arg_gr===false)
     $arg_gr=$this->groupe;
     return $this->fichier_ini[$arg_gr];
  }
?>

À noter : les deux lignes ci-dessous sont équivalentes :
Code : PHP
1
2
3
4
<?php
print_r($objet->array_groupe('mon groupe'));
print_r($objet->fichier_ini['mon groupe']);
?>


save()



C'est l'opération inverse de m_fichier, cette fonction remplace le contenu du fichier par l'array en cours de traitement. save() sauvegarde donc les modifications apportées à 1 fichier :
Code : PHP
 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
<?php
  function save()
  {
     $fichier_save="";
     foreach($this->fichier_ini as $key => $groupe_n)
     {
         $fichier_save.="
[".$key."]";
         foreach($groupe_n as $key => $item_n)
         {
             $fichier_save.="
".$key."=".$item_n;
         }
     }
     $fichier_save=substr($fichier_save, 1);
     if(file_exists($this->fichier) && reset(explode('.',phpversion()))>=5)
     {
             if(false===file_put_contents($this->fichier, $fichier_save))
             {
                die("Impossible d'&eacute;crire dans ce fichier (mais le fichier existe).");
             }
     }
     else
     {
             $fichier_ouv=fopen($this->fichier,"w+");
             if(false===fwrite($fichier_ouv, $fichier_save))
             {
                die("Impossible d'&eacute;crire dans ce fichier (Le fichier n'existe pas).");
             }
             fclose($fichier_ouv);
     }
     return true;
  }
?>

À noter : il faut utiliser cette fonction avant de changer de fichier pour enregistrer les modifications. Peut-être que certains d'entre vous se disent qu'il vaudrait mieux inclure cette fonction dans m_put pour éviter de l'oublier et éviter des lignes de codes inutiles, mais il peut s'avérer utile (j'en ai eu besoin) de modifier l'objet sans modifier le fichier.

clear()



Réinitialise toutes les variables de l'objet et efface l'array $fichier_ini.
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
  function clear()
  {
      $this->fichier="";
      $this->groupe="";
      $this->item="";
      $this->valeur="";
      $this->fichier_ini=null;
      $this->fichier_ini=array();
  }
?>


s_fichier()



Supprime le fichier en cours d'exécution s'il existe.
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
  function s_fichier()
  {
     $return=$this->fichier;
     if(file_exists($this->fichier)) unlink($this->fichier);
     $this->fichier="";
     $this->valeur="";
     return "fichier(".$return.") supprim&eacute;.";
  }
?>


s_groupe()



Supprime le groupe sélectionné.
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
  function s_groupe()
  {
     $return=$this->groupe;
     if(isset($this->fichier_ini[$this->groupe])) unset($this->fichier_ini[$this->groupe]);
     $this->groupe="";
     $this->valeur="";
     return "groupe(".$return.") supprim&eacute;.";
  }
?>


s_item()



Supprime l'item sélectionné.
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
  function s_item()
  {
     $return=$this->item;
     if(isset($this->fichier_ini[$this->groupe][$this->item])) unset($this->fichier_ini[$this->groupe][$this->item]);
     $this->item="";
     $this->valeur="";
     return "item(".$return.") supprim&eacute;.";
  }
?>


print_curseur()



Affiche les coordonnées du curseur et la valeur courante.
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
  function print_curseur()
  {
     echo "Fichier : <b>".$this->fichier."</b><br />";
     echo "Groupe : <b>".$this->groupe."</b><br />";
     echo "Item : <b>".$this->item."</b><br />";
     echo "Valeur : <b>".$this->valeur."</b><br />";
     return true;
  }
?>


print_dossier()



Seulement si $fichier contient l'adresse d'un dossier.
Pour fonctionner correctement, il vous faut les images suivantes :
Image utilisateur Image utilisateur
Cette fonction ne reçoit aucun paramètre et affiche un arbre contenant au sommet l'adresse entrée dans la méthode m_fichier() et en dessous, la liste des fichiers .ini que contient ce dossier (utile surtout dans la page d'administration).
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
  function print_dossier()
  {
     if(is_dir($this->fichier)) {
     echo "<img src='dir.png' alt='Dossier' /><span style='position:relative; top:-10px;font-size:20px; font-weight:bold;'>".$this->fichier."</span><br />";
     if($handle=opendir($this->fichier))
     {
        while(false!==($file=readdir($handle)))
        {
            if(substr($file, -4, 4)==".ini")
            {
               echo "&nbsp;&nbsp;<a href='?fichier=".$file."'><img src='iniicone.png' alt='Ini' style='border:none;' /></a>&nbsp;".$file."<br />";
            }
        }
        closedir($handle);
     }
     return true; }
     else { echo "L'élément sélectionné n'est pas un dossier"; return false; }
  }
?>


print_fichier()



Affiche un aperçu du fichier et surligne le groupe et l'item sélectionné.
Code : PHP
 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
<?php
  function print_fichier()
  {
     if(file_exists($this->fichier) && is_file($this->fichier) && $fichier_lecture=file($this->fichier))
     {
       foreach($fichier_lecture as $ligne)
       {
         $ligne=preg_replace("#\s$#","",$ligne);
         if(preg_match("#^\[.+\]\s?$#",$ligne))
         $groupe=false;
         if(preg_match("#^\[".preg_quote($this->groupe, "#")."\]$#",$ligne))
         {
           $echo.= "<span style='background-color:aqua;'>".htmlspecialchars($ligne)."</span><br />";
           $groupe=true;
         }
         elseif($groupe==true && preg_match("#^(".$this->item."=)#",$ligne))
           $echo.= "<span style='background-color:yellow;'>".htmlspecialchars($ligne)."</span><br />";
         elseif($groupe==true && $this->item==reset(explode("=",$ligne)))
           $echo.= "<span style='background-color:yellow;'>".htmlspecialchars($ligne)."</span><br />";
         else
           $echo.= htmlspecialchars($ligne)."<br />";
       }
           echo $echo;
     }
     else
     {
       echo "Le fichier n'existe pas ou est incompatible";
     }
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
     return true;
  }
?>


m_valeur()



Prend deux paramètres : le premier est l'item et le deuxième le groupe. m_valeur() renvoie la valeur (sous forme d'une chaîne de caractères) qui se trouve à l'item donné du groupe donné dans le fichier en cours de traitement.
Code : PHP
1
2
3
4
5
6
<?php
  function m_valeur($arg_item, $arg_groupe)
  {
     return $this->fichier_ini[$arg_groupe][$arg_item];
  }
?>

On termine bien sûr par fermer la déclaration de class avec }.

Le code PHP

Code : PHP
  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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<?php
class ini
{
  var $fichier="";
  var $groupe="";
  var $item="";
  var $valeur="";
  var $fichier_ini=array();
  function m_fichier($arg)
  {
     $this->fichier=$arg;
     $this->fichier_ini=null;
     $this->fichier_ini=array();
     // Pour utiliser parse_ini_file() par défaut, enlevez /* et */, sinon supprimez ce commentaire (conseillé)
     /*if(false!==($array=@parse_ini_file($arg, TRUE)))
     {
        $this->fichier_ini=$array;
     }
     else*/if(file_exists($arg) && $fichier_lecture=file($arg))
     {
       foreach($fichier_lecture as $ligne)
       {
         if(preg_match("#^\[(.+)\]\s*$#",$ligne,$matches))
         {
           $groupe_curseur=$matches[1];
         }
         else
         {
           if($ligne[0]!=';' && $tableau=explode("=",$ligne,2))
           {
             $this->fichier_ini[$groupe_curseur][$tableau[0]]=preg_replace("#\s$#","",$tableau[1]);
           }
         }
       }
     }
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
  }
  function m_groupe($arg)
  {
     $this->groupe=$arg;
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
     return true;
  }
  function m_item($arg)
  {
     $this->item=$arg;
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
     return true;
  }
  function m_put($arg, $arg_i=false, $arg_g=false, $arg_f=false)
  {
     if($arg_f!==false) $this->m_fichier($arg_f);
     if($arg_g!==false) $this->m_groupe($arg_g);
     if($arg_i!==false) $this->m_item($arg_i);
     $this->fichier_ini[$this->groupe][$this->item]=$arg;
     $this->valeur=$arg;
     return $this->fichier." ==> [".$this->groupe."] ".$this->item."=".$this->valeur;
  }
  function m_count($arg_gr=false)
  {
     if($arg_gr===false)
     return array(1=>$gr_cou=count($this->fichier_ini), 0=>$itgr_cou=count($this->fichier_ini, COUNT_RECURSIVE), 2=>$itgr_cou-$gr_cou);
     else
     return count($this->fichier_ini[$arg_gr]);
  }
  function array_groupe($arg_gr=false)
  {
     if($arg_gr===false)
     $arg_gr=$this->groupe;
     return $this->fichier_ini[$arg_gr];
  }
  function save()
  {
     $fichier_save="";
     foreach($this->fichier_ini as $key => $groupe_n)
     {
         $fichier_save.="
[".$key."]";
         foreach($groupe_n as $key => $item_n)
         {
             $fichier_save.="
".$key."=".$item_n;
         }
     }
     $fichier_save=substr($fichier_save, 1);
     if(file_exists($this->fichier) && reset(explode('.',phpversion()))>=5)
     {
             if(false===file_put_contents($this->fichier, $fichier_save))
             {
                die("Impossible d'&eacute;crire dans ce fichier (mais le fichier existe).");
             }
     }
     else
     {
             $fichier_ouv=fopen($this->fichier,"w+");
             if(false===fwrite($fichier_ouv, $fichier_save))
             {
                die("Impossible d'&eacute;crire dans ce fichier (Le fichier n'existe pas).");
             }
             fclose($fichier_ouv);
     }
     return true;
  }
  function clear()
  {
      $this->fichier="";
      $this->groupe="";
      $this->item="";
      $this->valeur="";
      $this->fichier_ini=null;
      $this->fichier_ini=array();
  }
  function s_fichier()
  {
     $return=$this->fichier;
     if(file_exists($this->fichier)) unlink($this->fichier);
     $this->fichier="";
     $this->valeur="";
     return "fichier(".$return.") supprim&eacute;.";
  }
  function s_groupe()
  {
     $return=$this->groupe;
     if(isset($this->fichier_ini[$this->groupe])) unset($this->fichier_ini[$this->groupe]);
     $this->groupe="";
     $this->valeur="";
     return "groupe(".$return.") supprim&eacute;.";
  }
  function s_item()
  {
     $return=$this->item;
     if(isset($this->fichier_ini[$this->groupe][$this->item])) unset($this->fichier_ini[$this->groupe][$this->item]);
     $this->item="";
     $this->valeur="";
     return "item(".$return.") supprim&eacute;.";
  }
  function print_curseur()
  {
     echo "Fichier : <b>".$this->fichier."</b><br />";
     echo "Groupe : <b>".$this->groupe."</b><br />";
     echo "Item : <b>".$this->item."</b><br />";
     echo "Valeur : <b>".$this->valeur."</b><br />";
     return true;
  }
  function print_dossier()
  {
     if(is_dir($this->fichier)) {
     echo "<img src='dir.png' alt='Dossier' /><span style='position:relative; top:-10px;font-size:20px; font-weight:bold;'>".$this->fichier."</span><br />";
     if($handle=opendir($this->fichier))
     {
        while(false!==($file=readdir($handle)))
        {
            if(substr($file, -4, 4)==".ini")
            {
               echo "&nbsp;&nbsp;<a href='?fichier=".$file."'><img src='iniicone.png' alt='Ini' style='border:none;' /></a>&nbsp;".$file."<br />";
            }
        }
        closedir($handle);
     }
     return true; }
     else { echo "L'élément sélectionné n'est pas un dossier"; return false; }
  }
  function print_fichier()
  {
     if(file_exists($this->fichier) && is_file($this->fichier) && $fichier_lecture=file($this->fichier))
     {
       foreach($fichier_lecture as $ligne)
       {
         $ligne=preg_replace("#\s$#","",$ligne);
         if(preg_match("#^\[.+\]\s?$#",$ligne))
         $groupe=false;
         if(preg_match("#^\[".preg_quote($this->groupe, "#")."\]$#",$ligne))
         {
           $echo.= "<span style='background-color:aqua;'>".htmlspecialchars($ligne)."</span><br />";
           $groupe=true;
         }
         elseif($groupe==true && preg_match("#^(".$this->item."=)#",$ligne))
           $echo.= "<span style='background-color:yellow;'>".htmlspecialchars($ligne)."</span><br />";
         elseif($groupe==true && $this->item==reset(explode("=",$ligne)))
           $echo.= "<span style='background-color:yellow;'>".htmlspecialchars($ligne)."</span><br />";
         else
           $echo.= htmlspecialchars($ligne)."<br />";
       }
           echo $echo;
     }
     else
     {
       echo "Le fichier n'existe pas ou est incompatible";
     }
     $this->valeur=$this->fichier_ini[$this->groupe][$this->item];
     return true;
  }
  function m_valeur($arg_item, $arg_groupe)
  {
     return $this->fichier_ini[$arg_groupe][$arg_item];
  }
}
?>

Trier les méthodes grâce à l'héritage

Grâce au mot-clé extends nous allons pouvoir créer plusieurs class complémentaires. Je vous propose de faire ainsi : ne laissez dans la class ini que les méthodes de lectures :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
class ini
{
  var $fichier="";
  var $groupe="";
  var $item="";
  var $valeur="";
  var $fichier_ini=array();
  function m_fichier( ...
  function m_groupe( ...
  function m_item( ...
  function m_valeur( ...
  function m_count( ...
}
?>

Voilà donc la class utile pour lire un fichier .ini, mettez ça dans un fichier que vous incluez avec include() ou require() dans votre fichier .php. Puis dans un autre fichier, mettez les méthodes d'écriture :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
class ini_e extends ini
{
  function m_put( ...
  function save( ...
  function s_fichier( ...
  function s_groupe( ...
  function s_item( ...
}
?>

que vous n'inclurez dans vos pages que si vous avez besoin de modifier un fichier .ini : vous appellerez alors ini_e et non ini pour créer votre objet. Vous pouvez enfin faire un extension de ini_e avec les méthodes print_ et celles qui restent. Ce qui permet de ne pas déclarer des méthodes dont on n'a pas besoin dans une page ou une autre.

Q.C.M.

Comment créer une sous-classe new de la classe ini ?
Quelle méthode de notre objet ini permet de transformer un fichier en array ?
Quelle ligne de code permettrait à la variable $val d'être égale à 5 si le fichier sélectionné de l'objet ini $objet_ini contenait ceci ?
[item]
groupe=5
Quelle modification le code suivant va apporter au fichier titre.ini ?
Code : PHP
1
2
3
$objet=new ini();
$objet->m_fichier('titre.ini');
$objet->m_put(1,2,3);

Statistiques de réponses au QCM


La partie héritage, c'est du bonus : ça n'est ni vraiment essentiel pour le traitement INI, ni utile pour la suite du tuto.
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 10/06/2007 à 23:05:56
Modifié : le 26/08/2008 à 10:36:32
Avancement : 0%
Licence : Copie non autorisée

L'orthographe, la grammaire et la présentation de ce tutoriel ont été vérifiées par les zCorrecteurs.

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 438 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0492s (0.0364s)