Version en ligne

Tutoriel : Un système de news sans base de données grâce à serialize et unserialize

Table des matières

Un système de news sans base de données grâce à serialize et unserialize
Introduction
Lister les news
Ajouter une news
Supprimer une news
Quelques améliorations possibles

Un système de news sans base de données grâce à serialize et unserialize

Introduction

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

Introduction

Lister les news

Pourquoi les fichiers ?

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 :

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é :

<?php
$news = array(1 => array('auteur' => 'christophetd', 'titre' => 'Ma première news', 'contenu' => 'Test'));
?>

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:


Lister les news

Lister les news

Introduction Ajouter une news

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() :

<?php
$contenu_fichier_news = file_get_contents('news.txt');
?>

Ensuite, nous allons transformer le contenu (qui est actuellement sérialisé, souvenez-vous ;) ) en un array exploitable à l'aide de unserialize() :

<?php
$liste_news = unserialize(file_get_contents('news.txt'));
?>

Tiens, voyons un peu ce que cet array a dans le ventre :

<?php
echo '<pre>'.print_r($liste_news, true).'</pre>';
?>

Ce qui nous renvoie :

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&eacute;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&ucirc;r de vouloir supprimer cette news ?');">Supprimer</a>
			&nbsp;
			<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>';

Introduction Ajouter une news

Ajouter une news

Lister les news Supprimer une news

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 ? :-° ).

<?php
if (!function_exists('file_put_contents')) {
	function file_put_contents($filename, $data) {
		$f = @fopen($filename, 'w');
		if (!$f) {
			return false;
		} else {
			$bytes = fwrite($f, $data);
			fclose($f);
			return $bytes;
		}
	}
}
?>

Lister les news Supprimer une news

Supprimer une news

Ajouter une news Quelques améliorations possibles

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 :

<?php
$array = array('nom' => 'Dupont', 'prenom' => 'Jean');
unset($array['nom']);
?>

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 &eacute;t&eacute; supprim&eacute;e !';
}
else {
	echo 'La news n\'existe pas.';
}
echo '<br />';
echo '<a href="index.php">Retour</a>';

Ajouter une news Quelques améliorations possibles

Quelques améliorations possibles

Supprimer une news

Ce script ne demande qu'à être amélioré :

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.


Supprimer une news