Aller au menu - Aller au contenu

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

Mise à jour : 25/10/2009
Difficulté : Facile Facile Creative Commons BY-NC-ND
90 visites depuis 7 jours, classé 594/786
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 ...

Je préfère vous prévenir tout de suite, il n'est absolument pas pratique d'effectuer des sélections complexes (conditions, ordonnage) en se basant sur ce système.
Si vous avez besoin de quelque chose de tel, préférez utiliser une base de données.

Introduction

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 :

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

Code : PHP
1
2
3
<?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

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 :

Secret (cliquez pour afficher)
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() :

Code : PHP
1
2
3
<?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() :

Code : PHP
1
2
3
<?php
$liste_news = unserialize(file_get_contents('news.txt'));
?>


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

Code : PHP
1
2
3
<?php
echo '<pre>'.print_r($liste_news, true).'</pre>';
?>


Ce qui nous renvoie :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

Secret (cliquez pour afficher)

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?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>';


J'utilise ici la fonction htmlspecialchars(), qui permet de remplacer tous les caractères spéciaux (<, >, etc) par leur équivalent HTML.
Vous pouvez bien entendu utiliser la fonction dont vous avez besoin (parsage de bbcode par exemple).


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

Code : PHP
1
2
3
4
5
6
7
<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 :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?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 ? :-° ).

La fonction file_put_contents() n'est active que depuis PHP5, donc il est fort probable qu'elle ne soit pas disponible si votre hébergeur a une version plus ancienne de PHP.
Si vous n'êtes pas certains que votre hébergeur supporte PHP5, ou si vous souhaitez rendre votre code compatible PHP4 comme PHP5, vous pouvez placer ce bout de code dans vos scripts qui permet de définir la fonction file_put_contents au cas où elle serait absente.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?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;
		}
	}
}
?>

Supprimer une news

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 :

Code : PHP
1
2
3
4
<?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 :

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
<?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>';

Quelques améliorations possibles

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

  • 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 :
    Secret (cliquez pour afficher)
    Code : PHP - editer_news.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
    //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 &eacute;t&eacute; edit&eacute;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
    }
    

Q.C.M.

Les fonctions serialize() et unserialize() servent à ...

Statistiques de réponses au QCM

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.

Partager

83 commentaires pour "Un système de news sans base de données grâce à serialize et unserialize"
Note moyenne : 3.38 / 4 (13 votes)
Pseudo Commentaire
Hors ligne christophetd # Posté le 05/06/2011 à 12:59:07
Regardez-moi !
Avatar

Avis : Très bon
Flux RSS

Ville : Gap
Pays : France métropolitaine

Salut,
Pour récupérer la dernière news, j'utiliserais la fonction end(). ;)

Code : PHP
1
2
<?php
$derniereNews = end($news);
 
Hors ligne sankukai # Posté le 14/06/2011 à 10:18:33

Avis : Très bon

Merci pour le tuto il est nickel.

J'essaie d'afficher juste la dernière news mais ça ne marche pas.

J'ai essayé avec ce code :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
$derniereNews = end($news);				  
$liste_news = unserialize(file_get_contents('news.txt'));
if(!empty($liste_news)) {
	foreach($liste_news as $id => $news) {
		$news = array_map('htmlspecialchars', $news);
		?>
		<p><strong><?php echo $derniereNews['titre'] ?>               </strong>
			<p><em><?php echo $derniereNews['auteur'] ?></em>
			<p><?php echo $derniereNews['contenu'] 
 ?></p>
			
<?php

Si quelqu'un peut m'aider, merci d'avance.
Hors ligne Siana5184 # Posté le 16/06/2011 à 15:55:18

Merci pour le tutoriel!

J'aimerais savoir comment on pourrait faire pour que seul l'admin puisse supprimer et modifier les news.
Hors ligne christophetd # Posté le 16/06/2011 à 17:24:37
Regardez-moi !
Avatar

Avis : Très bon
Flux RSS

Ville : Gap
Pays : France métropolitaine

> Siana : il faut utiliser un système de connexion. Va faire un tour par ici, aussi : http://www.siteduzero.com/tutoriel-3-14563-variables-superglobales-sessions-et-cookies.html.

> sankukai : Ligne 1, d'où sort ton "$news" ? Il faut faire un truc du genre <?php $derniereNews = end($liste_news); ?> après avoir déserialisé l'array...
 
Hors ligne J3K # Posté le 12/07/2011 à 01:15:22

Merci pour ce tutorial !

je voudrais savoir comment cacher le bouton Ajouter News / Editer a tout le monde sauf moi, je crois qu'il faut utiliser le .htaccess mais je sais pas comment faire

PS : Je suis sur WAMP .

Merci !

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.