Bonjour, Vous avez besoin de développer deux ou trois modules simples pour votre site perso, mais vous ne voulez pas vous embêter à gérer vos bases de données et à inclure des fichiers de configuration de partout ? Ce tutoriel est fait pour vous. ;) Nous allons voir, étape par étape, la création d'un système basique de news à l'aide des fichiers et de deux fonctions bien pratiques de PHP ...
Vous vous demandez peut-être quel est l'intérêt d'utiliser les fichiers plutôt qu'une base de données. La principale réponse est : les fichiers sont beaucoup plus rapides que la communication avec une base de données, environ 5 fois selon des tests que j'ai effectués !
Serialize et unserialize
Je ne m'attarderai pas sur ces deux fonctions, étant donné qu'il y a déjà un tutoriel qui en parle. Sachez seulement qu'elles permettent de sauvegarder des données quelque part (fichier, base de données) en conservant leur format (type de variable, array, etc). ;)
Notre système de news
Le système de news que nous allons coder ici est très basique. Pour chaque news, nous aurons quatre informations :
id, l'identificateur unique de la news ;
titre, le titre de la news ;
auteur, l'auteur de la news ;
contenu, le contenu de la news.
Le principe est le suivant : dans le fichier news.txt, se trouve un array sérialisé (traité par la fonction serialize ;) ) contenant les informations sur les news. Cet array ressemble à ça lorsqu'il n'est pas encore sérialisé :
Lorsque l'on voudra lister toutes les news, nous n'aurons qu'à faire un foreach() sur cet array pour obtenir les informations sur les news. Vous êtes prêts ? Let's begin to code. :pirate:
Nous allons commencer par établir une liste des news. Tout d'abord, pour que nous ayions quelque chose à afficher, commencez par insérer le texte ci-dessous dans le fichier news.txt :
a:2:{i:0;a:3:{s:5:"titre";s:16:"Une news de test";s:6:"auteur";s:12:"christophetd";s:7:"contenu";s:77:"J'ai remarqué que les news de test portaient souvent toutes le même titre ...";}i:1;a:3:{s:5:"titre";s:14:"Une autre news";s:6:"auteur";s:8:"tarzoune";s:7:"contenu";s:35:"Bonjour, J'aime bien les news !";}}
(Ne vous occupez pas de savoir ce que ça signifie, il s'agit en fait d'un array sérialisé ;) )
Nous allons commencer par récupérer le contenu du fichier en utilisant la fonction file_get_contents() :
Array
(
[0] => Array
(
[titre] => Une news de test
[auteur] => christophetd
[contenu] => J'ai remarqué que les news de test portaient souvent toutes le même titre ...
)
[1] => Array
(
[titre] => Une autre news
[auteur] => tarzoune
[contenu] => Bonjour,
J'aime bien les news !
)
)
Il ne nous reste plus qu'à vérifier si le tableau récupéré n'est pas vide (au cas où il n'y aurait pas de news), puis de le parcourir à l'aide d'un foreach(). Je vous laisse le faire, c'est pas bien compliqué. :D
<?php
$liste_news = unserialize(file_get_contents('news.txt'));
if(!empty($liste_news)) {
foreach($liste_news as $id => $news) {
$news = array_map('htmlspecialchars', $news);
?>
<h2><?php echo $news['titre'] ?></h2>
<i>Ajoutée par <?php echo $news['auteur'] ?></i> <br />
<p><?php echo $news['contenu'] ?></p>
<i><a href="supprimer_news.php?id=<?php echo $id ?>" onclick="return confirm('Etes-vous sûr de vouloir supprimer cette news ?');">Supprimer</a>
<a href="editer_news.php?id=<?php echo $id ?>">Editer</a></i>
<br /><br />
<?php
}
}
else {
echo 'Il n\'y a aucune news pour le moment<br />';
}
echo '<a href="ajouter_news.php">Ajouter une news</a>';
Bien, maintenant qu'on peut afficher une liste des news, je suppose que vous aimeriez bien pouvoir en ajouter. :) Tout d'abord, commençons par créer la page ajouter_news.php, et liez-là dans index.php.
Il va nous falloir un formulaire contenant les champs pseudo, titre et contenu :
<form action="" method="post">
<label for="pseudo">Votre pseudo :</label> <input type="text" name="pseudo" id="pseudo" /><br />
<label for="titre">Titre de la news :</label> <input type="text" name="titre" id="titre" /><br />
<label for="contenu">Contenu de la news :</label> <br />
<textarea name="contenu" id="contenu" rows="20" cols="60"></textarea><br />
<input type="submit" value="Ajouter la news" />
</form>
Ensuite, on va vérifier si le formulaire a été soumis / correctement rempli. Si c'est le cas, on va récupérer les valeurs entrées, puis les insérer à la suite de l'array désérialisé contenu dans news.txt :
<?php
if(isset($_POST['titre']) && isset($_POST['contenu']) && isset($_POST['pseudo'])) {
//On définit les variables
$titre = $_POST['titre'];
$contenu = $_POST['contenu'];
$pseudo = $_POST['pseudo'];
//Puis on récupère les news qui existent déjà, et on stocke le tout dans $news
$news = unserialize(file_get_contents('news.txt'));
//On ajoute les données de la news à la suite de l'array
$news[] = array('titre' => $titre, 'auteur' => $pseudo, 'contenu' => $contenu);
//Et pour finir, on enregistre le tout
file_put_contents('news.txt', serialize($news));
echo 'La news a bien été ajoutée !';
} else {
//Affichage du formulaire
}
?>
Vous pouvez tester ce code, et vous verrez qu'il marche (qui a osé en douter ? :-° ).
Créez la page supprimer_news.php. Elle recevra en paramètre (GET) l'id de la news à supprimer.
Pour supprimer, nous allons utiliser la fonction unset(). Elle permet d'effacer aussi bien une variable que l'index d'un tableau (exactement ce dont nous avons besoin :p ). Par exemple, en faisant :
L'array ne contiendra plus que l'index 'prenom'. Vous voyez où je veux en venir ? Nous allons faire la même chose avec notre array $news :
<?php
//Si l'id passé en paramètre dans l'url n'existe pas, c'est que le visiteur a été amenené ici par hasard
if(!isset($_GET['id'])) {
//Donc on redirige vers index.php
header('Location: index.php');
//Puis on stoppe l'exécution du script
exit();
}
//On récupère l'array des news
$news = unserialize(file_get_contents('news.txt'));
//Puis l'id passé en paramètre
$id = (int) $_GET['id'];
//Si la news existe
if(isset($news[$id])) {
//On efface l'index correspondant à l'id de la news
unset($news[$id]);
//Puis on sauvegarde le tout
file_put_contents('news.txt', serialize($news));
echo 'La news a bien été supprimée !';
}
else {
echo 'La news n\'existe pas.';
}
echo '<br />';
echo '<a href="index.php">Retour</a>';
Il serait mieux, pour récupérer l'array des news, d'appeller une fonction getNews() plutôt que d'avoir à chaque fois recourt à unserialize() et file_get_contents()
Vous serez sûrement d'accord avec moi si je vous dit qu'il manque un petit quelque chose ... que diriez-vous de coder la page editer_news.php ? Elle fonctionne sur le même principe que supprimer_news.php, sauf qu'au lieu d'effacer la news de l'array, on va la modifier. ;) Voici la correction :
<?php
//Si l'id passé en paramètre dans l'url n'existe pas, c'est que le visiteur a été amenené ici par hasard
if(!isset($_GET['id'])) {
//Donc on redirige vers index.php
header('Location: index.php');
//Puis on stoppe l'exécution du script
exit();
}
//On récupère l'array des news
$news = unserialize(file_get_contents('news.txt'));
$newsAmodifier = (int) $_GET['id'];
//Si le formulaire a été soumis
if(isset($_POST['titre']) && isset($_POST['contenu'])) {
//On modifie les infos de la news
$news[$newsAmodifier]['titre'] = $_POST['titre'];
$news[$newsAmodifier]['contenu'] = $_POST['contenu'];
//Puis on sauvegarde le tout
file_put_contents('news.txt', serialize($news));
echo 'La news a bien été editée.';
echo '<br />';
echo '<a href="index.php">Retour</a>';
} else { //Sinon, on affiche le formulaire d'édition
?>
<form action="" method="POST">
Auteur : <strong><?php echo $news[$newsAmodifier]['auteur'] ?></strong><br />
<label for="titre">Titre de la news :</label> <input type="text" name="titre" id="titre" value="<?php echo $news[$newsAmodifier]['titre'] ?>" ><br />
<label for="contenu">Contenu de la news : </label><br />
<textarea name="contenu" id="contenu" rows="20" cols="60"><?php echo $news[$newsAmodifier]['contenu'] ?></textarea><br />
<input type="submit" value="Appliquer les modifications" />
</form>
<?php
}
Voilà, c'est fini pour ce tutoriel. J'espère qu'il vous a plu et que vous saurez vous en servir à bon escient. ;) Notez toutefois qu'il est impossible (ou vraiment pas pratique) d'utiliser une telle sorte de système pour des modules plus complexes tels qu'un forum, un système de tutoriels, etc.
Le script complet du tutoriel est disponible au téléchargement ici.
Si vous avez un problème ou une question avec ce tutoriel, n'hésitez pas à poster un commentaire (réponse assurée :p ) ou à m'envoyer un MP. ;)
Je remercie vyk12 et tarzoune pour leurs remarques et corrections pertinentes.