Training Brussels | Centre de formation Informatique ...



Formation PHP/MySQL 3 jours FRFormation PHP/MySQL 3 jours FRPHP est un langage de programmation professionnel qui permet de créer des sites et applications web, basés sur des concepts poussés de programmation. Malgré tout, PHP a su conserver ce qui l'a rendu si populaire et si répandu : un langage souple, facilement abordable et adapté aux développeurs les moins expérimentés.Pour aborder cette formation, il suffit de posséder les notions de base du HTML et des feuilles de style CSS, afin de pouvoir générer le code à afficher par le navigateur. L'apprentissage de PHP se fait de fa?on progressive, en dévoilant les notions fondamentales du langage.Il n'est pas question ici de faire le tour complet des possibilités de PHP, ni d'entrer dans des considérations complexes de programmation. Le but de cette formation est de vous faire comprendre les principes de fonctionnement de PHP pour que vous soyez capable de programmer des pages attrayantes répondant aux attentes de vos visiteurs.Vous allez découvrir comment utiliser les ressources d'un serveur pour récupérer des informations à afficher, puis comment utiliser ce serveur pour traiter, stocker et enregistrer des actions de l'utilisateur afin de lui fournir des informations adaptées à ses demandes.Vue d'ensemble de la formation :IntroductionLes bases de PHPInteragir avec l'utilisateurCréer un site webPHP et les bases de donnéesTable des matièresIntroductionPrésentation de PHP- Présentation générale de PHP- Historique de PHP- Installation de PHP?: Easy PHP- Outils de développement? - utilisation du bloc-notes- Présentation et installation de Notepad++- Présentation de l'interface NetBean- Présentation et installation de FileZillaLes bases de PHP- Rappels sur l'utilisation de PHP- Insertion de code PHP dans un document- Les variables- Les types- Déclaration et utilisation des tableaux- Précisions sur l'affichage des cha?nes de caractères- Les constantesLes opérateurs- L'opérateur de concaténation- Les opérateurs arithmétiques- Les opérateurs d'affectation- Les opérateurs de comparaison et les conditions- Comparaison des nombres décimaux- Les opérateurs logiques ou booléensBoucles et conditions- Les structures conditionnelles- Les boucles- Les fonctions et la portée des variables- Présentation de la documentation officielle sur Interagir avec l'utilisateur- Récupérer et utiliser des paramètres GET- Récupération des données d'un formulaire- utiliser les cookies pour stocker des informations- Considérations sur la sécurité- utiliser les fonctions des tableaux pour filtrer une donnée- utiliser les fonctions des cha?nes de caractères pour filtrer une donnée- utiliser les fonctions de filtres pour valider une donnée- utiliser les expressions régulières pour valider une donnéeLes sessions en PHP- Présentation des sessions- Mécanisme de propagation des identifiants de session- Autres informations utiles sur les sessions- stocker et récupérer des variables de session- Gérer un tableau dans une variable de session- Récupérer un fichier transmis par un champ de formulaire de type "file"- Vérification du fichier re?u- Récupérer des informations sur le serveur avec $_sERVER PHP et les bases de données- Pourquoi utiliser des bases de données- Bases de données, sQL et MysQL- Présentation de phpMyAdmin et WorkBench- Créer une base avec phpMyAdmin et WorkBench- Créer des tables avec phpMyAdmin et WorkBench- Créer des tables avec un script PHP- stocker ses identifiants de base de données- Modifier la structure d'une table- Insérer et supprimer des entrées dans une table- Ajouter des données dans la base avec PHP- Protéger les données à envoyer à MysQL- Récupérer des données de la base- Trier les résultats d'une requête- Compter le nombre d'entrées dans une table- Vérifier des conditions dans la base de données - Effectuer des requêtes sur plusieurs tables d'une base de données- ConclusionLa programmation en PHP - introductionQu'est-ce que PHP ?Avant toute chose, il faut que vous sachiez ce que veut dire?XHTML?avant de commencer à lire toute la section concernant PHP. En effet, le XHTML (nouvelle version du langage HTML) est la base de construction des sites web (tous les sites web, utilisant PHP ou non, doivent envoyer du code HTML aux internautes qui le consultent). En effet, le navigateur que vous utilisez pour consulter les sites web ne sait transcrire en document visible que du code (X)HTML.Je vous encourage donc à aller consulter la section?XHTML. Si vous ne connaissez pas ce langage, apprendre le PHP ne vous servira pas à grand-chose. Bien que PHP ne se limite pas qu'à l'affichage de code HTML (il peut aussi générer des images ou agir sans renvoyer de code à l'internaute) il est aujourd'hui inconcevable de parler de PHP sans savoir comment les sites web dits "statiques" sont con?us. Un site web statique est un site qui ne peut avoir son contenu modifié en temps réel sans intervention du webmaster (le webmaster étant le "gérant" du site). Le PHP va vous permettre de créer ce qu'on appelle des sites "dynamiques". Par opposition au HTML, le PHP qui est interprété par le serveur permet d'effectuer beaucoup plus de choses (affichage de l'heure du serveur en temps réel pour donner un exemple très simple).Depuis tout à l'heure je vous parle de?serveur. Qu'est-ce qu'un serveur ? pour faire simple, lorsque vous consultez un site internet, ce site est stocké sur une machine qui vous l'envoie. Cette machine est appelée?serveur. C'est elle qui contient le site et qui va permettre, si PHP est installé, d'analyser le code PHP pour le transcrire en code HTML. Voici un schéma explicatif simple (à gauche, l'internaute qui consulte le site, à droite le serveur qui stocke le site) :Maintenant que vous avez compris les bases de ce qu'on appelle?l'architecture client/serveur, parlons un peu de PHP. De nombreux sites l'utilisent pour pouvoir créer tout ce qui permet de créer de l'interactivité avec le visiteur, comme par exemple des forums, chats, livres d'or, compteurs de visiteurs, etc ...Différences entre X(HTML) et PHPNous avons vu que XHTML ne permet de créer que des pages statiques. PHP peut se mettre dans du code XHTML pour rendre celui-ci dynamique ! Voyons le code d'une page XHTML basique permettant d'afficher "Bonjour" et la même page en PHP (la page en PHP devra porter l'extension .php pour que le serveur puisse savoir que cette page devra être analysée par PHP avant d'être envoyée, sinon vous aurez le code source PHP qui s'affichera au visiteur, ce qui pourrait être f?cheux, surtout si vous placez des mots de passe !Voici le code basique de notre page en XHTML :<html?xmlns=""?xml:lang="fr"?lang="fr"><head><title>Ici le titre de votre page</title><meta?http-equiv="Content-Type"?content="text/html; charset=iso-8859-1"?/><link?rel="stylesheet"?href="style.css"?media="screen"?type="text/css"?/></head><body>Bonjour !</body></html>Nous allons maintenant transformer cette page en PHP, nous utiliserons pour afficher le texte la fonction (qui n'en est pas réellement une, mais je ne vais pas vous compliquer la t?che)?echo(). Cette fonction permet d'afficher du texte, nous verrons comment l'utiliser en détail plus loin dans la section PHP.<html?xmlns=""?xml:lang="fr"?lang="fr"><head><title>Ici le titre de votre page</title><meta?http-equiv="Content-Type"?content="text/html; charset=iso-8859-1"?/><link?rel="stylesheet"?href="style.css"?media="screen"?type="text/css"?/></head><body><?php?echo?'Bonjour?!';??></body></html>On constate que le code PHP se place dans le code HTML (pensez à donner à votre page une extension .php). A première vue, on ne voit pas énormément de différences, et on pourrait se demander de l'utilité d'un tel code. Pour l'instant, l'utilité d'un tel code est nulle. Pourquoi ? car utiliser PHP pour générer du contenu?statique?(ici, votre page affichera tout le temps?Bonjour !) est inutile car cela engendre une perte de performances (le serveur doit d'abord traiter la page en PHP avant de l'envoyer, contrairement à une page (X)HTML). Mais patience ! PHP ne se limite pas à l'affichage de texte (et heureusement), d'abord on commence par les bases et on approfondira ensuite :)Nous venons de voir un exemple de code PHP intégré dans du code XHTML, mais le PHP peut très bien être à part dans un fichier, sans code XHTML autour. Ne jamais oublier que le PHP permet de générer du texte (ou des images) qui seront envoyés au navigateur. Le code XHTML généré par PHP via la fonction echo() n'est rien d'autre que du texte. Si nous prenons par exemple ceci :<html?xmlns=""?xml:lang="fr"?lang="fr"><head><title>Ici le titre de votre page</title><meta?http-equiv="Content-Type"?content="text/html; charset=iso-8859-1"?/><link?rel="stylesheet"?href="style.css"?media="screen"?type="text/css"?/></head><body><p>Bonjour !</p></body></html>On peut générer la même chose en PHP (il y a plusieurs fa?ons de le faire, on peut aussi très bien mettre tout le contenu XHTML dans la fonction?echo()) :<html?xmlns=""?xml:lang="fr"?lang="fr"><head><title>Ici le titre de votre page</title><meta?http-equiv="Content-Type"?content="text/html; charset=iso-8859-1"?/><link?rel="stylesheet"?href="style.css"?media="screen"?type="text/css"?/></head><body><?php?echo?'<p>Bonjour?!</p>';??></body></html>Le visiteur verra absolument la même page XHTML ! Pourquoi utiliser PHP alors ? Parce que gr?ce à lui, vous pourrez mettre des instructions beaucoup plus complexes que le serveur exécutera (comme par exemple lire un fichier et en afficher le contenu, ou encore afficher le nombre de visiteurs d'une page, etc ...). Vous pourrez également personnaliser des pages en fonction des visiteurs par exemple (comme je le fais sur ce site en affichant?Bonjour visiteur?si vous n'êtes pas connecté au site et en le rempla?ant par votre pseudo si vous êtes connecté). Tout ceci est impossible en (X)HTML !Installer EasyPhpPour utiliser PHP sur votre PC en local, il vous faut l'installer. Afin de simplifier l'opération, il existe un package regroupant Apache (le serveur web), PHP, et Mysql (SGBD très simple d'utilisation). Ce package se nomme?EasyPHP. Voici comment l'installer :Installation de?EasyPhp?sous Windows :Commencez par télécharger EasyPHP ici :? ensuite le fichier. Vous arrivez à cet écran (toutes les captures ont été faites avec la version 1.6 d'easyPHP) :Cliquez sur oui. L'écran de bienvenue suivant s'affiche :Cliquez sur suivant. Les termes de la licence s'affichent. Cliquez sur Oui pour accepter la licence. On vous propose ensuite de choisir le répertoire d'installation. Il s'agit par défaut de?c:\program files\easyphpChoisissez votre répertoire et cliquez sur suivant. Indiquez ensuite le répertoire qui sera visible dans le menu démarrer. Cliquez sur suivant. Un récapitulatif des opérations qui vont se dérouler s'affiche. Cliquez sur installer. L'installation se déroule. L'écran suivant appara?t ensuite :Cochez "lancer Easyphp.exe" et cliquez sur terminer. Vous apercevez ensuite dans le systray (en bas à droite de la barre des t?ches) une ic?ne en forme de E. Faites un clic droit dessus. Vous apercevez le menu suivant :Cliquez sur?web local. La page contenue dans le répertoire d'installation d'easyphp suivi du sous répertoire?www?(c:\program files\easyphp\www par défaut) s'affiche. C'est dans ce répertoire que vous devrez placer vos fichiers php pour qu'ils soient interprétés par le serveur. Je vous conseille de placer des sous dossiers dans le répertoire www car la création de plusieurs sites deviendrait un calvaire sans une organisation efficace des données.Si le lien "Web local" n'est pas accessible, cliquez sur "Démarrer". Cela redémarrera le serveur apache, php et mysql.EasyPHP est désormais installé.WAMP [Tutoriel] - Environnement de travail en PHPEnvironnement de travailNous avons vu brièvement dans la première partie que PHP s'exécutait c?té serveur. Or, vous avez s?rement envie de pouvoir coder en PHP sur votre ordinateur et de voir instantanément les résultats des modifications que vous pourrez apporter à vos scripts PHP !Petit rappel, architecture client/serveur :Rassurez-vous, vous n'aurez pas besoin d'investir dans un serveur distant pour ?a. Je vais vous montrer comment installer WAMPserver. WAMPserver est un logiciel qui contient un?package?de différentes choses :Apache : il s'agit du serveur web. C'est lui qui renvoie les pages (X)HTML, les fichiers, etc...PHP : il communique avec apache et permet de traiter les pages PHP. Il renvoie les pages PHP traitées à apache qui les renvoie au client.MySQL : il s'agit d'un système de gestion de base de données. Nous parlerons plus loin de ce qu'est une base de données.PHPMyAdmin : Vous allez pouvoir gr?ce à PHPMyAdmin disposer d'une interface de gestion de vos bases de données bien plus ergonomique que la console.Toutes ces choses seront installées automatiquement lorsque vous installerez WAMP (Windows Apache MySQL PHP).?Installer WAMPInstaller WAMP est très facile, il suffit de se laisser guider en cliquant sur?Next?lorsqu'on vous le demande. Commencez par télécharger WAMP sur le site officiel à l'adresse suivante :?. Exécutez ensuite l'archive que vous venez de télécharger. Une fenêtre de ce style appara?t :Cliquez sur?Next, on vous demande ensuite d'accepter le contrat de licence. Acceptez-le puis cliquez encore sur?Next.Choisissez ensuite un répertoire dans lequel vous installerez WAMP puis cliquez sur Next. L'installation s'effectue ensuite, vous pouvez fermer la fenêtre puis démarrer WAMP.Si tout va bien, vous devriez voir appara?tre un petit symbole en bas à droite de votre barre des t?ches, un symbole blanc (ici, il est tout à gauche) :Si ce symbole a un fond blanc comme ici, c'est parfait. Si le fond est jaune ou rouge, cela signifie que les services ne se sont pas installés correctement, ou qu'ils n'ont pu démarrer. Dans le doute, relancez WAMP après l'avoir quitté proprement (clic droit, exit).Une fois WAMP installé, vous allez pouvoir consulter sa page d'accueil par défaut (réalisée en PHP). Pour ce faire, démarrez votre navigateur web, puis tapez dans la barre d'adresses ceci :?. Une page se charge :Cette page contient la liste des dossiers situés dans le répertoire?www?de WAMP. Par défaut, il vous faudra placer vos dossiers et fichiers PHP dans ce dossier (ou dans un sous dossier), pour qu'ils puissent être analysés par PHP. Pour tester le bon fonctionnement de tout ?a, créez une page nommée "test.php" dans le dossier "www". Mettez-y le contenu suivant :?<?php?echo?'<p>Bonjour?!</p>';??>Enregistrez la page et rendez-vous à l'adresse suivante :?. Vous devriez voir "Bonjour !" d'affiché. Si c'est le cas, tout est bien installé, sinon vérifiez que vous ne vous êtes pas trompé de répertoire et que WAMP est bien lancé (fond blanc).Il existe encore d’autres possibilités?pour infos: bases de PHP - débuter en PHPLes bases de PHPAprès avoir vu comment installer un serveur qui va vous permettre d'interpréter PHP sur votre ordinateur, nous allons maintenant voir avec quels outils on peut coder en PHP, et comment on dit à telle page "il y a du code PHP dedans, interprète-le".Ce qu'il faut savoir avant tout, c'est que les fichiers PHP ne sont que des fichiers textes. Ils ne sont donc pas compilés (en?binaire). Lorsque vous demandez une page, PHP lit le code et l'interprète au fur et à mesure. On parle de code interprété. Comme ce sont des fichiers textes, vous allez pouvoir utiliser n'importe quel éditeur de texte pour coder en PHP. Personnellement j'utilise le NotePad++ intégré à Windows, mais il existe des centaines d'éditeurs de ce genre. A vous d'utiliser celui qui vous convient le mieux :)Les tags (ou balises) PHPLorsque vous enregistrez votre fichier texte avec l'extension .php, vous pouvez avoir plusieurs codes dedans : du (X)HTML, du javascript, du CSS ... mais aussi du PHP. Comment l'analyseur syntaxique de PHP fait-il la différence ? il sait en fait que le code est délimité par des balises appelées?tags. Ces tags sont un peu spéciaux, ils se présentent sous cette forme :<?php?//code?PHP?ici?//encore?du?code?ci?nécessaire,?sur?plusieurs?lignes??>Le code PHP est donc situé entre les tags?<?php?et??>. Avant de vous parler du reste, je fais le point sur l'autre syntaxe existante et que vous rencontrerez parfois si vous téléchargez certaines sources mal codées. Il s'agit des tags?<??et??>. N'utilisez pas ces tags qui pourront ne pas être compatibles avec toutes les configurations de serveurs existantes. Pour faire simple, PHP dispose d'un réglage appelé?short_open_tags, celui-ci peut prendre deux valeurs (On ou Off). Si il est sur On, cette syntaxe sera acceptée et comprise par l'analyseur de code, dans le cas contraire vos scripts ne pourront être interprétés, tandis que si vous utilisez tout le temps?<?php?et??>, quelle que soit la valeur de cette option, vos scripts fonctionneront parfaitement.Quand utiliser PHP ?Vous allez s?rement en apprenant PHP vouloir convertir tout votre site en PHP et donc remplacer le code (X)HTML par des echo() en rafale. Ce n'est pas une bonne solution, on ne doit pas utiliser PHP pour générer du contenu statique. Si votre page n'est pas destinée à changer dans le temps dynamiquement, laissez-la en HTML. Vous gagnerez en performances et soulagerez votre serveur. Vous pourrez également lorsque vous aurez beaucoup de fichiers dans votre répertoire savoir quels sont ceux qui sont statiques des autres.Afficher du texteOpération de base en PHP, l'affichage du texte peut se faire de différentes fa?ons. Nous allons voir la fa?on la plus simple et la plus rapide (au niveau du temps de traitement serveur) d'afficher du texte. Il s'agit de la "fonction"?echo()?(il s'agit d'une structure du langage en réalité et non d'une fonction, en effet il n'est pas obligatoire de l'utiliser avec des parenthèses).Voici l'exemple d'affichage de texte utilisant echo :<?php?????echo?'bonjour?!';?//affiche?le?texte?"bonjour?!"??>Tout ?a c'est bien beau mais si vous souhaitez afficher une apostrophe comment fait-on ? Et bien il suffit d'ajouter le caractère \ (antislash) devant l'apostrophe à ajouter. Un petit exemple vaut mieux qu'un long discours :<?php?????echo?'l\'apostrophe?au?milieu?d\'une?cha?ne';??>Vous auriez pu écrire également ?a comme ceci (avec des guillemets doubles) :<?php?????echo?"l'apostrophe?au?milieu?d'une?cha?ne";??>Le premier exemple étant plus rapide à traiter par PHP (on reparlera de la rapidité d'exécution dans la section traitant de l'optimisation de PHP).?Chaque instruction se termine par un point virgule en PHP, ne l'oubliez pas car vous obtiendrez des erreurs parfois insolubles si votre code devient long.Exercices pratiques?: Hello World<html lang="en"><head><title>Hello World</title></head><body><?php// single-line comments are like this# or like this (less common)/* double-line comments are written like this, so that you can keep typing and typing*/?><?php echo "Hello World!"; ?><br /><?php echo "Hello" . " World!"; ?><br /><?php echo 2 + 3; ?></body></html>Les commentaires :Les commentaires sont très utiles pour donner des informations utiles sur ce que va faire une portion de code. Ils ne seront pas affichés ni analysés par PHP. Vous pouvez mettre ce que vous voulez dedans (même du code PHP, (X)HTML, etc...). Il existe deux sortes de commentaires que nous allons voir maintenant.Les commentaires sur une ligne : ils permettent de commenter sur une seule ligne, on les place généralement à droite ou au dessus de (ou des) ligne(s) concernée(s) :?<?php?????echo?'bonjour?!';?//affiche?le?texte?"bonjour?!"??>?Comme vous le constatez, le commentaire qui ne sera pas analysé se situe après les?//. Ceci marque le début du commentaire.Les commentaires sur plusieurs lignes : ils peuvent occuper une ou plusieurs lignes et sont délimités par les tags?/*?et?*/. Voici comment on les utilise :<?php?????/*???????Nous?allons?maintenant?afficher?du?texte???????On?peut?commenter?sur?plusieurs?lignes???????et?mettre?du?code?<?php?echo?'test';??>???????dans?les?commentaires?????*/?????echo?'l\'apostrophe?au?milieu?d\'une?cha?ne';??>PHP : les variablesDéfinition et présentationAfficher du texte c'est bien beau, mais si il y a une chose essentielle dans tout langage de programmation qui se respecte, ce sont bien les variables. Qu'est-ce qu'une variable ? déjà rien qu'au nom, on peut penser qu'il s'agit quelque chose qui va changer ! Et c'est bien de ?a qu'il s'agit !Une variable est une zone mémoire qui va contenir des données, ces données pourront changer au fil du temps. Vous devez s?rement vous demander à quoi cela va bien nous servir dans nos applications PHP, mais j'y viens !Imaginions que vous souhaitiez afficher le prénom du visiteur, prénom que ce même visiteur aura renseigné dans un formulaire. Vous ne connaissez pas le prénom de ce visiteur tant qu'il ne l'a pas renseigné, donc vous ne pouvez pas l'afficher directement via ceci par exemple :<?php?????echo?'prénom';??>Pour pouvoir afficher le prénom du visiteur, il faut que celui-ci le renseigne. On verra plus bas sur cette page comment récupérer des données provenant de formulaires. Ici, on va supposer que le prénom est "Anthony". Ce prénom sera stocké dans une variable, et c'est la valeur de cette variable que nous allons afficher ensuite (j'espère que vous suivez toujours) ! Le code basique devient le suivant :<?php??????$prenom?=?'Anthony';??????echo?$prenom;?//affiche?"Anthony"??>Les guillemets (simples ou doubles) dans le echo sont ici inutiles quand vous affichez une variable. Elles peuvent même avoir un effet non voulu. En effet, tout ce qui se trouve entre guillemets simples (apostrophes) n'est pas remplacé par PHP (au contraire des guillemets doubles). Nous verrons plus loin comment utiliser ces propriétés.<?php??????$prenom?=?'Anthony';??????echo?'$prenom';?//affiche?"$prenom"??????echo?'$prenom?vaut?:'.$prenom;?//affiche?"$prenom?vaut?:?Anthony"??>Une variable est constituée d'un nom de variable et d'une valeur. Pour l'exemple que j'ai utilisé ci-dessus, le nom de la variable est "prenom" et la valeur est "Anthony". Une variable commence toujours par le signe dollar $ suivi d'une lettre ou d'un underscore _ (touche 8 du pavé alphanumérique)Types de variablesLe langage PHP n'est pas un langage très typé, c'est à dire qu'une variable peut être alternativement un nombre, une cha?ne de caractères ou que sais-je encore ! Voici les principaux types de données en PHP (cela ne changera presque rien pour vous au niveau de la syntaxe, mais il est bon de les savoir. Notez que les noms de variables pris en exemple ainsi que leurs valeurs sont purement arbitraires) :Cha?ne de caractères : la valeur est délimitée par des guillemets (simples ou doubles, on privilégiera les simples pour une question de rapidité) :?<?php??????$prenom?=?'Anthony';??>Un nombre :?on enlève les guillemets cette fois, cela permet de dire à PHP qu'il s'agit d'un nombre (qu'il soit entier ou flottant) :<?php??????$nombre?=?7;??????$nombre?=?3.02;??>Un booléen : les variables booléennes peuvent prendre deux valeurs : la valeur?TRUE?(vrai) et la valeur?FALSE?(faux). Elles peuvent être utiles pour savoir par exemple si une option est activée :<?php??????$afficher_options?=?FALSE;?//on?n'affichera?pas?les?options??????$utiliser_cache???=?TRUE;??//on?utilisera?un?cache??>Le type objet : nous n'allons pas en parler pour l'instant, sachez qu'il s'agit d'un type spécial que l'on utilise uniquement avec des classes. Tout ceci ne vous parle pas encore, c'est normal.Exercices pratiques?: Les variables<html lang="en"><head><title>Variables</title></head><body><?php$var1 = 10;echo $var1;echo "<br />";$var1 = 100;echo $var1;echo "<br />";$var2 = "Hello world";echo $var2;?></body></html>Les cha?nes de caractères<html lang="en"><head><title>Strings</title></head><body><?phpecho "Hello World<br />";echo 'Hello World<br />';$greeting = "Hello";$target = "World";$phrase = $greeting . " " . $target;echo $phrase;?><br /><?phpecho "$phrase Again<br />";echo '$phrase Again<br />';echo "{$phrase}Again<br />";?></body></html>Les fonctions cha?nes de caractères<html lang="en"><head><title>String Functions</title></head><body><?php$first = "The quick brown fox";$second = " jumped over the lazy dog.";$third = $first;$third .= $second;echo $third;?><br />Lowercase: <?php echo strtolower($third); ?><br />Uppercase: <?php echo strtoupper($third); ?><br />Uppercase first: <?php echo ucfirst($third); ?><br />Uppercase words: <?php echo ucwords($third); ?><br /><br />Length: <?php echo strlen($third); ?><br />Trim: <?php echo "A" . trim(" B C D ") . "E"; ?><br />Find: <?php echo strstr($third, "brown"); ?><br />Replace by string: <?php echo str_replace("quick", "super-fast", $third); ?><br /><br />Repeat: <?php echo str_repeat($third, 2); ?><br />Make substring: <?php echo substr($third, 5, 10); ?><br />Find position: <?php echo strpos($third, "brown"); ?><br />Find character: <?php echo strchr($third, "z"); ?><br /></body></html>Les integers<html lang="en"><head><title>Integers</title></head><body><?php$var1 = 3;$var2 = 4;?>Basic Math: <?php echo ((1 + 2 + $var1) * $var2) / 2 - 5; ?><br /><br />Absolute value: <?php echo abs(0 - 300); ?><br />Exponential: <?php echo pow(2,8); ?><br />Square root: <?php echo sqrt(100); ?><br />Modulo: <?php echo fmod(20,7); ?><br />Random: <?php echo rand(); ?><br />Random (min,max): <?php echo rand(1,10); ?><br /><br />+= : <?php $var2 += 4; echo $var2; ?><br />-= : <?php $var2 -= 4; echo $var2; ?><br />*= : <?php $var2 *= 3; echo $var2; ?><br />/= : <?php $var2 /= 4; echo $var2; ?><br /><br />Increment: <?php $var2++; echo $var2; ?><br />Decrement: <?php $var2--; echo $var2; ?><br /><br /><?php// PHP will convert a string to an integer// but it is sloppy programmingecho 1 + "2 houses";?></body></html>Les nombres flotants<html lang="en"><head><title>Floating Point Numbers</title></head><body><?php echo $float = 3.14; ?><br /><?php echo $float + 7; ?><br /><?php echo 4/3; ?><br /><?php echo 4/0; ?><br /><br />Round: <?php echo round($float, 1); ?><br />Ceiling: <?php echo ceil($float); ?><br />Floor: <?php echo floor($float); ?><br /><br /><?php $integer = 3; ?><?php echo "Is {$integer} integer? " . is_int($integer); ?><br /><?php echo "Is {$float} integer? " . is_int($float); ?><br /><br /><?php echo "Is {$integer} float? " . is_float($integer); ?><br /><?php echo "Is {$float} float? " . is_float($float); ?><br /><br /><?php echo "Is {$integer} numeric? " . is_numeric($integer); ?><br /><?php echo "Is {$float} numeric? " . is_numeric($float); ?><br /><br /></body></html>Les booléens<html lang="en"><head><title>Booleans</title></head><body><?php$result1 = true;$result2 = false;?>Result1: <?php echo $result1; ?><br />Result2: <?php echo $result2; ?><br />result2 is boolean? <?php echo is_bool($result2); ?><br /><?php$number = 3.14;if( is_float($number) ) {echo "It is a float.";}?></body></html>Les opérateurs?de calculPHP sait heureusement faire des calculs. Les symboles utilisés (appelés opérateurs) pour effectuer des calculs sont les suivants :OpérateurSignification+Addition-Soustration*Multiplication/Division%Division entière (modulo)Voici quelques exemples simples d'utilisation des opérateurs (il en existe d'autres que nous verrons plus loin au fur et à mesure des exemples) :<?php??????$entier???=?7;??????$flottant?=?2.5;??????$somme????=?4?+?5;?//$somme?vaut?9??????$multiplic=?2*5;???//$multiplic?vaut?10??????$division?=?9/3;???//$division?vaut?3??????$modulo???=?10?%?3?//$modulo?vaut?1??????$multi_variables?=?$entier?*?$flottant;?//7?*?2.5?=?17.5?donc?$multi_variables?vaut?17.5??>Exercices pratiques?:<html lang="en"><head><title>Comparison and Logical Operators</title></head><body><?php$a = 4;$b = 3;$c = 1;$d = 20;if (($a >= $b) || ($c >= $d)) {echo "a is larger than b OR ";echo "c is larger than d";}?><br /><?php$e = 100;if (!isset($e)) {$e = 200;}echo $e;?><br /><?php// don't reject 0 or 0.0$quantity = "";if (empty($quantity) && !is_numeric($quantity)) {echo "You must enter a quantity.";}?></body></html>Les variables de formulaires et d'adresses web :Ne vous est-il jamais arrivé de tomber sur des pages ayant des url à rallonge de ce style ? :?page.php?param1=valeur&param2=autre_valeur?(et ainsi de suite)PHP va vous permettre de récupérer le nom et la valeur des paramètres qui seront dans votre url si il y en a. Ceci est très pratique par exemple pour transmettre des variables et valeurs de page en page (exceptionnellement, car nous verrons qu'il existe un moyen plus efficace pour faire ceci plus loin dans notre approfondissement du PHP).Avant d'utiliser ce principe sur vos pages, il faut faire par contre attention à la transmission de variables. En effet, si vous faites des traitements sur ces variables (ou si vous utilisez leur valeur) il faut bien faire attention à certaines choses, notamment les suivantes :Si vous souhaitez afficher la valeur de la variable, il faut que si quelqu'un tape du code HTML dans la barre d'adresses, qu'il soit affiché et non considéré comme du code car n'importe qui peut mettre n'importe quoi (du javascript affichant une message box jusqu'à la récupération de cookies confidentiels sur le PC client).Si vous allez utiliser la valeur dans une requête de base de données (si vous ne savez pas ce qu'est une base de données pas de souci, on verra tout ?a après), il faut protéger la requête en utilisant des fonctions de protection comme mysql_real_escape_string() pour une base de données MySQL.Imaginions que vous souhaitiez maintenant proposer un service d'affichage de prénom à des webmasters. Ils appelleront une page de votre site avec des paramètres dans l'adresse, et votre page renverra le prénom qui est dans l'url. Prenons un exemple d'url :ù valeur correspondra à la valeur du prénom !Le nom des variables créées en PHP est très simple et commence par $_GET. Ici, en appelant cette page, PHP créera une variable nommée $_GET['prenom'] qui portera la valeur 'valeur' ainsi qu'une variable $_GET['style'] qui portera la valeur '1'. Attention, ceci ne sera pas équivalent aux définitions de variables suivantes :<?php??????$_GET['prenom']?=?'X';?//un?prénom?n'importe?lequel??????$_GET['style']??=?1;?//style?qui?est?ici?un?entier??>En effet, vous pourriez bien vous dire que c'est la même chose, et ?a l'est presque, il y a juste un tout petit détail dont il faut bien se rappeler : PHP considère les valeurs quelles qu'elles soient comme des cha?nes de caractères !Notre code est donc équivalent à ?a :<?php??????$_GET['prenom']?=?'X';?//un?prénom?n'importe?lequel??????$_GET['style']??=?'1';?//style?qui?est?ici?une cha?ne de caractères??>Maintenant, si vous souhaitez faire des opérations sur ces variables, il faut tout d'abord vérifier qu'elles existent, sinon vous aurez une erreur, en effet si vous souhaitez par exemple afficher la valeur d'une variable qui n'existe pas, avec un PHP bien configuré vous obtiendrez une erreur de?undefined variable. On utilise pour savoir si une variable existe, la fonction isset(). Si vous ne savez pas ce qu'est une fonction ce n'est pas bien grave, sachez juste que cette fonction renvoie un booléen VRAI si la variable existe, et FAUX sinon. Si nous souhaitons afficher le prénom, on regarde d'abord qu'il existe, on effectue ensuite un htmlentities() pour transformer un éventuel code html en sa valeur affichable (on empêche donc les failles de sécurité de ce style). Notre code devient celui-ci :<?php??????if(isset($_GET['prenom']))?//On?vérifie?que?la?variable?$_GET['prenom']?existe??????{?????????????echo?htmlentities($_GET['prenom']);?//On?affiche?le?prénom?tout?en?l'ayant?protégé?des?failles?d'injection?de?code?HTML??????}??>Les variables $_GET font partie de ce qu'on appelle des variables superglobales. Cela ne vous dit rien pour l'instant, mais sachez qu'il s'agit de variables accessibles depuis n'importe où (on verra plus loin que les variables ne peuvent pas être utilisées partout, et bien les superglobales peuvent l'être, en gros voici une des différences majeures qui les séparent des autres). Bon c'est bien beau vous allez me dire les variables $_GET, mais ?a ne fait pas forcément ce que vous voudriez. Si vous souhaitez récupérer l'?ge d'un visiteur qu'il aura rentré dans une zone de texte via la méthode post d'un formulaire, il va falloir utiliser cette fois-ci les variables nommées $_POST. Le principe est exactement le même que pour les variables $_GET. Prenons l'exemple d'un formulaire en XHTML contenant un champ texte nommé "age". Le visiteur remplira son ?ge et on l'affichera à l'écran. Le code en XHTML est le suivant :<form method="post"?action="traitement.php"><p><input type="text"?name="age"?/></p><p><input type="submit"?value="Envoyer"?/></p></form>Le code en PHP est très simple et peut se résumer à ?a :<?php??????if(isset($_POST['age'])?AND?ctype_digit($_POST['age'])?AND?$_POST['age']?>?0)??????{???????????echo?htmlentities($_POST['age']);??????}??>N'ayez pas peur en voyant tout ce code. En fait, la première fonction isset(), vous savez à quoi elle sert :p je vous l'ai expliqué tout à l'heure. Concernant la fonction ctype_digit(), elle permet de vérifier que la variable est bien composée de chiffres et uniquement de chiffres (que la cha?ne soit un entier donc). On pourrait dire "bah oui mais pourquoi ne pas utiliser la fonction is_int() qui permet de vérifier si un nombre est un entier" ? tout simplement car comme je vous l'ai expliqué plus haut, les variables de type $_GET et $_POST sont considérées comme des cha?nes de caractères par PHP et non des nombres. Pour finir, on vérifie que l'?ge soit un nombre positif. Si toutes ces conditions sont réunies, on affiche l'?ge.La concaténation :La quoi ? n'ayez pas peur en voyant ce terme barbare. La concaténation est l'opération qui permet de "coller" deux valeurs de variables pour n'en former qu'une par exemple. En PHP, l'opérateur de concaténation est le point (.)Pour cette partie, des exemples valent à mon avis mieux que de longs discours. Voyons comment afficher plusieurs variables à la suite ou encore compléter la valeur d'une variable déjà définie.<?php??????$nom????=?'Dupont';??????$prenom?=?'Pierre';??????echo?$nom.$prenom;?//va?afficher?"DupontPierre"??????echo?$nom.'?'.$prenom;?//va?afficher?"Dupont?Pierre"??????echo?'$nom.$prenom';?//va?afficher?"$nom.$prenom"??????echo?'$nom$prenom';?//va?afficher?$nom$prenom??????$nom?.=?$prenom;?//est?équivalent?à?$nom?=?$nom?.?$prenom??????echo?$nom;?//affichera?"DupontPierre"??????$nom??=?'Dupont';??????$nom?.=?'?'.$prenom;??????echo?$nom;?//affichera?"Dupont?Pierre"??>Je pense qu'on a fait le tour niveau exemples là :pPHP - Les fonctionsDéfinition et présentationUne fonction est un bloc de code PHP destiné généralement à être réutilisé plusieurs fois. Plut?t que d'écrire X fois le morceau de code, on le met dans une fonction, et c'est cette fonction que l'on appellera dès qu'on l'aura décidé. On pourra utiliser les fonctions pour par exemple afficher un texte bien défini (ce que nous allons voir plus bas) ou encore effectuer des calculs répétitifs en fonction de paramètres d'entrée (comme par exemple calculer une conversion en degrés C° => degrés fahrenheit, vous fournissez la valeur des degrés Celcius et la fonction vous retourne l'autre valeur. Dans ce cas, le paramètre sera la température d'entrée en degrés C°). Voici la syntaxe de base pour dire à PHP "ceci est une fonction, il faut la traiter comme telle" :<?php??????function?mafonction()??????{??????}??>On constate que le premier mot est le mot?function, il est obligatoire et signifie que le bloc traité par PHP sera une fonction.?Une fonction comporte toujours des parenthèses.Il existe deux grands types de fonctions : les fonctions qui retournent une valeur, et celles qui n'en retournent pas (on appelle ces fonctions des procédures).Exemple de procédure affichant "bonjour tout le monde !" :<?php??????function?hello_world()??????{???????????echo?'bonjour?tout?le?monde?!';??????}??>Pour afficher?Bonjour tout le monde !?n'importe où dans votre code, vous n'aurez plus qu'à taper ceci :<?php??????hello_world();?//appelle?la?fonction?"hello_world"?qui?va?afficher?"Bonjour?tout?le?monde?!"??>Les paramètresNous venons de voir l'exemple d'une procédure qui ne contenait aucun paramètre.?Les paramètres sont des variables que l'on place entre les deux parenthèses. Ces paramètres servirons de données sur lesquelles effectuer la fonction. Généralement, les paramètres impliquent que l'on va retourner quelque chose (on aura donc de très grandes chances d'avoir des fonctions et non des procédures). Nous verrons plus loin que le passage par référence des paramètres (ne vous inquiétez pas si vous ne comprenez pas encore ce que je dis, vous le comprendrez en bas de cette page) permet de s'affranchir généralement du retour d'une valeur.Exemple d'une fonction calculant le produit de deux nombres et retournant le résultat :<?php??????function?produit($nombre1,?$nombre2)??????{????????????return?$nombre1?*?$nombre2;??????}??>Ici la fonction retournera le produit des deux nombres. Remarquez qu'on utilise le mot clé?return?pour renvoyer une valeur. Vous pouvez également utiliser le mot clé?return?pour stopper l'exécution de la fonction (en retournant une valeur). Tout ce qui se trouve après return ne sera pas exécuté.Si vous souhaitez afficher le produit de 10 et 2 par exemple, vous pouvez faire ceci :<?php??????echo?produit(10,?2);??>Nous pouvons assigner des valeurs par défaut aux paramètres. Pourquoi assigner des valeurs par défaut ? c'est simple, assigner une valeur par défaut à un paramètre permet de se passer du passage du paramètre lorsque vous appelez la fonction (attention, ceci n'est pas général). Voici un exemple :<?php??????function?produit($nombre1?=?10,?$nombre2?=?2)??????{????????????return?$nombre1?*?$nombre2;??????}??>Ici, nous assignons comme valeurs par défaut les nombres 10 et 2. Si nous appelons maintenant notre fonction comme ceci :<?php??????echo?produit();??>Nous obtiendrons le même résultat que plus haut, car les deux paramètres ne sont pas obligatoires ici. Par contre attention, si vous renseignez un paramètre, il sera prioritaire, c'est à dire que si vous appelez la fonction comme ceci :<?php??????echo?produit(5,?2);??>Ici, on multipliera 5 par 2 et pas 10 par 2. Donner une valeur par défaut aux paramètres convient donc lorsque vous souhaitez ne pas être obligé de rajouter des paramètres lorsque vous dites à PHP "exécute-moi cette fonction". Attention avec l'exemple suivant :<?php??????echo?produit(5);??>Il n'y a qu'un seul paramètre ! Alors lequel va-t-il remplacer ? Et bien il s'agit du premier paramètre. En effet, lorsque vous ne renseignez pas tous les paramètres, PHP va remplacer les paramètres dans l'ordre.Passage de paramètres par référenceLe passage de paramètres par référence n'est pas compliqué en soit. Voyons un exemple simple et expliquons ensuite son fonctionnement :<?php??????function?ajouter_cinq($nombre)??????{????????????$nombre?+=?5;?//équivalent?de?$nombre?=?$nombre?+?5????????????return?$nombre;??????}??????$mon_entier?=?15;??????echo?ajouter_cinq($mon_entier);?//affichera?20??????echo?$mon_entier;?//affichera?15??>Ici on effectue ce qu'on appelle un passage de paramètres par recopie. Ne vous prenez pas trop la tête avec ces termes, il s'agit d'un peu de culture générale ;) En fait cela veut dire que la variable que l'on va passer dans la fonction (ici $mon_entier) sera recopiée dans une autre variable nommée $nombre (qui prendra donc la même valeur). La fonction utilise ensuite cette variable $nombre pour faire ses traitements, et non la variable $mon_entier. C'est pourquoi lorsqu'on affiche le contenu de la variable $mon_entier après avoir appelé la fonction, on obtient toujours 15.Voici maintenant la version avec le passage par référence :<?php??????function?ajouter_cinq($nombre)??????{????????????$nombre?+=?5;?//équivalent?de?$nombre?=?$nombre?+?5????????????return?$nombre;??????}??????$mon_entier?=?15;??????echo?ajouter_cinq(&$mon_entier);?//affichera?20??????echo?$mon_entier;?//affichera?20??>L'avantage de ce type d'opération est que vous travaillez directement sur la variable d'origine, il n'y a pas de recopie et donc les performances peuvent être meilleures. Vous n'avez d'ailleurs plus forcément besoin de retourner une valeur. Prenons cet exemple qui fait exactement la même chose que le précédent :<?php??????function?ajouter_cinq($nombre)??????{????????????$nombre?+=?5;?//équivalent?de?$nombre?=?$nombre?+?5??????}??????$mon_entier?=?15;??????ajouter_cinq(&$mon_entier);??????echo?$mon_entier;?//affichera?20??>CAS PRATIQUES?:<?phpfunction hello_world(){echo "Bonjour le monde!"; //affiche la fonction}hello_world();?><br/><?phpfunction produit($nbr1, $nbr2){return $nbr1 * $nbr2;} echo produit(10,2);?><br/><?phpfunction produit($nbr1=2, $nbr2=10){return $nbr1 * $nbr2;}?><?phpecho produit();?>FonctionDescriptionCode PHPRés.addslashes()?Ajoute des anti-slashes devant les caractères spéciaux$res =?addslashes("L'a");Echo $res?;L\'astripslashes()?Retire les anti-slashes devant les caractères spéciaux.$res =?stripslashes("L\'a");Echo $res?;L'adechex()?Retourne la valeur hexadécimale d'un nombre (ici 2548).$res =?dechex("2548");Echo $res?;9f4ceil()Retourne le nombre entier supérieur ( utiliser floor() pour le nombre entier inférieur et round() pour le nombre entier le plus proche).$res =?ceil("12.1");Echo $res?;13chunk_split()Permet de scinder une cha?ne en plusieurs morceaux.$res =?chunk_split("DGDFEF","2","-");Echo $res?;DG-DF-EF-htmlentities()Remplace les caractères par leur équivalent HTML (si ils existent).$res =?htmlentities("&");Echo $res?;&amp;strstr()Recherche le premier caractère 'p' dans la cha?ne et affiche le reste de la cha?ne y compris le 'p'.$res =?strstr?("webmaster@", "p");Echo $res?;strlen()Retourne la longueur de la cha?ne$res =?strlen("lachainedecaracteres");Echo $res?;20strtolower()Passe tous les caractères en minuscules.$res =?strtolower("LA CHAINE dE caRActERes");Echo $res?;la chaine de caracteresstrtoupper()Passe tous les caractères en MAJUSCULES.$res =?strtoupper("LA CHAINE dE caRActERes");Echo $res?;LA CHAINE DE CARACTERESstr_replace()Remplace un caractère par un autre dans une cha?ne. Tiens compte de la casse.$res =?str_replace("a","o","Lalala");Echo $res?;Lololotrim()Efface les espaces blancs (\n, \r, etc)? au début et à la fin d'une cha?ne (pas au milieu).$res =?trim("??Salut le monde?? ");Echo $res?;Salut le mondeucfirst()Met la première lettre de chaque cha?ne en Majuscule.$res =?ucfirst("salut le monde. ca va ?");Echo $res?;Salut le monde. ca va ?ucwords()Met la première lettre de chaque mot d'une cha?ne en Majuscule.$res =?ucwords("salut le monde");Echo $res?;Salut Le Mondestrpos()Recherche la position du premier caractères trouvé. Retourne le nombre de caractères placés avant lui (ici 4).$res =?strpos("abcdef","e");Echo $res?;4ereg()Recherche si une cha?ne de caractère est contenue dans une autre (ex. recherche si "ABCDE" contient "BCD").if(ereg("BCD","ABCDEF")){echo?"oui";} else {echo?"non";}ouiPHP - Les conditionsDéfinition et présentationLes conditions sont les éléments les plus utilisés dans n'importe quel langage. Il est impossible de faire l'impasse dessus. Gr?ce aux conditions, vous allez pouvoir effectuer des actions telles que "Si le visiteur est un homme, afficher 'Bonjour Monsieur', sinon afficher 'Bonjour Madame'". Vous allez pouvoir effectuer plein de traitements en fonction de données diverses. Une condition n'est ni plus ni moins qu'un bloc de code PHP contenant des instructions à exécuter en fonction de la condition qui elle sera placée entre parenthèses (bien que ce ne soit pas toujours le cas, on verra tout en bas l'opérateur ternaire, en attendant ne soyez pas affolés par le terme, tout deviendra compréhensif plus bas). Voyons déjà quelques opérateurs nécessaires pour appliquer tout ?a aux conditions :Les opérateurs de base conditionnelsOn utilise quelques opérateurs très simples en PHP pour comparer deux variables. Nous ne verrons pas certains opérateurs particuliers qui dépassent le cadre de ce chapitre, mais vous les reverrez dans la partie qui concernera l'optimisation et la rédaction de vos scripts.Voici les opérateurs de base et leur signification :SymboleSignification$a == $b$a est égal à $b$a < $b$a est inférieur à $b$a > $b$a est supérieur à $b$a <= $b$a est inférieur ou égal à $b$a >= $b$a est supérieur ou égal à $b$a != $b$a est différent de $b$a <> $b$a est différent de $bLa structure de base if/elseLa structure if / else est la base en PHP. Gr?ce à elle, vous allez pouvoir effectuer deux choses : une action si la condition est vraie, et une autre action si elle est fausse. On traduit le if par "si" et le else par "sinon". Voyons un exemple :<?php??????$heure?=?12;?//On?définit?une?heure??????if($heure?<?12)?//Si?l'heure?contenue?dans?la?variable?est?inférieure?à?12??????{???????????echo?'Il?n\'est?pas?encore?midi?!';??????}??>Vous constaterez en exécutant ce code qu'en fonction de ce que vous allez attribuer à la variable $heure, le message "Il n'est pas encore midi" s'affichera ou non. Vous pouvez tout à fait effectuer plusieurs actions dans une condition. Vous pouvez également imbriquer des conditions :<?php??????$heure?=?12;?//On?définit?une?heure??????if($heure?<?12)?//Si?l'heure?contenue?dans?la?variable?est?inférieure?à?12??????{???????????echo?'Il?n\'est?pas?encore?midi?!';???????????if($heure?==?11)???????????{?????????????????echo?'Il?est?bient?t?midi?!';???????????}??????}??>Notez l'utilisation du double égal, si vous mettez un simple signe égal, ?a voudra dire "si j'ai attribué 11 à la variable, alors faire l'action", le problème est qu'attribuer une valeur à une variable renvoie toujours (dans notre cas) la valeur VRAI, donc la condition sera toujours exécutée. Pensez-y lorsque vous coderez vos scripts PHP car sinon vous risquez de vous retrouver avec des erreurs insolubles !Bon tout ?a c'est bien beau, mais vous aimeriez peut-être passer à plus évolué ! Nous allons donc voir maintenant le if / else en PHP. Else signifie "sinon", nous allons prendre un exemple simple qui consiste à comparer les valeurs de deux variables. Si les deux variables sont égales, nous afficherons "Les valeurs sont égales" dans le cas contraire nous afficherons "Les valeurs ne sont pas égales".<?php??????$nombre1?=?12;??????$nombre2?=?13;??????if($nombre1?==?$nombre2)?//Si?les?deux?nombres?sont?égaux??????{????????????echo?'Les?valeurs?sont?égales';??????}??????else?//Sinon??????{????????????echo?'Les?valeurs?ne?sont?pas?égales';??????}??>Nous allons maintenant voir une autre structure de base un peu plus évoluée que le if / else, il s'agit du if / elseif / else.La structure conditionnelle if / elseif / elseEn fran?ais, on appelle cette structure le "si, sinon si, sinon". Gr?ce à ?a, vous allez pouvoir exécuter des instructions PHP en fonction de conditions plus poussées. Prenons un exemple simple consistant à dire "Si les deux nombres sont égaux, on affiche 'Les valeurs sont égales' sinon si le nombre 1 est supérieur au nombre 2 on affiche 'Le nombre 1 est supérieur' et si aucune de ces conditions n'est validée, on affiche 'Le nombre 2 est supérieur'".Voyons ce que ?a donne niveau code :<?php??????$nombre1?=?12;??????$nombre2?=?13;??????if($nombre1?==?$nombre2)?//Si?les?deux?nombres?sont?égaux??????{????????????echo?'Les?valeurs?sont?égales';??????}??????elseif($nombre1?>?$nombre2)?//Les?deux?nombres?ne?sont?pas?égaux?mais?$nombre1?est?supérieur?à?$nombre2??????{????????????echo?'Le?nombre?1?est?supérieur';??????}??????else?//Les?deux?nombres?ne?sont?pas?égaux,?et?$nombre1?n'est?pas?supérieur?à?$nombre2??????{????????????echo?'Le?nombre?2?est?supérieur';??????}??>Au niveau purement syntaxique, le code que je viens de vous présenter est équivalent à celui-ci :<?php??????$nombre1?=?12;??????$nombre2?=?13;??????if($nombre1?==?$nombre2)?//Si?les?deux?nombres?sont?égaux??????{????????????echo?'Les?valeurs?sont?égales';??????}??????else?//Les?deux?nombres?ne?sont?pas?égaux??????{???????????if($nombre1?>?$nombre2)?//$nombre1?est?supérieur?à?$nombre2???????????{????????????????echo?'Le?nombre?1?est?supérieur';???????????}???????????else?//$nombre1?n'est?pas?supérieur?à?$nombre2???????????{????????????????echo?'Le?nombre?2?est?supérieur';???????????}??????}??>Les conditions multiplesLes conditions multiples vont vous permettre de donner plusieurs conditions pour effectuer une ou plusieurs actions. Par exemple, si vous souhaitez que les visiteurs aient plus de 13 ans pour visiter le site et qu'ils soient des hommes, vous pourrez faire une condition de ce style :<?php??????$homme?=?FALSE;?//booléen?ayant?la?valeur?FALSE?(faux)?ici?il?s'agit?donc?d'une?femme??????$age???=?17;??????if($homme?===?TRUE?AND?$age?>?13)?//Le?visiteur?est?un?homme?et?agé?de?plus?de?13?ans??????{????????????echo?'Vous?pouvez?visiter?le?site';??????}??????else?//Le?visiteur?est?une?femme?ou?alors?il?a?moins?de?13?ans??????{????????????echo?'Vous?ne?pouvez?pas?visiter?le?site';??????}??>Notez la présence ici du triple égal. Ce n'est pas une erreur. Je ne vous ai pas présenté cet opérateur auparavant pour ne pas compliquer la t?che. En fait cet opérateur, en plus de comparer les valeurs des variables, compare également leurs types (bien que la notion de type soit très faible en PHP). Cet opérateur permet de valider une condition si les variables ont même valeur et même type. En fait, un booléen peut aussi être représenté par un nombre (0 pour FALSE et 1 pour TRUE). Le problème est que lorsque vous utiliserez des fonctions qui renvoient des booléens ou des nombres, comment distinguer 0 et 1 de FALSE et TRUE ?. C'est là qu'intervient le signe ===, qui vous permettra de savoir si la fonction a renvoyé TRUE ou 1, ce que ne permet pas de faire l'opérateur ==Il existe de la même manière l'opérateur !== qui regarde si deux variables sont de valeurs ou de types différents.Voyons maintenant la liste des opérateurs utilisables :OpérateurSignificationAND"et" logiqueOR"ou" logiqueXOR"ou exclusif" logique&&"et" logique, avec priorité supérieure||"ou" logique, avec priorité supérieureVoyons un peu les opérateurs && et || ainsi que leurs différences avec les opérateurs AND et OR. Prenons le cas d'une condition qui doit vérifier "Si il s'agit d'un homme ou d'une femme qui a dans ce cas plus de 13 ans, on autorise l'accès au site". On constate que tous les hommes peuvent accéder au site, mais les femmes doivent avoir au moins 13 ans. On peut faire ?a de plusieurs fa?ons. La première, purement logique, utilise des parenthèses (en effet, ce qui se trouve entre parenthèses sera traité en premier par PHP, comme en mathématiques) :<?php??????if($homme?===?TRUE?OR?($hommme?===?FALSE?AND?$age?>?13))?//On?veut?soit?tous?les?hommes,?soit?les?filles?de?plus?de?13?ans??????{????????????echo?'Vous?pouvez?visiter?le?site';??????}??????else??????{????????????echo?'Vous?ne?pouvez?pas?visiter?le?site';??????}??>Vous constatez qu'au bout d'un moment, si les conditions sont multiples, le nombre de parenthèses peut être important, nous allons donc utiliser les opérateurs prioritaires && et || pour supprimer les parenthèses. Voici le code obtenu :<?php??????if($homme?===?TRUE?OR?$hommme?===?FALSE?&&?$age?>?13)?//On?veut?soit?tous?les?hommes,?soit?les?filles?de?plus?de?13?ans??????{????????????echo?'Vous?pouvez?visiter?le?site';??????}??????else??????{????????????echo?'Vous?ne?pouvez?pas?visiter?le?site';??????}??>Comme le && est prioritaire, PHP effectue d'abord le traitement pour savoir si il s'agit d'une fille ayant plus de treize ans. On pourrait simuler ?a par ce code :<?php??????if($homme?===?TRUE?OR?$fille_de_plus_de_treize_ans?===?TRUE)?//On?veut?soit?tous?les?hommes,?soit?les?filles?de?plus?de?13?ans??????{????????????echo?'Vous?pouvez?visiter?le?site';??????}??????else??????{????????????echo?'Vous?ne?pouvez?pas?visiter?le?site';??????}??>Ensuite PHP utilise le OR classique pour faire une condition entre les deux variables.Exercices pratiques?:<html lang="en"><head><title>Logical</title></head><body><?php$a = 3;$b = 4;if ($a > $b) {echo "a is larger than b";} elseif ($a < $b) {echo "a is smaller than b";} else {echo "a is equal to b";}?><br /><?php // Only welcome new users$new_user = true;if ($new_user) {echo "<h1>Welcome!</h1>";echo "<p>We are glad you decided to join us.</p>";}?><br /><?php // don't divide by zero$numerator = 20;$denominator = 0;$result = 0;if ($denominator > 0) {$result = $numerator / $denominator;}echo "Result: {$result}";?></body></html>Le switchLe switch est une instruction particulière. En effet, vous allez pouvoir remplacer des quantités de if/elseif/else par un seul switch. Voyons comment cela fonctionne avec un exemple simple : Imaginions que nous souhaitons afficher un message différent en fonction d'un nombre. Si ce nombre vaut 1, on affichera "le nombre vaut 1", si il vaut 2 "le nombre vaut 2", et si il vaut 7, on affichera "c'est un très bon chiffre". Ceci est possible via le code suivant :<?php??????$nombre?=?7;??????if($nombre?==?1)??????{????????????echo?'Le?nombre?vaut?1';??????}??????elseif($nombre?==?2)??????{????????????echo?'Le?nombre?vaut?2';??????}??????elseif($nombre?==?7)??????{????????????echo?'C\'est?un?très?bon?chiffre?!';??????}??????else??????{????????????echo?'Le?nombre?ne?vaut?ni?1,?ni?2,?ni?7';??????}??>Vous constaterez que si vous voulez faire 10 cas possibles, ?a va devenir très lourd au niveau de la syntaxe.<?php??????$nombre?=?7;??????switch($nombre)??????{????????????case?1:????????????????echo?'Le?nombre?vaut?1';????????????break;????????????case?2:????????????????echo?'Le?nombre?vaut?2';????????????break;????????????case?7:????????????????echo?'C\'est?un?très?bon?chiffre?!';????????????break;????????????default:????????????????echo?'Le?nombre?ne?vaut?ni?1,?ni?2,?ni?7';????????????break;??????}??>La syntaxe est quand même nettement plus réduite. Maintenant, nous allons voir à quoi correspondent ces "case", "break" et encore "default". Regardez la structure du switch(). A l'intérieur des parenthèses, on met une seule variable pour laquelle on souhaitera comparer sa valeur (ou effectuer des conditions dessus). Chaque instruction case permet ensuite de?délimiter une condition, on peut donc voir ?a comme ?a : si $nombre correspond à?1, alors on exécute le?echo 'Le nombre vaut 1';Le break veut dire qu'il faut que PHP s'arrête, c'est l'équivalent de la fin de condition. Imaginions que vous ayez le code suivant :<?php??????$nombre?=?7;??????switch($nombre)??????{????????????case?1:case?2:????????????????echo?'Le?nombre?vaut?1?ou?2';????????????break;????????????case?7:????????????????echo?'C\'est?un?très?bon?chiffre?!';????????????break;????????????default:????????????????echo?'Le?nombre?ne?vaut?ni?1,?ni?2,?ni?7';????????????break;??????}??>Je pense que vous comprenez le fonctionnement du break à présent, ainsi que de l'utilisation de conditions OU (ici, on affiche un message différent si le nombre vaut soit 1, soit 2). Voyons maintenant comment insérer des conditions plus évoluées dans le switch :<?php???????$nombre?=?8;???????switch($nombre)???????{?????????????case?$nombre?<?7:?????????????????echo?'Le?nombre?est?inférieur?à?7';?????????????break;?????????????case?7:?????????????????echo?'C\'est?un?très?bon?chiffre?!';?????????????break;????????????case?$nombre?>?7:????????????????echo?'le?nombre?est?supérieur?à?sept';????????????break;????????????default:?????????????????echo?'Le?nombre?ne?vaut?ni?1,?ni?2,?ni?7';?????????????break;???????}??>A noter que vous pouvez tout à fait utiliser des AND, OR, etc ... dans les instructions case du switch !Exercices pratiques?:<html lang="en"><head><title>Switch</title></head><body><?php$a = 2;switch ($a) {case 0:echo "a equals 0<br />";break;case 1:echo "a equals 1<br />";break;case 2:echo "a equals 2<br />";break;case 3:echo "a equals 3<br />";break;default:echo "a is not 0, 1, 2, or 3<br />";break;}?><?php// ChineseZodiac// whitespace doesn't matter// colons, semicolons and breaks do$year = 2013;switch (($year - 4) % 12) {case 0: $zodiac = 'Rat'; break;case 1: $zodiac = 'Ox'; break;case 2: $zodiac = 'Tiger'; break;case 3: $zodiac = 'Rabbit'; break;case 4: $zodiac = 'Dragon'; break;case 5: $zodiac = 'Snake'; break;case 6: $zodiac = 'Horse'; break;case 7: $zodiac = 'Goat'; break;case 8: $zodiac = 'Monkey'; break;case 9: $zodiac = 'Rooster'; break;case 10: $zodiac = 'Dog'; break;case 11: $zodiac = 'Pig'; break;}echo "{$year} is the year of the {$zodiac}.<br />";?><?php // case with multiple values$user_type = 'customer';switch ($user_type) {case 'student':echo "Welcome!";break;case 'press':case 'customer':case 'admin':echo "Hello!";break;}?></body></html>PHP - les variables prédéfiniesLes variables prédéfinies : ce sont des variables inclues dans PHP qui évitent le recours à des fonctions longues pour obtenir le même résultat. Elles sont très utiles et permettent d'avoir des informations sur le client et le serveur.Voici les variables classées par type :Les variables serveur :On obtient leur valeur comme ceci :$_SERVER['nom_de_la_variable'];Voici les variables serveur :$_SERVER['PHP_SELF']Donne l'arborescence de la page courante en partant de la racine de votre site (si PHP fonctionne en ligne de commande la variable n'est pas accessible)$_SERVER['GATEWAY_INTERFACE']Contient le numéro de révision de l'interface CGI du serveur$_SERVER['SERVER_NAME']Nom du serveur h?te sur lequel est exécuté le script.$_SERVER['SERVER_PROTOCOL']Nom et révision du protocole de communication : HTTP/1.0$_SERVER['REQUEST_METHOD']Méthode de requête utilisée pour accéder à la page : 'GET','HEAD', 'POST' ou 'PUT'$_SERVER['QUERY_STRING']Donne les arguments placés après le point d'interrogation si ils existent dans l'URL.$_SERVER['DOCUMENT_ROOT']Racine de votre site.$_SERVER['HTTP_ACCEPT_ENCODING']Contenu de l'en-tête Accept-Encoding: de la requête courante, si elle existe. Par exemple : 'gzip'.$_SERVER['HTTP_ACCEPT_LANGUAGE']Langage utilisé par votre navigateur : 'fr'$_SERVER['HTTP_REFERER']C'est l'adresse de la page par laquelle le client est venu sur votre site. Certains navigateurs permettent de modifier cette valeur, et certains pare-feux la bloquent.$_SERVER['HTTP_USER_AGENT']Navigateur utilisé par le client.$_SERVER['REMOTE_ADDR']Adresse ip du client.$_SERVER['REMOTE_HOST']Résolution DNS inverse qui permet de donner le nom d'h?te de l'IP du client$_SERVER['REMOTE_PORT']Port utilisé (généralement le 80) pour envoyer et recevoir des données HTTP entre le serveur et le client.$_SERVER['SCRIPT_FILENAME']Chemin absolu du script courant.$_SERVER['PATH_TRANSLATED']Chemin qui pointe sur le script courant.$_SERVER['SCRIPT_NAME']Nom de la page courante.$_SERVER['REQUEST_URI']URI servant à accéder à la page courante,?/mapage.php?par exemple.Les autres variables prédéfinies :$GLOBALS?: ce tableau contient toutes les variables globales définies.$_GET?: ce tableau contient toutes les variables provenant de l'URL courante.$_POST?: ce tableau contient toutes les variables provenant d'un formulaire en méthode?post.$_SERVER?: ce tableau contient toutes les variables fournies par le serveur Web ou le client.$_COOKIE?: ce tableau contient toutes les valeurs et noms des cookies envoyés par le client.$_FILES?: ce tableau contient les variables fournies par le navigateur lors d'un upload de fichier par le client.$_ENV?: ce tableau contient toutes les variables fournies par l'environnement PHP.$_REQUEST?: ce tableau contient toutes les variables fournies par l'intermédiaire d'un script d'entré (GET,POST,COOKIE... par exemple).$_SESSION?: ce tableau contient toutes les variables de session utilisées.Exemples pratiques?:<?php getenv("COMPUTERNAME");print getenv("COMPUTERNAME");echo "<br/>";getenv("REMOTE_ADDR");print getenv("REMOTE_ADDR");echo "<br/>";getenv ("PHP_SELF");print $_SERVER["PHP_SELF"];echo "<br/>";getenv ("GATEWAY_INTERFACE");print $_SERVER["GATEWAY_INTERFACE"];echo "<br/>";getenv ("HTTP_USER_AGENT");print $_SERVER["HTTP_USER_AGENT"];echo "<br/>";getenv ("HTTP_ACCEPT_LANGUAGE");print $_SERVER["HTTP_ACCEPT_LANGUAGE"];echo "<br/>";getenv ("REMOTE_PORT");print $_SERVER["REMOTE_PORT"];echo "<br/>";getenv ("SCRIPT_FILENAME");print $_SERVER["SCRIPT_FILENAME"];echo "<br/>";?>VariablesDescriptionRésultat à l'écran (Free.fr)$_SERVER['DOCUMENT_ROOT']Racine du serveur/var/www/php.$_SERVER['HTTP_ACCEPT_LANGUAGE']Langage accepté par le navigateurfr$_SERVER['HTTP_HOST']Nom de domaine du serveurproxyphp3.free.fr$_SERVER['HTTP_USER_AGENT']Type de navigateurMozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)$_SERVER['PATH_INFO']Chemin web du script/d2expert.free.fr/phpdebutant/fichier.php$_SERVER['PATH_TRANSLATED']Chemin complet du script/var/www/free.fr/3/d/2/e/x/d2expert/phpdebutant/fichier.php$_SERVER['REQUEST_URI']Chemin du script/d2expert.free.fr/phpdebutant/fichier.php$_SERVER['REMOTE_ADDR']Adresse IP du client195.132.7.201$_SERVER['REMOTE_PORT']Port de la requête HTTP45039$_SERVER['QUERY_STRING']Liste des paramètres passés au scriptvar=23&data=ok$_SERVER['SERVER_ADDR']Adresse IP du serveur212.27.32.44$_SERVER['SERVER_ADMIN']Adresse de l'administrateur du serveuremail@$_SERVER['SERVER_NAME']Nom local du ser`_veurphp.$_SERVER['SERVER_SIGNATURE']Type de serveur?$_SERVER['REQUEST_METHOD']Méthode d'appel du scriptGETComment débugger une page php??<?php$number = 99;$string = "Bug?";$array = array(1 => "Homepage", 2 => "About Us", 3 => "Services");var_dump($number);echo "<br/>";var_dump($string);echo "<br/>";var_dump($array);echo "<br/>";gettype($array);echo "<br/>";print_r($array);echo "<br/>";get_defined_vars();echo "<br/>";debug_backtrace();?>Les URL en PHP<html lang="en"><head><title>url_get_header</title></head><body><pre><?php$url = '';print_r(get_headers($url));?></pre></body></html>Comment passer des infos sur une autre page avec l’url??FIRST PAGE<html lang="en"> <head> <title>First Page</title> </head> <body> <?php $link_name = "Second Page"; ?> <?php $id = 5; ?> <?php $company = "Johnson & Johnson"; ?> <a href="second_page.php?id=<?php echo $id; ?>&company=<?php echo rawurlencode($company); ?>"><?php echo $link_name; ?></a><?php$encoded = implode("/", array_map("rawurlencode", explode("/", $path)));?> </body></html>SECONDE PAGE<html lang="en"> <head> <title>Second Page</title> </head> <body> <pre> <?php print_r($_GET); ?> </pre> <?php $id = $_GET['id']; echo $id; ?> <br /> <?php $company = $_GET['company']; echo $company; ?> </body></html>PHP - Les bouclesDéfinition et présentationLes boucles vont vous permettre d'effectuer un certain nombre de fois les mêmes opérations, par exemple afficher une suite de nombres que l'on incrémentera à chaque tour de boucle. Vous allez pouvoir répéter autant d'instructions que vous souhaitez et vous arrêter lorsque vous l'aurez décidé, selon une condition bien précise par exemple (si vous ne vous rappelez plus de ce qu'est une condition, je vous engage à relire le chapitre les concernant). Voyons maintenant différents types de boucles que nous expliquerons au fur et à mesure. Commen?ons par la boucle la plus simple, la boucle while.La boucle whileCette boucle qui est une des plus utilisées en PHP va vous permettre d'effectuer une ou plusieurs actions?tant que?la condition que vous placerez à l'intérieur des parenthèses sera vérifiée. Voyons de plus près sa syntaxe :<?php??????while(condition)??????{????????????instruction?1;????????????instruction?2;????????????...??????}??>Voyons maintenant un exemple. Imaginiez que vous souhaitez afficher la valeur d'un nombre tant que celui-ci est inférieur à 7. Dès que le nombre sera supérieur à 7, vous quitterez la boucle. Le nombre sera incrémenté d'une unité à chaque tour de boucle. Voilà ce que ?a donne avec une boucle while en pratique :<?php??????$i?=?0;?//on?définit?la?variable?$i?qui?sera?notre?nombre?que?l'on?incrémentera.?Ici?$i?va?commencer?à?0??????while($i?<?7)??????{????????????echo?$i.'<br?/>';????????????$i++;??????}??>On traduit donc la boucle while?tant que. Tant que la condition est vérifiée (ici $i < 7), PHP traite les instructions situées dans la boucle. Vous pouvez mettre plusieurs conditions entre parenthèses. Voyons un autre exemple, cette fois-ci nous souhaitons que $i reste inférieur à sept et que $j soit inférieur à 5 :<?php??????$i?=?0;?//on?définit?la?variable?$i?qui?sera?notre?nombre?que?l'on?incrémentera.?Ici?$i?va?commencer?à?0??????$j?=?4;??????while($i?<?7?AND?$j?<?5)??????{????????????echo?$i.'<br?/>';????????????$i++;????????????$j++;??????}??>Vous allez constater que la variable $i ne s'affiche qu'une seule fois. Pourquoi ? car au prochain tour de boucle, $j vaudra 5, or on n'effectue la boucle que si $i < 7 ET $j < 5. Vous l'avez compris, vous pouvez utiliser ici toutes les conditions que l'on a vues au chapitre précédent. Exercices pratiques?:<html lang="en"><head><title>Loops: while</title></head><body><?php$count = 0;while ($count <= 10) {if ($count == 5) {echo "FIVE, ";} else {echo $count . ", ";}$count++; // increment by 1}echo "<br />";echo "Count: {$count}";?><br /><br /><?php // On your own exercise$count = 1;while ($count < 20) {if($count % 2 == 0) {echo "{$count} is even<br />";} else {echo "{$count} is odd<br />";}$count++;}?></body></html>Voyons maintenant une boucle différente, la boucle for.La boucle forCette boucle est très utile lorsque, comme pour notre premier exemple, vous souhaitez incrémenter une variable sur une certaine plage de valeurs connue à l'avance.Etudions sa syntaxe :<?php??????for(initialisation;?condition?de?continuité?;?expression?3)??????{????????????instruction?1;????????????instruction?2;????????????...??????}??>La première expression (initialisation) est interprétée au premier démarrage de la boucle. Elle ne sera exécutée qu'une seule fois?(et non à chaque tour de boucle). On y place généralement l'initialisation des variables. La deuxième condition est appelée?condition de continuité, on la place pour dire?"si cette condition est respectée, alors la boucle peut continuer". La troisième expression sera elle interprétée à la fin de chaque tour de boucle. On y place généralement l'incrémentation d'une variable, mais vous pouvez y mettre n'importe quoi, faites attention cependant aux boucles infinies. On entend par boucle infinie une boucle qui ne s'arrête jamais. Outre le fait de monopoliser le?processeur, votre script ne s'arrêtera pas en fonction de la configuration de PHP.Voici notre premier exemple qui utilise cette fois-ci une boucle for :<?php??????for($i=0;$i?<?7;$i++)??????{????????????echo?$i.'<br?/>';??????}??>Vous pouvez constater que pour cet exemple précis, le code a été légèrement réduit. Ces deux codes sont pourtant équivalents. Reprenons notre deuxième exemple, cette fois-ci à l'aide d'une boucle for. Comme vous allez pouvoir le constater, on peut également placer plusieurs conditions :<?php??????$i?=?0;?//on?définit?la?variable?$i?qui?sera?notre?nombre?que?l'on?incrémentera.?Ici?$i?va?commencer?à?0??????for($j=4;$i?<?7?AND?$j?<?5;$j++)??????{????????????echo?$i.'<br?/>';????????????$i++;??????}??>Exercices pratiques?: Les boucles For<html lang="en"><head><title>Loops: for</title></head><body><?php // while loop example $count = 0; while ($count <= 10) { echo $count . ", "; $count++; }?><br /><?phpfor($count = 0; $count <= 10; $count++) { echo $count . ", ";}?><br /><?phpfor ($count = 20; $count > 0; $count--) {if ($count % 2 == 0) {echo "{$count} is even.<br />";} else {echo "{$count} is odd.<br />";} }?></body></html>Voyons maintenant une dernière boucle, qui n'est pas plus compliquée qu'une boucle while. Il s'agit de la boucle do-while.La boucle do-whileRien qu'au nom de la boucle, vous pouvez vous douter qu'elle a des similitudes avec la boucle while. Effectivement, c'est le cas ! Néanmoins, une différence de taille les séparent. Reprenons notre premier exemple avec la boucle while :<?php??????$i?=?0;?//on?définit?la?variable?$i?qui?sera?notre?nombre?que?l'on?incrémentera.?Ici?$i?va?commencer?à?0??????while($i?<?7)??????{????????????echo?$i.'<br?/>';????????????$i++;??????}??>Vous constatez que si on initialise $i à 8, la boucle ne sera jamais exécutée, car dès l'analyse de la condition, 8 < 7 renverra FALSE (et oui, 8 est bien inférieur à 7 !).Vous aimeriez peut-être effectuer au moins une fois une opération, et si une condition est vraie, reboucler autant de fois que vous le souhaitez ? la boucle do-while permet de le faire en PHP. Voici sa syntaxe :<?php??????do??????{????????????instruction?1;????????????instruction?2;????????????...??????}???? while(condition)??>Dans ce cas, les instructions seront exécutées au moins une fois, même si la condition de continuité est fausse. Par contre, si la condition de continuité est vraie, PHP rebouclera. Voyons notre exemple du 8 < 7 avec une boucle do-while :<?php??????$i?=?8;??????$j?=?7;??????do??????{???????????echo?'la?boucle?a?bouclé<br?/>';??????}??????while($i?<?$j)??>Pour illustrer les?if,?else?et?elseif, voici un exemple très simple à lire, nous définissons une variable à la valeur '?512?' puis nous allons tester si celle-ci est comprise entre 0 et 499 puis entre 500 et 999 et enfin supérieure à 999, ce qui nous donne :<??$toto?=?512;?// on encha?ne les contr?les ci-dessous ----?if($toto>=0?&&?$toto<500)?????????//1er?????{?????echo?$toto.' est compris entre 0 et 499';?????}?elseif($toto>=500?&&?$toto<1000)?//2eme?????{?????echo?$toto.' est compris entre 500 et 999';?????}?else??????????????????????????????????//3eme?????{?????echo?$toto.' est plus grand que 999';?????}??>1er contr?le :?Si (512?est plus grand ou égal à?0?et que?512?est plus petit que?500) {?on affiche le 1er message?; }2e contr?le :?Si (512?est plus grand ou égal à?500?et que?512?est plus petit que?1000) {?on affiche le 2e message?; }3e contr?le :?Dans tous les autres cas {?on affiche le 3e message?; }PHP - Les tableauxDéfinition et présentationLes tableaux vont vous changer la vie ! en fait, il s'agit de variables qui peuvent contenir plusieurs valeurs. On peut donc imaginer leur représentation sous forme d'un tableau. Pour différencier les valeurs, pour savoir comment on va dire à PHP "je veux telle valeur de cette variable" il faut bien distinguer les valeurs par des indices. Ces indices. Voilà comment on peut représenter tout ?a :IndiceValeur0Maurice1Jean2Pierre3PaulOn peut voir ici qu'il s'agit d'une liste de prénoms. On appelle cela un?tableau, aussi appelé?array. La syntaxe de définition du tableau en PHP (pour dire "voilà, cette variable sera un tableau") sera de la forme suivante :<?php??????$prenoms?=?array();?//on?déclare?le?tableau?de?prénoms, remarquez que cela se fait avec la fonction array()??????/*????????On?va?initialiser?les?valeurs?pour?les?indices?0,?1,?2??et?3???????*/??????$prenoms[0]?=?'Maurice';??????$prenoms[1]?=?'Jean';??????$prenoms[2]?=?'Pierre';??????$prenoms[3]?=?'Paul';??>Les tableaux peuvent avoir des indices sous forme de nombres entiers ou de cha?nes de caractères. On parle alors respectivement en PHP de tableaux indexés et de tableaux associatifs. Pour les tableaux indexés, le premier indice commence toujours à 0 lorsque le tableau est généré par une fonction. Vous pouvez cependant forcer les indices aux valeurs que vous souhaitez, mais cela peut être source d'erreurs. Faites-y donc attention ;)Les tableaux à indices numériques (indexés)En PHP, les tableaux indexés diffèrent uniquement des tableaux associatifs par leurs indices. Ici, ils sont numériques.Nous avons vu dans le premier exemple de ce cours comment affecter différentes valeurs à un tableau :<?php??????$prenoms?=?array();?//on?déclare?le?tableau?de?prénoms, remarquez que cela se fait avec la fonction array()??????/*????????On?va?initialiser?les?valeurs?pour?les?indices?0,?1,?2??et?3???????*/??????$prenoms[0]?=?'Maurice';??????$prenoms[1]?=?'Jean';??????$prenoms[2]?=?'Pierre';??????$prenoms[3]?=?'Paul';??>Voyons une syntaxe équivalente :<?php??????$prenoms?=?array(0?=>?'Maurice',???????????????????????1?=>?'Jean',???????????????????????2?=>?'Pierre',???????????????????????3?=>?'Paul');?//on?initialise?le?tableau?de?prénoms??>Dans le cas où vous souhaitez garder le premier indice à zéro (et les suivants incrémentés de 1 à chaque fois) vous pouvez également utiliser la syntaxe suivante :<?php??????$prenoms?=?array('Maurice',?'Jean',?'Pierre',?'Paul');?//on?initialise?le?tableau?de?prénoms??>C'est bien beau tout ?a, mais comment afficher la valeur du tableau pour un indice spécifié ? bah on utilise toujours echo, mais cette fois-ci voilà comment on accède au tableau :<?php??????echo?$prenoms[0];?//Va?afficher?"Maurice"??????echo?$prenoms[1];?//Va?afficher?"Jean"??????...??>Les tableaux associatifsPHP peut également vous permettre de distinguer les différentes valeurs de vos tableaux par des indices associatifs. Ils sont constitués de cha?nes de caractères. Prenons cette fois l'exemple d'un article. On va le différencier par plusieurs choses :Son numéro uniqueSon nomSon prixVoilà comment on pourrait représenter ?a avec un tableau associatif :<?php??????/*????????Première?possibilité??????*/??????$article?=?array('Numero'?=>?77,????????????????????????'Nom'????????????=>?'Nom?de?l\'article',????????????????????????'Prix'?????????????=>?7);??????/*????????Autre?possibilité??????*/??????$article?=?array();??????$article['Numero']?=?77;??????$article['Nom']????? =?'Nom?de?l\'article';??????$article['Prix']?????? =?7;??>Si on veut afficher le prix de l'article, on utilisera toujours echo, mais de cette fa?on :<?php??????echo?$article['Prix'];?//Affiche?"7"??>Parcourir un tableauLes tableaux offrent une possibilité assez intéressante qui est de stocker plusieurs données dans une seule variable. PHP vous permet d'appliquer de nombreuses opérations sur les tableaux, donc celle de les parcourir. En effet, vous aurez par exemple besoin de lister tous les articles d'un tableau pour les afficher. On peut utiliser pour faire cette opération la fonction foreach(), dont nous allons voir la syntaxe de base ici :<?php??????$tableau?=?array(...);??????foreach($tableau?AS?$indice?=>?$valeur)??????{??????????????instructions;??????}??>Voici ce que cela donne avec un exemple :<?php??????$tableau?=?array(0?=>?'Chiffre?0',???????????????????????1?=>?'Chiffre?1',???????????????????????2?=>?'Chiffre?2');??????foreach($tableau?AS?$cle?=>?$valeur)??????{??????????????echo?$cle.'?|?'.$valeur.'<br?/>';??????}??>Exécutez ce code et regardez ce que cela affiche ;) La variable $cle va récupérer l'indice du tableau, et la variable $valeur sa valeur associée. Si vous n'avez pas besoin de récupérer l'indice, vous pouvez également utiliser la fonction foreach() comme ceci :<?php??????$tableau?=?array(0?=>?'Chiffre?0',???????????????????????1?=>?'Chiffre?1',???????????????????????2?=>?'Chiffre?2');??????foreach($tableau?AS?$valeur)??????{??????????????echo?$valeur.'<br?/>';??????}??>Ceci fonctionne également pour les tableaux associatifs, vous récupèrerez alors la cha?ne de caractères correspondant à l'indice dans la variable $cle.Exercices pratiques?:Les tableaux<html lang="en"><head><title>Arrays</title></head><body><?php$numbers = array(4,8,15,16,23,42);echo $numbers[0];?><br /><?php $mixed = array(6, "fox", "dog", array("x", "y", "z")); ?><?php echo $mixed[2]; ?><br /><?php //echo $mixed[3]; ?><br /><?php //echo $mixed ?><br /><?php echo $mixed[3][1]; ?><br /><?php $mixed[2] = "cat"; ?><?php $mixed[4] = "mouse"; ?><?php $mixed[] = "horse"; ?><pre><?php echo print_r($mixed); ?></pre><?php //PHP 5.4 added the short array syntax.$array = [1,2,3];?></body></html>Les tableaux associatifs<html lang="en"><head><title>Array Functions</title></head><body><?php $numbers = array(8,23,15,42,16,4); ?>Count: <?php echo count($numbers); ?><br />Max value: <?php echo max($numbers); ?><br />Min value: <?php echo min($numbers); ?><br /><br /><pre>Sort: <?php sort($numbers); print_r($numbers); ?><br />Reverse sort: <?php rsort($numbers); print_r($numbers); ?><br /></pre><br />Implode: <?php echo $num_string = implode(" * ", $numbers); ?><br />Explode: <?php print_r(explode(" * ", $num_string)); ?><br /><br />15 in array?: <?php echo in_array(15, $numbers); // returns T/F ?><br />19 in array?: <?php echo in_array(19, $numbers); // returns T/F ?><br /></body></html>PHP - Les datesLes datesLa gestion des dates en PHP est très simple. Vous allez voir que tout au long de ce chapitre, nous allons nous servir d'une fonction principale, la fonction date(). Nous verrons ensuite la fonction time() et mktime(). L'utilisation de ces trois fonctions constitue les bases de ce tutoriel sur les dates en PHP.La fonction date()Incontournable, la fonction date() s'utilise de différentes fa?ons. Elle renvoie toujours une cha?ne de caractères correspondant à ce qu'on lui a demandé (?a peut être l'heure, le jour, le mois, etc...). Attention, les paramètres renvoyés correspondront à ceux du serveur, si votre serveur a une heure déréglée, la fonction date() ne renverra pas une heure correcte. Pour que la fonction sache ce qu'on attend d'elle et qu'elle ne nous renvoie pas n'importe quoi (les minutes au lieu de l'heure par exemple) on va placer comme paramètre unique un code. Ce code se compose de différents caractères que nous allons détailler ci-dessous :CaractèreSignificationExemples de valeurs possibles :JourjJour du mois sur deux chiffres sans les zéros initiaux1 à 31dJour du mois sur deux chiffres avec un zéro initial en fonction du jour01 à 31l (L minuscule)Jour de la semaine en anglaisSunday à SaturdaywJour de la semaine au format numérique0 (dimanche) à 6 (samedi)zJour de l'année0 à 366SemaineWNuméro de semaine dans l'année (les semaines commencent le lundi)Exemple : 42 (la 42ème semaine de l'année)MoisFMois, textuel, version longue; en anglais, comme January ou DecemberJanuary à DecembermMois au format numérique, avec zéros initiaux01 à 12nMois sans les zéros initiaux1 à 12tNombre de jours dans le mois28 à 31AnnéeLEst ce que l'année est bissextile1 si bissextile, 0 sinon.YAnnée sur 4 chiffresExemples : 1999 et 2003yAnnée sur 2 chiffresExemples : 99 et 03HeureaAnte méridien et Post méridien (minuscules)am ou pmAAnte méridien et Post méridien (majuscules)AM ou PMgHeure (format 12h) sans les zéros initiaux1 à 12GHeure (format 24h) sans les zéros initiaux0 à 23hHeure (format 12h) avec les zéros initiaux01 à 12HHeure (format 24h) avec les zéros initiaux00 à 23sSecondes avec zéros initiaux00 à 59iMinutes avec zéros initiaux00 à 59Par exemple, voici un cas concret : nous allons afficher l'année en cours avec la fonction date() :<?php??????echo?date('Y');?//affichera?l'année?actuelle?sur?4?chiffres???>Vous n'avez plus qu'à vous référer aux autres codes pour afficher ce que vous voulez. Tout ?a c'est bien beau mais si vous souhaitez afficher toute une date avec un seul appel à la fonction date, comment feriez-vous ?Si vous souhaitez afficher le mois et l'année, vous pourriez faire ceci :<?php??????echo?date('m').' '.date('Y');?//affichera?le?mois?sur?deux?chiffres?et?l'année?actuelle?sur?4?chiffres???>Cette solution est cependant peu pratique et gourmande. Vous avez un moyen bien plus simple de le faire :<?php??????echo?date('m?Y');?//affichera?le?mois?sur?deux?chiffres?et?l'année?actuelle?sur?4?chiffres???>Vous allez même pouvoir formater votre date comme bon vous semble, par exemple si vous souhaitez séparer les composantes de votre date par un slash (/), vous pouvez mettre ceci :<?php??????echo?date('m/Y');??><?php$date?=?date("d-m-Y");$heure?=?date("H:i");Print("Nous sommes le?$date?et il est?$heure");?><??$date?=?gmdate("H\hi");?print("Il?est?$date"."gmt.");??>?Le timestamp PHPVous allez s?rement vous demander de quoi il s'agit, et c'est normal ;) Un timestamp est un nombre qui indique le nombre de secondes qui se sont écoulées depuis le premier janvier 1970. Vous allez me dire jusque-là, "mais à quoi ?a sert" ? patience, on y arrive :)Le premier janvier 1970 à minuit, le timestamp valait 0. Il tient maintenant sur 10 chiffres, c'est dire si le nombre de secondes qui se sont écoulées depuis est important !Pour afficher le timestamp de la seconde actuelle, on utilise la fonction time() de PHP. Voici un exemple :<?php??????echo?time();?//Affiche?le?nombre?de?secondes?écoulées?depuis?le?1er?janvier?1970??>Par défaut, la fonction date ne demande qu'un seul paramètre comme nous l'avons vu plus haut, cela permet d'afficher par exemple le jour actuel ou encore la minute et la seconde courantes. Nous pouvons par contre, et là cela devient intéressant, afficher toutes ces informations pour un timestamp donné. La fonction date telle que nous l'avons vue correspond à ceci :<?php??????echo?date('Y',?time());??>Si nous indiquons un timestamp différent, PHP va nous retourner tout ce que vous voulez pour le timestamp donné et non pour le temps courant. Imaginez ceci :?<?php??????$timestamp?=?time()?-?3600;??????echo?date('j',?$timestamp);??>PHP va vous retourner ici le jour qu'il était il y a une heure ! en effet, on utilise ici le timestamp $timestamp qui correspond au timestamp actuel (obtenu via la fonction time() auquel on a retranché 3600 secondes, soit une heure) !Vous comprenez maintenant qu'il va être possible d'effectuer des choses très puissantes avec le timestamp de PHP. Vous venez d'apprendre comment convertir un timestamp en date avec la fonction date(), nous allons maintenant voir comment convertir une date en timestamp, vous allez voir ce n'est pas compliqué !Conversions d'une date vers un timestampPHP permet de convertir une date vers un timestamp. Pour ce faire, on utilise la fonction mktime(). Elle va vous permettre à partir du jour, de l'heure, etc ... d'une date classique, d'obtenir le timestamp correspondant. Ce timestamp pourra être ensuite stocké ou encore subir des traitements. Voici la syntaxe de base de la fonction mktime() :<?php??????$timestamp?=?mktime(heures,?minutes,?secondes,?mois,?jour,?année);??>Si vous voulez obtenir le timestamp du 3 janvier 1988 à 2h31 et 10 secondes, vous pouvez mettre ceci :<?php??????echo?mktime(2,?31,?10,?1,?3,?1988);??>PHP - Les inclusions de fichiers : fonctions include et requirePrésentationTout ce que vous venez d'apprendre sur PHP est bien beau, mais si il y a une chose essentielle en PHP, c'est bien l'inclusion de fichiers. En quoi cela consiste t-il ? Et bien imaginions que vous ayez un site qui comporte toujours le même menu à gauche ou encore la même partie haute, en (X)HTML vous étiez (à moins d'utiliser des frames dépréciées et néfastes pour le référencement) obligé de copier coller le même code sur toutes les pages de votre site, avec pour inconvénient principal des mises à jour rendues plus difficiles car vous deviez modifier toutes les pages faisant appel à votre menu en cas d'actualisation de celui-ci.L'include, ou comment inclure des fichiers en PHPLe code en lui-même est très simple. On utilise la structure du langage "include". Elle peut donc ne pas prendre de parenthèses. Cette structure va vous permettre d'inclure un fichier PHP à interpréter. Voici un exemple permettant d'inclure la page "haut.php" dans le fichier courant :<?php??????include?'haut.php';??>Le principe est simple : vous allez pouvoir gr?ce à ce code exécuter le code PHP inclus dans le fichier "haut.php". C'est à dire que si par exemple le fichier inclus contient du code HTML ou des instructions "echo" affichant du HTML, vous allez pouvoir afficher un code HTML bien défini sur toutes les pages de vos sites via?un seul?fichier que vous inclurez quand et où vous le voulez.Le fichier "haut.php" peut contenir du code PHP mais aussi du code HTML, il est important de le souligner. Inutile donc pour afficher du code HTML d'utiliser?echo?à foison dans votre fichier inclus.Voyons maintenant un exemple pratique qui consistera à inclure pour une page PHP, le haut du site. Toutes nos pages PHP pourront s'en resservir pour que le haut du site soit identique sur toutes les pages. Pour cet exemple, nous allons utiliser deux fichiers, l'un sera HTML (le fichier "haut.php") et sera identique sur toutes les pages pour lequel nous ferons appel à lui, et l'autre en PHP permettra d'inclure ce fichier.Contenu du fichier "haut.php" :<!DOCTYPE html PUBLIC?"-//W3C//DTD XHTML 1.0 Strict//EN"?""><html xmlns=""?xml:lang="fr"?lang="fr"><head><title>Bienvenue sur mon site web !</title></head><body><h1>Bienvenue sur mon site !</h1>Contenu du fichier "bas.php" qui sera le pied de page du site :</body></html>Contenu du fichier "index.php" qui sera l'accueil du site :<?php??????include?'haut.php';??????echo?'Ici?le?contenu?du?site';??????include?'bas.php';??>Ce qui donnera en HTML lorsque vous appellerez la page "index.php" :<!DOCTYPE html PUBLIC?"-//W3C//DTD XHTML 1.0 Strict//EN"?""><html xmlns=""?xml:lang="fr"?lang="fr"><head><title>Bienvenue sur mon site web !</title></head><body><h1>Bienvenue sur mon site !</h1>Ici le contenu du site</body></html>Attention à l'utilisation à foison de fichiers inclus. Plus vous utiliserez include, plus le temps de génération de la page sera ralenti (car il faut bien faire un accès disque pour lire les différents fichiers). Préférez un seul include d'un fichier un peu plus gros que de 4 fichiers très petits.Inclusion avec requirela structure du langage require fonctionne de la même fa?on qu'include. Cependant, il existe une différence entre ces deux méthodes. Lorsque vous tentez d'inclure un fichier, si le fichier n'existe pas que se passe t-il ? Et bien par défaut, PHP affichera une erreur mais continuera l'exécution du script. Imaginions maintenant que vous ayez un espace membres qui, dans un fichier inclus, vérifie que l'internaute soit bien identifié comme étant membre pour afficher le reste. Voici un exemple résumé (le code n'est pas complet) :<?php??????include?'verification.php';??????/*??????*?Code?qui?sera?exécuté?si?le?membre?est?identifié??????*/??????echo?'vous?êtes?membre?!';??>Et maintenant, voici le contenu du fichier "verification.php" qui est chargé de vérifier si l'internaute est bien identifié en tant que membre :<?php??????if(!est_membre())??????{???????????exit('Vous?devez?être?membre?pour?accéder?à?cette?page');??????}??>Le code est bien s?r très simplifié, nous considèrerons que la fonction est_membre() est plus haut dans le code ;) Le but est uniquement de comprendre ce que peut entra?ner l'absence d'inclusion d'un fichier sensible. Ici, nous faisons appel à la fonction est_membre() qui renvoie TRUE si l'internaute est identifié comme membre, et FALSE sinon. Le point d'exclamation permet d'effectuer le contraire de la condition, ici on traduit par "si l'internaute n'est pas membre" tandis que sans le point d'exclamation on aurait dit "si l'internaute est membre". Le code exécuté arrête alors le script PHP si le visiteur n'est pas membre en utilisant la structure du langage exit. Tout ceci est bien, mais si le fichier "verification.php" n'existe pas, dans ce cas, PHP affichera "vous êtes membre !" ce qui ne va pas du tout avec ce que l'on souhaite faire. Nous allons donc utiliser la structure du langage "require". Celle-ci permet d'inclure un fichier et de couper le script si le fichier n'a pu être inclus.<?php??????require?'verification.php';?//Coupera l'exécution du code si le fichier n'a pu être inclus par PHP??????/*??????*?Code?qui?sera?exécuté?si?le?membre?est?identifié??????*/??????echo?'vous?êtes?membre?!';??>require permet à la différence d'include de couper l'exécution du script PHP si le fichier à inclure n'a pu être inclus.Exercices pratiques?simple:<?php include("included_functions.php"); include("included_header.php");?> The header has been included. <br /> <?php echo hello("Everyone"); ?><br /> </body></html>Incluted_functions.php<?php function hello($name) { return "Hello {$name}!"; }?>Incluted_header.php<html lang="en"> <head> <title>Includes</title> </head> <body>Cas pratiques avec sécurité?:Le code de la page accueil.php<p>Mettez ici simplement le contenu que vous voulez voir afficher en accueil.</p>Le code de la page news.php<p>Mettez ici simplement le contenu que vous voulez voir afficher dans les news. Il y a de forte chance que cela soit du code PHP qui vous génère ces news. Cela ne pose aucun problème, procédez comme à votre habitude: requête, boucle et echo.</p>Le code de la page menu.htm<ul>??<li>?????<a href="index.php?page=accueil" title="L'accueil">Accueil</a>??</li>??<li>????<a href="index.php?page=news" title="Les News ">News</a>??</li></ul>?Nous allons maintenant créer une page index.php qui va être le noyau de notre site. Elle va se charger d'inclure tout les éléments découpés afin de construire une page complète.Le code de la page index.php<div class="entete" ><?php???include('entete.htm');??// Nous appelons l'entete du site?></div><div class="colonneGauche" ><?php???include('menu.htm');???// Nous appelons notre menu?></div><div class="colonneDroite"><?php???include($_GET['page'].'.php');???// Nous appelons le contenu central de la page?></div><div class="pied"><?php???include('pied.htm');???// Nous appelons le pied de page?></div>Le code de la page index.php<div class="entete" ><?php???include('entete.htm');??// Nous appelons l'entete du site?></div><div class="colonneGauche" ><?php???include('menu.htm');???// Nous appelons notre menu?></div><div class="colonneDroite"><?php??// On définit le tableau contenant les pages autorisées??//?----------------------------------------------------??$pageOK?= array('news'?=>?'news.php',???????????????????'accueil'?=>?'accueil.php');??// On teste que le paramètre d'url existe et qu'il est bien autorisé??// -----------------------------------------------------------------??if (?(isset($_GET['page'])) && (isset($pageOK[$_GET['page']]))?)?{????include($pageOK[$_GET['page']]);???// Nous appelons le contenu central de la page??} else {????include('accueil.php');???// Page par défaut quant elle n'existe pas dans le tableau??}?></div>?<div class="pied"><?php???include('pied.htm');???// Nous appelons le pied de page?></div>?ExplicationComme vous le voyez nous avons créé un tableau associatif. Ce tableau est construit ainsi : son index représente les paramètres d'inclusion autorisés dans l'url, les valeurs représentent le chemin réel du fichier. En l'occurence les fichiers sont dans le même répertoire que la page?index.php, mais vous auriez pu vouloir inclure un fichier dans le répertoirecolGauche?contenu dans le répertoire courant. Dans ce cas vous auriez d? rajouter une ligne au tableau de cette forme :?'page'?=>?'colGauche/fichier.php'.Ensuite nous testons l'existence de cette ligne du tableau avec comme index du tableau, le paramètre passé en url. Si la ligne existe c'est que le paramètre est autorisé, on inclu donc le fichier en utilisant la valeur de la ligne concernée du ment faire une redirection??<?php // This is how you redirect to a new page function redirect_to($new_location) { header("Location: " . $new_location); exit; } $logged_in = $_GET['logged_in']; if ($logged_in == "1") { redirect_to("basic.html"); } else { redirect_to(""); } ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"> <head> <title>Redirect</title> </head> <body> </body></html>PHP - Les formulairesPrésentationQuand je vous ai présenté PHP au début de cette section, je vous avais parlé d'interactivité avec le visiteur. C'est là que les formulaires sont le plus souvent utilisés. En effet un formulaire permet d'interagir avec l'internaute. L'avantage que nous allons voir maintenant est que PHP permet de faire tout et n'importe quoi instantanément en fonction de ce que souhaite le visiteur. Vous allez pouvoir disposer d'un site complètement dynamique sans bouger le petit doigt !Je supposerai que vous savez comment créer des formulaires en (X)HTML, donc je ne ferai pas de rappel poussé sur leur utilisation. N'hésitez donc pas à revoir le?cours de HTML?si vous pensez avoir des lacunes à ce niveau.Il existe deux méthodes d'envoi de formulaire en (X)HTML : la méthode POST et la méthode GET. La méthode GET transmet les informations du formulaire dans l'adresse du site, adresse qui est limitée en fonction du navigateur à un certain nombre de caractères et qui est encore moins sécurisée que la méthode POST. Nous allons donc commencer par la méthode POST.PHP va créer lorsque des données de formulaires seront disponibles, des variables commen?ant par $_GET ou $_POST (en fonction de la méthode d'envoi et de l'url de la page), vous allez donc voir que d'exploiter les données de formulaires est très simple !L'envoi de formulaire via méthode POST et les textboxNous allons commencer par le traitement des formulaires simples comportant une zone de texte. Nous avons attribué une valeur par défaut à la zone de texte. Voyons le code XHTML :<form action="page.php?formulaire"?method="post"><p><input type="text"?name="pseudo"?value="Entre ici ton pseudo"?/></p><p><input type="submit"?value="Envoyer"?/></p></form>Comme vous pouvez le constater, il n'y a rien de compliqué là dedans. J'ai juste corsé un peu l'adresse de la page php qui sera utilisée pour le traitement. Comme je vous l'ai appris pour la page concernant les?variables en PHP, ici une variable nommée $_GET['formulaire'] sera présente mais ne comportera pas de valeur. C'est tout pour les complications :pBon tout ?a c'est bien beau, mais une fois que le visiteur clique sur "Envoyer" que se passe t-il sur la page "page.php" ? Et bien la variable $_POST['pseudo'] sera crée et sa valeur sera le pseudo qu'a entré le visiteur. Si le visiteur a juste cliqué sur "Envoyer" sans toucher à la zone de texte, la variable $_POST['pseudo'] aura pour valeur 'Entre ici ton pseudo' qui est la valeur par défaut de cette zone de texte.Lorsque vous soumettez un formulaire avec PHP via la méthode POST, celui-ci crée des variables $_POST['X'] avec 'X' correspondant aux noms des différents champs. Ceci est valable pour tout formulaire. Les valeurs de ces différentes variables correspondent aux valeurs des champs en question.?Pour tout champ de formulaire, lorsque le visiteur ne touche à rien, les valeurs par défaut seront conservées et utilisées de la même manière par PHP (qui n'a aucun moyen de savoir si il s'agit d'une valeur par défaut ou d'une valeur remplie par le visiteur). Vous venez maintenant de comprendre pourquoi nous parlerons de sécurité plus loin sur cette page. En effet, comme PHP ne peut savoir de qui proviennent les informations, il faudra toujours les vérifier pour éviter les failles de sécurité.Revenons à notre formulaire. Le visiteur a cliqué et a renseigné son pseudo, maintenant nous voudrions l'afficher. Voici un code tout simple pour la page "page.php" permettant de faire ceci en PHP :<?php??????if(isset($_POST['pseudo'],?$_GET['formulaire']))?//On?regarde?si?les?variables?$_POST['pseudo']?et?$_GET['formulaire']?existent,?sinon?la?condition?ne?sera?pas?validée?????{???????????echo?htmlentities($_POST['pseudo']);??????}??>Vous remarquerez que l'on regarde d'abord si les variables que l'on souhaite utiliser existent gr?ce à la fonction isset() (qui peut prendre en paramètre plusieurs variables). Ceci est tout à fait normal et vous devez procéder de la sorte lorsque vous souhaitez accéder avec PHP à des variables provenant de formulaires, dont vous n'êtes pas s?r de l'existence. Voyons ce code que n'importe quel débutant (ce n'est pas péjoratif) aurait pu faire :<?php???????echo?htmlentities($_POST['pseudo']);??>Le problème de ce code, est qu'il ne vérifie pas si la variable $_POST['pseudo'] existe. Ce code peut donc tenter d'afficher une variable qui n'existe pas, ce qui retournera généralement une erreur. Plus grave, si vous utilisez cette variable pour faire des traitements plus poussés, vous pourrez avoir de belles failles de sécurité dans votre site. Un mot maintenant sur la fonction htmlentities() : elle permet de transformer le code HTML pouvant être envoyé par le visiteur en code visible. En effet, imaginiez que votre visiteur entre comme pseudo "<body>" par exemple, et bien vous ne verrez rien à l'écran car le texte qu'il aura entré sera interprété comme étant du code HTML (logique, puisque PHP envoie du texte, et <body> est un texte comme un autre pour PHP, il ne fera donc pas la différence). Il faut donc transformer <body> en son code HTML visible. Voilà pourquoi on utilise toujours cette fonction.D'une manière générale, servez-vous toujours de la fonction htmlentities() lorsque vous tentez d'afficher du texte provenant de formulaires.Les textareaPassons maintenant aux zones de texte plus évoluées. Nous allons maintenant traiter le cas de la zone de texte multilignes appelée textarea. Voici un exemple simple en XHTML :<form action="traitement.php"?method="post"><p><textarea name="description"?rows="5"?cols="50">Entrez ici une description de votre site</textarea></p><p><input type="submit"?value="Envoyer"?/></p></form>Tout ce qu'il y a de plus classique. Lorsque le formulaire est envoyé à la page "traitement.php", vous pourrez récupérer la variable $_POST['description'] (car cette fois-ci le champ porte le nom "description" et non "pseudo") comme nous l'avons fait tout à l'heure. Voilà ce que ?a donne :<?php??????if(isset($_POST['description']))?//On?regarde?si?la variable?$_POST['description']?existe??????{???????????echo?htmlentities($_POST['description']);??????}??>Le selectBon, pour l'instant rien de compliqué. Nous allons maintenant étudier le cas du select. Comme vous le savez, un <select> peut être à choix unique ou à choix multiples. Regardons le code pour le select à choix unique. Vous allez voir que la méthode de récupération de la valeur ne diffère pas :<form action="traitement.php"?method="post"><p><select name="couleur">?????<option value="rouge">Couleur rouge</option>???? <option value="vert"?selected="selected">Couleur verte</option>???? <option value="bleu">Couleur bleue</option></select></p><p><input type="submit"?value="Envoyer"?/></p></form>Ici, si nous souhaitons afficher la couleur qu'a sélectionné le visiteur, nous utiliserons ce code :<?php??????if(isset($_POST['couleur']))??????{????????????echo?htmlentities($_POST['couleur']);??????}??>Nous allons maintenant passer aux choses plus sérieuses avec le select multiple. En effet, imaginions que quelqu'un souhaite commander un article en plusieurs couleurs, il faudra qu'il puisse sélectionner plusieurs valeurs d'un coup dans le select. Voyons comment ?a se présente en (X)HTML :<form action="traitement.php"?method="post"><p><select name="couleur"?multiple="multiple">?????<option value="rouge">Couleur rouge</option>???? <option value="vert"?selected="selected">Couleur verte</option>???? <option value="bleu">Couleur bleue</option></select></p><p><input type="submit"?value="Envoyer"?/></p></form>Si l'utilisateur sélectionne une ou plusieurs valeurs, que va t-il se passer ? Et bien je vous le donne en mille : PHP va créer un tableau $_POST['couleur'] qui contiendra la ou les différentes valeurs que l'utilisateur aura sélectionné. Voici un exemple qui affiche toutes les valeurs sélectionnées par le visiteur :<?php??????if(isset($_POST['couleur'])?AND?is_array($_POST['couleur']))??????{???????????foreach($_POST['couleur']?AS?$valeur)???????????{?????????????????echo?'Vous?avez?sélectionné?la?couleur'.htmlentities($valeur).'<br?/>';???????????}??????}??>Notez l'utilisation du is_array() qui permet de vérifier si on a bien transmis un tableau. Ceci est très important car la fonction foreach() nécessite un tableau en paramètre (ici $_POST['couleur'] est le tableau à parcourir). Si $_POST['couleur'] n'avait pas été un tableau, vous auriez eu une erreur, c'est donc pour ?a que l'on vérifie non seulement que $_POST['couleur'] existe mais qu'il est un tableau. Si vous ne vous rappelez plus comment on utilise les tableaux, n'hésitez pas à aller relire le cours les concernant.D'une manière générale, pensez à toujours vérifier pour les données provenant de formulaires, que votre variable est du type que vous attendez, avant d'effectuer un quelconque traitement sur elle.Les cases à cocher (checkbox)Voyons maintenant comment on utilise les cases à cocher. On commence comme d'habitude avec un exemple de code XHTML. Le principe consistera à savoir ici si le visiteur veut se connecter automatiquement au site. Pour cela, on utilisera une checkbox. Si le visiteur la coche, il sera connecté automatiquement au site lors de sa prochaine visite, dans le cas contraire rien ne se passera. Voici le code XHTML :<form action="traitement.php"?method="post"><p><input type="checkbox"?name="connexion_automatique"?value="1"?/></p><p><input type="submit"?value="Envoyer"?/></p></form>Bon jusque-là rien de très compliqué. Vous allez voir pour la partie de traitement, c'est toujours aussi simple !<?php??????if(isset($_POST['connexion_automatique']))??????{???????????echo?'Vous?avez?coché?la?case?!';??????}??>Ici il s'agit d'un cas particulier, en effet, lorsque la case à cocher n'est pas cochée, le navigateur ne renvoie rien, donc la variable $_POST['connexion_automatique'] n'existe pas. Si elle existe, cela signifie donc que la case a été cochée.Les boutons radiosLes boutons radio permettent de ne sélectionner qu'une seule option parmis plusieurs. Par exemple si vous demandez "souhaitez-vous recevoir la newsletter mensuelle ?" le visiteur peut répondre "oui" ou "non", mais pas les deux à la fois. Voici ce que ?a donne en XHTML :<form action="traitement.php"?method="post"><p><input type="radio"?name="choix"?value="oui"?/>Oui</p><p><input type="radio"?name="choix"?value="non"?/>Non</p><p><input type="submit"?value="Envoyer"?/></p></form>Ici, pour savoir ce qu'a répondu le visiteur, on fera ceci en PHP :<?php??????if(isset($_POST['choix']))??????{??????????echo?htmlentities($_POST['choix']);?//affichera?"oui"?ou?"non"?en?fonction?de?ce?qu'a?sélectionné?le?visiteur??????}??>Les champs cachés (hidden)Les champs cachés fonctionnent exactement de la même manière que pour un champ de texte simple, la seule différence étant qu'ils ne seront pas affichés sur la page web. Vous pourrez transmettre ainsi des informations que le visiteur n'a pas besoin de remplir. N'allez pourtant pas croire que cette méthode est sécurisée, il s'agit juste d'une méthode bien pratique pour transmettre des variables et elle doit donc subir les mêmes traitements que les autres variables, à savoir une vérification minutieuse avant toute utilisation.Voici un exemple en XHTML :<form action="traitement.php"?method="post"><p><input type="hidden"?name="champ_cache"?value="ici ce que vous voulez"?/>Oui</p><p><input type="submit"?value="Envoyer"?/></p></form>Et voici comment on récupère la valeur de ce champ caché en PHP :<?php??????if(isset($_POST['champ_cache']))??????{??????????echo?htmlentities($_POST['champ_cache']);?//affiche?le?contenu?du?champ??????}??>La méthode getCette méthode de transmission de données passe par l'url, nous avons vu comment récupérer des données en PHP qui provenaient de l'url, il s'agit des variables $_GET['nom'] où nom est le nom du champ de formulaire dans notre cas.?Voici un exemple en XHTML pour le champ de type hidden :<form action="traitement.php"?method="get"><p><input type="hidden"?name="champ_cache"?value="ici ce que vous voulez"?/>Oui</p><p><input type="submit"?value="Envoyer"?/></p></form>La valeur se récupère de la même fa?on, en GET cette fois :<?php??????if(isset($_GET['champ_cache']))??????{??????????echo?htmlentities($_GET['champ_cache']);?//affiche?le?contenu?du?champ??????}??>Exercices pratiques?:Afficher le nom et prénom.<html><body>?<form method="post" action="verif.php">?Nom : <input type="text" name="nom" size="12"><br>?Prénom : <input type="text" name="prenom" size="12">?<input type="submit" value="OK">?</form></body></html><?php?$prenom?=?$_POST['prenom'];?$nom?=?$_POST['nom'];?print("<center>Bonjour?$prenom?$nom</center>");??>?Vérifier la présence des informations.La première fonction que nous utiliserons est?empty(), qui permet de contr?ler si un champs est vide. Ensuite nous allons contr?ler que?$_POST['url']?commence bien par?http://?à l'aide des deux fonctions?strtolower()?et?substr().<html><body>?<form method="post" action="verif.php">?Titre : <input type="text" name="titre" size="12"><br>?URL : <input type="text" name="url" size="12" value="http://">?<input type="submit" value="OK">?</form></body></html><?php?$titre?=?$_POST['titre'];?$url?=?$_POST['url'];?if(empty($titre))?{?print("<center>Le '<b>Titre</b>' est vide !</center>");?exit();?}?// vérification du début de l'url?$verif_url?=?strtolower($url);?$verif_url?=?substr("$verif_url",?0,?7);?// on verifie les 7 premiers caractères?if?($verif_url!="http://")?{?print("L'URL doit commencer par <b>;");?exit();?}?else?{?print("$titre?: <a?href=\"$url\">$url</a>");?}??>Ajouter un emailAvec cet exemple nous commen?ons à attaquer les conditions, c'est un aspect primordial dans tous les langages. La première vérification porte sur le champ 'titre', la fonction?empty()permet de contr?ler si celui-ci est vide ou non. Ce qui nous donne :?if(empty($titre)){?print("<center>Le '<b>Titre</b>' est vide !</center>"); exit(); }?:?Si la variable?$titre?est vide alors j'affiche le message :?'Le titre est vide'?(placé entre accolades)?et j'arrête l'exécution du reste du code avec la commande?exit().Par contre si la variable n'est pas vide, l'exécution ne prend pas en compte ce qui se trouve entre accolades et continue.La seconde vérification est plus fine puisqu'il s'agit de vérifier que les 7 premiers caractères qui ont été entrés par le visiteur sont bien?http://. Pour commencer nous utilisons la fonctionstrtolower()?qui permet de transformer tous les caractères en minuscules (ex.??). Puis à l'aide de la fonction?substr(), nous sélectionnons les 7 premiers caractères?(0?est toujours le premier caractère d'une chaine - le second chiffre '?7?' étant le nombre de caractères à sélectionner), puis nous les comparons à ce que nous avons dans notre condition if :if?($verif_url!="http://"){?print("L'URL doit commencer par <b>;"); exit(); }?:?Si les 7 premiers caractères sont différents ( signe:?!=?)?de?http://, alors on exécute ce qui ce trouve entre accolades?(en l'occurrence on affiche un message d'erreur), puis nous arrêtons le?reste du code avec la commande?exit().Par contre si le résultat est correct, PHP ignore ce qui ce trouve entre accolades et exécute le reste du code.<html><body> <form method="post" action="verif.php"> Votre email : <input type="text" name="email" size="20"> <input type="submit" value="OK"> </form></body></html><?php?$email?=?$_POST['email'];?$point?=?strpos($email,".");?$aroba?=?strpos($email,"@");?if($point=='')?{?echo?"Votre email doit comporter un <b>point</b>";?}?elseif($aroba=='')?{?echo?"Votre email doit comporter un <b>'@'</b>";?}?else?{?echo?"Votre email est: '<a href=\"mailto:"."$email"."\"><b>$email</b></a>'";?}??>Exercices pratiques?:1) Envoyer un formulaire automatiquement par email?:Voici le code HTML du formulaire d’envoi?: envoimail.html<form id="form1" name="form1" method="post" action="envoimail.php">//cela ne fonctionne que si nous avons un server de mail si non nous pouvons utiliser un server de mail en ligne en indiquant alors l’url complète. il faut pour cela utiliser un ftp pour transférer le fichier php sur internet. Par exemple?: Filezilla. <p> <label>Nom : <input type="text" name="nom" id="nom" /> </label> </p> <p> <label>Votre email : <input type="text" name="mail" id="mail" /> </label> </p> <p> <label>Sujet : <input type="text" name="sujet" id="sujet" /> </label> </p> <p> <label>Votre message : <textarea name="message" cols="50" rows="10" id="message"></textarea> </label> </p> <p> <label> <input type="submit" name="envoyer" id="envoyer" value="Envoyer" /> </label> <label> <input type="reset" name="reinitialiser" id="reinitialiser" value="Réinitialiser" /> </label> </p></form>Voici le code PHP?: envoimail.php<?php// je ne défini pas manuellement les champs comme précédement, je les défini au sein d’une boucle foreach et d’un tableau$vars = array("nom", "mail", "objet", "message");foreach($vars as $var)if(isset($_POST[$var]))$$var = $_POST[$var];else$$var = '';//je teste la validité des donnéesif(strlen($nom) < 3)die("Un nom doit avoir plus de 3 caractères !");if(!eregi('^([a-z0-9\._-])+@([^\.]+\.[^\.]+)', $mail, $matched))die("Adresse invalide !!");else if(!getmxrr($matched[2], $mxrr))die("Serveur de mail invalide !!");$expediteur = "formateur@video2brain.fr";//Utilisation des variables d’environnement, pour conna?tre l’adresse ip de l’expéditeur.$expediteurIP = $_SERVER[REMOTE_ADDR];$corpsDuMail = "Demande d'informations :Nom : $nomeMail : $mailObjet : $objetMessage :$message";//méthode PHP d’envoi de mailmail($expediteur, "Nouveau message...", $corpsDuMail, "de: $mail");print "Mail envoyé...";?>2) Créer une base de données?en Workbench: shema -> info1 table -> infos_tblrequête SQL:CREATE TABLE infos_tbl (id INT (11) not null AUTO_INCREMENT, nom VARCHAR (35) not null , prenom VARCHAR (35) not null , email VARCHAR (70) not null , icq INT (11) null , titre VARCHAR (70) not null , url VARCHAR (255) not null , PRIMARY KEY (id), INDEX (id), UNIQUE (id))2) Créer une page html: Form.html<html><form method="POST" action="add.php"><center><input type="text" name="nom" size="20" value="nom" maxlength="35"> <input type="text" name="prenom" size="20" value="prenom" maxlength="35"><br><input type="text" name="email" size="20" value="email" maxlength="70"> <input type="text" name="icq" size="20" value="icq" maxlength="11"><br><input type="text" name="titre" size="20" value="titre du site" maxlength="70"> <input type="text" name="url" size="20" value="url du site" maxlength="255"><br><input type="submit" value="Envoyer" name="envoyer"></center></form>3) Insérer des données dans la base de données à travers le formulaire php. add.php<html lang="en"><head><title>add</title></head><body><?php // On commence par récupérer les champs if(isset($_POST['nom'])) $nom=$_POST['nom'];else $nom="";if(isset($_POST['prenom'])) $prenom=$_POST['prenom'];else $prenom="";if(isset($_POST['email'])) $email=$_POST['email'];else $email="";if(isset($_POST['icq'])) $icq=$_POST['icq'];else $icq="";if(isset($_POST['titre'])) $titre=$_POST['titre'];else $titre="";if(isset($_POST['url'])) $url=$_POST['url'];else $url="";// On vérifie si les champs sont vides if(empty($nom) OR empty($prenom) OR empty($email) OR empty($titre) OR empty($url)) { echo '<font color="red">Attention, seul le champs <b>ICQ</b> peut rester vide !</font>'; } // Aucun champ n'est vide, on peut enregistrer dans la table else { $link = mysqli_connect('localhost', 'root', '', 'info'); // connexion à la base /* Vérification de la connexion */if (mysqli_connect_errno()) {printf("Echec de la connexion : %s\n",mysqli_connect_error());exit();}if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante{$row = $result->fetch_row();printf("La base de donnees courante est %s.\n", $row[0]);echo "<br>";$result->close();}// On insère les informations du formulaire dans la table$sql = "INSERT INTO infos_tbl(id, nom, prenom,email, icq, titre, url) VALUES('','$nom','$prenom','$email','$icq','$titre','$url')"; $result = mysqli_query($link, $sql)?;echo 'Vos infos on ete ajoutees.'; // on affiche le résultat pour le visiteur echo "<br/>"; // Requête "Select" retourne un jeu de résultats$result = mysqli_query($link, "SELECT * FROM infos_tbl");while ($row=mysqli_fetch_row($result)){print("id:$row[0] nom:$row[1] prenom:$row[2] email:$row[3] icq:$row[4] titre:$row[5] url:$row[6]) <br>");}mysqli_close($link); // on ferme la connexion } ?> </body></html>Afficher le nom et prénom de la table infos_tbl<html lang="en"><head><title>afficher nom et prénom </title></head><body><?php // On commence par récupérer les champs if(isset($_POST['nom'])) $nom=$_POST['nom'];else $nom="";if(isset($_POST['prenom'])) $prenom=$_POST['prenom'];else $prenom="";if(isset($_POST['email'])) $email=$_POST['email'];else $email="";if(isset($_POST['icq'])) $icq=$_POST['icq'];else $icq="";if(isset($_POST['titre'])) $titre=$_POST['titre'];else $titre="";if(isset($_POST['url'])) $url=$_POST['url'];else $url="";// On vérifie si les champs sont vides if(empty($nom) OR empty($prenom) OR empty($email) OR empty($titre) OR empty($url)) { echo '<font color="red">Attention, seul le champs <b>ICQ</b> peut rester vide !</font>'; } // Aucun champ n'est vide, on peut enregistrer dans la table else { $link = mysqli_connect('localhost', 'root', '', 'info'); // connexion à la base /* Vérification de la connexion */if (mysqli_connect_errno()) {printf("Echec de la connexion : %s\n", mysqli_connect_error());exit();}if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante{$row = $result->fetch_row();printf("La base de donnees courante est %s.\n", $row[0]);echo "<br>";$result->close();}// exécution de la requete$result = mysqli_query ($link, "SELECT nom, prenom FROM infos_tbl order by 2,1");// lecture des ligneswhile ($row=mysqli_fetch_row($result)){print ("<pre>");for ($i=0; $i<mysqli_num_fields($result);$i++){print ("$row[$i] ");}}print ("</pre>");}// déconnectionmysqli_close($link);?></body></html>PHP - Les sessionsPrésentationLes sessions en PHP permettent de sauvegarder des variables de page en page pendant une certaine durée prédéfinie par PHP (et modifiable bien entendu). L'avantage des sessions sur les variables de type $_GET et $_POST est double : outre l'absence de formulaires (et même de tout code HTML) pour gérer les sessions, ce système va vous permettre de transmettre des variables sur toutes les pages de votre site d'une manière transparente pour vous (en PHP) ainsi que pour l'utilisateur. Vous imaginez si un membre devait cliquer à chaque fois sur les pages qu'il visite sur un bouton de formulaire indiquant qu'il est connecté ? ?a ne serait pas vraiment viable comme système. Les variables de session vont pouvoir mémoriser tout ce que vous souhaitez pendant la durée de connexion d'un visiteur. Sur ce site par exemple, lorsque vous êtes connecté, j'utilise le système de sessions pour savoir que vous êtes toujours là sans que vous ayez besoin de retaper votre mot de passe ou votre nom d'utilisateur à chaque page consultée.La technique est simple : chaque utilisateur ayant besoin des sessions se voit attribuer un identifiant unique appelé?ID de session. Cet identifiant est stocké sur le poste de l'internaute sous forme d'un cookie ou transite via l'URL si l'option?session.use_trans_sid?est à 1 (ou On) dans le fichier?php.ini. Utiliser la méthode du cookie est plus que recommandée : un identifiant de session dans l'URL empêche de retenir l'adresse d'une page simplement par le visiteur néophyte, cela rallonge donc l'adresse de votre page. Cela nuit également au référencement de votre page. En effet, l'identifiant étant unique, lorsque le robot du moteur de recherche scanne votre site, il ne retombera jamais sur la même URL plusieurs fois de suite. Vous pouvez donc dire adieu à votre référencement en procédant comme ?a.Il est important de toujours avoir à l'idée qu'un identifiant de session peut être dérobé par un pirate. ?vitez donc autant que possible le transit par l'url des informations de session (qui peuvent généralement se retrouver dans des copier-collers de liens dans un forum par exemple).?Utilisation des sessionsAvant d'utiliser les sessions sur une page, on doit toujours utiliser la fonction?session_start()?placée avant tout envoi de code HTML, et donc généralement tout en haut de votre page PHP :<?php??????session_start();?//doit?être?placé?avant?tout?echo?ou?autre?code?html??????//Vous?pouvez?commencer?à?utiliser?les?sessions?après?le?session_start();??>Pourquoi session_start() doit-elle être placée de la sorte ? et bien parce que si PHP utilise les cookies pour repérer quel est l'id de session utilisé par l'internaute, il va écrire cet id de session dans un cookie. Or, le protocole HTTP fonctionne de telle sorte que les en-têtes (qui permettent de dire à votre navigateur "crée un cookie ayant tel nom et telle valeur") sont envoyés avant le premier caractère HTML transmis. Cela veut dire que dès que vous transmettrez un caractère HTML, les en-têtes seront envoyés et vous ne pourrez plus les modifier, vous ne pourrez donc plus écrire le cookie de session. En général, si vous faites une maladresse de ce style, vous vous retrouverez avec une erreur de?headers already sent.Les variables de session fonctionnent comme les variables classiques. Voici un exemple pour attribuer une valeur à une variable de session nommée?login?:<?php??????session_start();?//doit?être?appelée?avant?toute?utilisation?des?sessions??????$_SESSION['login']='valeur';??>Pour récupérer la valeur d'une variable de session (sur la même page ou sur une autre page, après un session_start()), il s'agit de la même procédure que pour une variable classique hormis l'ajout du session_start() tout en haut de la page :<?php??????session_start();??????if(isset($_SESSION['login']))??????{???????????echo?$_SESSION['login'];?//affiche?la?valeur?de?$_SESSION['login']?qui?a?pu?être?attribué?dans?une?autre?page?php??????}??>Pour savoir si une variable de session existe, on procède de la même fa?on que pour les autres variables à savoir qu'on utilise la fonction isset().Vous souhaiterez peut-être effacer une ou plusieurs variables de session, au même titre qu'une autre variable en PHP, il faut utiliser pour ?a la fonction?unset().Voici un petit exemple simple pour effacer la variable de session?login?que nous avons créée tout à l'heure (le membre ne pourra donc plus être considéré comme identifié) :<?php??????session_start();??????if(isset($_SESSION['login']))??????{???????????unset($_SESSION['login']);??????}??>Si vous souhaitez effacer toute la session d'un coup, vous pouvez?utiliser la fonction?session_destroy()?pour détruire toutes les variables de session d'un visiteur. Cette fonction doit quand même avoir été initialisée par un session_start(), comme vous le feriez sur toutes vos pages.Pour une plus grande sécurité, vous aurez peut-être envie de conna?tre l'id de session du visiteur, pour pouvoir effectuer divers traitements dessus ou encore pour l'enregistrer quelque part pour en garder une trace. PHP dispose d'une fonction destinée à cet usage, il s'agit de la fonction?session_id().<?php??????session_start();??????echo?session_id();?//Retourne?l'identifiant?de?session??>Vous pouvez également modifier l'id de session courant en spécifiant une valeur dans la fonction?session_id(), mais par contre il faudra cette fois-ci que vous le fassiez avant le?session_start()?sinon ?a ne fonctionnera pas.<?php??????session_id(md5(mt_rand()));??????session_start();??????echo?session_id();?//Retourne?l'identifiant?de?session??>Voilà, ce que vous venez de voir suffit amplement pour gérer un système de sessions sur votre site, pour réaliser un espace membres ou encore un panier en ligne. Comme quoi, des notions simples permettent souvent de faire des choses concrètes en PHP.PHP : Les cookiesQu'est-ce qu'un cookie ?Les cookies sont de petits fichiers textes placés sur votre disque dur par les sites internet qui les utilisent. A chaque consultation d'une page, votre navigateur envoie dans les?en-têtes HTTP, le nom et les données des cookies que le site a créés, et qui sont encore valides.Pour créer un cookie sur le navigateur de l'internaute (le?client), le site internet place une mention dans les requêtes qu'il envoie au navigateur. Celui-ci les interprète et décide de créer un cookie disposant d'un nom, d'une valeur et d'une date de fin de validité. Chaque site internet peut créer plusieurs cookies, mais ils ont tous, chacun, une taille maximale de 4?Ko. N'espérez donc pas stocker de grosses informations par ce moyen.Les cookies ne sont consultables que par le site qui les a créés. Il sera donc impossible pour un site internet de lire l'ensemble de vos cookies.Ce mécanisme de communication permet de conserver des données de pages en pages, bien qu'on préfère en PHP les?sessions, bien plus sécurisées et situées c?té serveur.Créer un cookie en PHPOn utilise la fonction PHP?setcookie()?pour créer un cookie.Exemple de création d'un cookie<?php setcookie('moncookie','Anthony',time()+$validite);?>Création d'un cookie valable 7 joursLa variable?$validite?est un nombre entier spécifiant le nombre de secondes (par rapport au temps actuel) pendant lesquelles le cookie sera valide. Si vous souhaitez créer un cookie valable 7 jours, il faudra compter 7 * 24 * 3600 secondes.<?php????setcookie('moncookie','Anthony',time()+?3600?*?24?*?7);?>D'autres paramètres existent pour la fonction setcookie() mais je n'en parlerai pas ici. Ils permettent entre-autres de restreindre la visibilité des cookies à un ou plusieurs sous-domaines de votre site, ou encore de ne pas rendre visible le cookie via Javascript. Des explications plus détaillées sont disponibles sur?fr.Attention ! l'usage de la fonction setcookie() se fait avant toute écriture de code HTML ou textuel. Si vous ne respectez pas cette consigne, une erreur?Headers already sent by?appara?tra. Vous pouvez utiliser la?bufferisation de sortie en PHP?pour résoudre ce problème si vous n'avez pas totalement la main sur votre code.Supprimer un cookiePour supprimer un cookie, c'est très simple. A l'aide de la fonction setcookie(), vous passez en paramètre le nom du cookie que vous souhaitez supprimer, et c'est tout !<?php setcookie('moncookie','');?>Lire la valeur d'un cookieSi vous vous souvenez, nous avons vu plus haut que l'utilisation des cookies était en partie similaire à celle des sessions. C'est bien le cas !Pour lire un cookie nommé?moncookie, vous devrez utiliser le code suivant :<?php????echo?$_COOKIE['moncookie'];?>PHP - Fichiers et dossiersPrésentationLes fichiers et dossiers sont très souvent utilisés en PHP. Nous verrons plus loin qu'il existe d'autres manières de stocker les données en utilisant ce qu'on appelle une base de données, qui est une autre forme de stockage très couramment utilisée.Nous allons apprendre pour ce chapitre à manipuler des fichiers existants (ouvrir un fichier, enregistrer des données et fermer le fichier).Ouvrir un fichier en PHPNous supposerons que vous avez déjà un fichier qui se nomme "test.txt" (fichier texte donc) sur votre disque dur, dans le répertoire courant que vous utilisez pour travailler en PHP. Vous savez ce qu'est une fonction, donc je ne vais pas mettre plus de temps à vous dire que pour ouvrir un fichier, plusieurs fonctions sont disponibles en fonction de ce que l'on souhaite faire.La plus simple est la fonction?file_get_contents(). Elle prend comme paramètre le nom du fichier (nous ne détaillerons pas les autres paramètres possibles de cette fonction ici, ils ne nous seront pas utiles pour la suite). On récupère le contenu du fichier ouvert dans une variable. Voici comment ?a se passe :<?php??????$fichier?=?file_get_contents('test.txt');?//récupère?le?contenu?du?fichier?et?le?place?dans?la?variable?$fichier??????echo?$fichier;?//affiche?le?contenu?du?fichier??>Vous n'avez pas à fermer le fichier quand vous utilisez cette fonction, qui à mon avis est adaptée quand vous ne souhaitez pas lire les données du fichier d'une certaine fa?on. Vous verrez qu'avec une autre fonction que nous allons voir maintenant, vous allez pouvoir faire plus de choses. La fonction que nous allons utiliser porte le doux nom de fopen() et demande au minimum deux paramètres devant être renseignés. Le premier paramètre est le nom du fichier (ce qui ne change pour le moment pas avec la fonction file_get_contents()), et le deuxième est un peu particulier. En effet, ce deuxième paramètre va être utile pour déterminer le mode d'ouverture du fichier. Voici un récapitulatif des modes disponibles :modeDescriptionrOuvre le fichier en lecture seule, le pointeur de fichier est placé au début du fichier.r+Ouvre le fichier en lecture + écriture, le pointeur de fichier est placé au début du fichier.wOuvre le fichier en écriture seule; le pointeur de fichier est placé au début du fichier et écrase les données du fichier existant (si il existe). Si le fichier n'existe pas, ce mode permet de créer le fichier.w+Ouvre le fichier en lecture et écriture; le pointeur de fichier est placé au début du fichier et écrase les données du fichier existant (si il existe). Si le fichier n'existe pas, ce mode permet de créer le fichier.aOuvre le fichier en écriture seule; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, il est créé.a+Ouvre le fichier en lecture et écriture; le pointeur de fichier est placé à la fin du fichier. Si le fichier n'existe pas, il est créé.xCrée et ouvre le fichier en lecture seule; le pointeur de fichier est placé au début du fichier. Si le fichier existe déjà,?fopen()?va échouer. Si le fichier n'existe pas,?fopen()?tente de le créer. Cette option est supportée à partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.x+Crée et ouvre le fichier en lecture et écriture; place le pointeur de fichier au début du fichier. Si le fichier existe déjà,?fopen()?va échouer. Si le fichier n'existe pas, il est crée. Cette option est supportée à partir de PHP 4.3.2, et fonctionne uniquement avec des fichiers locaux.Vous vous demandez peut-être ce qu'est un pointeur de fichier. En fait, prenons un exemple simple avec un fichier contenant "123456". Le pointeur de fichier peut être représenté comme un curseur que vous placeriez à une certaine position. Si vous écrivez à partir de cette position, vous remplacerez les caractères qui suivent. Le pointeur de fichier commence à la position 0, cette position correspond à un curseur placé juste avant le premier caractère du fichier. Voici comment on peut représenter ?a :Si votre pointeur de fichier est en position 0, tout ce que vous écrirez remplacera les caractères 1, 2, 3 etc ... alors que si vous aviez placé votre curseur en position 6, vous auriez écrit après et votre fichier aurait donc été "prolongé".Maintenant nous allons mettre en pratique tous ces exemples. Si nous souhaitons ouvrir le fichier "test.txt" en lecture, on regarde d'abord le mode que nous allons utiliser. Ici, il s'agit du mode r, voici donc la syntaxe à utiliser pour ouvrir le fichier :<?php??????$ressource_fichier?=?fopen('test.txt',?'r');?//Ouvre?le?fichier?en?lecture?seule??>Notez le nom de la variable que j'ai utilisée, ici on ne récupère pas le contenu du fichier mais une ressource qui va permettre de contr?ler ce fichier. On va donc ensuite pouvoir dire à PHP "utilise cette ressource et récupère le contenu du fichier". Pour récupérer le contenu du fichier, il y a plusieurs manières :Récupérer caractère par caractère le contenu du fichier.Récupérer ligne par ligne le contenu du fichier.Récupérer tout le contenu du fichier d'une traite (nous avons déjà vu une méthode avec la fonction file_get_contents()).Lire un fichier caractère par caractèreNous allons commencer par la méthode consistant à récupérer un (ou plusieurs caractères) du fichier. La fonction permettant de retourner un seul caractère s'appelle fgetc() et prend en paramètre la fameuse ressource de fichier dont je vous ai parlé tout à l'heure.<?php??????$ressource_fichier?=?fopen('test.txt',?'r');?//Ouvre?le?fichier?en?lecture?seule,?on?supposera?qu'il?existe?sous?peine?d'avoir?une?erreur??????if($ressource_fichier)?//Si?$ressource_fichier?ne?vaut?pas?FALSE?on?peut?continuer??????{???????????$carac1?=?fgetc($ressource_fichier);?//Place?le?chiffre?1?dans?la?variable?$carac1???????????$carac2?=?fgetc($ressource_fichier);?//Place?le?chiffre?2?dans?la?variable?$carac2???????????fclose($ressource_fichier);??????}??>Vu que notre fichier contient "123456" si vous faites des fgetc() successivement, vous allez pouvoir récupérer le "1" puis le "2", etc ...A chaque fois que vous utilisez la fonction fgetc(), PHP incrémente le pointeur de fichier d'une position, voilà pourquoi vous ne lisez pas le même caractère à chaque fois (ce qui ne serait pas forcément ce qu'on souhaite).Vous imaginez bien que vous ne savez pas forcément le nombre de caractères d'un fichier, et que cette méthode n'est valable pour des fichiers contenant un nombre très restreint de caractères. On peut déjà se dire que l'on pourrait utiliser une boucle pour récupérer tous les caractères du fichier, mais il y a un problème. En effet, quoi mettre dans la condition de continuité de la boucle ? On doit dire à la boucle "arrête-toi dès que tu atteints la fin du fichier" et nous ne connaissons pour le moment aucune condition à placer pour lui dire cela. Heureusement, PHP vient à notre secours avec la fonction feof qui renvoie TRUE si le pointeur se trouve à la fin du fichier (et donc qu'il n'y a plus aucun caractère à lire). Nous utilisons également la fonction fclose() qui permet de fermer le fichier et est indispensable.Voici donc ce que ?a donne :<?php??????$ressource_fichier?=?fopen('test.txt',?'r');?//Ouvre?le?fichier?en?lecture?seule,?on?supposera?qu'il?existe?sous?peine?d'avoir?une?erreur??????if($ressource_fichier)?//Si?$ressource_fichier?ne?vaut?pas?FALSE?on?peut?continuer??????{???????????$contenu_fichier???=?'';???????????while(!feof($ressource_fichier))?//Tant?que?l'on?est?pas?à?la?fin?du?fichier???????????{????????????????$contenu_fichier?.=?fgetc($ressource_fichier);?//Récupère?le?caractère?en?cours?et?l'ajoute?au?contenu?de?la?variable?$contenu_fichier???????????}???????????fclose($ressource_fichier);???????????echo?$contenu_fichier;?//affiche?le?contenu?du?fichier??????}??>Un petit rappel : $variable .= 'valeur'; est équivalent à $variable = $variable . 'valeur'; sauf que PHP interprète la première solution plus rapidement, vous y gagnez en clarté et en performances générales.Concernant la solution de lire le fichier caractère par caractère, nous venons de le voir à titre purement pédagogique. On évitera cette solution pour des scripts couramment utilisés. Il vaut mieux lire le fichier d'une traite ou ligne par ligne, vous minimiserez ainsi les appels aux fonctions qui sont gourmands en ressources système.Lire un fichier ligne par ligneDeuxième méthode, cette fois-ci plus adaptée à de gros fichiers, la lecture ligne par ligne. On utilise la fonction fgets() qui permet de lire une ligne d'une seule traite. Voici ce que ?a donne, je pense que vous comprendrez car cela ne change presque pas par rapport à l'exemple précédent :<?php??????$ressource_fichier?=?fopen('test.txt',?'r');??????if($ressource_fichier)?//Si?$ressource_fichier?ne?vaut?pas?FALSE?on?peut?continuer??????{???????????$contenu_fichier???=?'';???????????while(!feof($ressource_fichier))?//Tant?que?l'on?est?pas?à?la?fin?du?fichier???????????{????????????????$contenu_fichier?.=?fgets($ressource_fichier);?//Récupère?la?ligne?en?cours?et?l'ajoute?au?contenu?de?la?variable?$contenu_fichier???????????}???????????fclose($ressource_fichier);???????????echo?$contenu_fichier;?//affiche?le?contenu?du?fichier??????}??>Lire un fichier sous forme de tableauVous avez déjà vu ce que sont les tableaux. Et bien PHP va vous permettre de récupérer le contenu d'un fichier dans un tableau, chaque ligne du tableau correspondra à une ligne du fichier. Ceci est très pratique quand vous avez besoin d'une ligne en particulier dans votre fichier (dont vous connaissez le numéro) ou encore pour faire des opérations de tri alphabétiques, numériques ou que sais-je encore. En tout cas, sachez que c'est également très utilisé ;)La fonction que nous allons utiliser s'appelle file(). Comme son nom ne l'indique pas, elle va vous retourner un tableau contenant tout votre fichier. Voici comment on l'utilise :<?php??????$tableau?=?file('test.txt');?//Place?le?contenu?du?fichier?dans?un?tableau, on a supposé ici que le fichier existe sous peine d'avoir une erreur.??>Et voilà, c'est aussi simple que ?a. Maintenant, il faut se souvenir d'une des fonctions que l'on peut utiliser pour parcourir un tableau :pBon allez je vous le dit, on peut prendre par exemple la fonction foreach(). Pour placer le contenu du fichier dans une variable sous forme de cha?ne et afficher le fichier (comme nous l'avons fait pour les exemples précédents) on procèdera de cette fa?on :<?php??????$tableau?=?file('test.txt');?//Place?le?contenu?du?fichier?dans?un?tableau, on suppose que le fichier existe sous peine d'avoir une erreur??????if(is_array($tableau))?//Si la variable $tableau est bien un tableau, on peut continuer??????{???????????$contenu_fichier?=?'';???????????foreach($tableau?AS?$ligne)???????????{????????????????$contenu_fichier?.=?$ligne;???????????}???????????echo?$contenu_fichier;?//Affiche?le?contenu?du?fichier, notez que l'on a pas besoin d'utiliser fclose() ici??????}??>?crire dans un fichierNous allons voir une seule méthode pour écrire dans un fichier, il s'agit d'utiliser la fonction fputs() disponible sur toutes les versions de PHP. Il faut d'abord ouvrir le fichier à l'aide de la fonction fopen() et un mode d'écriture approprié, ensuite on utilise fputs() pour écrire les données, et ensuite on ferme le fichier. Voici un exemple pour écrire les données "7654321" dans le fichier "test.txt" que nous avons utilisé tout au long de cette page :<?php??????$ressource_fichier?=?fopen('test.txt',?'w');??????if($ressource_fichier?AND?is_writable('test.txt'))?//Si?$ressource_fichier?ne?vaut?pas?FALSE?et?que?le?fichier?est?accessible?en?écriture?alors?on?peut?continuer?????{???????????fputs($ressource_fichier,?'7654321');?//Si?une?erreur?a?lieu,?fputs()?renverra?FALSE,?il?faudra?dans?ce?cas?utiliser?l'opérateur?triple?égal?pour?le?savoir??????????fclose($ressource_fichier);??????}??>Quelques fonctions utilesSi vous souhaitez vérifier qu'un fichier existe, vous utiliserez pour cela la fonction file_exists() qui renverra TRUE ou FALSE si le fichier existe ou non. Elle prend en paramètre le nom du fichier. Voici un exemple :<?php??????if(file_exists('test.txt'))??????{???????????echo?'Le?fichier?existe';??????}??????else??????{???????????echo?'Le?fichier?n\'existe?pas';??????}??>Il faut toujours avant d'ouvrir un fichier, vérifier si il existe, ce que je n'ai pas fait dans mes exemples précédents, voilà pourquoi je vous mettais à chaque fois "on supposera que le fichier existe sous peine d'avoir une erreur". En effet, si vous tentez d'effectuer une ouverture d'un fichier inexistant, PHP vous renverra une erreur, ce qui serait f?cheux en terme de programmation.Vous aurez peut-être également besoin de savoir comment effacer un fichier. En PHP, on utilise la fonction unlink() avec comme paramètre le nom du fichier à effacer. Voici comment on l'utilise :<?php??????if(file_exists('test.txt'))??????{???????????unlink('test.txt');??????}??>PHP - Les expressions régulièresPrésentationLes expressions régulières sont souvent utilisées en PHP quand on doit faire des traitements conditionnels très poussés sur les cha?nes de caractères. Ce chapitre est malheureusement compliqué à comprendre, et nous aborderons plein d'exemples simples qui je l'espère vous permettront de faire des choses plus compliquées ensuite.Une expression régulière (aussi appelée regex) va par exemple vous permettre de savoir si une cha?ne est composée de 6 caractères numériques, de savoir si elle commence par un "a" tout en finissant par un "w" ou encore de savoir si il s'agit d'une date valide, etc ...Toutes ces conditions que l'on fixe se présentent sous la forme d'une cha?ne de caractères qui peut être immense en fonction de ce que l'on souhaite savoir ou récupérer.?Les fonctions PCREEn PHP, il existe deux "langages" pour les expressions régulières. Ces deux langages sont le POSIX et le PCRE. Nous étudierons les fonctions utilisant le langage PCRE, plus performant que le POSIX (que ce soit en terme de puissance ou de rapidité de traitement). Les fonctions utilisant le PCRE commencent généralement par le préfixe "preg_".Voici une liste des fonctions PCRE que nous serons amenées à utiliser (il en existe d'autres) :preg_match_allpreg_matchpreg_replacepreg_splitCes fonctions s'utilisent généralement de la manière suivante (pour les fonctions de remplacement) :preg_X('masque', 'chaine de remplacement', 'chaine de caractères dans laquelle on appliquera le masque');Les fonctions de comparaison sont plut?t de ce style là :preg_Y('masque', 'chaine de caractères dans laquelle on appliquera le masque');La cha?ne "masque" correspond à une expression régulière. Nous allons voir plus bas comment créer des expressions régulières. Avant toute chose, il faut savoir qu'une regex est toujours délimitée par deux caractères identiques appelés délimiteurs. Ces délimiteurs sont importants car ils vont vous permettre d'ajouter des options à votre expression régulière (comme par exemple l'insensibilité aux majuscules/minuscules).Voici l'exemple général d'utilisation d'une regex :`masque`optionsCe qui peut donner par exemple :`[a-z]*`iIci, vous ne le savez pas encore mais ceci désigne une cha?ne composée de lettres uniquement, majuscules ou minuscules (le i dans l'option signifie que la recherche est insensible aux minuscules ou majuscules)Recherche d'une cha?ne - basesLa recherche d'une cha?ne de caractères simple peut se faire avec la fonction strpos() de PHP, qui sera bien plus rapide qu'une expression régulière. Toutefois, ses fonctionnalités sont très limitées car elle ne peut disposer en paramètre que d'une cha?ne fixe. Avec une expression régulière vous allez pouvoir imposer des conditions performantes sur la recherche.Pour rechercher une cha?ne suivant des conditions précises, on utilise la fonction preg_match(). Elle s'utilise comme ceci :<?php??????$chaine?=?'Un exemple de cha?ne simple';??????if(preg_match('`exemple`',?$chaine))??????{???????????echo?'Vrai, la?cha?ne?correspond?au?masque';??????}??????else??????{???????????echo?'Faux, la?cha?ne?ne?correspond?pas?au?masque';??????}??>Ici, la cha?ne correspond au masque car nous cherchons la cha?ne "exemple" qui se situe bien dans la phrase "Un exemple de cha?ne simple". Bon, vous vous imaginez que les fonctions de preg_match() ne se limitent pas à ?a, sinon utiliser strpos() ...Voyons d'autres cas de figure :<?php??????$chaine?=?'Un exemple de cha?ne simple';??????if(preg_match('`Exemple`',?$chaine))??????{???????????echo?'Vrai, la?cha?ne?correspond?au?masque';??????}??????else??????{???????????echo?'Faux, la?cha?ne?ne?correspond?pas?au?masque';??????}??>Ici, vous aurez un résultat faux car le E de exemple est en majuscule. Pour remédier à ce problème, on utilise l'option "i" qui signifie que le masque ne tient pas compte des minuscules et majuscules. Les options se placent après le deuxième délimiteur (ici le caractère `) :<?php??????$chaine?=?'Un exemple de cha?ne simple';??????if(preg_match('`Exemple`i',?$chaine))??????{???????????echo?'Vrai, la?cha?ne?correspond?au?masque';??????}??????else??????{???????????echo?'Faux, la?cha?ne?ne?correspond?pas?au?masque';??????}??>Ici, preg_match() renvoie TRUE. Voyons d'autres cas : Cha?neRegexRésultat 'Un exemple de cha?ne simple'`exemple`Vrai (le mot "exemple" se trouve bien dans la cha?ne) 'Un exemple de cha?ne simple'`compliquée`Faux (le mot "compliquée" ne se trouvant pas dans la cha?ne) 'Un exemple de cha?ne simple'`Exemple`Faux car le E est en majuscule dans la regex et pas dans la cha?ne 'Un exemple de cha?ne simple'`Exemple`iVrai car le i rend insensible à la casse (majuscules/minuscules) la regexRecherche d'une cha?ne : condition "ou"Le symbole "ou" est désigné en PCRE par une seule barre verticale (contrairement au PHP qui lui en demande deux dans les conditions habituelles).Mettons que nous recherchions dans une chaine le mot "site" ou le mot "web". La regex pourra s'écrire comme ceci :`site|web`Cha?neRegexRésultat'Bienvenue sur mon site web'`site|web`Vrai (on a bien soit site soit web dans la cha?ne)'BIENVENUE SUR MON SITE WEB'`site|web`Faux (aucun des deux mots n'est en minuscules)'BIENVENUE SUR MON SITE WEB'`site|web`iVrai, on a rendu l'expression régulière insensible à la casse'Bienvenue sur mon site'`site|web`Vrai car le mot "site" figure dans la cha?ne à analyser'Bienvenue sur mon espace web'`site|web`Vrai car le mot "web" figure dans la cha?ne à analyser'Bienvenue sur mon espace'`site|web`Faux car ni le mot "site" ni le mot "web" ne figurent dans la cha?neLe début et la fin d'une cha?neBon, nous allons maintenant voir quelque chose d'un peu plus précis. Il s'agit du début et de la fin d'une cha?ne. Par exemple nous allons pouvoir dire "est-ce que cette cha?ne commence par la lettre A majuscule et se termine par un b minuscule ?"Les deux symboles utilisés pour désigner cela sont ceux-ci :^ qui désigne le début d'une cha?ne.$ qui désigne la fin d'une cha?ne.Cha?neRegexRésultat'Anthony'`^A`Vrai (la cha?ne commence bien par un A)'Anthony'`y$`Vrai (la cha?ne se termine par un y)'Début de phrase'`^Dt$`Faux car la cha?ne est différente de "Dt"'Bienvenue sur mon espace web'`^Bienvenue sur mon espace web$`Vrai car la cha?ne est identique des deux c?tés'Bienvenue sur mon espace web'`^Bienvenue web$`Faux car il y a des mots entre le mot "Bienvenue" et le mot "Web"Les quantificateursLes quantificateurs sont très utiles, gr?ce à eux vous allez pouvoir dire "je veux savoir si cette cha?ne commence par 7 fois la lettre A", ou encore "il me faut un A, trois o et deux z".?Il faut tout d'abord retenir trois symboles :? qui désigne "0 ou une occurrence". Si on prend par exemple le masque?`v?`, la ch?ine 'v' sera valide, 'vv' ne sera pas valide et '' sera valide+ qui désigne "1 ou plusieurs occurrences". Si on prend par exemple le masque?`v+`?la cha?ne 'v' sera valide, 'vv' le sera aussi, 'vvvvvv' aussi mais par contre '' ne sera pas valide.* qui désigne "0, 1 ou plusieurs occurrences".? Si on prend par exemple le masque?`v+`, la cha?ne 'v' sera valide, 'vv' le sera aussi, 'vvvvvv' aussi ainsi que ''Ces symboles s'appliquent uniquement à la lettre (ou au mot si vous placez des parenthèses) qui est situé(e) à gauche du symbole.Cha?neRegexRésultat'Anthony'`An?thony`Vrai (Il y a bien 0 ou 1 "n" après le A)'Annnnnnthony'`An?thony`Faux (il y a plus de 1 "n" après le A)'Annnnnnthony'`An+thony`Vrai (il y a bien au moins 1 "n" après le A)'Chat'`Chats?$`Vrai car le mot "chat" peut ici aussi être au pluriel (0 ou 1 "s"), ensuite on marque la fin de la cha?ne'Chat'`Chats*$`Vrai car * signifie "0", "1" ou "plusieurs" ici il n'y a pas de s, la condition reste quand même vraie.Il existe un autre moyen de quantifier, cette fois plus précisément, une cha?ne ou une lettre, ou encore une classe de caractères (on verra ce que c'est juste après). On utilise pour cela les accolades. Voici comment ?a fonctionne :{X} : la cha?ne doit être répétée X fois. Par exemple :?`A{2}`?fonctionnera pour AA mais pas pour AAA ni pour A.{X,Y} : la cha?ne peut être répétée de X fois à Y fois. Par exemple :??`A{2,4}`?fonctionnera pour AA, pour AAA et pour AAAA mais pas pour A ni pour AAAAA.{X,} : la cha?ne doit être répétée au moins X fois mais il n'y a pas de limite de nombre. Par exemple :??`A{2,}`?fonctionnera pour AA, pour AAA, pour AAAA... mais pas pour A.Cha?neRegexRésultat'Anthony'`An{0,1}thony`Vrai (Il y a bien 0 ou 1 "n" après le A)'Annnnnnthony'`An{2}thony`Faux (il n'y a pas deux "n" après le A)'Annnnnnthony'`An{2,}thony`Vrai (il y a bien au moins 2 "n" après le A)Les classes de caractèresLes classes de caractères vont vous permettre d'effectuer des recherches précises tout en limitant le nombre de caractères de vos expressions régulières. Les classes de caractères sont toujours contenues entre des crochets simples ou doubles (nous verrons certaines classes de caractères spéciales après).Voici un exemple d'expression régulière incluant une classe de caractères :?`[nv]ous`le?[nv]?signifie "n" OU "v". Les mots "nous" et "vous" seront donc acceptés, il s'agit donc de l'équivalent de?`(n|v)ous`Cha?neRegexRésultat'Nous'`[nv]ous`iVrai (le i rend la regex insensible à la casse)'Nous'`[vs]$`Vrai (la cha?ne se termine bien par un v ou un s)Voyons maintenant quelques classes un peu spéciales, elles ont de spécial le fait que l'on utilise un tiret entre plusieurs valeurs, il s'agit donc d'intervalles de caractères. Nous allons voir ici quelques exemples rapides, car je pense que vous allez vite comprendre l'intérêt de cette syntaxe :`[a-z]` : indique une lettre minuscule allant de a à z`[0-3]` : indique un chiffre allant de 0 à 3`[a-z0-9]` : indique des lettres minuscules OU des chiffres allant de 0 à 9Cha?neRegexRésultat'Anthony'`[a-z]*`Faux (le premier A est en majuscules)'Annnnnnthony'`[a-z]*`iVrai (les caractères sont tous des lettres minuscules ou majuscules)'Annnnnnthony1'`[0-9]$`Vrai (la cha?ne se termine bien par un chiffre allant de 0 à 9)Vous pouvez également interdire un ou une plage de caractères, cette fois-ci on utilise le symbole ^ placé juste après le premier crochet ouvrant. Il ne signifie plus "début de la cha?ne" mais une interdiction.Cha?neRegexRésultat'ANTHONY'`^[^a-z]*$`Vrai (la cha?ne ne contient pas de minuscules)'Anthony'`^[^a-z]*$`Faux (la cha?ne contient des minuscules)Voici maintenant quelques classes encore spéciales, puisqu'elles sont contenues entre des doubles crochets. Ce sont des classes prédéfinies qui vont vous simplifier la syntaxe de vos regex :[[:alpha:]] : n'importe quelle lettre[[:lower:]] : n'importe quelle lettre en minuscule[[:upper:]] : n'importe quelle lettre en majuscule[[:alnum:]] : n'importe quelle lettre ou chiffre[[:digit:]] : n'importe quel chiffre[[:punct:]] : n'importe quel signe de ponctuation[[:space:]] : n'importe quel espace blanc[[:blank:]] : espace ou tabulation[[:graph:]] : caractères affichables et imprimables[[:cntrl:]] : caractères d'échappement[[:xdigit:]] : caractères héxadécimaux[[:print:]] : scaractères imprimables exceptés ceux de contr?leLes métacaractèresLes métacaractères sont des caractères spéciaux effectuant des actions bien précises sur les cha?nes. Voici la liste de ces caractères :[ ] ! ( )? { } ^ $ ? . + * \ #Le problème qu'ils génèrent est lorsque vous souhaitez les utiliser dans vos recherches ou remplacements de caractères. Il faut les faire précéder d'un antislash \. Voici un exemple :Cha?neRegexRésultat'?a va?'`?a va?$`Faux (la cha?ne ne se termine pas par 0 ou 1 "a")'?a va?'`?a va\?$`Vrai (on a échappé correctement le caractère)Attention, cette règle ne s'applique pas à l'intérieur des classes de caractères. Ainsi, la classe [ab+?] signifie que vous pourrez avoir la lettre "a" ou "b" ou "+" ou "?".Les classes abrégéesLes classes abrégées vont vous permettre de réduire encore la longueur de vos expressions régulières au mépris de leur compréhension directe. On utilise pour cela un antislash suivi d'un caractère, qui à eux deux signifient une classe de caractère plus complexe. Quand on conna?t la signification des lettres par coeur, c'est assez facile de ne pas se tromper, mais sinon la confusion peut régner, voilà pourquoi personnellement je préfère utiliser les classes de caractères simples. Voici la liste des classes de caractères abrégées :. signifie que vous pouvez mettre n'importe quel caractère.\w indique les mots [_a-zA-Z0-9]\W indique ce qui ne correspond pas à un mot [^_a-zA-Z0-9]\d indique que vous souhaitez un chiffre [0-9]\D indique les caractères n'étant pas des chiffres [^0-9]\s correspond à un espace (correspond à \t \n \r)\S correspond à ce qui n'est pas un espace (\t \n \r)\t correspond à une tabulation\n correspond à un saut de ligne\r correspond à un retour chariotPHP - Les imagesPrésentationPHP ne se limite pas à la génération de pages (X)HTML. En effet, celui-ci peut également afficher des images et les générer à la volée. Vous avez sans doute déjà vu des? formulaires demandant un code à recopier pour être s?r que ce n'est pas un ordinateur qui remplit les champs automatiquement, et bien PHP permet de créer des images de ce style, mais heureuseument, ses performances ne s'arrêtent pas là. Vous allez pouvoir créer des images aux possibilités limitées uniquement par votre créativité artistique.?Activer la librairie GDPar défaut, la librairie GD est désactivée. Il va donc falloir l'activer car sinon vous ne pourrez pas faire ce qui va suivre. Pour l'activer, il faut que vous trouviez un fichier nommé "php.ini" qui contient les paramètres de configuration de PHP. Ce fichier se situe généralement dans le répertoire "apache2" d'easyPHP ou encore de Wamp. Essayez également dans le répertoire C:\Windows.?Une fois ce fichier ouvert, localisez la ligne suivante :?;extension=php_gd2.dll, supprimez le point-virgule, enregistrez le fichier php.ini puis redémarrez Apache (ou relancez complètement le programme que vous utilisez pour travailler en PHP, easyPHP, Wamp, etc ...)Créer une imageAvant de parler de création d'image proprement dite, il faut savoir qu'il existe plusieurs types d'images. Les types les plus répandus sur le web sont les formats gif, jpg et png. Cela tombe bien, GD permet de gérer ces trois formats (et d'autres, mais nous ne les utiliserons pas ici).Pour que le navigateur s?che qu'il envoie une image au navigateur et non une page (X)HTML, on doit envoyer un en-tête spécial sous peine de voir s'afficher des caractères incompréhensibles lorsque l'on demandera l'image. Cet en-tête dit juste "voilà, j'envoie une image de tel type". On doit renseigner dans cet en-tête (les en-têtes sont aussi appelés headers) le type mime du fichier envoyé. Je vais vous donner les trois types mimes que nous utiliserons :Pour une image gif, le type mime à utiliser est?image/gifPour une image jpg, le type mime à utiliser est?image/jpegPour une image png, le type mime à utiliser est?image/pngIl faut maintenant que l'on envoie l'en-tête, on utilise pour cela la fonction header() en PHP. Mettons que l'on veuille générer une image jpg, on utilisera le code suivant :<?php??????header('Content-type:?image/jpeg');??>Création d'une image de basePour créer une image, il y a deux solutions. Vous pouvez partir de rien du tout (et créer l'image de toutes pièces) ou partir d'une image déjà existante sur le disque dur. Pour créer une image en partant de zéro, on va utiliser la fonction imagecreate(), pour créer une image à partir d'un fichier, il existe trois fonctions en fonction du type de fichier de l'image source :imagecreatefromgif() : cette fonction permet de créer une image en partant d'une image gif source, on passera en paramètre le nom de l'image gif.imagecreatefromjpeg() : cette fonction permet de créer une image en partant d'une image jpg source, on passera en paramètre le nom de l'image jpg.imagecreatefrompng() : cette fonction permet de créer une image en partant d'une image png source, on passera en paramètre le nom de l'image png.En cas d'utilisation d'une fonction imagecreatefromX(), les dimensions de l'image que vous allez générer seront pour le moment dictées par les dimensions de l'image que vous avez ouverte. Dans le cas contraire, il faudra préciser les dimensions de l'image à créer.Voici un exemple créant une image de base, sans ouvrir d'image existante :<?php??????header('Content-type:?image/jpeg');??????$image?=?imagecreate(100,?50);?//Crée?une?image?de?100?pixels?de?large?et?50?pixels?de?haut??>Lorsque nous utiliserons les fonctions de la librairie GD, nous travaillerons en coordonnées X, Y selon ce plan :Pour créer une image tout en se servant d'une image déjà existante, voici un exemple pour une image jpeg, il suffit juste de remplacer le nom de la fonction imagecreatefromjpeg par le nom de la fonction qui va bien pour le fichier que vous souhaitez :<?php??????header('Content-type:?image/jpeg');??????$image?=?imagecreatefromjpeg('monimage.jpg');?//Crée?une?image?à?partir?de?'monimage.jpg'??>Envoi de l'image au navigateur ou sauvegarde sur le disqueUne fois que vous avez fini de générer votre image, il faut soit l'envoyer au navigateur, soit la sauvegarder sur le disque. On utilise pour cela différentes fonctions qui diffèrent uniquement selon le type d'image que vous allez envoyer ou sauvegarder.Voici la liste des fonctions que nous serons amenés à utiliser :imagegif() : cette fonction permet de générer une image gif. Si vous souhaitez sauvegarder l'image sur le disque, dans le paramètre de la fonction, entrez le nom du fichier sous lequel l'image sera sauvegardée.imagejpeg() : cette fonction permet de générer une image jpg. Si vous souhaitez sauvegarder l'image sur le disque, dans le paramètre de la fonction, entrez le nom du fichier sous lequel l'image sera sauvegardée.imagepng() : cette fonction permet de générer une image png. Si vous souhaitez sauvegarder l'image sur le disque, dans le paramètre de la fonction, entrez le nom du fichier sous lequel l'image sera sauvegardée.Les couleursOn travaillera en PHP avec le système de couleurs RGB (red, green, blue). Ce système permet de recomposer une quantité enorme de couleurs à partir de 256 possibilités de rouge, 256 possibilités de vert et 256 possibilités de bleu. Vous pourrez si vous le souhaitez conna?tre le code de votre couleur en utilisant un éditeur d'images. Windows intègre paint par défaut qui permet au moins de conna?tre ?a ;)Pour que PHP s?che quelle couleur il doit utiliser, on stocke les couleurs dans des variables. Les "codes couleurs" sont générés gr?ce à la fonction imagecolorallocate().<?php? ?? $blanc?=?imagecolorallocate($image,?255,?255,255);?//Premier?0?:?quantité?de?rouge,?second?0?:?quantité?de?vert,?troisième?0?:?quantité?de?bleu??????$noir?=?imagecolorallocate($image,?0,?0,?0);??>Le premier imagecolorallocate() que vous ferez correspondra à la couleur de fond de votre image. Vous pourrez toujours le changer de couleur ultérieurement via des bidouilles, mais pensez-y. Si vous souhaitez une image à fond blanc, il faut utiliser le code couleur 255, 255, 255.Ecrire du texteGD permet heureusement d'écrire du texte sur les images. On utilise pour cela la fonction imagestring().<?php??????imagestring($image,?$taille_de_police,?$x,?$y,?$texte,?$couleur);??>Nous allons maintenant détailler les paramètres de cette fonction :$image : correspond à l'image que vous avez créée avec imagecreate()$taille_de_police : il s'agit ici d'un nombre allant de 1 à 5 précisant la grosseur de la police. Nous n'utiliserons que pour ce chapitre des polices par défaut.$x : coordonnées en pixels sur l'axe des abscisses.$y : coordonnées en pixels sur l'axe des ordonnées.$couleur : une couleur générée avec imagecolorallocate()Si nous souhaitons écrire "Salut à tous" aux coordonnées (10, 50) en police noire de taille 4, on procèdera comme ceci :<?php??????imagestring($image,?4,?10,?50,?'Salut?à?tous?!',?$noir);??>Nous allons maintenant voir l'exemple complet :<?php??????header('Content-type:?image/jpeg');???????$image?=?imagecreate(100,?50);?//Crée?une?image?de?100?pixels?de?large?et?50?pixels?de?haut??????$blanc?=?imagecolorallocate($image,?255,?255,?255);?//Premier?0?:?quantité?de?rouge,?second?0?:?quantité?de?vert,?troisième?0?:?quantité?de?bleu??????$noir?=?imagecolorallocate($image,?0,?0,?0);??????imagestring($image,?4,?10,?50,?'Salut?à?tous?!',?$noir);?//Affiche?une?cha?ne?sur?l'image??????imagejpeg($image);?//Renvoie?l'image?au?navigateur??>Remarquez l'utilisation de la fonction imagejpeg() qui prend en paramètre l'image que l'on souhaite envoyer/sauvegarder. Cela permet à PHP ici d'envoyer l'image au navigateur.Quelques formes bien utilesHeureusement, les possibilités de GD ne s'arrêtent pas là et il est possible de créer de nombreuses formes. Voici quelques fonctions bien utiles et leurs effets :Créer une ligne :La fonction?imageline()?permet de créer une ligne. Voici un exemple :<?php$noir?= imagecolorallocate($image, 0, 0, 0);imageline($image, $x1, $y1, $x2, $y2, $noir);?>Nous venons de créer une ligne. Les coordonnées du premier point sont ($x1,$y1) et du second point ($x2,$y2). La ligne aura une couleur valant $noir (ici la couleur noire, qui vaut 0,0,0 en RVB).?Modifier le style des lignes et des contours de formes :La fonction?imagesetstyle()?permet de modifier le style des lignes et des contours de formes pour créer des lignes personnalisées. Voici un exemple :<?php??????header('Content-type:?image/gif');??????$image???=?imagecreate(200,?200);??????$blanc????=?imagecolorallocate($image,?255,?255,?255);??????$noir??????=?imagecolorallocate($image,?0,?0,?0);??????$rouge???=?imagecolorallocate($image,?255,?0,?0);??????$style????=?array($noir,?$rouge,?$noir,?$rouge,?$rouge,?$rouge,?$noir);?//un?pixel?noir,?un?pixel?rouge,?un?pixel?noir?...??????imagesetstyle($image,?$style);?//Applique?le?style?sur?l'image??????imagesetthickness($image,?20);?//Modifie?l'épaisseur?de?la?ligne??????imageline($image,?50,?60,?150,?60,?IMG_COLOR_STYLED);?//On?utilise?la?constante?IMG_COLOR_STYLED?qui?signifie?que?GD?doit?utiliser?le?style?défini?plus?haut?????imagegif($image);??>Nous venons de créer une ligne. Les coordonnées du premier point sont (50, 60) et du second point (150, 60). La ligne sera personnalisée (notez la constante?IMG_COLOR_STYLED). Il y aura respectivement un pixel noir, un pixel rouge, un pixel noir, trois pixels rouges et un pixel noir (voir le tableau?$style).Voilà ce que cela donne en pratique :Créer un rectangle :La fonction?imagerectangle()?permet de créer un rectangle. On l'utilise comme ceci :<?php??????header('Content-type:?image/gif');??????$image?=?imagecreate(200,?200);??????$blanc??=?imagecolorallocate($image,?255,?255,?255);??????$noir????=?imagecolorallocate($image,?0,?0,?0);??????imagerectangle($image,?50,?50,?150,?150,?$noir);??????imagegif($image);??>Nous venons de créer un rectangle. Les coordonnées du premier point sont ($x1,$y1) et du second point ($x2,$y2). Le rectangle sera comme tous nos exemples précédents noir : $noir (ici la couleur noire, qui vaut 0,0,0 en RVB). Voilà ce que cela donne en pratique :Maintenant appliquons ce que l'on a appris concernant les contours personnalisés :<?php??????header('Content-type:?image/gif');??????$image????=?imagecreate(200,?200);??????$blanc????=?imagecolorallocate($image,?255,?255,?255);??????$noir????=?imagecolorallocate($image,?0,?0,?0);??????$rouge????=?imagecolorallocate($image,?255,?0,?0);??????$style????=?array($noir,?$rouge,?$noir,?$rouge,?$rouge,?$rouge,?$noir);?//un?pixel?noir,?un?pixel?rouge,?un?pixel?noir?...??????imagesetstyle($image,?$style);?//Applique?le?style?sur?l'image,?ici?la?bordure?du?rectangle?sera?de?ce?style??????imagesetthickness($image,?10);?//Ici,?la?largeur?correspondra?à?la?largeur?du?contour?du?rectangle??????imagerectangle($image,?50,?50,?150,?150,?IMG_COLOR_STYLED);??????imagegif($image);??>Ca a de la classe non ? Si vous souhaitez que le rectangle soit rempli, on utilise la fonction imagefilledrectangle() qui s'utilise de la même fa?on que la fonction imagerectangle().Créer une ellipse :Vous pouvez quand même créer autre chose que des lignes et des rectangles ! Il existe par exemple une fonction vous permettant de créer des ellipses. Celle-ci porte le nom de imageellipse(). Voici ce que ?a donne au niveau du code :<?php???????header('Content-type:?image/gif');???????$image????=?imagecreate(200,?200);???????$blanc????=?imagecolorallocate($image,?255,?255,?255);???????$noir????=?imagecolorallocate($image,?0,?0,?0);???????imageellipse($image,?100,?50,?150,?70,?$noir);???????imagegif($image);???>Et ce que ?a donne en pratique :Inutile que je vous montre comment créer une ellipse avec un contour personnalisé, je pense que vous savez comment faire maintenant ;)Pour ce qui est de l'ellipse remplie intégralement, on utilise la fonction imagefilledellipse() qui se comporte comme la fonction imageellipse().Créer un polygone :La fonction?imagepolygon()?permet de créer un polygone. On l'utilise comme ceci :<?php????????header('Content-type:?image/gif');????????$image????=?imagecreate(200,?200);????????$blanc????=?imagecolorallocate($image,?255,?255,?255);????????$noir????=?imagecolorallocate($image,?0,?0,?0);??????????$points?=?array(50,10,70,60,90,40);???????imagepolygon($image,$points,3,$noir);???????imagegif($image);????>Voici ce que ?a donne :Inutile de vous dire que vous pouvez également créer des polygones aux lignes personnalisées ou/et remplis. Ici, le chiffre 3 dans les paramètres de la fonction correspond au nombre de points du polygone. Les points sont déterminés par le tableau $points. Détaillons un peu le principe de ce tableau via cette image :?Effets sur les imagesLes possibilités de GD ne s'arrêtent pas là. Vous allez pouvoir faire des rotations d'images, rendre des images transparentes, redimensionner des images ...Voyons comment effectuer la rotation d'une image :<?php????????header('Content-type:?image/gif');????????$image????=?imagecreate(150,?150);????????$blanc????=?imagecolorallocate($image,?255,?255,?255);?//On?a?donc?une?image?de?150*150?sur?fond?blanc??????$noir?????=?imagecolorallocate($image,?0,?0,?0);???????$image?=?imagerotate($image,?45,?$noir);?//L'image?sur?fond?blanc?a?été?tournée?de?45°?et?le?"vide"?a?été?comblé?par?du?noir??????imagegif($image);??>Rendre une image transparente :Les images GIF et PNG supportent la transparence. PHP et GD vont vous permettre de définir une couleur transparente sur une image. Reprenons l'image ci-dessus qui a été tournée de 45 degrés. Nous aimerions faire dispara?tre le noir. Voilà comment on pourrait procéder :<?php??????header('Content-type:?image/gif');?????????$image?=?imagecreate(150,?150);?????????$blanc??=?imagecolorallocate($image,?255,?255,?255);?//On?a?donc?une?image?de?150*150?sur?fond?blanc???????$noir????=?imagecolorallocate($image,?0,?0,?0);??????$image?=?imagerotate($image,?45,?$noir);?//L'image?sur?fond?blanc?a?été?tournée?de?45°?et?le?"vide"?a?été?comblé?par?du?noir???????$noir????=?imagecolorallocate($image,?0,?0,?0);?//On?réalloue?du?noir,?l'image?ayant?été?modifiée.??????imagecolortransparent($image,?$noir);?//Le?noir?devient?transparent??????imagegif($image);???>Voici ce que cela donne (il reste encore des pixels "presque noirs" voilà pourquoi ils n'ont pas été supprimés, car ils ne sont pas exactement noirs ;) ) :?Redimensionner une image :PHP et GD sont très utilisés pour redimensionner les images. Par exemple, sur ce site, votre avatar est redimensionné automatiquement si il est trop grand. J'utilise GD pour faire cela, avec une fonction très simple d'utilisation. Il s'agit de la fonction?imagecopyresampled(). Imaginions que nous souhaitions réduire l'image à 100*100 pixels :<?php??????header('Content-type:?image/gif');?????????$image???????=?imagecreate(150,?150);??????$destination?=?imagecreate(100,?100);?//Image?qui?sera?l'image?de?destination??????$blanc????=?imagecolorallocate($image,?255,?255,?255);?//On?a?donc?une?image?de?150*150?sur?fond?blanc???????$noir?????=?imagecolorallocate($image,?0,?0,?0);??????$image????=?imagerotate($image,?45,?$noir);?//L'image?sur?fond?blanc?a?été?tournée?de?45°?et?le?"vide"?a?été?comblé?par?du?noir???????$noir?????=?imagecolorallocate($image,?0,?0,?0);?//On?réalloue?du?noir,?l'image?ayant?été?modifiée.??????$largeur_src?=?imagesx($image);?//Renvoie?la?largeur?de?l'image?source??????$hauteur_src?=?imagesy($image);?//Renvoie?la?hauteur?de?l'image?source??????imagecopyresampled($destination,?$image,?0,?0,?0,?0,?100,?100,?$largeur_src,?$hauteur_src);??????imagecolortransparent($destination,?$noir);?//Le?noir?devient?transparent??????imagegif($destination);???>Voilà ce que l'on obtient :PHP - Envoyer un mailPrésentationVous vous êtes peut-être déjà demandé comment un site faisait pour vous envoyer un mail directement après votre inscription ou encore selon des paramètres que vous avez renseignés. La réponse tient à peu de choses : l'envoi de mails via PHP. Il existe différents moyens pour envoyer un mail en PHP, le plus simple étant d'utiliser la fonction prévue à cet effet, à savoir la fonction?mail().La fonction mail() s'utilise de cette fa?on :<?php??????mail('email_destinataire',?'sujet',?'message');??>Envoi de mails au format texteLes mails au format texte sont les mails les plus simples à envoyer. Ils ne possèdent pas de mise en forme (ni images, ni police spéciale, ni gras, etc ...) et sont de nos jours de moins en moins utilisés. Leur avantage principal est qu'ils sont lisibles par tous et qu'ils sont plus légers que leurs homologues (X)HTML, ce qui est idéal pour les serveurs et les petites connexions.La syntaxe à utiliser pour la fonction mail() est donc identique à celle que nous avons décrite plus haut. Pour faire un saut de ligne dans le message, on utilise \n qui doit être entouré de guillemets doubles et non de guillemets simples. En effet, "\n" est un seul caractère "interprété". '\n' ne fonctionnera donc pas.<?php?? ? ?mail('email_destinataire',?'sujet',?'message');??>Les en-têtes (headers)Les en-têtes sont utilisés dès que vous aurez envie de personnaliser un peu votre mail. Spécifier une adresse de réponse, plusieurs adresses d'envoi, des copies cachées, etc ... sont des choses impossibles sans utiliser d'en-têtes avec PHP. Voici la liste des principaux en-têtes (headers) :From?: cet en-tête permet de spécifier l'adresse email de l'expéditeur. On peut mettre tout et n'importe quoi comme adresse mail, et donc vous comprennez maintenant pourquoi vous recevez des emails de bill gates en personne (sic) et autres débilités (SPAM).On l'utilise comme ceci :?From: "Nom de l'expéditeur" <adresse mail de l'expéditeur>Reply-To?: cet en-tête permet de spécifier l'adresse email de réponse.On l'utilise comme ceci :?Reply-To: adresse_mailCc:?: cet en-tête permet de spécifier les autres destinataires qui recevront le mail en Cc (Carbon copy), c'est à dire que tous les destinataires pourront voir à qui le message a été transmis.On l'utilise comme ceci :?Cc: email1,email2,email3...Bcc:?: cet en-tête permet de spécifier les autres destinataires qui recevront le mail en Bcc (Blind carbon copy), c'est à dire que les destinataires ne pourront pas voir à qui le message a été transmis, il s'agit d'une copie cachée.On l'utilise comme ceci :?Bcc: email1,email2,email3...Content-Type?: cet en-tête permet de spécifier le type mime du mail et son charset (jeu de caractères).Content-Transfer-Encoding?: cet en-tête permet de spécifier l'encodage du mail ou de l'une de ses parties (utile dans le cas d'un envoi texte+html par exemple). Il peut par exemple prendre les valeurs 7 et 8 bit (l'encodage 7 bit étant utilisé dans les pays anglophones n'ayant pas besoin de gérer les lettres accentuées).X-Priority?: Permet de définir le niveau de priorité du mail envoyé. Peut prendre une valeur variant de 1 à 5. Plus ce chiffre est faible, plus haute est la priorité.Disposition-Notification-To?: Permet de spécifier l'adresse mail de retour pour la confirmation de lecture.La fonction mail() prend maintenant un autre argument en paramètre, à savoir les headers que vous aurez tous séparés par des \n. Voici ce que ?a peut donner :<?php??????$headers?='From:?"nom"<adresse@fai.fr>'."\n";??????$headers?.='Reply-To:?adresse_de_reponse@fai.fr'."\n";??????$headers?.='Content-Type:?text/plain;?charset="iso-8859-1"'."\n";??????$headers?.='Content-Transfer-Encoding:?8bit';??????if(mail('adresse_du_destinataire@fai.fr',?'Sujet',?'Message?de?test',?$headers))??????{???????????echo?'Le?message?a?bien?été?envoyé';??????}??????else??????{???????????echo?'Le?message?n\'a?pu?être?envoyé';??????}??>Bon, vous allez voir que maintenant envoyer un mail au format HTML n'est plus si compliqué.Envoi de mails en HTML avec PHPIl nous faut juste modifier le message pour le mettre au format HTML, et modifier le header "content-type" pour dire cette fois-ci que le message est au format HTML. Rien de bien sorcier, voici ce que ?a donne en pratique :<?php??????$headers?='From:?"nom"<adresse@fai.fr>'."\n";??????$headers?.='Reply-To:?adresse_de_reponse@fai.fr'."\n";??????$headers?.='Content-Type:?text/html;?charset="iso-8859-1"'."\n";??????$headers?.='Content-Transfer-Encoding:?8bit';??????$message?='<html><head><title>Un titre ici</title></head><body>Un message de test</body></html>';??????if(mail('adresse_du_destinataire@fai.fr',?'Sujet',?$message,?$headers))??????{???????????echo?'Le?message?a?été?envoyé';??????}??????else??????{???????????echo?'Le?message?n\'a?pu?être?envoyé';??????}??>Envoyer des mails au formats texte et HTMLPour être compatible avec tous les clients mails, il existe une solution : envoyer les mails aux formats texte et HTML. L'avantage de ce type d'envoi est que les clients mails qui n'acceptent pas le HTML verront le mail au format texte tandis que les autres pourront profiter de la mise en page plus évoluée offerte par le HTML. Voici un exemple de code permettant d'envoyer un mail au format texte et HTML :<?php??????//-----------------------------------------------??????//DECLARE?LES?VARIABLES??????//-----------------------------------------------?? ?? $destinataire='mail_destinataire@fai.fr';?????$email_expediteur='votre_mail@fai.fr';??????$email_reply='email_de_reponse@fai.fr';?????$message_texte='Bonjour,'."\n\n".'Voici?un?message?au?format?texte';??????$message_html='<html>??????<head>??????<title>Titre</title>??????</head>??????<body>Test?de?message</body>??????</html>';??????//-----------------------------------------------??????//GENERE?LA?FRONTIERE?DU?MAIL?ENTRE?TEXTE?ET?HTML??????//-----------------------------------------------??????$frontiere?=?'-----='?.?md5(uniqid(mt_rand()));??????//-----------------------------------------------??????//HEADERS?DU?MAIL??????//-----------------------------------------------??????$headers?=?'From:?"Nom"?<'.$email_expediteur.'>'."\n";??????$headers?.=?'Return-Path:?<'.$email_reply.'>'."\n";??????$headers?.=?'MIME-Version:?1.0'."\n";??????$headers?.=?'Content-Type:?multipart/alternative;?boundary="'.$frontiere.'"';??????//-----------------------------------------------??????//MESSAGE?TEXTE??????//-----------------------------------------------??????$message?=?'This?is?a?multi-part?message?in?MIME?format.'."\n\n";??????$message?.=?'--'.$frontiere."\n";??????$message?.=?'Content-Type:?text/plain;?charset="iso-8859-1"'."\n";??????$message?.=?'Content-Transfer-Encoding:?8bit'."\n\n";??????$message?.=?$message_texte."\n\n";??????//-----------------------------------------------??????//MESSAGE?HTML??????//-----------------------------------------------??????$message?.=?'--'.$frontiere."\n";?????$message?.=?'Content-Type:?text/html;?charset="iso-8859-1"'."\n";??????$message?.=?'Content-Transfer-Encoding:?8bit'."\n\n";??????$message?.=?$message_html."\n\n";??????$message?.=?'--'.$frontiere."\n";??????if(mail($destinataire,$sujet,$message,$headers))??????{???????????echo?'Le?mail?a?été?envoyé';??????}??????else??????{???????????echo?'Le?mail?n\'a?pu?être?envoyé';??????}??>On génère d'abord une frontière (boundary) qui permettra au client mail de séparer les différents contenus. Cette frontière, lorsqu'elle sera utilisée, sera entourée de deux tirets accolés. Après la frontière, on modifie éventuellement les headers appliqués localement (ici le type du message). Le code est ensuite prêt.Envoyer des mails avec pièces jointesLes frontières (boundary) dans les mails permettent d'envoyer aussi des pièces jointes. On encodera les pièces jointes en Base 64 à l'aide de la fonction PHP?base64_encode(). Voici un exemple :<?php??????//-----------------------------------------------??????//DECLARE?LES?VARIABLES??????//-----------------------------------------------??????$email_expediteur='votre_mail@fai.fr';??????$email_reply='email_de_reponse@fai.fr';??????$message_texte='Bonjour,'."\n\n".'Voici?un?message?au?format?texte';??????$message_html='<html>??????<head>??????<title>Titre</title>??????</head>??????<body>Test?de?message</body>??????</html>';??????//-----------------------------------------------??????//GENERE?LA?FRONTIERE?DU?MAIL?ENTRE?TEXTE?ET?HTML??????//-----------------------------------------------??????$frontiere?=?'-----='?.?md5(uniqid(mt_rand()));??????//-----------------------------------------------??????//HEADERS?DU?MAIL??????//-----------------------------------------------??????$headers?=?'From:?"Nom"?<'.$email_expediteur.'>'."\n";??????$headers?.=?'Return-Path:?<'.$email_reply.'>'."\n";??????$headers?.=?'MIME-Version:?1.0'."\n";??????$headers?.=?'Content-Type:?multipart/mixed;?boundary="'.$frontiere.'"';??????//-----------------------------------------------??????//MESSAGE?TEXTE??????//-----------------------------------------------??????$message?=?'This?is?a?multi-part?message?in?MIME?format.'."\n\n";??????$message?.=?'--'.$frontiere."\n";??????$message?.=?'Content-Type:?text/plain;?charset="iso-8859-1"'."\n";??????$message?.=?'Content-Transfer-Encoding:?8bit'."\n\n";??????$message?.=?$message_texte."\n\n";??????//-----------------------------------------------??????//MESSAGE?HTML??????//-----------------------------------------------??????$message?.=?'--'.$frontiere."\n";??????$message?.=?'Content-Type:?text/html;?charset="iso-8859-1"'."\n";??????$message?.=?'Content-Transfer-Encoding:?8bit'."\n\n";??????$message?.=?$message_html."\n\n";??????$message?.=?'--'.$frontiere."\n";??????//-----------------------------------------------??????//PIECE?JOINTE??????//-----------------------------------------------??????$message?.=?'Content-Type:?image/jpeg;?name="nom_du_fichier.jpg"'."\n";??????$message?.=?'Content-Transfer-Encoding:?base64'."\n";??????$message?.=?'Content-Disposition:attachement;?filename="nom_du_fichier.jpg"'."\n\n";??????$message?.=?chunk_split(base64_encode(file_get_contents('nom_du_fichier.jpg')))."\n";??????if(mail($destinataire,$sujet,$message,$headers))??????{???????????echo?'Le?mail?a?été?envoyé';??????}??????else??????{???????????echo?'Le?mail?n\'a?pu?être?envoyé';??????}??>PHP - Programmation orientée objetPrésentation de la POO (programmation orientée objet) en PHPLa POO (programmation orientée objet) est une forme particulière de programmation destinée à faciliter la maintenance et la réutilisation / adaptation de vos scripts PHP. Elle consiste à représenter des objets (du monde réel ou non) sous une forme d'entités informatiques. On représente généralement un objet global par ce que l'on appelle une classe. Une classe va regrouper un ensemble de fonctions et de propriétés pouvant agir sur l'objet. Si on prend par exemple une voiture dans le monde réel, on peut modéliser une voiture par une classe "Voiture" qui aura comme propriétés le nombre de roues, le nombre de portes, etc ...Les classesUne classe regroupe des fonctions et des variables (appelées cette fois "attributs", car il s'agit des attributs d'une classe) qui interragissent avec l'objet. C'est à dire que pour un objet "voiture" par exemple, vous aurez une classe nommée "Voiture" et vous pourrez avoir une fonction qui modifie le niveau de carburant (le niveau de carburant étant un attribut de la classe que l'on ne peut modifier que via une fonction (appelée "méthode") qui ira modifier cet attribut). On appelle ce principe l'encapsulation des données, le but de l'encapsulation des données étant de ne pas pouvoir accéder aux données de l'objet directement mais via des fonctions (appelées ici "méthodes"). Chaque attribut peut donc disposer de droits d'accès à l'extérieur de la classe. Nous verrons tout ceci au fur et à mesure que vous lisez cette page.Avant toute chose, PHP 5 a amélioré le support objet de PHP par rapport à PHP 4, nous allons donc utiliser PHP 5 pour tous nos exemples. Si vous avez besoin de savoir comment PHP 4 fonctionne avec l'objet, je vous conseille d'aller jeter un oeil dans la rubrique?codes sources orientés objet?du site, qui vous permettra d'obtenir des sources de tous types.Voici comment une classe peut être codée en PHP 5 :<?php??????class?Voiture??????{???????????/**???????????*?Déclaration?des?attributs???????????*/???????????private?$niveau_carburant;???????????private?$nombre_portes;???????????private?$nombre_roues;???????????/**???????????*?Cette?méthode?un?peu?spéciale?est?le?constructeur,?elle?est?exécutée?lorsque?vous?"créez"?votre?objet. Elle doit initialiser les attributs de la classe.??????????*/???????????public?function?__construct()???????????{????????????????$this->niveau_carburant?=?50;????????????????$this->nombre_portes?=?3;????????????????$this->nombre_roues?=?4;???????????}???????????/**???????????*?Première?méthode?accessible?par?tous?et?modifiant?le?niveau?de?carburant???????????*/???????????public?function?modifier_carburant(int?$niveau)???????????{????????????????$this->niveau_carburant?=?$niveau;???????????}? ? ? ? ??/**?? ? ? ? ? * Seconde méthode accessible à tous et modifiant le nombre de portes? ? ? ? ? */?? ? ? ? ??public function?modifier_nb_portes(int $nb_portes)?? ? ? ? ? {?? ? ? ? ? ? ? ?$this->nombre_portes?=?$nb_portes;?? ? ? ? ? }??????}??>Notion d'objetImaginions que vous souhaitiez créer deux voitures dans votre code. Sans programmation orientée objet, on aurait pu stocker les voitures et leurs attributs dans un tableau, ce qui devient vite impossible à gérer. Avec la programmation orientée objet, vous allez pouvoir créer deux objets différents en deux lignes de code. Créer un objet se fait en "instanciant" une classe. Quand on instancie une classe, on crée une version de l'objet ayant des caractéristiques propres. Si vous créez un deuxième objet, il est indépendant du premier, bien qu'ils utilisent tous les deux la même classe (ici nos deux objets seront des voitures, ils utiliseront donc la même classe "Voiture", mais seront bien différents pour autant. Nous pourrons par exemple avoir une voiture ayant trois portes et la seconde 5 portes).Créer un objet (instanciation d'une classe)Voici comment on crée un objet Voiture en PHP (on supposera que vous avez inclus le fichier contenant la classe, ou alors que le code de la classe se trouve au-dessus du code que vous allez voir) :<?php??????$objet_voiture?=?new?Voiture();??>La variable $objet_voiture représente l'objet qui est ici une voiture. Lorsque vous exécutez ce code, la méthode __construct() de la classe est exécutée. Comme il s'agit d'une fonction, elle peut prendre elle aussi des paramètres. Tout dépend comment vous souhaitez coder votre classe, mais vous pourriez très bien avoir une fonction __construct() qui initialise les attributs en fonction des paramètres que vous lui fournissez. Voici ce que ?a pourrait donner :<?php???????class?Voiture???????{????????????/**????????????*?Déclaration?des?attributs????????????*/????????????private?$niveau_carburant;????????????private?$nombre_portes;????????????private?$nombre_roues;????????????/**????????????*?Cette?méthode?un?peu?spéciale?est?le?constructeur,?elle?est?exécutée?lorsque?vous?"créez"?votre?objet.?Elle?doit?initialiser?les?attributs?de?la?classe.??????????*/????????????public?function?__construct(int?$nb_carburant,?int?$nb_portes,?int?$nb_roues?=?4)????????????{?????????????????$this->niveau_carburant?=?$nb_carburant;?????????????????$this->nombre_portes?=?$nb_portes;?????????????????$this->nombre_roues?=?$nb_roues;????????????}????????????/**????????????*?Première?méthode?accessible?par?tous?et?modifiant?le?niveau?de?carburant????????????*/????????????public?function?modifier_carburant(int?$niveau)????????????{?????????????????$this->niveau_carburant?=?$niveau;????????????}???????????/**????????????*?Seconde?méthode?accessible à tous et modifiant?le?nombre?de?portes???????????*/????????????public?function?modifier_nb_portes(int?$nb_portes)????????????{?????????????????$this->nombre_portes?=?$nb_portes;????????????}???????}???>Lorsque vous créerez l'objet voiture, vous allez pouvoir sans passer par les méthodes appropriées lui fixer un niveau de carburant, un nombre de portes et un nombre de roues (par défaut 4). Voici deux fa?ons de créer l'objet :<?php???????$objet_voiture?=?new?Voiture(50,?3);?//50?:?niveau?de?carburant?et?3?portes,?on?a?pas?besoin?de?spécifier?le?nombre?de?roues?car?il?est?de?4?par?défaut?????$autre_voiture?=?new?Voiture(10,?5,?6);?//10?:?niveau?de?carburant,?5?portes?et?6?roues??>Il est important de signifier que les objets $objet_voiture et $autre_voiture sont deux objets différents qui peuvent avoir leurs propriétés propres. Vous commencez peut-être maintenant à comprendre avec quelle simplicité vous allez pouvoir créer autant d'objets que vous le souhaitez ;)Constructeurs et destructeursLes constructeurs et destructeurs sont des méthodes particulières. D'une part, elle commencent par deux signes "underscores" accolés (touche 8 du pavé alphanumérique). D'autre part, elles sont exécutées à des moments précis.Le constructeur est appelé automatiquement quand vous créez votre objet. Généralement, cette méthode sert à donner une valeur de départ aux différents attributs de la classe pour vous permettre de "construire" l'objet. Ce n'est cependant pas une obligation et vous pouvez très bien ne rien mettre dans cette méthode.Le destructeur est appelé à la fin d'exécution de votre script. La méthode s'appelle cette fois-ci __destruct().<?php???????class?Voiture???????{????????????/**????????????*?Déclaration?des?attributs????????????*/????????????private?$niveau_carburant;????????????private?$nombre_portes;????????????private?$nombre_roues;????????????/**????????????*?Cette?méthode?un?peu?spéciale?est?le?constructeur,?elle?est?exécutée?lorsque?vous?"créez"?votre?objet.?Elle?doit?initialiser?les?attributs?de?la?classe.??????????*/????????????public?function?__construct(int?$nb_carburant,?int?$nb_portes,?int?$nb_roues?=?4)????????????{?????????????????$this->niveau_carburant?=?$nb_carburant;?????????????????$this->nombre_portes?=?$nb_portes;?????????????????$this->nombre_roues?=?$nb_roues;????????????}????????????/**??? ? ? ? ? * Destructeur, appelé quand l'objet est détruit? ? ? ? ? */??? ? ? ? ??public function?__destruct()??? ? ? ? ? { ?? ? ? ? ? ? ? ?echo?'L\'objet?a?été?détruit';? ? ? ? ? }? ?? }?>Visibilité des propriétés et méthodesPHP 5 introduit la notion de visibilité de méthodes et d'attributs. Chaques attributs et méthodes peuvent se voir attribuer un droit d'accès. Le principe de l'encapsulation voudrait que l'on mette tous les attributs uniquement modifiables et accessibles à l'intérieur de la classe, et les méthodes accessibles de l'extérieur. En pratique, ce n'est pas toujours le cas.Les trois mots permettant de gérer les accès sont ceux-ci :public : n'importe qui a accès à la méthode ou à l'attribut demandé.protected : seule la classe ainsi que ses sous classes éventuelles (classes héritées, on verra ce que c'est plus loin).private : seule la classe ayant défini l'élément peut y accéder.Pour la classe Voiture, vous pouvez constater que les attributs ne sont pas modifiables à l'extérieur de la classe, il faut passer par les méthodes appropriées.Pour accéder à un attribut d'une classe, on utilise ce code : $objet->attribut<?php????????class?Voiture????????{?????????????/**?????????????*?Déclaration?des?attributs?????????????*/?????????????private?$niveau_carburant;?????????????public?$nombre_portes;?????????????private?$nombre_roues;???????????/**?????????????*?Cette?méthode?un?peu?spéciale?est?le?constructeur,?elle?est?exécutée?lorsque?vous?"créez"?votre?objet.?Elle?doit?initialiser?les?attributs?de?la?classe.???????????*/?????????????public?function?__construct(int?$nb_carburant,?int?$nb_portes,?int?$nb_roues?=?4)?????????????{??????????????????$this->niveau_carburant?=?$nb_carburant;??????????????????$this->nombre_portes?=?$nb_portes;??????????????????$this->nombre_roues?=?$nb_roues;?????????????}??????}??>Maintenant, on instancie la classe :<?php??????$voiture?=?new?Voiture(50,?3);??????echo?$voiture->nombre_portes;?//va?afficher?"3" car l'attribut est en accès public?????echo?$voiture->nombre_roues;?//Erreur,?on?ne?peut?pas?y?accéder?car l'attribut est en accès privé !??>Notez que l'on ne met pas de signe $ pour accéder ou définir des valeurs aux attributs d'une classe. Le mot-clé $this est un peu spécial et il désigne la classe courante.L'héritageL'héritage consiste à utiliser une classe parente et une ou plusieurs classes filles qui héritent des propriétés de la classe parente. Par exemple, si vous avez une classe?Vehicule, vous pouvez avoir une classe?Voiture?qui hérite de certaines propriétés de la classe?Vehicule, ainsi qu'une autre classe?Moto?qui va hériter de certaines propriétés de la classe?Voiture?tout en ajoutant des propriétés propres. Le mot utilisé pour dire à PHP qu'une classe hérite d'une autre est le mot-clé?extends. Prenons l'exemple d'une classe Vehicule :<?php?????????class?Vehicule??????{??????????????/**??????????????*?Déclaration?des?attributs??????????????*/??????????????protected?$prix;?//On?souhaite?que?les?classes?qui?en?héritent?puissent?y?accéder??????????????/**??????????????*?Cette?méthode?un?peu?spéciale?est?le?constructeur,?elle?est?exécutée?lorsque?vous?"créez"?votre?objet.?Elle?doit?initialiser?les?attributs?de?la?classe.????????????*/??????????????public?function?__construct(int?$prix_vehicule)??????????????{???????????????????$this->prix?=?$prix_vehicule;??????????????}? ? ? ? ? /** ???? ? ? ? ? * Cette méthode permet de modifier le prix du véhicule? ? ? ? ??*/ ???? ? ? ? ??public function?modifier_prix;(int $nouveau_prix) ???? ? ? ? ? { ???? ? ? ? ? ? ? ?$this->prix?=?$nouveau_prix; ???? ? ? ? ? }???????}???>Comme vous pouvez le constater, on a mis dans la classe Vehicule tout ce qui sera commun aux différents véhicules que nous allons pouvoir créer. Ici, j'ai mis un attribut "prix" car une voiture ou une moto ont toutes les deux un prix. On met donc tout ce que les véhicules ont en commun dans une même classe, et cette classe sera étendue par d'autres classes plus spécifiques. Voici maintenant une classe Voiture qui étend les propriétés de la classe Vehicule :<?php??????????class?Voiture?extends?Vehicule??????{???????????????/**???????????????*?Déclaration?des?attributs???????????????*/???????????????private?$climatisation;???????????/**???????????????*?Constructeur?de?la?classe?Voiture???????????*/???????????????public?function?__construct(int?$prix_vehicule,?bool?$clim)???????????????{????????????????parent::__construct($prix_vehicule);?//On?appelle?le?constructeur?de?la?classe?Vehicule?en?lui?fournissant?le?prix????????????????$this->climatisation?=?$clim;???????????}????????}????>Voici ce que ?a donne au niveau de l'instanciation :<?php???????$voiture?=?new?Voiture(17000,?TRUE);?//On?crée?une?voiture?valant?17000?euros?et?ayant?la?climatisation??????$voiture->modifier_prix(15000);?//On?peut?modifier?le?prix?de?la?voiture??>Comme vous pouvez le constater, on peut accéder à la classe parente comme si on accédait à la classe Voiture (avec la méthodemodifier_prix()). Si vous aviez mis la méthode?modifier_prix()?en accès privé, vous n'auriez pu effectuer la modification directement. Le niveau de protection le plus restrictif permettant cette modification est le niveau?protected.Ceci marque la fin du cours sur ce chapitre, qui est vraiment très loin d'être exhaustif. Je vous conseille d'aller lire la?documentation de pour avoir plus de précisions sur ce sujet qui mériterait bien plus qu'un chapitre.PHP - Bases de données et PHPMyAdminIntroductionLes bases de données sont des éléments très importants en PHP. On les utilise pour stocker des données. Leur gros avantage est que via un langage dédié, on va pouvoir récupérer les données stockées très rapidement, faire de nombreuses opérations dessus, tout ?a en un temps record !Par exemple, le?forum informatique?de ce site repose entièrement sur l'utilisation d'une base de données qui contient les messages, les sujets, etc ...On abrège souvent "base de données" par BDD, donc si vous me voyez écrire cela plus loin, ne vous posez pas de questions ;) On appelle SGBD un système de gestion de base de données. L'avantage du SGBD est que pour aller chercher vos données, vous ne vous préoccupez pas de savoir où sont stockées les données ni comment, vous dites "Je veux telle donnée" et le SGBD va la chercher pour vous. Vous pourrez également récupérer des données d'une manière très compliquée qui dépendent d'énormément de facteurs, chose quasi impossible en stockant les données dans un fichier sans de nombreux calculs très lourds. Le langage que l'on utilise pour interroger et effectuer des opérations sur une ou plusieurs bases de données/tables s'appelle le SQL.Pour tout ce qui suit, nous allons utiliser un SGBD appelé MySQL. Il s'agit du SQBD le plus répandu, vous ne devriez donc pas avoir de problème à faire fonctionner votre site ultérieurement. Cependant, PHP supporte d'autres SGBD dont voici une liste non exhaustive :mSQLSybaseMySQLOracleUnix dbmInformixSQL ServerPostgreSQL.Les tablesUne base de données contient des tables. Faisons une analogie : Vous avez un bureau qui représente la base de données. Sur ce bureau vous avez des dossiers, ce sont les tables. Ces dossiers contiennent des documents, pour nous les données.Une table contient des champs. Chaque champ va pouvoir recevoir un type de données bien précis. On ne stocke pas un numéro de sécurité sociale avec le même type que le nom et le prénom. On peut représenter une table sous la forme d'un tableau :Ici, nous avons trois champs :id_cat?: c'est un numéro destiné à distinguer toutes les catégories. Plus tard, on verra qu'il s'agit aussi d'une question d'optimisation. On n'utilise pas le champ "nom" pour distinguer les catégories, mais un champ numérique, qui sera bien plus rapide à traiter pour MySQL.nom?: Il s'agit d'un nom de catégoriedescription?: il s'agit d'une description de notre catégorieChacune des données que vous allez stocker dans la table va remplir les champs, et une donnée correspond ici à une ligne du tableau. Par exemple pour stocker des articles on aurait pu prendre une liste de champs comme "numero, titre, texte" le tout formant la table "articles". Il est bien important de savoir qu'une table peut comporter un nombre infini de données (dans la limite de vos ressources matérielles bien entendu). Une base de données peut elle aussi comporter une infinité de tables.PHPMyAdminPHPMyAdmin est une application PHP qui va vous permettre de gérer vos bases de données. Vous allez pouvoir créer des bases, des tables, etc... sans vous préoccuper du langage SQL qu'il faut écrire. Pour accéder à PHPMyAdmin, tapez dans votre navigateur l'adresse suivante : vous avez installé EasyPHP, tapez ceci : (le / de fin est important)Si tout s'est bien passé, vous allez arriver devant un écran de ce style :Vous allez maintenant pouvoir créer votre base de données. Pour l'exemple, nous allons créer une base de données intitulée?actualites. Mettez donc?actualites?dans la case?Créer une base de données?et cliquez sur?Créer. Ne vous préoccupez pas du champ?interclassement.La base de données a été créée. Comme vous pouvez le constater, le langage SQL que PHPMyAdmin a utilisé pour créer cette base est?CREATE DATABASE actualitesIl s'agit de ce qu'on appelle une requête (My)SQL. Nous allons maintenant créer une table?news?qui va contenir des actualités pour notre site Web. Réfléchissez maintenant au nombre de champs que nous pourrions mettre. Tout d'abord, il faut pouvoir identifier chacune des actualités postées. Je vous ai dit plus haut qu'il fallait utiliser un champ de type numérique. On va le nommer?id_news. Chaque news aura donc un id différent. Ensuite, il faut que l'on connaisse le titre de l'actualité, sa date de parution, l'auteur de la news et son texte. Cela nous fait donc 5 champs au total. Dans la case?nom, indiquez?news, dans la case?nombre de champs, mettez?5, puis cliquez sur?Exécuter.Vous voici maintenant devant une liste de champs qu'il va falloir déterminer. Le premier champ sera notre champ?id_news. Indiquez donc dans la première case?id_news. Pour le type de champ, je vous laisse regarder cette page : types de champs MySQL. Après réflexion, vous pourrez avoir une quantité de news assez importante, on va donc utiliser un type SMALLINT avec comme attribut UNSIGNED. Vous pourrez donc stocker 65536 news. Je pense que c'est correct non ?Dans le champ?extra?indiquez?autoincrement. Pourquoi ? car en fait, l'avantage de ce type de champ est que vous allez pouvoir ne pas vous préoccuper du numéro à ajouter, MySQL le fera pour vous. Quand vous ajouterez une news, vous n'aurez donc pas à aller récupérer le numéro maximum existant pour lui ajouter un et l'insérer dans la base. Sélectionnez ensuite la troisième option (ic?ne avec un U), qui indique que ce champ sera un champ ayant une valeur unique (il s'agit également d'un INDEX qui va vous permettre d'accélérer les recherches sur la base, mais nous y viendrons plus tard).Pour le second champ, il s'agit du titre de l'actualité. On peut donc nommer ce champ?titre, et lui mettre un type VARCHAR (mettez?255?dans l'option "taille/valeurs").Pour le troisième champ, il s'agit d'une date de parution. Vous connaissez ce qu'est un timestamp, nous n'allons pas utiliser ce type de champ car le timestamp de PHP et celui de MySQL sont différents. En revanche, nous allons utiliser un type?INT?avec l'attribut?UNSIGNED, qui permettra de stocker des dates provenant de la fonction time() de PHP.Pour le quatrième champ, nous allons utiliser le nom?auteur, qui contiendra le pseudo du posteur de la news, avec le type?VARCHAR?et?20caractères dans la zone "taille/valeurs". Il faut savoir qu'il serait plus efficace de stocker un numéro correspondant à un numéro de membre, seulement nous n'avons pas de table?membres?et je ne vais donc pas vous compliquer la t?che pour ce premier exercice.Le dernier champ sera de type?TEXT?et portera le nom de?texte. Il servira à contenir le texte de la news.Choisissez dans la zone "moteur de stockage" l'option?MyISAM. Je ne vous dis pas pourquoi, mais sachez que certains types de tables ne sont pas supportés chez certains hébergeurs, ce qui n'est pas le cas du type MyISAM. Ce n'est pas dramatique en soi car on peut changer de type de table via les options de PHPMyAdmin, mais les autres types offrent certaines spécificités que nous ne détaillerons pas ici et qui peuvent ne pas être adaptées. Une fois que tout est rempli, cliquez sur le bouton?Sauvegarder. Si tout va bien, PHPMyAdmin exécutera la requête suivante :CREATE TABLE?`news` (? ?? `id_news`?MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT?,? ?? `titre`?VARCHAR( 255 )?NOT NULL,? ?? `date`?INT UNSIGNED NOT NULL?,? ?? `auteur`?VARCHAR( 20 )?NOT NULL?,? ?? `texte`?TEXT NOT NULL?,?UNIQUE?( `id_news` ) )ENGINE = MYISAM?;Vous vous retrouvez devant cet écran :Maintenant, nous allons insérer des données dans cette table?news. Pour ce faire, remarquez les onglets présents en haut du cadre de droite :Cliquez sur l'onglet?Insérer. Vous obtenez à l'écran une représentation des différents champs avec des zones de texte pour vous permettre de les remplir :Il va maintenant falloir remplir les champs. Voici ce que vous pouvez mettre :Tout d'abord dans le champ?id_news, ne mettez rien, en effet on a dit que c'était un champ qui se remplissait automatiquement. Pour le titre, à vous de trouver un titre accrocheur :p. En ce qui concerne la date, faites dans un fichier PHP ceci :<?php???????echo?time();??>Notez la valeur obtenue et renseignez-la dans le champ?date. Pour le champ?auteur, indiquez votre pseudo. Mettez ensuite un texte dans la zone de texte correspondant au champ?texte, ce sera le texte de la news. Cliquez ensuite sur?Exécuter.Voilà ce qu'a pu donner la requête :INSERT INTO?`news` ( `id_news` , `titre` , `date`, `auteur` , `texte` )?VALUES?(?NULL?, 'Bienvenue sur mon site !', '1166970760', 'Anthony', 'Ceci est ma première actualité !' );Si vous souhaitez maintenant consulter les données présentes dans la table, vous pouvez cliquer sur l'onglet?Afficher. Voici ce que vous obtenez (j'ai inséré une autre news entre temps pour vous montrer que l'on peut en mettre le nombre qu'on veut) :J'espère que ce chapitre sur PHPMyAdmin et une introduction à MySQL vous ont permis de comprendre les concepts fondamentaux de ce qu'est une base de données, car pour le prochain chapitre, nous allons maintenant parler de requêtes, le tout mélangé avec du code PHP :pPHP et les requêtes MySQLIntroductionAprès avoir vu ce qu'était une base de données et découvert comment fonctionnait PHPMyAdmin dans le chapitre précédent, nous allons maintenant nous intéresser à la partie PHP, car n'oubliez pas que PHP va vous permettre de communiquer avec votre base de données. Dans ce chapitre, on utilisera toujours PHP pour communiquer avec MySQL, mais sachez qu'il est tout à fait possible d'entrer les requêtes à la main dans ce qu'on appelle une console (pour voir la console Windows, cliquez sur?démarrer,?Exécuter?et tapez?cmd).Avant toute chose, il faut que vous sachiez qu'on ne fait pas directement une requête avec une fonction PHP. Il faut d'abord passer par plusieurs étapes. Un SGBD dispose ainsi de droits d'accès et peut comporter plusieurs bases. Il faut donc tout d'abord s'identifier au serveur MySQL que l'on souhaite utiliser. Une fois cette identification faite, il faut sélectionner la base sur laquelle on souhaite travailler. Et après ?a, vous pourrez effectuer vos requêtes ! Voyons comment cela fonctionne.Connexion au serveur MySQLLa première étape consiste à se connecter au serveur MySQL. Pour cela, on utilise la fonction mysql_connect() de PHP. Elle prend trois arguments:L'adresse IP (ou l'alias pointant vers l'ip) du serveur MySQLLe nom d'utilisateurLe mot de passeCes trois paramètres vous sont fournis par votre hébergeur. Lorsque vous travaillez avec EasyPHP ou Wamp, les paramètres à utiliser sont :localhostrootet il n'y a pas de mot de passe à renseigner.Voilà comment vous pouvez coder ?a pour un usage local :<?php???????$connexion?=?mysql_connect('localhost',?'root',?'')?OR?die('Erreur?de?connexion');???????>La partie?OR die('Erreur de connexion')?n'est pas indispensable, mais elle permet de couper le script si il n'a pas réussi à se connecter au serveur. Il est important pour une application sécurisée de bien gérer les erreurs que vous pouvez avoir à la connexion ou lors de la sélection de base de données (on va voir ?a tout de suite)Sélection de la base de donnéesUne fois que vous êtes connecté au serveur MySQL, sachant qu'il peut contenir une infinité de bases de données, il faut bien qu'il s?che sur laquelle vous souhaitez travailler. On utilise pour cela la fonction mysql_select_db() en PHP. Elle prend comme paramètre le nom de la base de données que vous souhaitez utiliser.Pour ceux qui ont suivi le chapitre précédent, j'avais utilisé une base?actualites. Tous mes exemples vont donc s'appuyer sur cette base que nous avons créée ensemble. Voici comment dire à PHP que nous allons travailler sur cette base :<?php??????mysql_select_db('actualites')?OR?die('Sélection?de?la?base?impossible');??>Encore une fois, la partie?OR die('Sélection de la base impossible')?n'est pas indispensable mais conseillée.Déconnexion du serveur MySQLIl s'agit d'une étape très importante et trop souvent négligée dans de nombreux scripts. Il faut savoir que MySQL dispose d'un paramètre spécifiant le nombre maximum de connexions simultannées qu'il peut traiter. En local, vous n'aurez pratiquement jamais de problème avec ce paramètre (qui se manifeste par une erreur de?Max user connections?et vous empêche donc d'effectuer vos requêtes). En revanche, chez un hébergeur, ce paramètre est souvent placé à une valeur de 3 ou de 5 (5 étant préférable). Cela veut dire que 5 connexions pourront avoir lieu quasiment simultanément. Vous vous dites "c'est énorme, il n'y aura jamais personne en même temps qui pourra cliquer sur mon site". Le problème, est que la connexion est par défaut, si vous ne la fermez pas, active pendant toute la durée de génération de la page. Si vous ouvrez votre connexion tout en haut de la page et que le serveur met 1 seconde (ce qui est énorme) pour générer la page, votre connexion restera ouverte pendant une seconde. Vous imaginez qu'il devient alors très facile d'avoir 5 connexions à la même seconde pour peu que vous ayez un peu de visiteurs ou des scripts très lents. Il faut donc fermer la connexion le plus t?t possible, après avoir effectué la dernière requête, etAVANT TOUT TRAITEMENT.Vous allez voir tout à l'heure que nous allons utiliser la fonction mysql_query() pour effectuer des requêtes MySQL, et bien voici un schéma qu'il faudrait adopter pour bénéficier d'une optimisation maximum :<?php??????$connexion?=?mysql_connect('localhost',?'root',?'')?OR?die('Erreur?de?connexion');??????mysql_select_db('actualites')?OR?die('Erreur?de?sélection?de?la?base');??????$requete1?=?mysql_query('....');??????$requete2?=?mysql_query('....');??????//Ici?vous?placez?vos?autres?requêtes??????mysql_close();?//On?ferme?la?connexion?à?MySQL??????//Ici?vous?mettez?le?code?PHP?qui?va?aller?récupérer?les?données?provenant?des?requêtes?(fonction?mysql_fetch_row()?par?exemple)??>Comme vous pouvez le voir, on utilise la fonction?mysql_close()?pour fermer la connexion au serveur MySQL. Par défaut, elle ne prend pas de paramètre.Lire des données dans une tableAvant de lire des données dans une table, il faut que votre table contienne des enregistrements. On va se servir toujours de la même table que précédemment, c'est à dire la table?news. Vous pouvez y insérer quelques enregistrements via PHPMyAdmin, comme je vous l'ai déjà montré au chapitre précédent.Qu'il s'agisse d'une lecture, d'une écriture ou d'une modification de données ou de paramètres, il vous faudra passer par la fonction mysql_query(). Query signifie requête en anglais. C'est cette fonction qui va vous permettre d'interagir avec MySQL.<?php??????$requete?=?mysql_query('Ici votre requête SQL');??>Le résultat de la requête sera retourné dans la variable $requete. Attention, il s'agit d'une variable de type resource. Vous ne pourrez donc pas faire un echo de cette variable, ?a ne vous renverra pas ce que vous attendez. On va en reparler juste après ;)Voyons comment effectuer une requête de sélection de certains champs :En SQL, lorsque vous souhaitez sélectionner des données provenant d'une table, on utilise tout d'abord le mot SELECT, qui veut dire que vous vous apprêtez à récupérer des données. Ensuite, vous devez indiquer à MySQL la liste des champs de la table que vous souhaitez voir dans votre résultat, séparés par des virgules. Vous devez ensuite indiquer à quelle table vous souhaitez prendre les données via le mot clé FROM suivi du nom de la tableSi nous souhaitons récupérer les champs titre et texte de la table news, voici comment nous allons procéder :<?php??????$requete?=?mysql_query('SELECT?titre,?texte?FROM?news');??>Bon c'est bien beau tout ?a, mais comment fait-on pour récupérer le résultat d'une requête sous forme textuelle ? Et bien on utilise pour cela quatre fonctions de PHP (en fait on en utilise une parmis les quatre). Voilà les trois fonctions que vous pouvez utiliser :mysql_fetch_row() : cette fonction va retourner un tableau avec des indices numériques (l'indice 0 correspond au premier champ de la requête, l'indice 1 au second champ ...). Je vous conseille d'utiliser cette fonction pour des tables dans lesquelles vous sélectionnez peu de champs (un ou deux), car c'est la fonction la plus rapide.mysql_fetch_array() : cette fonction va retourner un tableau avec par défaut les indices numériques et associatifs. Elle est plus lente que mysql_fetch_row() mais plus simple d'utilisation. Pour la rendre plus rapide, on peut utiliser la fonction mysql_fetch_assoc() qui va uniquement retourner un tableau avec les indices associatifs.mysql_fetch_object() : cette fonction retourne un objet qui aura pour attributs les champs de la requête MySQL.Voyons voir ce que ?a donne pour sélectionner tous les enregistrements de la table actualites, et les afficher :<?php??????mysql_connect('localhost',?'root',?'')?OR?die('Erreur?de?connexion?à?la?base');??????mysql_select_db('actualites')?OR?die('Erreur?de?sélection?de?la?base');??????$requete?=?mysql_query('SELECT?titre,?texte?FROM?news')?OR?die('Erreur?de?la?requête?MySQL');??????mysql_close();??????/**??????*?On?récupère?les?données??????*?Tant?qu'une?ligne?sera?présente,?la?boucle?continuera??????*/??????while($resultat?=?mysql_fetch_object($requete))??????{???????????echo?'<p>Titre?:?'.$resultat->titre.'.?Texte?:?'.$resultat->texte.'</p>';??????}??>?Avec la fonction?mysql_fetch_row(), voici ce que ?a aurait donné :<?php???????mysql_connect('localhost',?'root',?'')?OR?die('Erreur?de?connexion?à?la?base');???????mysql_select_db('actualites')?OR?die('Erreur?de?sélection?de?la?base');???????$requete?=?mysql_query('SELECT?titre,?texte?FROM?news')?OR?die('Erreur?de?la?requête?MySQL');???????mysql_close();???????/**???????*?On?récupère?les?données???????*?Tant?qu'une?ligne?sera?présente,?la?boucle?continuera???????*/???????while($resultat?=?mysql_fetch_row($requete))???????{????????????echo?'<p>Titre?:?'.$resultat[0].'.?Texte?:?'.$resultat[1].'</p>';???????}???>Et avec la fonction?mysql_fetch_assoc()?(équivalente à la fonction?mysql_fetch_array()?à laquelle on passe une constante en second paramètre :?MYSQL_ASSOC) :<?php????????mysql_connect('localhost',?'root',?'')?OR?die('Erreur?de?connexion?à?la?base');????????mysql_select_db('actualites')?OR?die('Erreur?de?sélection?de?la?base');????????$requete?=?mysql_query('SELECT?titre,?texte?FROM?news')?OR?die('Erreur?de?la?requête?MySQL');????????mysql_close();????????/**????????*?On?récupère?les?données????????*?Tant?qu'une?ligne?sera?présente,?la?boucle?continuera????????*/????????while($resultat?=?mysql_fetch_assoc($requete))??//équivalent?à??while($resultat?=?mysql_fetch_array($requete,?MYSQL_ASSOC))??????{?????????????echo?'<p>Titre?:?'.$resultat['titre'].'.?Texte?:?'.$resultat['texte'].'</p>';????????}????>Pour tout ce qui est insertion de données, je vous conseille de lire les requêtes MySQL associées dans ce cours :?requêtes MySQL d'insertion de données. Le principe est le même, sauf que là on ne récupère aucun résultat.FonctionsDescriptionsmysql_affected_rows()Retourne le nombre de rangée affectées par la dernière requête faite sur la base de données.mysql_close()Ferme la connexion à une base de données.mysql_connect()?tablit une connexion vers la base de données spécifiée dans les arguments. Si cette base se trouve sur un port différent, faites suivre le nom de la machine par (:) puis le numéro du port (ex.?:8080). Cette connexion est automatiquement fermée à la fin de l'exécution du script sauf si une fonction?mysql_close()?intervient auparavant.mysql_create_db()Permet de créer une nouvelle base de données.mysql_data_seek()Déplace le pointeur interne de la rangée du résultat vers la rangée spécifiée. Utilisez cette fonction avec?mysql_fetch_row()?pour passer à la rangée spécifiée et récupérer les données.mysql_db_query()Permet d'exécuter une requête?SQL?sur une ou plusieurs tables d'une base de données.Attention cette fonction est obsolète, ne l'utilisez plus, utilisez mysql_query !mysql_drop_db()Permet de supprimer une base de données. Dans ce cas toutes les données sont perdues.mysql_errno()Retourne le numéro de l'erreur générée lors de la dernière action sur la base de donnée.mysql_error()Retourne la description textuelle d'une erreur générée par la dernière action sur une base de données.mysql_fetch_array()Retourne un tableau qui représente tous les champs d'une rangée dans le résultat. Chaque appel récupère la prochaine rangée et ce jusqu'à ce qu'il n'y en ait plus. Chaque valeur de champ est stockée de deux fa?ons: elle est indexée par un offset qui commence par '0', et indexée par le nom du champ.mysql_fetch_assoc()Comme mysql_fetch_array() mais indexée uniquement par le nom du champ. Dans la plupart des cas, utiliser cette fonction ou mysql_fetch_row() de préférence à mysql_fetch_array().mysql_fetch_field()Récupère l'information attachée à un champs du résultat. Ces champs sont numérotés à partir de zéro.mysql_fetch_lengths()Retourne un tableau d'une longueur spécifiée pour chaque champ de résultat.mysql_fetch_object()Cette fonction est semblable à?mysql_fetch_array()?et à?mysql_fetch_row(). Mais à la place, elle retourne un objet. Chaque champ du résultat correspond à une propriété dans l'objet renvoyé. Chaque appel à?mysql_fetch_object()?retourne la rangée suivante, ouFalse?s'il ne reste plus de rangée.mysql_fetch_row()Comme mysql_fetch_array() mais indexée uniquement par le numéro d'ordre du champ. C'est la méthode la plus rapide pour obtenir des résultats à partir d'une requête. Dans la plupart des cas, utiliser cette fonction ou mysql_fetch_assoc() de préférence à mysql_fetch_array().mysql_field_flags()Permet d'obtenir une description des options rattachées au champs spécifié.mysql_field_len()Retourne la longueur maximale du champ spécifié.mysql_field_name()Retourne le nom d'une colonne. L'argument champ correspond à un offset numéroté à partir de zéro.mysql_field_seek()Déplace le pointeur interne du champ vers le champs spécifié. Le prochain appel versmysql_field_seel()?retournera l'information de ce champs.mysql_field_table()Retourne le nom de la table pour le champ spécifié.mysql_field_type()Retourne le type d'un champ particulier dans le résultat obtenu.mysql_free_result()Libère la mémoire associée au résultat spécifié. Elle n'est toutefois pas strictement nécessaire, car cette mémoire est automatiquement vidée lorsqu'un script termine son exécution.mysql_insert_id()Après l'insertion d'un nouvel enregistrement avec un champ?auto_increment, la fonctionmysql_insert_id()?retourne l'ID?qui vient d'être affecté au nouvel enregistrement.mysql_list_dbs()Interroge le serveur pour obtenir une liste de bases de données. Elle retourne un pointeur de résultat qui pourra être exploité avec?mysql_fetch_row()?et d'autres fonctions similaires.mysql_list_fields()Retourne un pointeur de résultat correspondant à une requête sur une liste de champs pour la table spécifiée. Ce pointeur pourra être exploité par toutes les fonctions qui recherchent des rangées à partir d'un résultat. Notez que l'argument lien reste optionnel.mysql_list_tables()Retourne le pointeur de résultat d'une liste de tables pour la base de données spécifiée. Ce pointeur pourra être exploité par toutes les fonctions qui recherchent des rangées à partir d'un résultat. Notez que l'argument lien reste optionnel.mysql_num_fields()Retourne le nombre de champs dans un résultat.mysql_num_rows()Retourne le nombre de rangées dans un résultat. Anciennement mysql_numrows()mysql_pconnect()Cette fonction opère de la même manière que?mysql_connect(), sauf que la connexion ne se referme pas à la fin de l'exécution du script sauf si un?mysql_close()?se trouve en fin de script.mysql_query()Permet d'exécuter une requête?SQL?sur une ou plusieurs tables d'une base de données. Si la requête exécute une instruction:?INSERT,?DELETE?ou?UPDATE, une valeur booléenne sera retournée (0?ou?1). Dans le cas d'une requête de type?SELECT, vous obtiendrez un identifiant de résultat.mysql_result()Retourne la valeur du champ spécifié dans la rangée concernée. L'argument champ peut être un numéro et, dans ce cas, il sera considéré comme un champ offset. Il peut également désigner le nom de la colonne, avec éventuellement celui de la table. Enfin, il peut également renvoyer à un alias.mysql_select_db()Sélectionne la base de données par défaut.Syntaxe SQL pour créer la table :?clients_tblCREATE TABLE?clients_tbl?(id?INT not null AUTO_INCREMENT,?prenom?VARCHAR (50) not null ,?nom?VARCHAR (50) not null ,?ne_le?DATE not null ,?ville?VARCHAR (90) not null ,?enfants?INT not null ,?PRIMARY KEY (id))Cas pratiques?:<?php?$db?=?mysql_connect('sql.free.fr',?'login',?'password');??// 1?mysql_select_db('nom_de_la_base',$db);????????????????????// 2?$req?=?mysql_query('SELECT * FROM clients_tbl');??????????// 3?$res?=?mysql_num_rows($req);???????????????????????????????// 4?echo?'Il y a '.$res.' enregistrement(s) dans la table Clients.';??// 5?mysql_close($db);??// 6??>Explication du code ci-dessus :On se connecte à la base de données :Host :?Par exemple "sql.free.fr", vous pouvez également utiliser "localhost" par défaut.Login :?Ensuite vous devez mettre le "login" pour accéder à la base (chez les hébergeurs gratuits c'est souvent le même login que l'accès FTP).Password :?Et pour finir le "mot de passe", là aussi il s'agit très souvent du même password que l'accès FTP.On sélectionne la base de données, en effet je vous rappelle que?MySQL?est un?serveur de bases de données, donc il peut contenir plusieurs bases. Bien s?r dans votre cas si vous êtes chez un hébergeur gratuit, vous n'avez en général droit qu'à une seule base, mais MySQL ne le sait pas ;), il faut donc lui spécifier sur quelle base vous souhaitez vous connecter.Notez : Chez Free.fr et Nexen le nom de la base est souvent le même que le login de connection.La fonction?mysql_query()?permet de passer une requête SQL vers la base de données, c'est évidement l'un des attraits intéressants de PHP (notez que nous initialisons au passage la variable?$req?qui contient la requête).La fonction?mysql_num_rows()?permet de compter le nombre d'enregistrements que retourne la requête "$req" dans notre cas : 5 puisqu'il s'agit d'un simple "select " sur la table sans aucune condition, nous initialisons donc une variable?$res?qui contient : 5.Il ne reste plus qu'à afficher le nombre de résultats avec un?echo()?de?$res.Et pour finir on referme la connexion -?ouverte avec mysql_connect?- avec la fonction?mysql_close(). Cette fonction n'est pas vraiment obligatoire avec un?mysql_connect(), car par défaut la connexion sera coupée automatiquement à la fin de l'exécution du script.Requête SQL :?CREATE TABLE famille_tbl ( id int(11) NOT NULL auto_increment, nom varchar(255) NOT NULL, prenom varchar(255) NOT NULL, statut varchar(255) NOT NULL, date date DEFAULT '0000-00-00' NOT NULL, PRIMARY KEY (id), KEY id (id), UNIQUE id_2 (id) );INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Grégoire', 'Grand-père', '1932-05-17');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Germaine', 'Grand-mère', '1939-02-15');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Gérard', 'Père', '1959-12-22');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Marie', 'Mère', '1961-03-02');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Julien', 'Fils', '1985-05-17');INSERT INTO famille_tbl VALUES( '', 'Dupond', 'Manon', 'Fille', '1990-11-29');Affichage des résultats tels qu'ils sont dans la table sans condition.<?php?// on se connecte à MySQL?$db?=?mysql_connect('localhost',?'login',?'password');?// on sélectionne la base?mysql_select_db('nom_de_la_base',$db);?// on crée la requête SQL?$sql?=?'SELECT nom,prenom,statut,date FROM famille_tbl';?// on envoie la requête?$req?=?mysql_query($sql)?or?die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());?// on fait une boucle qui va faire un tour pour chaque enregistrement?while($data?=?mysql_fetch_assoc($req))?????{?????// on affiche les informations de l'enregistrement en cours?????echo?'<b>'.$data['nom'].' '.$data['prenom'].'</b> ('.$data['statut'].')';?????echo?' <i>date de naissance : '.$data['date'].'</i><br>';?????}?// on ferme la connexion à mysql?mysql_close();??>?Explication :Voici donc notre première boucle sur une table, champagne ! :). Plus sérieusement, vous vous apercevez que les résultats qui s'affichent sont exactement dans le même ordre que la table et pour cause, nous n'avons pas spécifié de condition dans notre requête (2), donc dans ce cas, la requête scanne la table de haut en bas.Remarquez que la fonction mysql_fetch_assoc() renvoie un tableau dont les clés sont les noms des champs sélectionnés. On a aussi rajouté après mysql_query() ceci: ?or?die('Erreur SQL !<br>'?.$sql.?'<br>'.?mysql_error());?. Cela veut dire qu'en cas d'erreur dans la requete vers mysql, ce qui arrive fréquemment, php va afficher un message indiquant l'erreur renvoyée par mysql (grace à mysql_error()) ce qui fournit une aide précieuse pour comprendre le problème.Affichage des résultats par ordre alphabétique de prénom.<?php?// Gardez le code ci-dessus, changez juste la requête SQL !???$sql?=?'SELECT nom,prenom,statut,date FROM famille_tbl ORDER BY prenom';?// L'opérateur ORDER BY permet de classer soit alphabétiquement?// soit numériquement suivant le type du champ.?// Si l'on souhaite classer en décroissant (ex. de Z à A), nous?// y ajouterons DESC soit : ORDER BY prenom DESC??>?Affichage des résultats par comparaison de date.<?php?// Gardez le code ci-dessus, changez juste la requête !???$sql?=?"SELECT nom,prenom,statut FROM famille_tbl WHERE date<'1960-01-01'";?// L'avantage d'avoir un type DATE dans notre base de données, c'est que?// nous pouvons comparer des dates dans la requête SQL.?// Ici nous ne souhaitons afficher que les membres de la famille qui sont?// nés avant le 1er janvier 1960, soit : WHERE date<'1960-01-01'??>Affichage des résultats avec le commande LIKE.<?php?// Gardez le code ci-dessus, changez juste la requête !???$sql?=?"SELECT nom,prenom,statut,date FROM famille_tbl WHERE prenom LIKE 'G%'";?// Le signe pourcentage "%" placé après le G, indique que la lettre G peut?// être suivie, mais pas précédée, d'autres caractères !?// Notez aussi que LIKE n'est pas sensible à la casse, cela veut dire que?// la requête cherchera aussi bien des G majuscules que minuscules.??>?<?php?// Gardez le code ci-dessus, changez juste la requête !???$sql?=?"SELECT * FROM famille_tbl WHERE prenom LIKE '%MA%'";?// Le signe pourcentage "%" placé avant et après MA indique que la syllabe?// peut-être précédée ou suivie de caractères.?// Une fois de plus notez que LIKE n'est pas sensible à la casse, la requête?// cherchera aussi bien des MA majuscules que des ma en minuscules.??>?Pour terminer voici comment vous allez pouvoir convertir la date du format US au format FR, une fois que vous avez récupéré l'information depuis la table. Nous vous donnons deux fa?ons de faire, la deuxième est bien meilleure !<?php??// on se connecte à MySQL?$db?=?mysql_connect('localhost',?'login',?'password');??// on sélectionne la base?mysql_select_db('nom_de_la_base',$db);??// on crée la requete SQL?$sql?=?'SELECT nom,prenom,statut,date FROM famille_tbl';??// on envoie la requête?$req?=?mysql_query($sql)?or?die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());??// on fait une boucle qui va faire un tour pour chaque enregistrement?while($data?=?mysql_fetch_array($req))??????{?????$a?=?substr($data['date'],?0,?4);?????// conversion?????$m?=?substr($data['date'],?5,?2);?????// de la date?????$j?=?substr($data['date'],?8,?2);?????// au format?????$date?=?$j.'-'.$m.'-'.$a;?????????????// Fran?ais????????????// on affiche les informations de l'enregistrement en cours?????echo?'<b>'.$data['nom'].' '.$data['prenom'].'</b> ('.$data['statut'].')';??????echo?' <i>date de naissance : '.$date.'</i><br>';??????}??// on ferme la connexion à mysql?mysql_close();???>?<?php??// on se connecte à MySQL?$db?=?mysql_connect('localhost',?'login',?'password');??// on seléctionne la base?mysql_select_db('nom_de_la_base',$db);??// on crée la requete SQL?$sql?=?"SELECT nom,prenom,statut,DATE_FORMAT(date, '%d-%m-%Y') as datefr FROM famille_tbl";??// on envoie la requête?$req?=?mysql_query($sql)?or?die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());??// on fait une boucle qui va faire un tour pour chaque enregistrement?while($data?=?mysql_fetch_array($req))??????{?????// on affiche les informations de l'enregistrement en cours?????echo?'<b>'.$data['nom'].' '.$data['prenom'].'</b> ('.$data['statut'].')';??????echo?' <i>date de naissance : '.$data['datefr'].'</i><br>';??????}??// on ferme la connexion à mysql?mysql_close();???>?Autres cas pratiques?:Créer un fichier PHP?: connexion.php<?php# FileName="Connection_php_mysql.htm"# Type="MYSQL"# HTTP="true"$hostname_MaConnexion = "localhost";$database_MaConnexion = "php_dream";$username_MaConnexion = "root";$password_MaConnexion = "";$MaConnexion = mysql_pconnect($hostname_MaConnexion, $username_MaConnexion, $password_MaConnexion) or trigger_error(mysql_error(),E_USER_ERROR); ?>Créer une page affichePeintres.php<?php require_once('Connections/MaConnexion.php'); ?><?phpif (!function_exists("GetSQLValueString")) {function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { if (PHP_VERSION < 6) { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; } $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue;}}$maxRows_affichePeintre = 10;$pageNum_affichePeintre = 0;if (isset($_GET['pageNum_affichePeintre'])) { $pageNum_affichePeintre = $_GET['pageNum_affichePeintre'];}$startRow_affichePeintre = $pageNum_affichePeintre * $maxRows_affichePeintre;mysql_select_db($database_MaConnexion, $MaConnexion);$query_affichePeintre = "SELECT nom, ville FROM utilisateurs ORDER BY nom ASC";$query_limit_affichePeintre = sprintf("%s LIMIT %d, %d", $query_affichePeintre, $startRow_affichePeintre, $maxRows_affichePeintre);$affichePeintre = mysql_query($query_limit_affichePeintre, $MaConnexion) or die(mysql_error());$row_affichePeintre = mysql_fetch_assoc($affichePeintre);if (isset($_GET['totalRows_affichePeintre'])) { $totalRows_affichePeintre = $_GET['totalRows_affichePeintre'];} else { $all_affichePeintre = mysql_query($query_affichePeintre); $totalRows_affichePeintre = mysql_num_rows($all_affichePeintre);}$totalPages_affichePeintre = ceil($totalRows_affichePeintre/$maxRows_affichePeintre)-1;?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""><html xmlns=""><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Document sans titre</title></head><body><table width="200" border="1"> <tr> <td>Nom</td> <td><?php echo $row_affichePeintre['nom']; ?></td> </tr> <tr> <td>Ville</td> <td><?php echo $row_affichePeintre['ville']; ?></td> </tr></table><p>&nbsp;</p><p>&nbsp;</p><table border="1"> <tr> <td>nom</td> <td>ville</td> </tr> <?php do { ?> <tr> <td><?php echo $row_affichePeintre['nom']; ?></td> <td><?php echo $row_affichePeintre['ville']; ?></td> </tr> <?php } while ($row_affichePeintre = mysql_fetch_assoc($affichePeintre)); ?></table><p>&nbsp;</p></body></html><?phpmysql_free_result($affichePeintre);?>Créer une page d’ajout d’enregistrement?: ajoutPeintre.php<?php require_once('Connections/MaConnexion.php'); ?><?phpif (!function_exists("GetSQLValueString")) {function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { if (PHP_VERSION < 6) { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; } $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue;}}$editFormAction = $_SERVER['PHP_SELF'];if (isset($_SERVER['QUERY_STRING'])) { $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);}if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $insertSQL = sprintf("INSERT INTO utilisateurs (nom, ville) VALUES (%s, %s)", GetSQLValueString($_POST['nom'], "text"), GetSQLValueString($_POST['ville'], "text")); mysql_select_db($database_MaConnexion, $MaConnexion); $Result1 = mysql_query($insertSQL, $MaConnexion) or die(mysql_error()); $insertGoTo = "affichePeintres.php"; if (isset($_SERVER['QUERY_STRING'])) { $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?"; $insertGoTo .= $_SERVER['QUERY_STRING']; } header(sprintf("Location: %s", $insertGoTo));}?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""><html xmlns=""><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Document sans titre</title></head><body><form action="<?php echo $editFormAction; ?>" method="post" name="form1" id="form1"> <table align="center"> <tr valign="baseline"> <td nowrap="nowrap" align="right">Nom:</td> <td><input type="text" name="nom" value="" size="32" /></td> </tr> <tr valign="baseline"> <td nowrap="nowrap" align="right">Ville:</td> <td><input type="text" name="ville" value="" size="32" /></td> </tr> <tr valign="baseline"> <td nowrap="nowrap" align="right">&nbsp;</td> <td><input type="submit" value="Ins&eacute;rer un enregistrement" /></td> </tr> </table> <input type="hidden" name="MM_insert" value="form1" /></form><p>&nbsp;</p></body></html>Optimiser phpPHP?est un langage de?programmation?interprété, c'est à dire que le fichier texte contenant le code PHP est analysé puis traité directement (pas de code compilé). Nous allons voir comment améliorer les performances de vos scripts PHP pour tirer le maximum de performances.Les différentes techniques d'optimisation que nous allons voir ici vous permettront :De générer vos pages plus rapidement pour le visiteurD'économiser des ressources serveurD'accueillir plus de visiteurs en même temps sur votre siteDe coder plus proprement, car optimisation rime souvent (pas toujours) avec clarté et propreté.Suite aux différentes remarques plus ou moins fondées que j'ai pu lire sur le net, je tiens à préciser que le début de cet article ne vous fera pas gagner un temps de génération énorme si votre page est mal codée et qu'il s'agit de micro-optimisations, ?a ne remplace donc en AUCUN cas un algorithme optimisé et ce pour n'importe quelle page de votre site. Privilégiez donc une amélioration de vos algorithmes avant de finir par optimiser les quelques tournures qui pourraient vous faire perdre quelques millièmes de secondes supplémentaires.Nous allons donc commencer par optimiser les quelques millisecondes que vous pourriez perdre par l'emploi de fonctions moins efficaces que d'autres. Tous les benchs qui vont suivre ont été effectués avec la version 5.2.4 de PHP, la dernière au moment où j'écris ces lignes. Ils consistent en l'exécution d'une boucle comptant un nombre?n?d'itérations (ce nombre?n?est précisé en face de chaque bench car les différences sont parfois tellement minimes qu'elles exigent un nombre d'itérations plus important afin que l'on puisse les constater). A l'intérieur de cette boucle se trouve le code pour lequel on teste les performances. A la fin du script, on décompte le nombre de secondes qu'il a nécessité pour s'exécuter et on compare donc les différents codes entre-eux. Les benchs ont été exécutés 5 fois de manière à prendre la valeur moyenne du temps de génération et limiter les erreurs. A l'attaque !Les simples et doubles quotes :Commen?ons avec un classique en?PHP?à savoir les simples et doubles quotes (guillemets). Elles tiennent leur différence principale dans le fait que tout ce qui se trouve à l'intérieur des guillemets simple n'est pas interprété, contrairement à ce qui se trouve à l'intérieur des guillemets doubles.?En pratique le code suivant fait exactement la même chose :<?php?? ? ?echo?'Voici une cha?ne de test';??>?<?php?? ? ?echo?"Voici une cha?ne de test";??>Par contre le code suivant donnera deux résultats totalement différents :Version 1:<?php?? ? ?$mavariable?=?'bonjour tout le monde';?? ? ?echo?'Valeur de la variable : $mavariable';???>??Version 2:<?php?? ? ?$mavariable?=?'bonjour tout le monde';?? ? ?echo?"Valeur de la variable : $mavariable";???>Résultats avec 200 itérations :Lorsque vous utilisez la deuxième version de cet exemple, vous constatez que la cha?ne?$mavariable?est remplacée par sa valeur, contrairement à ce qui se passe dans la première version de cet exemple. Or, remplacer $mavariable par sa valeur nécessite du temps supplémentaire pour PHP car il doit non seulement rechercher le nom exact de la variable mais ensuite la remplacer par sa valeur. C'est pourquoi il est plus rapide d'utiliser la version 1. Bien me direz-vous, mais comment faire si on souhaite afficher le contenu d'une variable ? et bien on va pouvoir utiliser la concaténation. Reprenons notre code lent et optimisons-le :Version 1:<?php?? ? ?$mavariable?=?'bonjour tout le monde';?? ? ?echo?"Valeur de la variable : $mavariable";???>?Version 2:<?php??? ? ?$mavariable?=?'bonjour tout le monde';??? ? ?echo?'Valeur de la variable : '.$mavariable; ???>Version 3:<?php??? ? ?$mavariable?=?'bonjour tout le monde';??? ? ?print?'Valeur de la variable : '.$mavariable; ???>Nous pouvons également (cf version 3) utiliser la fonction print. Elle a une différence avec echo cependant : elle renvoie toujours la valeur 1, ce qui fait que vous pouvez l'utiliser dans des conditions ou autre. En pratique, elle est supposée être plus lente. Voici une comparaison des temps de génération, toujours avec 200 itérations :On constate qu'il n'y a ici aucune différence moyenne entre print et echo (cependant attention, j'ai constaté que print pouvait être plus rapide que echo, mais c'est généralement l'inverse. La moyenne a lissé les résultats). Vous pouvez (et uniquement pour?echo) remplacer le point de concaténation par une virgule. Ceci peut se révéler plus rapide (sur 200 itérations je n'ai pas obtenu de différences suffisantes toutefois). Cela vient du fait qu'il est souvent plus rapide de concaténer un petit bout de cha?ne et de tout envoyer dans le même buffer que de fermer et réouvrir le buffer nécessaire à chaque fois que vous utilisez echo. Voici en quoi cela consiste :Concaténation avec le point :<?php?? ? ?$mavariable?=?'bonjour tout le monde';??? ? ?echo?'Valeur de la variable : '.$mavariable; ???>"Concaténation" avec la virgule :<?php??? ? ?$mavariable?=?'bonjour tout le monde';??? ? ?echo?'Valeur de la variable : ',$mavariable; ???>Après ce bref passage autour de la fonction print et de la structure de langage echo, attaquons-nous aux différentes manières de codage. Commen?ons par la déclaration (et l'initialisation) des variables. Il existe plusieurs moyens de le faire :Version 1:<?php???????$mavariable;??????$mavariable2;??????$mavariable?=?'valeur';??????$mavariable2=?'valeur';??>Version 2:<?php??????$mavariable;$mavariable2;??????$mavariable?=?$mavariable2?=?'valeur';??>Voyons laquelle des deux est la plus rapide (toujours sur 200 itérations) :Contrairement à PHP4 où j'avais obtenu des résultats plus rapides pour la version 1, c'est ici la version 2 (plus logique) qui l'emporte d'une courte tête. Passons maintenant aux conditions. Il existe trois manières de faire des conditions en PHP :La condition if/elseL'instruction SwitchL'opérateur ternaireLes trois permettent de faire la même chose avec plus ou moins de syntaxe. Voyons trois exemples qui font absolument la même chose mais codés de manière différente :Version 1:<?php??? ? ?$variable?=?1;?? ? ?$i?=?0;?? ? ?if($variable?===?1)?? ? ?{?? ? ? ? ??$i++;?? ? ?}?? ? ?elseif($variable?===?2)?? ? ?{?? ? ? ? ??$i?=?2;?? ? ?}?? ? ?else?? ? ?{?? ? ? ? ??$i?=?3;?? ? ?}??>Version 2:<?php?? ? ?$variable?=?1;?? ? ?$i?=?0;?? ? ?switch($variable)?? ? ?{?? ? ? ? case?1:?? ? ? ? ??$i++;?? ? ? ? break;?? ? ? ? case?2:?? ? ? ? ??$i?=?2;?? ? ? ? break;?? ? ? ? default:?? ? ? ? ??$i?=?3;?? ? ? ? break;?? ? ?}??>?Version 3:<?php?? ? ?$variable?=?1;?? ? ?$i?=?0;?? ? ?($variable?===?1) ??$i++ : (($variable?===?2) ??$i?=?2?:?$i=3);??>?La première version utilise l'opérateur classique en PHP, à savoir la condition if/else. La seconde version utilise un switch tandis que la dernière utilise ce qu'on appelle l'opérateur ternaire. Les trois solutions ont des avantages et inconvénients différents du point de vue maintenance notamment, mais nous ne sommes ici que pour juger de leurs performances ! Voici donc les résultats du test, effectué encore une fois sur 200 itérations :Test encore une fois étonnant, car il est le contraire de ce que j'obtenais en PHP4. La solution la plus rapide est donc l'opérateur ternaire bien que sa lisibilité soit absolument affreuse !Passons maintenant aux boucles, et plus précisément à l'utilisation de la fonction?count()?dans une boucle. Vous êtes nombreux à mettre uncount()?dans une boucle for de manière à ce que cette boucle s'arrête une fois que la variable à incrémenter dépasse la valeur retournée par la fonction?count(). Or, en général, vous travaillez sur un tableau de dimension fixe, c'est à dire que?count()?va retourner à chaque fois la même valeur. Lorsque vous faites un tour de boucle, la valeur du?count()?est donc recalculée pour rien ! Voici les deux codes dont je veux parler :Version 1:<?php?? ? $w?=?0;?? ??$tableau?= array('test',?'hop');?? ??$n?=?count($tableau);?? ? for($i?=?0;?$i?<?$n;?$i++)?? ? {?? ? ? ? ? ??$w++;?? ? }??>Version 2:<?php?? ? $w?=?0;?? ??$tableau?= array('test',?'hop');?? ? for($i?=?0;?$i?<?count($tableau);?$i++)?? ? {?? ? ? ? ? ??$w++;?? ? }??>Voici maintenant les résultats pratiques de 200 itérations :Placer un?count()?dans une boucle est ici deux fois plus lent ! On privilégiera donc la première solution. Dans le même genre de chose, voyons voir l'impact que peut avoir d'utiliser une boucle for ou une boucle while :Version 1:<?php?? ? $i=0;?? ? while($i?<?50)?? ? {?? ? ? ??$i++;?? ? }??>?Version 2:<?php?? ?for($i?=?0;?$i?<?50;?$i++)?? ?{?? ?}??>?Comparons maintenant les résultats de ces deux codes réalisant la même fonction (attention, en cas de code plus complexe, le for peut s'avérer bien utile car il accepte des conditions supplémentaires), toujours sur 200 itérations :?Comme on peut le constater, le while est légèrement plus rapide.Ouverture d'un fichier :Il y a beaucoup de fonctions permettant en PHP d'ouvrir un fichier pour lire son contenu. Nous allons tester trois fonctions qui ouvriront un fichier contenant une quinzaine de lignes. Voici les trois fonctions utilisées :file_get_contents()file()fopen()?suivi de?fread()?pour récupérer les données et?fclose?pour fermer le handle.Voici les codes utilisés :Version 1:<?php? ?$fichier=file_get_contents('bench.txt');??>?Version 2:<?php?? ?$fichier=file('bench.txt');??>Version 3:<?php?? ?$fp?=?fopen('bench.txt',?'r');?? ?$fichier?=?fread($fp,?filesize('bench.txt'));?? ?fclose($fp);??>?Nous utiliserons toujours une boucle de 200 itérations. Voici les résultats (sans appel) : la fonction?fopen()?est de loin la plus efficace. La fonction?file()?nécessite la création d'un tableau et est de ce fait plus lente, de peu devant la fonction?file_get_contents()?qui malgré sa simplification n'est pas plus rapide.Voyons un peu maintenant deux méthodes pour concaténer une valeur à une variable cha?ne. Imaginions que vous ayez une variable contenant la valeur?bonjour?et que vous souhaitiez qu'elle contienne la valeur?bonjour tout le monde. On peut utiliser trois méthodes, l'une d'entre-elles est cependant inintéressante puisqu'elle consiste à réassigner entièrement la nouvelle valeur à la variable :<?php?? ?$variable?=?'bonjour';?? ?$variable?=?'bonjour tout le monde';??>Nous n'allons donc pas l'utiliser. Voyons maintenant deux autres méthodes utilisant la concaténation ou la recopie de valeur :Version 1:<?php?? ?$variable?=?'bonjour';?? ?$variable?=?$variable.' tout le monde';??>Version 2:<?php?? ?$variable ?=?'bonjour';?? ?$variable?.=?' tout le monde';??>Voyons maintenant le résultat des tests effectués encore et toujours avec une boucle de 200 itérations :?La concaténation l'emporte de peu, mais elle marque un net avantage en fonction de la longueur de la cha?ne initiale. Plus la cha?ne initiale est longue, plus la concaténation l'emporte aisément sur la recopie.Remplacement d'une expression dans une cha?ne :Il existe de multiples fa?ons en PHP de remplacer une portion de cha?ne par une autre valeur. Voici les deux fonctions principalement utilisées pour cela :preg_replace()str_replace()Sachez qu'il est plus rapide d'utiliser?str_replace()?que?preg_replace(), car?str_replace()?ne prend qu'une cha?ne fixe en paramètre, contrairement à?preg_replace()?qui utilise les?expressions régulières. Bien s?r dans le cas où vous souhaitez remplacer une cha?ne selon une condition bien précise, la fonction?str_replace()?n'est généralement pas assez puissante et il vous faudra recourir à la fonctionpreg_replace().Parcours d'un tableau :Préférez l'utilisation de la fonction?foreach()?à la place de l'utilisation du couple?while(list() = each()). Nous allons pour le prouver remplir un tableau de 1000 valeurs aléatoires, puis nous allons parcourir ce tableau 200 fois des deux fa?ons que je viens de mentionner. Voici les codes utilisés :Version 1:<?php?? ?$w?=?0;?? ?foreach($tableau?AS?$cle?=>?$valeur)?? ?{?? ? ? ?$w++;?? ?}??>Version 2:<?php?? ?$w?=?0;?? ?while(list($cle,?$valeur) =?each($tableau))?? ?{?? ? ? ?$w++;?? ?}??>Voici les résultats obtenus :?Le?while()?combiné au?list()?est plus rapide que la fonction?foreach().Après toutes ces micro optimisations, nous allons maintenant parler d'autres méthodes pour optimiser vos scripts PHP de manière à améliorer cette fois-ci de manière conséquente les performances. Ces modifications sont plut?t orientées algorithmes ou bases de données. Pour consulter quelques règles d'optimisation de MySQL, vous pouvez consulter ce lien :?Optimiser MySQL.En PHP, il existe de nombreuses solutions destinées à simplifier la t?che des designers et développeurs. Elles peuvent non seulement leur faciliter la t?che, mais également accélérer le temps de génération de vos scripts si elles sont bien utilisées. On peut parler notamment des moteurs de templates, dont vous trouverez une version con?ue par mes soins ici (en PHP5) :?Moteur de templates PHP. Gr?ce à l'utilisation de ce genre de sources, vous disposerez la plupart du temps d'un mode "cache". Cacher les informations consiste à les enregistrer dans un fichier ou une base de données de manière à réduire les traitements nécessaires pour afficher les données la prochaine fois. Par exemple, lorsque vous affichez la liste de vos actualités, vous savez qu'elle ne sera pas mise à jour toutes les minutes, il est donc inutile de redemander à la base tout le contenu des actualités et d'effectuer des traitements dessus à chaque fois qu'un visiteur clique sur la page. Vous pouvez récupérer une bonne fois pour toutes cette liste, la mettre en cache (dans un fichier texte par exemple) et la réutiliser ensuite au lieu de faire appel à la base de données. Ce genre d'astuce peut très facilement diminuer de?50 %?le temps de génération de vos pages et consommera moins de ressourcesCPU?(au mépris parfois de la quantité de mémoire vive consommée). Ces scripts et méthodes d'optimisation prennent toute leur importance dès lors que vous avez un site web un minimum visité. Si vous avez dix visiteurs journaliers et que vos traitements ne sont pas trop lourds, il est inutile de mettre en place un système de cache, mais qui peut le plus peut le moins comme on dit !L'upload de fichier (sécurisé)Les formulaires d'upload sont de plus en plus répandus sur un site Web. PHP permet de gérer l'upload très simplement. Il faudra par contre sécuriser cet upload pour éviter aux gens mal intentionnés d'envoyer du code PHP (par exemple dans un formulaire d'upload d'avatar, nous souhaitons recevoir une image...), c'est aussi ce que nous verrons plus loin dans cet article.Un formulaire d'upload en XHTML :Un formulaire d'upload contient obligatoirement un champ de type?file?qui dispose d'un bouton?parcourir?pour que vous puissiez envoyer votre fichier. Voici un exemple de formulaire basique que nous utiliserons pour tous les exemples présents dans cet article :<form?action="upload.php"?method="post"?enctype="multipart/form-data"><p><input?type="file"?name="fichier_source"?/><input?type="submit" value="Envoyer"?/></p></form>Ce formulaire va nous permettre d'envoyer à notre page?upload.php?toute sorte de fichiers que nous analyserons ensuite.La variable superglobale?$_FILES?:La variable superglobale?$_FILES?vous permet d'avoir pleins d'informations sur le fichier envoyé. Attention cependant : ces informations sont fournies par le navigateur Web, elles peuvent donc être manipulées. Attention aux failles de sécurité (notamment pour le type mime du fichier). Nous utiliserons pour tous nos exemples le nom de champ?fichier_source?dans notre formulaire XHTML. Vous devez donc remplacer dans PHP?fichier_source?par le nom de votre champ?file.$_FILES['fichier_source']['name']?: renvoit le nom du fichier stocké sur la machine du client qui envoit le fichier.$_FILES['fichier_source']['tmp_name']?: renvoit le nom du fichier stocké sur le serveur (le fichier a donc été re?u).$_FILES['fichier_source']['type']?: renvoit le type mime du fichier envoyé. Attention aux failles de sécurité.$_FILES['fichier_source']['size']?: renvoit la taille du fichier en octets.$_FILES['fichier_source']['error']?: renvoit éventuellement un code d'erreur pendant le transfert.Se préparer à la réception du fichier :Nous devons en cas de réception d'un fichier utiliser PHP pour le traiter. Affichons un exemple simple pour savoir si le formulaire a été envoyé :<?phpif(!empty($_FILES['fichier_source']['tmp_name'])){//Un fichier a été envoyé, nous pouvons le traiter}?>Savoir si le fichier a été uploadé correctement :Pour éviter les erreurs futures, il est utile de savoir si le fichier a été uploadé correctement. On utilise pour cela la fonctionis_uploaded_file().Exemple :<?phpif(is_uploaded_file($_FILES['fichier_source']['tmp_name'])){//C'est bon}?>Copier un fichier uploadé sur le serveur dans un répertoire de destination :On utilise pour déplacer le fichier uploadé du répertoire temporaire vers le répertoire de destination la fonction?move_uploaded_file().Exemple :<?phpif(is_uploaded_file($_FILES['fichier_source']['tmp_name'])){move_uploaded_file($_FILES['fichier_source']['tmp_name'],'repertoire/image.jpg');?//L'image est copiée sous le nom 'image.jpg' dans le répertoire 'repertoire'}?>Les bases acquises maintenant vont nous permettre de les mettre en pratique avec un exemple qui va consister à recevoir une image (par upload). Cette image doit être de type jpeg obligatoirement (toutes les extensions de fichiers sont acceptées), sa taille ne doit pas excéder 50 Ko. Nous l'enregistrerons sous le nom?image.jpeg.Nous allons tout d'abord reprendre le code XHTML du formulaire de départ :<form?action="upload.php"?method="post"?enctype="multipart/form-data"><p><input?type="file"?name="fichier_source"?/><input?type="submit" value="Envoyer"?/></p></form>Passons ensuite au code PHP de la page?upload.php?:<?phpif(!empty($_FILES['fichier_source']['tmp_name']) AND is_uploaded_file($_FILES['fichier_source']['tmp_name'])){//On va vérifier la taille du fichier en ne passant pas par $_FILES['fichier_source']['size'] pour éviter les failles de sécuritéif(filesize($_FILES['fichier_source']['tmp_name'])<51200){//On vérifie maintenant le type de l'image à l'aide de la fonction?getimagesize()list($largeur, $hauteur, $type, $attr)=getimagesize($_FILES['fichier_source']['tmp_name']);//Si le Type est JPEG (correspond au chiffre 2) on copie l'imageif($type===2){//Copie le fichier dans le répertoire de destinationif(move_uploaded_file($_FILES['fichier_source']['tmp_name'], 'repertoire/image.jpg')){//Le fichier a été uploadé correctementecho?'Ok, fichier envoyé correctement';}else{//Erreurecho?'Erreur lors de la copie du fichier';}}}}?>Cet exemple est sécurisé contre les attaques par changement de type de fichier, les extensions n'influen?ent en rien ce script et la modification des en-têtes HTTP non plus. Il faut par contre faire attention aux noms de fichiers locaux pouvant contenir des caractères spéciaux. Je vous conseille d'utiliser pour cela les?expressions régulières.Traiter les exceptions PDOPDO est une couche d'abstraction permettant d'accéder à de nombreuses?bases de données?depuis?PHP. Elle remplace les antédiluviennes fonctions mysql_(), pgsql_() etc. Utiliser PDO offre de meilleures performances et fonctionnalités. De plus, c'est la seule méthode valable qui sera intégrée nativement dans les futures versions de PHP.PDO génère des erreurs appelées exceptions. Une exception est un message que l'on peut lancer puis attraper, et en faire ensuite ce que l'on veut, comme dans tout langage de programmation qui se respecte.Ces exceptions sont bien souvent mal rédigées, et il est difficile de s'y retrouver, c'est pourquoi j'ai essayé de lister l'ensemble des erreurs que vous pourrez trouver avec PDO ici. Elles commencent toutes par?PDOException.Installer PDODans les versions supérieures ou égales à la 5.3 de PHP, PDO est intégré nativement. Vous n'aurez plus besoin de faire ces fastidieuses manipulations.Sous LinuxSous Linux, prenons le cas de Debian, vous devrez exécuter les commandes suivantes :?apt-get install pdo.~# apt-get install pdoOuvrez ensuite le fichier php.ini (situé généralement dans le répertoire?/etc/php5/apache2/php.ini) puis ajoutez la ligneextension=pdo.so. CTRL+X et ensuite appuyez sur la touche?Y?(ou O en fran?ais) pour sauvegarder.~# nano /etc/php5/apache2/php.iniPour installer ensuite les différents drivers PDO, vous pourrez utiliser la commande suivante (Exemple pour MySQL) :?apt-get install pdo_mysql.~# apt-get install pdo_mysqlRelancez ensuite Apache :?/etc/init.d/apache2 restart.~# /etc/init.d/apache2 restartSous WindowsAvec un utilitaire tel que?WAMP, PDO est déjà inclus dans les dernières versions de PHP. Vous n'avez plus qu'à activer le ou les drivers dont vous avez besoin (voir plus bas). Si vous ne disposez pas d'un tel utilitaire, vous devrez décommenter dans le php.ini la ligne;extension=php_pdo.dll.Could not find driverCette erreur se produit lorsque vous tentez de vous connecter à une base dont le type est encore inconnu par PDO. Cela signifie que le?drivernécessaire n'est pas installé, et que PDO ne peut donc pas contr?ler ce type de base.Pour résoudre ce problème, vous devez installer puis activer les extensions manquantes dans le fichier?php.ini?:L'extension?php_pdo_mysql?pour contr?ler les bases de données MySQLL'extension?php_pdo_pgsql?pour contr?ler les bases de données PostgreSQLL'extension?php_pdo_mssql?pour contr?ler les bases de données SQL ServerL'extension?php_pdo_sqlite?pour contr?ler les bases de données SQLiteCould not find driverSous Windows, repérez les différentes lignes?;extension=php_pdo_X.dll?et enlevez le point-virgule se trouvant devant pour les décommenter, et relancez votre serveur Apache.Sous Linux, repérez les différentes lignes?extension=pdo_X.so?et enlevez le point-SQLSTATE[HY000] [1045] Access denied for user ...Cette erreur survient lorsque le login ou/et le mot de passe utilisés pour vous connecter au serveur sont faux. Exemple de code utilisé pour se connecter à une base MySQL nommée?test, sur le serveur?localhost, avec PDO :<?php????$db?=?new?PDO('mysql:host=localhost;dbname=test',?'login',?'passe');?>Dans le cas où l'utilisateur?login?n'existe pas, ou alors si son mot de passe est différent de?passe, le code ci-dessus ne fonctionnera pas et renverra une Exception?PDOException.Access denied for user ...@...Pour corriger cette erreur, vous devez indiquer un h?te, un login et un mot de passe valides.SQLSTATE[HY000] [1049] Unknown database ...Cette erreur survient lorsque la base de données à laquelle vous tentez de vous connecter n'existe pas. Prenons l'exemple suivant où je tente de me connecter à une base MySQL avec PDO. Cette base?mabasequinexistepas?n'existe pas (comme son nom l'indique).<?php????$db?=?new?PDO('mysql:host=localhost;dbname=mabasequinexistepas',?'root',?'');?>L'erreur renvoyée sous forme d'exception par PDO sera la suivante :Unknown database 'mabasequinexistepas'Bufferisation de sortieLa bufferisation de sortie permet d'envoyer les données au navigateur à un moment précis. Elle permet également d'éviter l'erreur des?headers already sent?et est donc très utileLa fonction?ob_start()?:Cette fonction permet d'enclencher la mise en buffer de tout le code html qui sera généré par PHP. La fonction?ob_end_flush()?permet d'envoyer le contenu du buffer au navigateur.Exemple :<?phpob_start();//Votre code PHPob_end_flush();?>La fonction?ob_start()?peut également prendre une fonction comme paramètre, cette fonction sera appelée lorsque vous enverrez le buffer à l'aide de la fonction?ob_end_flush().Exemple :<?phpob_start('fonction_ici');function fonction_ici($output_buffer){return?$output_buffer.'Fin de la page';}//Votre code PHPob_end_flush();?>Ici, notre exemple rajoutera à la fin de la page la mention 'Fin de la page'. Cette possibilité peut être très utile pour rajouter des mentions en bas de page sans faire d'include spécifique et sans utiliser la fonction?ob_get_contents().La fonction?ob_end_flush()?:Cette fonction envoit les données contenues dans le buffer de sortie et détruit ensuite le contenu du buffer.La fonction?ob_flush()?:Cette fonction envoit les données contenues dans le buffer de sortie.La fonction?ob_clean()?:Cette fonction permet d'effacer le buffer de sortie.La fonction?ob_get_clean()?:Cette fonction lit le contenu du buffer de sortie puis l'efface.La fonction?ob_get_contents()?:Cette fonction retourne le contenu du buffer.Exemple :<?phpob_start();echo?'test';$buffer=ob_get_contents();?//La variable $buffer contiendra la valeur 'test'ob_end_flush();?>La fonction?ob_get_length()?:Cette fonction retourne la taille en octets du buffer de sortie.La fonction?ob_gzhandler()?:Cette fonction permet d'être placée à la place de la fonction?ob_start(). Elle permet si le serveur le supporte de compresser les pages web pour accélérer le temps de téléchargement pour le visiteur et gaspiller moins de trafic. Malheureusement cette option est souvent désactivée sur la plupart des hébergeurs. Vous pouvez toutefois utiliser cette option qui ne génèrera pas d'erreur, même si la compression n'est pas utilisable sur le serveur web.Failles PHP à éviterLa sécurisation de scripts PHP est une étape importante à prendre en compte lors de toute conception de site ou de script, simple ou complexe.PHP permet déjà si on le configure correctement d'éliminer pas mal de problèmes de sécurité (on parlera à ce sujet notamment desregister_globals). Nous traiterons ensuite quelques exemples pratiques couramment employés dans certains sites web et qu'il ne faut surtout pas faire. Enfin nous parlerons de quelques techniques de dissimulation (Url Rewriting, Force download), pour dissimuler des URL et des fichiers.Les register_globals :PHP est enfin configuré avec le paramètre?register_globals?à off par défaut. Vous pouvez désactiver les register_globals via le fichierphp.ini, recherchez la ligne?register_globals?et attribuez-lui la valeur?Off. Vous pouvez également passer par un fichier?.htaccess, vous devrez dans ce cas rajouter la ligne suivante :?php_flag register_globals off. Ceci désactivera les register_globals, qui sont une vraie plaie pour la sécurité d'un script.Nous allons maintenant présenter quelques exemples à ne pas faire et comment corriger les failles potentielles :La faille include :Prenons un exemple simple de cette faille : La plupart des sites ayant cette faille utilisent des url du style?index.php?page=xxxxx?ou xxxxx est une page qui sera inclue comme ceci :<?phpif(isset($_GET['page'])){include?$_GET['page'].'.php';}else{include?'accueil.php';}?>Maintenant il suffit que le pirate place une page intitulée par exemple?page?sur son serveur. Il se rend ensuite sur le site concerné par la faille, et rentre l'url suivante :?index.php?page=. La page n'est pas exécutée par PHP sur le site distant, elle sera donc exécutée sur le site possédant la faille. Vous pouvez donc vous imaginer des conséquences que cela peut engendrer... Pour contrer cette faille nous devons simplement utiliser la fonction?file_exists()?(attention en PHP5 ceci n'est plus forcément valable, assurez-vous d'avoir la directive?allow_url_fopen?à?OFF?dans votre fichier?php.ini. Voici le code corrigé :<?phpif(isset($_GET['page']) AND file_exists($_GET['page'].'.php')){include?$_GET['page'].'.php';}else{include?'accueil.php';}?>Attention maintenant à la faille dans votre site, c'est à dire qu'un visiteur inclue une page de votre site pour laquelle il n'a pas les droits d'accès en remontant d'un répertoire par exemple... Vous pouvez utiliser pour contrer cela les?Expressions régulières?en enlevant les caractères spéciaux : le slash, le point et l'antislash... qui pourraient prendre place dans l'url.La faille du code HTML et des formulaires :Il est courant maintenant de demander aux internautes tout ce qui vous passe par la tête, et d'afficher ensuite ces informations. Un internaute mal intentionné pourrait alors y mettre du code HTML pour défacer votre site (rien à craindre pour les donnés, juste pour la présentation).Voici un exemple de formulaire courant :<form action="page.php"?method="post"><p><textarea name="message"></textarea><input?type="submit"?value="Envoyer"?/></p></form>Voici maintenant un exemple de code PHP qui récupère la valeur du message tapé et l'affiche sur la page Web :<?phpif(isset($_POST['message'])){echo?$_POST['message'];?//On aurait très bien pu stocker le message, cela serait revenu au même}?>Maintenant imaginions que l'internaute rentre du code html quelconque, il fait ce qu'il veut avec la présentation de votre site, et peut même utiliser du javascript pour rediriger l'internaute n'importe où. Nous allons utiliser la fonction?htmlentities()?pour corriger la faille :<?phpif(isset($_POST['message'])){echo?htmlentities($_POST['message']);?//Les caractères HTML sont désormais affichés et non interprétés}?>Les failles de type?SQL injection?:Les failles de type SQL injection consistent à exécuter des requêtes arbitraires sur une base de données. En général ces failles sont utilisées gr?ce à un formulaire. Imaginions que nous ayons une table?membres?et que notre requête pour savoir si un membre est bien identifié est la suivante :mysql_query("SELECT login,passe FROM membres WHERE login='".$_POST['login']."' AND passe='".$_POST['passe']."'");login et passe sont deux champs d'un formulaire. Imaginions maintenant que nous rentriions cette valeur dans le champ login :?' OR 1=1"); #. La requête exécutée par PHP devient la suivante :mysql_query("SELECT login,passe FROM membres WHERE login='' OR 1=1");Comme la condition?OR 1=1?est toujours vraie, la requête est exécutée et le membre peut se connecter sans aucun pseudo.Pour remédier à cette faille, nous allons échapper les caractères spéciaux en utilisant la fonction mysql_real_escape_string (cela est aussi valable pour une insertion dans une base de données) :Les magic_quotes si elles sont activées vont automatiquement échapper les caractères, voilà pourquoi on doit toujours regarder si cette fonction est active avant d'échapper quoi que ce soit. Voici le code corrigé :<?php?/**?*?Si?des?slashes?ont?été?ajoutés?via?les?magic?quotes,?on?les?enlève?*/?if(get_magic_quotes_gpc()===1)?{??????$_POST['login']?=?stripslashes($_POST['login']);??????$_POST['passe']?=?stripslashes($_POST['passe']);?}?/**?*?On?protège?les?cha?nes?*/??????$_POST['login']?=?mysql_real_escape_string($_POST['login']);??????$_POST['passe']?=?mysql_real_escape_string($_POST['passe']);?/**?*?On?effectue?la?requête?*/??????mysql_query("SELECT?login,passe?FROM?membres?WHERE?login='".$_POST['login']."'?AND?passe='".$_POST['passe']."'");??>Les failles utilisant l'upload?:Ce genre de faille est de plus en plus courant. Pour y remédier, vous pouvez consulter cet article :?Upload sécurisé en PHP.EXERCICES Complémentaires?:Créer un logiciel Zodiac.Création d’un formulaire?: signe_zodiac.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="fr"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>signe_du_zodiac</title></head><body><h2>Zodiac</h2>Entrez votre année de naissance?<form method="post" action="07_zodiac.php"><input type="text" name="result" size="4" value="" maxlength="4"><input type="submit" name="envoyer" value="envoyer"></form></body></html>Créer l’action?: 07_zodiac.php<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Zodiac</title></head><body><?phpif (isset($_POST['result'])){$result=$_POST['result'];} else $result="";if (empty($_POST['result'])){echo "Attention vous devez encodez une année";exit();}elseswitch(($result-4)%12){case 0: $zodiac="Rat";break;case 1: $zodiac="Boeuf";break;case 2: $zodiac="Tigre";break;case 3: $zodiac="Lapin";break;case 4: $zodiac="Dragon";break;case 5: $zodiac="Serpent";break;case 6: $zodiac="Cheval";break;case 7: $zodiac="Chèvre";break;case 8: $zodiac="Singe";break;case 9: $zodiac="Poulet";break;case 10: $zodiac="Chien";break;case 11: $zodiac="Cochon";break;}echo "{$result} est l'année du {$zodiac}.<br/>"?><a href="signe_zodiac.html"> Entrez une nouvelle année?</a></body></html>Comment récupérer un login/password??Création d’un formulaire?: form.php<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Form</title></head><body><form action="form_processing.php" method="post"> Username: <input type="text" name="username" value="" /><br /> Password: <input type="password" name="password" value="" /><br /><br /> <input type="submit" name="submit" value="Submit" /></form></body></html>Récupération des données – 2 méthodes?: form_processing.php<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Form Processing</title></head><body><pre><?phpprint_r($_POST);?></pre><br /><?php// détection de l'envoi du formulaireif (isset($_POST['submit'])) {echo "Le formulaire a bien été envoyé<br />";// set default valuesif (isset($_POST["username"])) {$username = $_POST["username"];} else {$username = "";}if (isset($_POST["password"])) {$password = $_POST["password"];} else {$password = "";}// set default values using ternary operator// boolean_test ? value_if_true : value_if_false//$username = isset($_POST['username']) ? $_POST['username'] : "";//$password = isset($_POST['password']) ? $_POST['password'] : "";} else {$username = "";$password = "";}?><?phpecho "Username:{$username}<br/>";echo "Password:{$password}<br/>";?></body></html>Comment tester et récupérer un email??Le formulaire d’envoi?: form_verifEmail.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>VerifEmail</title></head><body><form id="form1" name="form1" method="post" action="verifEmail.php"><p><label> Votre Email:<input type="text" name="email" id="email"/></label></p><p><label> Envoyer<input type="submit" name="valid" id="valid" value="Envoyer"/></label></p></form></body></html>La vérification?: verifEmail.php<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>verifEmail</title></head><body><?php$email = $_POST['email'];$point = strpos($email, ".");$arob = strpos ($email, "@");if ($point==''){echo "Votre email doit comporter un point";}elseif ($arob==''){echo "Votre email doit comporter un '@'";}else{echo "Votre email est: '<a href=\"mailto:"."$email"."\">$email";}?></body></html>Connexion avec includeFichier principal?: connexion_avec_include.php<?php include "includes/entete.html";//include de l'entête html?><?php //Connexion et vérification avec un includeinclude "includes/include_link.php";//Nom de la table avec un includeinclude "includes/include_nom_table.php";//Exécution de la requète$resultat=mysqli_query($link, 'SELECT NomSociete, ContactNom FROM client');if ($resultat==FALSE){echo "Echecs de l'exécution de la requête.<br/>";}else {//fetch sur chaque ligne de la requètewhile ($ligne=mysqli_fetch_assoc($resultat)) {//Affichage du Nom de la société et Nom du contactecho "Nom de la société: ".$ligne['NomSociete']." et Nom du contact: ".$ligne['ContactNom']."<br/>";}}//Déconnexion avec un includeinclude "includes/include_link_off.php";//Pied de page HTML?> <?php include "includes/pied.html";//include du pied de page html?>Les includes(1)?: entete.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>titre</title></head><body>Les includes(2)?:pied.html</body></html>Les includes(3)?:include_link.php<?php //Connexion $link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif(mysqli_connect_errno()){printf('Echec de la connexion:%s\n', mysqli_connect_error());exit();}else {echo"Connexion réussie à la base de donnée"."<br/>";}?>Les includes(4)?:include_link_off.php<?php //déconnexion de la base de donnéesif (mysqli_close($link)) {echo "<br>";echo "<br>";echo 'Déconnexion réussie de la base de données.<br/>';}else {echo 'Echecs de la deconnexion.';}?>Les includes(5)?:include_nom_table.php<?php //Connexion if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante{$row = $result->fetch_row();echo "<br>";printf("La base de données courante est %s.\n", $row[0]);echo "<br>";echo "<br>";$result->close();}?>Connexion Mysqli<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>connexion</title></head><body><?php //Connexion $link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif ($link){echo 'Connexion réussie.<br />';//Informations sur le serveurecho 'Information sur l\'host: '.mysqli_get_host_info($link);echo "<br/>";echo 'Information sur le serveur: '.mysqli_get_server_info($link);echo "<br/>";echo 'Information sur la version du serveur: '.mysqli_get_server_version($link);echo "<br/>";echo 'Information sur le client: '.mysqli_get_client_info($link);echo "<br/>";echo 'Information sur la version du client: '.mysqli_get_client_version($link);echo "<br/>";echo 'Information sur le proto: '.mysqli_get_proto_info($link);echo "<br/>";//Exécution de la requète$resultat=mysqli_query($link, 'SELECT NomSociete, ContactNom FROM client');if ($resultat==FALSE){echo "Echecs de l'exécution de la requête.<br/>";}else {//affichage du nbr de lignesecho 'Nombre de personnes: '.mysqli_num_rows($resultat).'<br/>';}if (mysqli_close($link)) {echo 'Déconnexion réussie.<br/>';}else {echo 'Echecs de la deconnexion.';}}else {printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());}?> </body></html>Requête Mysqli_fetch_assoc?:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>connexion</title></head><body><?php //Connexion $link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif ($link){echo 'Connexion réussie.<br />';//Informations sur le serveurecho 'Information sur l\'host: '.mysqli_get_host_info($link);echo "<br/>";echo 'Information sur le serveur: '.mysqli_get_server_info($link);echo "<br/>";echo 'Information sur la version du serveur: '.mysqli_get_server_version($link);echo "<br/>";echo 'Information sur le client: '.mysqli_get_client_info($link);echo "<br/>";echo 'Information sur la version du client: '.mysqli_get_client_version($link);echo "<br/>";echo 'Information sur le proto: '.mysqli_get_proto_info($link);echo "<br/>";//Exécution de la requète$resultat=mysqli_query($link, 'SELECT NomSociete, ContactNom FROM client');if ($resultat==FALSE){echo "Echecs de l'exécution de la requête.<br/>";}else {//fetch sur chaque ligne de la requètewhile ($ligne=mysqli_fetch_assoc($resultat)) {//Affichage du Nom de la société et Nom du contactecho "Nom de la société: ".$ligne['NomSociete']." et Nom du contact: ".$ligne['ContactNom']."<br/>";}}if (mysqli_close($link)) {echo 'Déconnexion réussie.<br/>';}else {echo 'Echecs de la deconnexion.';}}else {printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());}?> </body></html>Requête préparée lire des données?:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Requête préparée - lire des données</title></head><body><?php //Connexion à la base de donnée $base = mysqli_connect('127.0.0.1', 'root', '', 'db_cra');//vérification de la connexionif ($base){echo 'Connexion réussie.<br />';echo 'Information sur le serveur:'.mysqli_get_host_info($base).'<br/>';//Lire les données$sql = "SELECT ClientId, DateCommande from commande WHERE CommandeId > ?";// Préparation de la requête$resultat=mysqli_prepare($base,$sql);// Liaison des paramètres$ok = mysqli_stmt_bind_param($resultat, 'i', $CommandeId);//Initialisation de la variable $CommandeId$CommandeId = 10500;$ok= mysqli_stmt_execute($resultat);if ($ok==FALSE){echo "Echecs de l'exécution de la requête.<br/>";}else {// Association des variables résultats$ok = mysqli_stmt_bind_result($resultat,$ClientId,$DateCommande);// lecture des valeursecho "Client Id et Date Commande > 10500<br/>";while (mysqli_stmt_fetch($resultat)) {echo $ClientId.", ".$DateCommande."<Br/>";}mysqli_stmt_close($resultat);}if (mysqli_close($base)) {echo 'Déconnexion réussie.<br/>';}else {echo 'Echecs de la deconnexion.';}}else {printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());}?> </body></html>Requête préparée écrire des données?:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Requête préparée - ecrire des données</title></head><body><?php //Connexion à la base de donnée $base = mysqli_connect('127.0.0.1', 'root', '', 'db_cra');//vérification de la connexionif ($base){echo 'Connexion réussie.<br />';echo 'Information sur le serveur:'.mysqli_get_host_info($base).'<br/>';//Ecrire des données$sql = "INSERT INTO client (NomSociete, ContactNom, ClientId) VALUES (?,?,?)";// Préparation de la requête$resultat = mysqli_prepare($base,$sql);// Liaison des paramètres$ok = mysqli_stmt_bind_param($resultat, 'sss', $NomSociete, $ContactNom, $ClientId);//Initialisation des variables$NomSociete = "Microsoft";$ContactNom= "Bill Gates";$ClientId="BEBE";$ok= mysqli_stmt_execute($resultat);if ($ok==FALSE){echo "Echecs de l'exécution de la requête.<br/>";echo "Erreur:".mysqli_stmt_errno($resultat).' - ' .mysqli_stmt_error($resultat)."<br/>";}else {echo "Personne ajoutée.<br/>";}mysqli_stmt_close($resultat);if (mysqli_close($base)) {echo 'Déconnexion réussie.<br/>';}else {echo 'Echecs de la deconnexion.';}}else {printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());}?> </body></html>Requête dans un tableau en msql?:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Requete dans un tableau en mysql</title></head><body><?php//Ancienne méthode de connexion en mysql mysql_connect('localhost', 'root', '');mysql_select_db('db_cra');mysql_set_charset('utf8');//initialisation du fichier .eniini_set('mysql.trace_mode', true);$sql = 'SELECT * FROM client'; $result = mysql_query($sql); if($result!==FALSE){if(mysql_num_rows($result) > 0){echo '<table border="1">'; $row = mysql_fetch_assoc($result); echo '<tr><th>', implode('</th><th>', array_keys($row)), '</th></tr>'; do{echo '<tr><td>', implode('</td><td>', $row), '</td></tr>';}while($row = mysql_fetch_row($result)); echo '</table>';} mysql_free_result($result); }?></body></html>Requête dans un tableau en msqli?:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Requete dans un tableau</title></head><body><?php//Ancienne méthode de connexion en mysql //mysql_connect('localhost', 'root', '');//mysql_select_db('db_cra');//mysql_set_charset('utf8');//Connexion en mysqli $link = mysqli_connect('localhost', 'root', '', 'db_cra');//vérification de la connexionif ($link){echo 'connexion réussie.<br />';echo 'information sur le serveur:'.mysqli_get_host_info($link);}else {printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());}//initialisation du fichier .eniini_set('mysql.trace_mode', true);$sql = 'SELECT * FROM client'; $result = mysqli_query($link,$sql); if($result!==FALSE){if(mysqli_num_rows($result) > 0){echo '<table border="1">'; $row = mysqli_fetch_assoc($result); echo '<tr><th>', implode('</th><th>', array_keys($row)), '</th></tr>'; do{echo '<tr><td>', implode('</td><td>', $row), '</td></tr>';}while($row = mysqli_fetch_row($result)); echo '</table>';} mysqli_free_result($result); }if (mysqli_close($link)) {echo 'Déconnexion réussie.<br/>';}else {echo 'Echecs de la deconnexion.';}?></body></html>Ajouter des données à une base de données à travers un formulaire?:Le formulaire?:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"""><html xmlns=" xml:lang="fr" lang="fr"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Formulaire_ajout</title></head><body><h2>Formulaire d'ajout de contenu à la base info</h2><form method="POST" action="addok.php">Nom: <input type="text" name="nom" size="20" value="" maxlength="35"><br>Prénom: <input type="text" name="prenom" size="20" value="" maxlength="35"><br>Email: <input type="text" name="email" size="20" value="" maxlength="70"><br>ICQ: <input type="text" name="icq" size="20" value="" maxlength="11"><br>Titre URL: <input type="text" name="titre" size="20" value="" maxlength="70"><br>URL: <input type="text" name="url" size="20" value="" maxlength="255"><br><input type="submit" value="Envoyer" name="envoyer">L’action en php?:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>add.php </title></head><body><?php //Titreecho "<h2> Les données saisies sont </h2>";// On commence par récupérer les champs if(isset($_POST['nom'])){$nom=$_POST['nom'];echo "<br/>";echo htmlentities ($nom);} else {$nom="";} if(isset($_POST['prenom'])){$prenom=$_POST['prenom'];echo "<br/>";echo htmlentities ($prenom);} else {$prenom="";} if(isset($_POST['email'])){$email=$_POST['email'];echo "<br/>";echo htmlentities ($email);} else {$email="";} if(isset($_POST['icq'])){$icq=$_POST['icq'];echo "<br/>";echo htmlentities ($icq);} else {$icq="";}if(isset($_POST['titre'])){$titre=$_POST['titre'];echo "<br/>";echo htmlentities ($titre);} else {$titre="";}if(isset($_POST['url'])){$url=$_POST['url'];echo "<br/>";echo htmlentities ($url);echo "<br/>";} else {$url="";}//On vérifie si les champs sont vides if(empty($nom) OR empty($prenom) OR empty($email) OR empty($titre) OR empty($url)) { echo '<font color="red">Attention, seul le champs <b>ICQ</b> peut rester vide !</font>'; echo "<br/>";exit();} // Aucun champ n'est vide, on peut enregistrer dans la table else { $link = mysqli_connect('localhost', 'root', '', 'info'); // connexion à la base /* Vérification de la connexion */if (mysqli_connect_errno()) {printf("Echec de la connexion : %s\n", mysqli_connect_error());echo "<br/>";exit();}if ($result = $link->query("SELECT DATABASE()")) //Retourne le nom de la base de données courante{$row = $result->fetch_row();printf("La base de donnees courante est %s.\n", $row[0]);echo "<br>";$result->close();}//On insére les informations du formulaire dans la table$sql="INSERT INTO infos_tbl(id, nom, prenom, email, icq, titre, url)VALUES('','$nom','$prenom','$email','$icq','$titre','$url')";$result = mysqli_query ($link,$sql);if ($result==FALSE){echo "Echecs de l'exécution de la requête insert.<br/>";}else {echo "La personne a bien été enregistrée dans la base de données info.<br/>";}// exécution de la requete$sql="SELECT nom, prenom, email, titre, icq, url FROM infos_tbl order by 2,1";$result = mysqli_query ($link,$sql);if ($result==FALSE){echo "Echecs de l'exécution de la requête select.<br/>";}else// lecture des ligneswhile ($row=mysqli_fetch_row($result)){//En indiquant la place du champ dans le tableau//echo "Nom: ".$row[0].//" et Prénom: ".$row[1]."<br/>";//avec une boucle FORprint ("<pre>");for ($i=0; $i<mysqli_num_fields($result);$i++){print ("$row[$i] ");}}print ("</pre>");}// déconnectionmysqli_close($link);?><a href="form.html">retourner au formulaire d'encodage</a></body></html>La sécurité?:XdebugLe Xdebug affine le rapport des erreurs. Il apporte une couche d’information sur ce qui se passe.Télécharger –> Pour vérifier vos informations?: info.php<??phpphpinfo()?;?>Placer le fichier .dll dans le dossier Php_runningversionModifier le fichier php.ini et mettre le Xdebug sur 1 ou ment afficher les erreurs??Modifier le fichier php.ini et mettre Display_errors=ONDans le code nous pouvons aussi modifier temporairement le .iniAttention lors d’une modification du php.ini vous devez impérativement redémarer le server.Error_reporting(E_ALL)?;INI_SET(‘display_errors’,true)?;Attention en production ne pas afficher les erreurs?!Le JAVA SCRIPTAfficher un pop up dans une page à travers un formulaire GETLe formulaire en HTML -> form.html<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><title>Form avec Get</title></head><body><form action="info_sans_securite.php" method="GET"><p><input type="text" name="name" value=""/><br /><p><input type="submit" name="submit" value="Envoyer"/><br /></form></body></html>Le code en php -> info_sans_securite.php (non sécurisé)<?php//script 1 ?name=alain//<script> alert ('bonjour') </script>//Génération d'un pop up// script 2 ?name=alain//<script>var link = document.getElementsByTagName('a')[0];link.href="";</script>//Le lien http de menu qui renvoit vers est renvoyé vers $name = $_GET['name'];echo '<a href="">menu</a><br />';echo 'hello ' . $name . '<br />'; ?>A travers le formulaire, nous envoyons des informations dans l’URL du code PHP en JAVA SCRIPT par injection ment se prémunir?? Mise à jour de son navigateur. La plupart des navigateurs modernes stopent l’injection XSS.Il faut donc en consol désactiver la protection xssFermer le navigateur ChromeOuvrir la console Windows (ou créer un fichier .bat -> batcher.fr) avec la commande ci-dessous.start chrome.exe --args --disable-web-security --disable-xss-auditorVoici les principales commande DOS?:CommandeFonctionCDPermet de se déplacer d'un répertoire à un autre.?(Exemple: c> cd dossier )CD \Permet d'acceder à la racine d'un lecteur.?(Exemple: c> cd \ )DIRListe le contenu du répertoire courant.?(Exemple: c> dir )MKDIRCréation d'un dossier.?(Exemple: c>mkdir dossier )RMDIREffacer un dossier.?(Exemple: c>rmdir dossier)COPYCopie des fichiers.?(Exemple: c> copy toto.txt c:\toto.txt )XCOPYCopie des fichiers et des répertoires.?(Exemple: c> xcopy toto.txt c:\toto.txt )DELEffacer un fichier?(Exemple: c>del c:\temp.txt )RENRenommer des fichier?(Exemple: ren toto.txt tata.txt)MOVEDéplace un fichier.?(Exemple: c> move c:\temp.txt d:\)EDITLance un éditeur de texte sous MS-DOS.(Exemple: c> edit toto.txt )MOREVisualiser le contenu d'un fichier texte?(Exemple: c> more toto.txt )FORMATPermet d'effacer le contenu d'un lecteur.?(Exemple: c> format a: )CLSEfface l'écran actuel.?(Exemple: c> cls )FINDRecherche dans un fichier la ligne contenant une valeur.(Exemple:CMDOuvre la fenêtre de commande DOS.?(Exemple: c> cmd?)ECHOAffiche un message.?(Exemple: c> echo salut )ECHO.Permet de sauter une ligne.?(Exemple: c>echo.?)SORTPermet de trier une liste en fonction d'un critère.?(Exemple: c> dir | sort reverse?)PRINTImprime le fichier spécifié.?(Exemple: c>print toto.txt )EXITFerme la fenêtre MSDOS.?(Exemple: c> exit)TYPEAffiche un fichier texte.?(Exemple: c> type list.txt?) même fonction que?moreFCComparaison de fichiers.ATTRIBModifie les attributs d'un fichier.?(Exemple: c> attrib c:\test +a)CACLSModifie les droits utilisateurs sur un fichier.CHDIRAffiche l'arboréscence actuelle.?(Exemple: c:\temp> chdir)?Commandes réseauxCommandeFonctionPINGEffectue un test de connectivité sur une machine distante à utiliser avec une adresse IP.?(exemple: c> ping google.fr)IPCONFIGPermet de voir votre configuration réseau, adresse IP, DNS, serveur DHCP...?(exemple: c> ipconfig ,ipconfig /all)NETSTATAffiche leurs connexions active sur votre machine, port et protocole.?(exemple: c> NETSTAT)NET USEConnecte un lecteur réseau.?(exemple: c>net use z: \\nompc\nompartage)TRACERTAffiche les adresses de toutes les passerelles pour accédez à une destination?(exemple: c> tracert google.fr)ARPPermet de voir et de modifier la table ARP, correspondance MAC <-> IP des machines connectées sur le réseau.TELNETTelnet sur une autre machine?(exemple: c> telnet 192.168.0.1)NET SENDEnvoi un message sur une machine sur le réseau.(exemple: c> net send %computername% coucou)NSLOOKUPPermet de faire une résolution DNS, l'exemple donne les IP de google?(exemple: c> nslookup google.fr )FTPLance un module FTP permettant de faire des transfert de fichiers.?(exemple: c> ftp )REXECExécute des commandes sur des h?tes distants exécutant le service REXEC. Rexec authentifie l'utilisateur sur l'h?te distant avant d'exécuter la commande spécifiée.TFTPtransfère les fichiers depuis et vers un ordinateur distant exécutant le service TFTP.RUNASPermet d'éxécuter une commande avec un compte utilisateur diffé TIMEPermet de pouvoir synchroniser l'horloge avec un serveur.MODEPermet d'afficher des informations concerant les ports COMNETSHPermet de configurer des interfaces réseaux.ROUTEPermet de gérer la table de routage de la machine locale(exemple: c> route print?)NBTSTATAffiche les statistiques du protocole TCP/IP actuellesCommandes utilitaires WindowsCommandeFonctionDEFRAGPermet de défragmenter un lecteur?(exemple: c> defrag c:)CHKDSKPermet de lancer un scandisk sur un disque durNET STARTDémarre un service windows?(exemple: c> net start sharedaccess)CLEANMGRPermet de faire un netoyage des disques durs.CONVERTConvertit des volumes FAT en volumes NTFSSCHTASKSPermet sous Windows XP à un administrateur de créer, supprimer, effectuer des requêtes, modifier, exécuter et mettre fin à des t?ches planifiées sur un système local ou distant.TASKKILLPermet sous Windows XP de mettre fin à une ou plusieurs t?ches ou processus. Voir TASKLISTTASKLISTAffiche la liste des applications et t?ches ou processus associés actuellement activés sur un système à distance sous Windows XPSHUTDOWNArrête ou redémarre un ordinateur local ou distant.BOOTCFGConfigure, interroge ou modifie les paramètres du fichier boot.ini.DISKPARTGère des disques, des partitions ou des volumes.SYSTEMINFOPermet d'obtenire une foule d'information sur votre équipement.TYPEPERFAffiche les données du compteur de performances dans la fenêtre de commande ou dans un format de fichier journal pris en charge.DRIVERQUERYRecherche une liste de pilotes et de propriétés de pilotes.MEMAffiche des informations concernant les zones de mémoire allouées, les zones de mémoire libre et les programmes actuellement chargés en mémoire dans le sous-système MS-DOS.LABELLes symboles ^ et & peuvent être utilisés dans les noms de volume.ATplanifie l'exécution de commandes?Commandes DiverseCommandeFonctionCALLAppelle un fichier batch à partir d'un autre fichier batch.(exemple: c> ping google.fr)COLORPermet de modifier les couleurs de la fenêtre MS-DOS(exemple:color 0a affiche le texte en vert et le fond en noir)HOSTNAMEAffiche le nom de l'ordinatateur?(exemple: c> hostname)REGPermet de faire des interventions dans la base de registre.TITLEPermet de renommer la fenêtre MS-DOS?(exemple: c> title batcher!)TREEReprésente graphiquement une arborescence de répertoires(exemple: c>tree)BREAKActive ou désactive le contr?le étendu de CTRL+C.PROMPTModifie l'invite de commande(exemple: c> prompt batcher! )>Redirection remplacement?(exemple: echo batcher! > temp.txt)>>Redirection ajout?(exemple: c> echo batcher! >> temp.txt)COMPACTCompresse et décompresse un fichier?(exemple: c> compact temp.txt /C )?Commandes dédiées aux scriptsCommandeFonctionPAUSEPermet de stopper le traitement en cours en demandant à l'utilisateur de taper une touche pour continuer.IFInstore une structure conditionnelleFORpermet de créer des bouclesSETdéfintion d'une variable %variable% pour la rapeléeGOTOPermet d'aller à une étiquette définit dans le script via ":".SET VARNAME=Crée?une variable.SETLOCALCrée?une variable locale.TIMEOUTPermet de créer une?temporisation?avec un réglage en secondes. (!!! Valable uniquement sous Vista !!!)Le code php avec la sécurité?: info.php<?php$name = htmlentities($_GET['name']);if (preg_match('/script/', $name)) { header('HTTP/1.1 418 Forbidden'); echo 'Are you a teapot?'; die;}echo '<a href="">menu</a><br />';echo 'hello ' . $name . '<br />';?>Le token -> méthode sha1L’importance de la méthode?: la méthode GET -> les paramètres sont passés dans l’URL<?php?><form> <input type="text" name="param"> <input type="submit"></form>La méthode POST<?php?><form method="post"> <input type="text" name="param"> <input type="submit"></form>Création d’un jeton de sécurité avec la méthode sha1<?phpsession_start();//création d'un jeton de sécurité avec la méthode sha1$token = sha1(session_id() . 'ùknsùoih');echo $token."<br/>";//contr?le des données$postedToken = isset($_POST['token']) ? $_POST['token'] : null;if ($postedToken) { if ($postedToken == $token) { echo 'ok'; } else { echo 'not ok'; }}//régénère l'id donc le token n'est plus == à $postedToken//session_regenerate_id();?><form method="post"> <input type="text" name="param"> <!-- nous passons la valeur du token dans un hidden- pas visible de l'utilisateur --> <input type="hidden" name="token" value="<?php echo $token ?>"> <input type="submit"></form>La sécurisation avec un captcha?: ();include_once 'securimage/securimage.php';$securimage = new Securimage();$token = sha1(session_id() . 'ùknsùoih');$postedToken = isset($_POST['token']) ? $_POST['token'] : null;$captcha = isset($_POST['captcha']) ? $_POST['captcha'] : null;if ($postedToken) { if ($postedToken === $token) { if ($securimage->check($captcha)) { echo 'ok'; } else { echo 'captcha not valid!'; } } else { echo 'not ok'; }}?><form method="post"> <label>your name</label> <input type="text" name="param"> <br /> <img src="securimage/securimage_show.php" /> <br /> <label>captcha</label> <input type="text" name="captcha"> <br /> <input type="hidden" name="token" value="<?php echo $token ?>"> <input type="submit"></form>Les cookies et les sessionsExemple?: se faire voler une session Comment utiliser la session d’un autre utilisateur?? <?php//session_non_securesession_start(); //une session utilisateur est un espace temporaire pour stoker des //informations. Par exemple voir si l’utilisateur est identifié ou non$password=isset($_GET['password']) ? $_GET['password']:null;if('gogogo'===$password){$_SESSION['identified']=true;}//indique la valeur de la sessionvar_dump(session_id());var_dump($_SESSION);//régénère le session id//session_regenerate_id();//indique la valeur du cookievar_dump($_COOKIE);//var_dump(session_get_cookie_params());//document.cookie - en mode consol permet d'afficher la valeur du cookie//ouvrir une nouvelle page chrome//surcharger document.cookie="n°de session de l'autre navigateur"//metre fin à une session//session_destroy();?>Comment se protéger??<?php// session securesession_start();var_dump(session_id());$password=isset($_GET['password']) ? $_GET['password']:null;if('gogogo'===$password){session_regenerate_id();var_dump(session_id());$_SESSION['identified']=true;$_SESSION['IP']=$_SERVER['REMOTE_ADDR'];}//indique la valeur de la session: true égal connectévar_dump($_SESSION);//indique la valeur du cookievar_dump($_COOKIE);?>Exemple?: vote en utilisant les cookies.Formulaire d’encodage?:<?phpsession_start();var_dump($_COOKIE);?><a href="vote_cookies.php?name=robin">Voter pour Robin</a><a href="vote_cookies.php?name=julien">Voter pour Julien</a><a href="vote_cookies.php?name=jeff">Voter pour Jeff</a><!--<img src="vote_cookies.php?name=julien"/>-->Le code PHP?: vote_cookies.php<?phpsession_start();if (!isset($_COOKIE['vote'])) { setcookie('vote', 0); setcookie('jeff', 0); setcookie('julien', 0); setcookie('robin', 0);}if (isset($_GET['name'])) { $name = $_GET['name']; setcookie('vote', ++$_COOKIE['vote']); setcookie($name, ++$_COOKIE[$name]);}header('Location: form_cookies.php');Exemple de code avec des cookies?:<?php// Définit les cookiessetcookie("cookie[three]", "cookiethree");setcookie("cookie[two]", "cookietwo");setcookie("cookie[one]", "cookieone");// Après le rechargemet de la page, nous les affichonsif (isset($_COOKIE['cookie'])) { foreach ($_COOKIE['cookie'] as $name => $value) { $name = htmlspecialchars($name); $value = htmlspecialchars($value); echo "$name : $value <br />\n"; }}$value = 3600;setcookie("TestCookie", $value, time()+3600); /* expire dans 1 heure *///afficher une cookieecho $_COOKIE["TestCookie"];// afficher tous les cookiesecho "<br/>";print_r($_COOKIE);var_dump($_COOKIE);?>Login/passwordPréparer une nouvelle base de données en Workbench ou phpmyadmin?:Nom?: info2Table?: adminNom des champs?: id -> clé primaire, auto-incrementuser-> varchar(50), uniquepassword-> varchar(50), uniqueLes données?:User?: jerome, lia, jeffPassword?: 123, 1234, 12345Login/password avec faille de sécurité.Comment se prémunir des failles de sécurité??<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>login_unsecure</title></head><body><?php//Connexion $link = mysqli_connect('localhost', 'root', '', 'info2');//vérification de la connexionif ($link){echo 'connexion réussie à la base de données.<br />';echo 'information sur le serveur:'.mysqli_get_host_info($link);echo "<br/>";echo 'Information sur le serveur: '.mysqli_get_server_info($link);echo "<br/>";echo 'Information sur la version du serveur: '.mysqli_get_server_version($link);echo "<br/>";echo 'Information sur le client: '.mysqli_get_client_info($link);echo "<br/>";echo 'Information sur la version du client: '.mysqli_get_client_version($link);echo "<br/>";}else {printf('erreur %d: %s.<br/>', mysqli_connect_errno(), mysqli_connect_error());}//$username = isset($_POST['username']) ? $_POST['username'] : null;//$password = isset($_POST['password']) ? $_POST['password'] : null;//echapper en utilisant mysqli_real_escape_string$username = isset($_POST['username']) ? mysqli_real_escape_string($link,$_POST['username']) : null;$password = isset($_POST['password']) ? mysqli_real_escape_string($link,$_POST['password']) : null;$sql = mysqli_query($link, "SELECT * FROM admin WHERE user = '$username' and password = '$password'");// le hack//dans la requête remplacer le $username et $password par 'OR'1'='1if ($result = mysqli_fetch_assoc($sql)) { var_dump($result);echo 'Vous êtes identifié';} else { echo 'Vous n\'êtes pas identifié';}?><h1>Identification</h1><form method="post"> <label>Username :</label> <input type="text" name="username"> <label>Password :</label> <input type="password" name="password"> <input type="submit"></form></body></html>Login/password avec l’objet pdo<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>login_pdo</title></head><body><?php$pdo = new PDO('mysql:host=localhost;dbname=info2', 'root', null);$stmt = $pdo->prepare('SELECT * FROM admin WHERE user = :user and password = :password');$stmt->bindParam(':user', $username);$stmt->bindParam(':password', $password);$username = $_POST['username'];$password = $_POST['password'];$stmt->execute();if ($result = $stmt->fetchObject()) { var_dump($result);echo 'Vous êtes identifié';} else { echo 'Vous n\'êtes pas identifié';}?><h1>Identification</h1><form method="post"> <label>Username :</label> <input type="text" name="username"> <label>Password :</label> <input type="password" name="password"> <input type="submit"></form></body></html>Comment générer des password fort password definitionA strong password:…has at least 15 characters…has uppercase letters…has lowercase letters…has numbers…is not like your previous passwords…is not your name…is not your login…is not your friend’s name…is not your family member’s name…is not a dictionary word…is not a common name…is not a keyboard pattern, such as qwerty, asdfghjkl, or 12345678…has symbols, such as ` ! " ? $ ? % ^ & * ( ) _ - + = { [ } ] : ; @ ' ~ # | \ < , > . ? /Exemple de script pour parer aux attaques par dictionnaire et par force brut. – Comment remettre ce script au go?t du jour??<?php// Démarrage de la sessionsession_start(); // Si on a dépassé le temps de blocage if(isset($_SESSION['nombre']) and $_SESSION['timestamp_limite'] < time()) { // Destruction des variables de session unset($_SESSION['nombre']); unset($_SESSION['timestamp_limite']); }// Si le cookie n'existe pas if(!isset($_COOKIE['marqueur'])){// Si le formulaire est correctement rempli if(isset($_POST['connexion']) and !empty($_POST['pseudo']) and !empty($_POST['passe'])) {// Si la variable de session qui compte le nombre de soumissions n'existe pasif(!isset($_SESSION['nombre'])){// Initialisation de la variable $_SESSION['nombre'] = 0; // Blocage pendant 10 min $_SESSION['timestamp_limite'] = time() + 60*10;}// Sécurisation des variables $pseudo = mysql_real_escape_string($_POST['pseudo']); $passe = mysql_real_escape_string(md5($_POST['passe'])); // Formatage de la requête $requete = "SELECT id FROM administrationWHERE pseudo = '$pseudo' AND passe = '$passe'";// Si on n'essaye pas de nous attaquer par force brute if($_SESSION['nombre'] < 10){// Connexion à notre base de données mysql_connect("localhost", "root", ""); mysql_select_db("table");// Envoie de la requête au serveur $query = mysql_query($requete) or exit(mysql_error());// Ici, vous traitez les résultats de votre requête à votre guise // Incrémentation de notre variable de session $_SESSION['nombre']++;}// Si on a dépassé les 10 tentativeselse{// Si le cookie marqueur n'existe pas on le crée if(!isset($_COOKIE['marqueur'])) { $timestamp_marque = time() + 60; // On le marque pendant une minute $cookie_vie = time() + 60*60*24; // Durée de vie de 24 heures pour le décalage horaire setcookie("marqueur", $timestamp_marque, $cookie_vie); }// on quitte le scriptexit();}} ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ""><html> <head> <title>Administration</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form method="post" action=""><p> <label>Pseudo </label><input type="text" name="pseudo" /><br /><label>Passe </label><input type="text" name="passe" /><br /><input type="submit" name="connexion" value="connexion" /></p> </form> </body></html><?php} // Si le cookie existe else { // Si le temps de blocage a été dépassé if($_COOKIE['marqueur'] < time()) { // Destruction du cookie setcookie("marqueur", "", 0); } }?> ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download