Programmation PHP/Exemples/Livre

Un livre de Wikilivres.

Créer le livre[modifier | modifier le wikicode]

Tout d'abord, il faut créer le livre d'or, c'est-à-dire une table où seront stockés les messages.

Voici un exemple de table, avec un identifiant auto-incrémenté qui sera la clé (pour pouvoir identifier de manière unique chaque message), puis un champ pour le nom, courriel, date, ... et bien sûr le message.

CREATE TABLE `livre` (
	`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
	`nom` VARCHAR( 128 ),
	`email` VARCHAR( 128 ),
	`date` DATE,
	`message` TEXT NOT NULL,
	PRIMARY KEY( `id` )
);

Ajouter un message[modifier | modifier le wikicode]

Voici la requête SQL qui permet d'insérer les données dans la table:

INSERT INTO `livre` ( `nom` , `email` , `date` , `message` )
 VALUES ( `UnNom` , `Une@` ,  `xx/xx/xxxx` , `blalblablabla...` );

Saisie des données[modifier | modifier le wikicode]

Voici un exemple de formulaire servant à récupérer les données saisies par l'utilisateur pour les faire suivre vers 'ajout_message.php' qui les traitera. La méthode utilisée est POST, bien que GET marche aussi, mais POST possède l'avantage de ne pas rendre visible dans l'URL les paramètres passés, ce qui rend cette méthode plus « propre » et plus claire.

fichier formulaire.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire</title>
</head>

<body>
<form name="formulaire" method="post" action="ajout_message.php">
<label for="nom">Nom :</label><input type="text" id="nom" name="nom" /><br />
<label for="email">Courriel :</label><input type="text" id="email" name="email" /><br />
<label for="message">Votre message :</label><br />
<textarea id="message" name="message" cols="50" rows="10">Message par défaut</textarea><br />
<input type="submit" />
</form>
</body>
</html>

Traitement des données[modifier | modifier le wikicode]

Le fichier « ajout_message.php » va récupérer et traiter les données saisies par l'utilisateur puis effectuer une insertion dans la base (c'est-à-dire ajouter le message dans le livre d'or). Ces données portent le nom qui leur a été donné dans le formulaire, précédé d'un '$' (représente une variable en PHP). Il est fortement conseillé d'effectuer des tests de saisie à ce niveau, pour vérifier que l'utilisateur a rempli correctement les champs (champs non vides, adresse email correcte,...).

fichier params.php

<?php
$host='localhost';
$user='root';
$password='';
$base='toto';
?>

fichier ajout_message.php

<?php
isset($_POST['nom']) or die('Pas de paramètres en entrée');

//récupération des données entrées par l'utilisateur
$nom = $_POST['nom'];
$message = $_POST['message'];
$email= $_POST['email'];

//vérification des données entrées par l'utilisateur
if (($nom == "")||($message == ""))
        die("Paramètres incorrects.
        <a href='formulaire.html'>Cliquez ici pour revenir au formulaire</a>".mysql_error());
        
//connexion à la base
require 'params.php';
$link=mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');
mysql_select_db($base,$link) or die('La base de données n\'existe pas');

//insertion du message

$date=date("Y-m-d"); // on récupère la date
$message = htmlspecialchars($message,ENT_QUOTES); //convertit les caractères spéciaux
$sql="INSERT INTO `livre` ( `id` , `nom` , `email` , `date` , `message` ) VALUES ( NULL , '$nom', '$email', '$date', '$message' );";
$res=mysql_query($sql,$link);
mysql_close($link);
if ($res==NULL) die('Erreur lors de l\'écriture du message'.mysql_error());

print "Message correctement ajouté.<br />Merci d'avoir pris le temps de remplir ce livre d'or";
?>

La fonction htmlspecialchar() permet de convertir les caractères spéciaux qui pourrait être interprétés comme du code HTML par un navigateur. Il existe d'autres fonctions, comme htmlentities(), qui permet en plus de spécifier les caractères de remplacement, ou n12br() qui permet de remplacer les retours chariots par le caractère HTML de retour à la ligne (br).

Récupérer les messages et les faire afficher[modifier | modifier le wikicode]

Cette partie est beaucoup plus simple à réaliser que la partie précédente.


Voici la requête SQL qui permet de récupérer toutes les informations de la table dans la base de donées:

SELECT * FROM `livre` ORDER BY `id`

Les messages seront alors triés en fonction du champ `id`, et, par défaut, par ordre croissant, donc plus du plus ancien au plus récent. Pour les classer dans l'ordre décroissant, il faut rajouter l'instruction DESC, ce qui donne la requête suivante :

SELECT * FROM `livre` ORDER BY `id` DESC

Après, il suffit d'afficher les informations obtenues grâce à la requête.

fichier affiche_message.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Livre d'or</title>
</head>

<body>
<?php
//connexion à la base
require 'params.php';
$link=mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');
mysql_select_db($base,$link) or die('La base de données n\'existe pas');

//récupération des messages
$sql="SELECT * FROM `livre` ORDER BY `id` DESC";
$rep=mysql_query($sql,$link);
mysql_close($link);
while ( $ligne = mysql_fetch_array($rep))
{
	//on récupère les valeurs des diffèrent champs pour chaque message
	$nom=$ligne['nom'];
	$email=$ligne['email'];
	$date=$ligne['date'];
	$message=$ligne['message'];
	/* on remplace les retours chariots '\n'
	 par le symbole de retour à la ligne en HTML : <br /> */
	$message=nl2br($message);
	
	//on affiche ses valeurs dans un tableau
	print "<table>
	<tr><th>Par :<a href=mailto:$email>$nom</a>/th>
	<th>Le : $date</th></tr>
	<tr><td colspan='2'>$message</td></tr>
	</table>";

}

?>
</body>
</html>

Ceci n'est que le strict minimum pour faire un livre d'or. D'autres fonctionnalités, comme le nombre d'affichage par page, peuvent être ajoutées.