5) TP : un Mini-Chat
Transcription
5) TP : un Mini-Chat
TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 1 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html TP : un Mini-Chat Voilà un TP qui, je l'espère, va vous permettre de souffler un peu. Il faut dire qu'on a pas mal enchaîné de choses totalement nouvelles dans les chapitres précédents (Base de données, extraction des informations contenues dans une table etc...). Auteur : M@teo21 Créé le : 17/08/2005 à 16h33 Modifié le : 24/03/2007 à 16h44 Noter et commenter ce tutorial Imprimer ce tutorial Ici, je vous propose de passer à l'application pratique de ce que vous venez d'apprendre. Vous allez voir que vous savez maintenant faire des scripts très intéressants : vous avez le niveau pour réaliser un Mini-Chat (ce qu'on va faire), un livre d'or et même un script de news ! Ces scripts sont en fait assez similaires, mais le plus simple d'entre eux est le Mini-Chat. Ne vous inquiétez pas, le TP pour le système de news ne va pas tarder (je sais que vous mourez d'envie de vous y attaquer, mais vous n'êtes pas tout à fait prêts ;)) Et puis, ne vous y trompez pas : un Mini-Chat sur votre site ça peut s'avérer trrrès intéressant :D. Les plus grands sites en ont (ils l'appellent parfois "Shoutbox" ou encore "Tribune libre"). De plus, ça ajoutera énormément de dynamisme à votre site web. Réalisation du Mini-Chat Etape 1 : prérequis Vous pourrez suivre ce TP sans problème si vous avez lu tous les chapitres précédents. Plus précisément, on va utiliser les notions suivantes : Transmission de variables via un formulaire Lire dans une table Ecrire dans une table Vous remarquerez que, dans la plupart des TP, la transmission de variables par formulaire est très importante. Pour l'instant, on a rapidement vu comment ça marchait dans le chapitre sur les variables. Mais, dans la partie III, nous étudierons cela plus en détail car il y a beaucoup de choses intéressantes à savoir Etape 2 : préparation du script Avant de commencer à rédiger comme des bourrins notre script PHP, qu'est-ce que je vous avais dit qu'il fallait absoluement faire ? Un brouillon ! Eh oui, votre script ne va pas s'écrire tout seul comme par magie , alors il va falloir réfléchir un petit peu avant de commencer. C'est un script très simple, donc vous ne devriez pas avoir de problèmes pour comprendre. 29/07/2007 18:16 TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 2 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html Quelles seront les fonctionnalités de mon Mini-Chat ? Ce sera quelque chose de basique pour commencer, mais rien ne vous empêchera de l'améliorer à votre sauce On souhaite avoir, sur la même page, deux zones de texte en haut : une pour écrire votre pseudo, une autre pour écrire votre petit message. Ensuite, un bouton "Envoyer" permettra d'envoyer les données à MySQL, pour qu'il les enregistre dans une table de la Base de Données. En-dessous, le script devra afficher les 10 derniers messages qui ont été enregistrés (parce que si vous les affichez tous et que vous avez 1000 messages ça risque d'être un peu long !) en allant du plus récent au plus ancien. C'est un peu flou ? OK, voilà à quoi doit ressembler votre page PhP une fois terminée : C'est plus clair là ? Bon, comme à chaque fois que l'on se servira d'une base de données, on va commencer par étudier la forme de la table (quels seront les champs). Voici un petit tableau que j'ai mis 1 minute à pondre sur une feuille de papier brouillon : ID pseudo message 1 Tom Il fait beau aujourd'hui vous trouvez pas ? 2 John Ouais, ça faisait un moment qu'on n'avait pas vu la lumière du soleil ! 3 Patrice Ca vous tente d'aller à la plage aujourd'hui ? Y'a de super vagues ! 4 Tom Cool bonne idée ! J'amène ma planche ! 5 John Comptez sur moi ! Voilà : on a un champ ID de type INT (comme toujours) qui nous permettra de savoir dans quel ordre ont été postés les messages. Il faudra le mettre en auto_increment pour que les numéros s'écrivent tous seuls, et ne pas oublier de sélectionner "Primaire" (ça dit à MySQL que c'est le champ qui numérote les entrées) Pour les champs "pseudo" et "message", vous utiliserez le type VARCHAR (taille limite : 255 caractères, c'est suffisant, on n'est pas là pour écrire un roman !). Commencez donc par créer cette table dans votre base de données. Appelez-la comme vous voulez, moi j'ai choisi "minichat". 29/07/2007 18:16 TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 3 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html C'est fait ? Très bien Et maintenant ? Eh bien vous êtes pratiquement au point. Comme pour le TP sur la page protégée par mot de passe, vous n'utiliserez qu'une seule page. Le code ressemblera en gros à ceci : Le formulaire doit renvoyer sur la même page. Si votre page s'appelle "minichat.php", alors votre balise de formulaire sera : <form action="minichat.php" method="post"> Ca va donc recharger la même page ! Oui, mais cette fois il se passera quelque chose de différent ! En effet, 2 variables seront créées (par exemple $_POST['pseudo'] et $_POST['message']), et vous allez pouvoir vérifier si elle contiennent quelque chose. SI elles contiennent quelque chose, ALORS vous enregistrez les données. Sinon, bah vous ne faites rien (je ne veux pas voir de else dans votre code !). En résumé, lorsque la page se charge, il y a 2 cas : L'utilisateur a posté un message, $_POST['pseudo'] et $_POST['message'] ne sont pas vides. On enregistre ces informations, puis on affiche les 2 zones de texte les 10 derniers messages. L'utilisateur n'a pas posté de message, $_POST['pseudo'] et $_POST['message'] sont vides. Alors on ne fait rien, on se contente d'afficher les 2 zones de texte et les 10 derniers messages. Vous aurez besoin de deux conditions pour vérifier si vos variables ne sont pas vides : 1) Utilisez un isset pour vérifier si les variables existent (comme dans le premier TP). 2) Puis, si les variables existent, vérifiez si elles ne sont pas vides (NULL). Si ces 2 conditions sont remplies, alors vous pouvez envoyer le message dans la base de données sans crainte. Ah mais attendez... il peut y avoir un problème quand même ! Aleeerte ! Ce n'est pas fini, il reste un point important à voir. Il faut que vous soyez au courant, car si vous ne faites pas attention un tel script peut poser problème pour la sécurité de votre site ! Oui, c'est très important. Il ne s'agit pas de quelque chose de compliqué, pourtant beaucoup de monde l'oublie et ça peut poser problème sur certains sites. QUOOIIII ? Je vais me faire hacker mon site à cause de ton script !? Disons qu'il y a un petit danger En effet, si le visiteur poste dans son message du code HTML, celui-ci sera enregistré dans la base de données. Lorsque que quelqu'un affichera son message, le code HTML sera lu ! OK, si le visiteur a posté une balise inoffensive du style <em>, on ne risque rien. Mais il pourrait très bien insérer un code javascript qui affiche une boîte de dialogue (très gênant) ou même qui pourrait scanner vos cookies et 29/07/2007 18:16 TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 4 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html récupérer des informations confidentielles ! Bon je vous ai fait assez peur comme ça Pour régler le problème en un tour de main, on utilisera une fonction PHP toute prête : htmlspecialchars. On l'appliquera aux 2 variables $_POST['pseudo'] et $_POST['message'] : Code : PHP $message = htmlspecialchars ($_POST['message']); $pseudo = htmlspecialchars ($_POST['pseudo']); Ceci nous permet donc d'éviter que le visiteur puisse poster du HTML ou (pire) du Javascript. Pour être totalement sécurisé ça ne suffit pas. Je ne souhaite pas rentrer dans le détail pour le moment (parce que c'est limite un cours de hacking qu'il faudrait après ) mais il faut aussi se protéger des injections sql, c'est-à-dire des gens qui, par une technique précise, pourraient essayer d'introduire du code SQL dans le message. C'est particulièrement dangereux. Pour éviter ça, là encore il suffit d'appliquer une fonction. Le code parfaitement sécurisé à utiliser sera donc : Code : PHP $message = mysql_real_escape_string(htmlspecialchars($_POST['message'])); $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo'])); Etape 3 : à vous de jouer ! J'adore l'étape 3 : je n'ai rien à faire C'est maintenant à votre tour de réfléchir. Avec les éléments que je vous ai donnés, et avec ce que vous avez appris dans les chapitres précédents, vous devez être capables de réaliser le Mini-Chat ! Si vous avez un peu de mal, et si votre script ne marche pas, ne le supprimez pas dans un moment de rage (il ne faut jamais s'énerver ^^). Au contraire, si vraiment vous n'y arrivez pas, mettez votre code de côté et comparez avec la correction. Ce sera très enrichissant pour vous, vous verrez ! Etape 4 : correction Hop hop hop ! On relève les copies ! Vous allez maintenant voir ce que j'attendais de vous. Si vous avez réussi à faire quelque chose qui marche : bravo ! Et si vous n'y êtes pas arrivés, ne vous en faites pas trop : le principal est que vous ayez fait l'effort de réfléchir. En voyant la correction, vous apprendrez énormément de choses ! Code : PHP 29/07/2007 18:16 TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 5 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Mini-chat</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <style type="text/css"> form { text-align:center; } </style> <body> <?php if (isset($_POST['pseudo']) AND isset($_POST['message'])) // Si les variables existent { if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL) // Si on a quelque chose à enregistrer { // D'abord, on se connecte à MySQL mysql_connect("localhost", "sdz", "mot_de_passe"); mysql_select_db("coursphp"); // On utilise les fonctions PHP mysql_real_escape_string et htmlspecialchars pour la sécurité $message = mysql_real_escape_string(htmlspecialchars($_POST['message'])); $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo'])); // Ensuite on enregistre le message mysql_query("INSERT INTO minichat VALUES('', '$pseudo', '$message')"); // On se déconnecte de MySQL mysql_close(); } } // Que l'on ait enregistré des données ou pas... // On affiche le formulaire puis les 10 derniers messages // Tout d'abord le formulaire : ?> <form action="minichat.php" method="post"> <p> Pseudo : <input type="text" name="pseudo" /><br /> Message : <input type="text" name="message" /><br /> <input type="submit" value="Envoyer" /> </p> </form> <?php // Maintenant on doit récupérer les 10 dernières entrées de la table // On se connecte d'abord à MySQL : mysql_connect("localhost", "sdz", "mot_de_passe"); mysql_select_db("coursphp"); // On utilise la requête suivante pour récupérer les 10 derniers messages : $reponse = mysql_query("SELECT * FROM minichat ORDER BY ID DESC LIMIT 0,10"); // On se déconnecte de MySQL mysql_close(); // Puis on fait une boucle pour afficher tous les résultats : while ($donnees = mysql_fetch_array($reponse) ) { 29/07/2007 18:16 TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 6 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html Essayer ! Bien entendu, ce script ne fonctionnera chez vous que si vous avez créé une table "minichat" comme je vous l'ai montré plus haut. Bon, comment marche ce script ? 1. Tout d'abord, on fait un isset sur les deux variables $_POST['pseudo'] et $_POST['message'] pour vérifier si les variables existent. Si elles n'existent pas, on ne va pas plus loin. Si elles existent, on procède à un deuxième test... 2. La seconde condition vérifie si les variables $_POST['pseudo'] et $_POST['message'] contiennent quelque chose. En effet, il serait ennuyeux qu'un visiteur envoie un message vide ou qu'il ne donne pas son pseudo. Si c'est le cas, alors on va enregistrer les données (en n'oubliant pas d'utiliser mysql_real_escape_string et htmlspecialchars pour les raisons de sécurité que je vous ai expliquées plus tôt). 3. Ensuite, que l'on ait dû enregistrer quelque chose ou pas, on écrit le code HTML du formulaire. C'est tout bête, vous avez déjà vu ça dans le chapitre sur les variables et même dans le TP de la protection par mot de passe. 4. Enfin, on affiche les 10 derniers messages à l'aide de la requête SQL suivante : SELECT * FROM minichat ORDER BY ID DESC LIMIT 0,10 Cela signifie : "Sélectionne tous les champs dans minichat (SELECT * FROM minichat), ordonne les entrées dans l'ordre décroissant (ORDER BY ID DESC), et n'en prends que 10 (LIMIT 0,10)" La première fois que vous affichez la page, $_POST['pseudo'] et $_POST['message'] n'existent pas, donc PHP n'exécutera pas ce qui se trouve dans la condition du isset. Si vous vous amusez à poster un message, il sera d'abord enregistré dans la base de données. Ensuite, on affiche les messages. Comme le vôtre a été enregistré juste avant, c'est normal qu'il apparaisse de suite ! C'est-y pas beau tout ça ? Vous allez pouvoir chatter sur votre propre site web avec vos visiteurs ! Etape 5 : améliorez ce script ! Oh, mais il serait dommage d'en rester là... Le script de Mini Chat que je vous ai fait faire est certes marrant, mais je suis sûr que vous aimeriez l'améliorer ! Cependant, je ne peux que vous donner des idées. Je ne peux pas vous proposer de corrections pour chacune de ces idées, ça serait beaucoup trop long ! Mais ne vous en faites pas : si je vous propose de faire des améliorations, c'est que vous en êtes capables Et puis, n'oubliez pas qu'il y a un forum sur le site : si jamais vous séchez un peu, n'hésitez pas à aller y demander de l'aide ! Voici quelques idées pour améliorer le script qui me viennent à l'esprit : Retenir le pseudo. En effet, le pseudo qu'a tapé le visiteur se trouve dans la variable $_POST['pseudo'].Comme vous le savez probablement, il est possible en HTML de pré-remplir un champ avec l'attribut "value". Par exemple : Code : HTML <input type="text" name="pseudo" value="M@teo21" /> Remplacez M@teo21 par un echo de $_POST['pseudo'], et le pseudo sera automatiquement inscrit ! Empêcher les messages en double. En effet, si vous actualisez la page (touche F5) pour voir s'il y a de nouveaux messages, votre navigateur va vous demander s'il doit renvoyer les informations... Si vous dites "oui", alors le message qu'il vient d'envoyer sera réenvoyé, ce qui fait qu'il apparaîtra en double !Pour éviter cela, il y a bien une solution : avant d'enregistrer un message, vous vérifiez que le dernier message posté n'est pas identique. Si c'est le même, vous n'enregistrez pas le message (sinon vous auriez eu un double !). Supprimer automatiquement les vieux messages. A chaque fois qu'un nouveau message va être posté, vous comptez le nombre total de messages dans la table. S'il y en a par exemple plus de 1000, vous supprimez le plus vieux, histoire de faire de la place pour pas trop encombrer votre base de données (à moins que vous ne 29/07/2007 18:16 TP : un Mini-Chat - Site Web - Lecture du tutorial - Le Site du Zéro 7 sur 7 http://www.siteduzero.com/tuto-3-146-1-tp-un-mini-chat.html préfériez garder un historique complet ;)) Il est probable que peu d'entre vous aient trouvé de suite le code "exact" que j'attendais. Mais si vous n'étiez pas trop loin, c'est tout aussi bon. Et même si vous n'avez pas réussi, passez un moment à essayer de comprendre le code, c'est super important. Il faut que vous soyez capables de le refaire sans aide ! Maintenant, si vous voulez utiliser ce script PHP sur votre site web, aucun problème ! Mais je vous conseille d'y apporter quelques améliorations : au niveau du graphisme d'abord (parce que c'est rudement moche ce que j'ai fait), mais aussi au niveau du code PHP (vous pourriez ajouter un champ qui enregistre l'heure du message !) Je vous donne rendez-vous au prochain TP, et d'ici là restez attentifs en cours Auteur : M@teo21 Noter et commenter ce tutorial Imprimer ce tutorial 29/07/2007 18:16