Ce cours est visible gratuitement en ligne.

J'ai tout compris !
  • Facile

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

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

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

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

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

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

  • Thématiques du cours : PHP Web

déroulement d'un cours

  • 1

    Dès aujourd'hui, vous avez accès au contenu pédagogique et aux exercices du cours.

  • 2

    Vous progressez dans le cours semaine par semaine. Une partie du cours correspond à une semaine de travail de votre part.

  • !

    Les exercices doivent être réalisés en une semaine. La date limite vous sera annoncée au démarrage de chaque nouvelle partie. Les exercices sont indispensables pour obtenir votre certification.

  • 3

    À l'issue du cours, vous recevrez vos résultats par e-mail. Votre certificat de réussite vous sera également transmis si vous êtes membre Premium et que vous avez au moins 70% de bonnes réponses.

Exemple de certificat de réussite
Exemple de certificat de réussite