The manual Page
English version
accueil | glossaire | downloads | liens ]
 

Le livre d'or de TmP

Principe

Le principe du livre d'or n'est pas très compliqué. C'est principalement un accès à une base de données MySQL.

La table associée au livre d'or s'appelle livre_or. Elle contient 5 colonnes : Date, Nom, Mail, Message et ID. ID est autoincrémenté, il est donc inutile de le mettre dans la requête d'ajout.

L'intérêt de ce script est qu'il se suffit à lui-même : le formulaire d'ajout appelle la page elle-même ce qui évite d'avoir à utiliser une petite page externe ne contenant que trois mots de remerciement. De plus, la personne rajoutant un message le voit tout de suite apparaître dans la liste.

La seule difficulté du script, peut-ête, est la façon de gérer l'affichage sur plusieurs pages. Il y a une variable, passée en paramètre dans l'URL (page) qui indique le numéro de la page à afficher. Cette variable est initialisée à 0 pour la première page, 1 pour la deuxième... S'il n'y a pas de paramètre page dans l'URL, ou si c'est une valeur négative, on prend la valeur 0, et si on demande une page trop avancée (page 10 alors qu'il n'y a que 3 messages en tout et pour tout à afficher), on considère que l'on demande la dernière page. Voir l'affichage des messages.

Implémentation

Le script PHP peut être découpé en 2 parties : une première partie traitant l'éventuel message à ajouter, et une deuxième traitant l'affichage des messages enregistrés. Les deux manipulations se font toutefois avec une seule et même connexion au serveur MySQL.

Nouveau message

On utilise un formulaire avec une méthode POST. Ceci a l'avantage de permettre des passages de messages longs et de laisser la barre d'URL des navigateurs propre. Autre intérêt pour la programmation en PHP : on récupère directement des variables PHP initialisées avec les données entrées dans le formulaire.

La première chose à faire est vérifier que toutes les informations nécessaire à la validation du message sont là :

// Y a-t-il un message a ajouter ?
if ($message != "") {
	$message = htmlentities($message);
// Y a-t-il un nom ?
	if ($nom != "") {
		...
	}
}

Le htmlentities permet de tranformer les éventuels codes HTML écrits dans le message dans un format qui ne sera pas interprété par le navigateur. Lorsqu'il manque quelque chose, on affiche un message. Sinon, on ajoute le message dans la table :

// Requete d'ajout dans la table
$query  = "INSERT INTO livre_or (Date, Nom, Mail, Message)";
$query .= "VALUES ($date, \"$nom\", \"$mail\", \"$message\")";
mysql_query($query) or die ("probleme lors de l'insertion du message");

On avait auparavant calculé la date comme suit :

$date = date("YmdHis", time());

Affichage des messages

Ici, rien de particulier. On fait une requête auprès du serveur pour récupérer les messages, et on les affiche avec une mise en page. Pour ne pas trop charger la page, on n'en affiche que 10 à la fois . La seule subtilité est la gestion de l'affichage sur plusieurs pages. Pour savoir quelle page afficher, on utilise une variable (page) passée en argument dans l'URL.

La première chose à faire est donc de récupérer cette variable. Cela se fait très simplement avec la fonction parse_str qui a pour principal avantage de créer les variables detectées :

parse_str(getenv("QUERY_STRING"));

On se retrouve donc avec une variable $page. Après, ce n'est qu'un jeu pour déterminer les messages à récupérer. Dans le cas de ce script, on effectue une requête sur tous les messages en cours, et avec mysql_data_seek, on ne garde que les messages intéressants :

for($i = $page*10; ($i < $nbr) && ($i < $page*10+10); $i++) {
	if (! mysql_data_seek($result, $i)) {
		continue;
	}
	if (! $row = mysql_fetch_row($result)) {
		continue;
	}
// On affiche enfin les messages
	list($annee, $mois, $jour) = split("-", substr($row[0], 0, 10));
	$nom = $row[1];
	$mail = $row[2];
	$message = $row[3];
	echo "<TABLE align=\"...
	...
}

Auparavant, on a fait des tests pour savoir quelle page exactement afficher :

Au début de programme :

if (($page == "") || ($page < 0)) {
// On numerote les pages a partir de 0
	$page = 0;
}

Puis après avoir récupéré le nombre de messages ($nbr=mysql_num_rows($result);) :

$nbr = mysql_num_rows($result);
// Si on demande une page au-dela de ce que contient la bdd,
// on considere qu'on demande la derniere page
if ($page*10+10 > $nbr) {
	$page = ($nbr-$nbr%10)/10;
}

Dernier point : lorsqu'il manque un élément nécessaire à la validation du message, les autres données valables sont recopiées dans leur champ par un dernier script PHP :

<SPAN style="font-family: Arial; font-weight: normal;">nom&nbsp;:</SPAN><BR>
<?
echo "<INPUT name=\"nom\" maxlength=\"64\" type=\"text\" size=\"20\"";
echo " style=\"font-size: 10px\;\" value=\"$nomform\">\n";
?>

Et ainsi de suite avec $mail et $message. Ce qui se passe en fait est que ces trois variables ($nom, $mail et $message) sont toujours ajoutées ; elles sont initialisées à chaque fois avec les valeurs envoyées par le formulaire et remise à zéro lorsque le message à été ajouté.

Tout à la fin, il ne reste plus qu'à afficher des liens vers les pages précédentes ou suivantes en fonction du numéro de la page affichée.

Fonctions utiles

nom description
htmlentities transforme les caractères spéciaux d'une chaîne de caractères en entités HTML (caractères encodés)
parse_str récupère et crée toutes les variables passées dans l'URL
split découpe une chaîne de caractères suivant une chaîne de séparation
date formate une date

Charger le code complet.


format imprimable format imprimable



Copyright © 2000-2006 themanualpage.org - Ce site est soumis aux conditions décrites dans les licences GNU GPL et FDL.