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

Formation

En Ligne

Prix sur demande

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Description

  • Typologie

    Formation

  • Méthodologie

    En ligne

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Les Avis

Le programme

Introduction du cours

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.

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

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

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 :

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

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 :

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

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.

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

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

    <?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 }

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.

  • #
Waouh !

Très heureux de voir que nos cours vous plaisent, déjà 3 pages lues aujourd'hui ! Vous pouvez continuer la lecture de nos cours en devenant un Roomie, un membre de la communauté d'OpenClassrooms. C'est gratuit !

Vous pourrez aussi suivre votre avancement dans le cours, faire les exercices et discuter avec les autres Roomies.

S'inscrire Se connecter
  • Thématiques du cours : PHP Web

Chaque cours est créé par un professeur ou un expert dans le domaine. Il est composé d'une ou plusieurs parties et peut comporter du texte, des images (schéma, illustration) et des vidéos. Chaque partie d'un cours certifiant est ponctuée d'exercices de 2 types : Des quiz corrigés automatiquement Des devoirs libres (exemple : créer un site web avec des consignes précises). Ces devoirs sont évalués par les pairs. Chaque devoir est corrigé 3 fois par 3 autres élèves, dans un processus en double aveugle, selon un barème fixé par le professeur. La note finale est la moyenne des 3 notes reçues sur le devoir. 50% des devoirs corrigés par les pairs obtiennent quasiment les 3 mêmes notes, avec une variance inférieure à 1. La recherche académique montre d'ailleurs que l'évaluation par les pairs peut être aussi précise que celle des professeurs.

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

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

Prix sur demande