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)
Nous allons désormais afficher, à l'aide d'un code PHP, une valeur prélevée dans un fichier .ini grâce à vos nouvelles connaissances !
Très bien : je vous suggère pour vos essais d'utiliser le fichier dans cette archive :
http://kyle.katarnls.free.fr/fichier_ini.zip, de mettre
membres.ini au même endroit que votre fichier
.php.
Avant de vous donner le code de votre fichier
.php (qui, je le rappelle, doit afficher une valeur du fichier), nous allons réfléchir à ce qu'il y aura dans ce code. Tout d'abord, une valeur est à un endroit précis, on peut dire à une adresse où le nom du fichier serait la ville, le nom du groupe serait la rue et le nom de l'item serait le numéro de la maison. Donc, les trois premières lignes auront pour but de donner l'adresse avec ces trois variables (vous pouvez vous amuser à créer un formulaire pour les entrer). Puis la quatrième ligne initialisera la valeur à
false : comme ça, si à la fin cette variable vaut toujours
false, c'est qu'aucune valeur n'a été trouvée, et on pourra afficher un message d'erreur.
Donner l'adresse
On entre le nom du fichier, du groupe, de l'item et on initialise
$valeur à
false.
Si après recherche,
$valeur vaut toujours
false, cela voudra dire que notre adresse ne mène à aucune valeur.
Code : PHP1
2
3
4
5
6 | <?php
$fichier="membres.ini";
$groupe_recherche="Louise";
$item_recherche="code postal";
$valeur=false;
?>
|
Vérifier que le fichier existe
Code : PHP1
2
3
4
5
6
7 | <?php
// Si le fichier existe et qu'on arrive à le lire avec file()
if(file_exists($fichier) && $fichier_lecture=file($fichier))
// Ici on lance la recherche
else
echo "Le fichier est introuvable ou incompatible<br />";
?>
|
La recherche
Attention, voici le plus gros morceau à mettre à la place du commentaire
# // Ici on lance la recherche # dans le précédent code :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11 | <?php
foreach($fichier_lecture as $ligne)
{
if(preg_match("#^\[.+)\]\s+$#",$ligne,$matches))
$groupe=$matches[1];
else
if($ligne[0]!=';')
if($groupe==$groupe_recherche && preg_match("#^".preg_quote($item_recherche, "#")."=#",$ligne))
$valeur=end(explode("=",$ligne,2));
}
?>
|
On me souffle dans l'oreillette que je n'ai pas définit les fonctions
explode() et
end()
Merci à Lo-X !
explode("=",$ligne,2) découpe la chaîne $ligne à chaque fois qu'il trouve "=" et renvoie un array avec un morceau par entrée. 2 est le nombre maximal de morceau qu'il doit renvoyer. Enfin la fonction end() qui encapsule le tout renvoie la dernière valeur de l'array : Dans le cas présent il s'agit de récupérer tout ce qui suit le premier signe =.
Une alternative avec les expressions régulières :
Code : PHP1
2
3 | <?php
$valeur=preg_replace('#^[^=]+=$#','',$ligne);
?>
|
Bref, explication du code :
On lit chaque ligne du fichier : le premier
preg_match() détecte la présence d'un groupe. Si c'en est un, on stocke sa valeur dans
$groupe.
$groupe contient donc toujours le groupe en cours de lecture.
La condition
$ligne{0}!=';' vérifie que l'on n'est pas en train de lire un commentaire (que le premier caractère de la ligne n'est pas un point-virgule).
Et le dernier
preg_match() compare le nom de l'item avec celui qui est recherché ; si c'est le cas et que le groupe courant est celui de l'adresse, alors on entre la valeur de l'item dans
$valeur.

Mais... et si ma ligne n'est ni un item ni un groupe, ni un commentaire ?
Eh bien justement, ce qui n'est ni un commentaire ni un groupe
EST un item.
Exemple : la ligne
ressource>52.
Ici, on considère que le nom de l'item est "
ressource>52" et que la valeur est "" (une chaîne vide).
Retenez bien ceci :
- une ligne qui commence par [ et se termine par ] est une ouverture de groupe ;
- une ligne commençant par ; est un commentaire ;
- toutes les autres lignes sont des entrées item/valeur.
Afficher le résultat
On peut terminer le code en affichant la valeur trouvée s'il y en a une, et un message d'erreur s'il n'y en a pas :
Code : PHP1
2
3
4
5
6 | <?php
if($valeur===false)
echo "Groupe ou item inexistant";
else
echo "Valeur trouvée : ".$valeur;
?>
|
Et voilà le code complet :
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 | <?php
$fichier="membres.ini";
$groupe_recherche="Louise";
$item_recherche="code postal";
$valeur=false;
if(file_exists($fichier) && $fichier_lecture=file($fichier))
foreach($fichier_lecture as $ligne)
{
if(preg_match("#^\[(.+)\]\s+$#",$ligne,$matches))
$groupe=$matches[1];
else
if($ligne[0]!=';')
if($groupe==$groupe_recherche && preg_match("#^".preg_quote($item_recherche, "#")."=#",$ligne))
$valeur=end(explode("=",$ligne,2));
}
else
echo "Le fichier est introuvable ou incompatible<br />";
if($valeur===false)
echo "Groupe ou item inexistant";
else
echo "Valeur trouvée : ".$valeur;
?>
|
Certains ont peut-être déjà essayé de rajouter un formulaire pour choisir l'adresse. Et comme au final, je vous ferai faire un
big formulaire avec toutes les manipulations possibles (

mais non ne vous découragez pas), alors voici comment faire.
Le début du 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 | <?php
if(isset($_POST["envoyer"]))
{
$fichier=$_POST["fichier"];
$groupe_recherche=$_POST["groupe"];
$item_recherche=$_POST["item"];
$valeur=false;
if(file_exists($fichier) && $fichier_lecture=file($fichier))
foreach($fichier_lecture as $ligne)
{
if(preg_match("#^\[.+\]$#",$ligne=preg_replace("#\s$#","",$ligne)))
$groupe=substr($ligne,1,-1);
else
if(!preg_match("#^\;#",$ligne))
if($groupe==$groupe_recherche && preg_match("#^".preg_quote($item_recherche, "#")."=#",$ligne))
$valeur=end(explode("=",$ligne,2));
}
else
echo "Le fichier est introuvable ou incompatible<br />";
if($valeur===false)
echo "Groupe ou item inexistant";
else
echo "Valeur trouvée : ".$valeur;
}
?>
|
La suite du fichier
Code : HTML1
2
3
4
5
6
7
8 | <form method="post" action="">
<fieldset><legend>Adresse de la valeur recherchée</legend>
<label>Fichier : <input type="text" name="fichier" /></label><br />
<label>Groupe : <input type="text" name="groupe" /></label><br />
<label>Item : <input type="text" name="item" /></label><br />
<input type="submit" name="envoyer" value="Rechercher" />
</fieldset>
</form>
|