0% ont trouvé ce document utile (0 vote)
109 vues122 pages

PHP Partie 1

Cours php

Transféré par

ykp78pvph9
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
109 vues122 pages

PHP Partie 1

Cours php

Transféré par

ykp78pvph9
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Formateur :RETROUVEZ

El bahloussi Yassine
L’INTÉGRALITÉ DES COURS SUR EPROJET.FR EVOGUE.FR LIAM TARDIEU

PHP
Objectifs
Maîtriser la syntaxe et les instructions de base en PHP.
Conserver et échanger des informations avec un internaute.
Sauvegarder, utiliser et exploiter pleinement une base de données en faisant communiquer les technologies PHP/SQL.
Créer un site web « 2en1 » avec une partie cliente (front) et une interface de gestion (back).
Développement de fonctionnalités. (CRUD orienté e-commerce)

01 A quoi sert le Php ? Qu'est-ce que c'est ?

Le PHP (Hypertext Preprocessor) est un langage de programmation (fonctionnel) à l'inverse des

langages Html et Css qui sont des langages de conception (structure et mise en forme de page

web).

Avec PHP, nous pouvons faire tous types de site et il n'y a plus de limite : moteur de recherche

(type google), réseaux sociaux (type facebook), plateforme multimédia (type YouTube), site

d'informations (type Wikipédia), boutique ecommerce (type amazon), petites annonces (type

leboncoin), forum, blog, espace membre, etc.

Pour mieux comprendre, prenons le cas d'un formulaire :

1 formulaire est déclaré en html,

il est mis en forme en css (html + css = conception),

mais si nous voulons récupérer et exploiter les saisies postées par l'internaute nous aurons besoin

du PHP qui est un langage permettant d'effectuer des traitements (et c'est bien là le principe, si nous faisons un formulaire c'est pour récupérer des

données !).

Autrement dit, sans PHP nous ne pourrons pas faire fonctionner un formulaire.

Ensuite, si nous voulions sauvegardées ces données dans une base, nous aurons besoin du langage SQL.

D'autre part, le PHP permet de créer des sites web dynamiques ! Et c'est très utile !

02 Histoire de Php

La première version du langage PHP fut créée en 1994 par Rasmus Lerdorf et repris en 1997 par deux étudiants : Andi Gutmans et Zeev Suraski.
Dans le monde, plus de 300 millions de sites reposent sur la technologie Php. Ce chiffre ne cesse d'augmenter.

Je ne m'étale pas trop sur l'historique de PHP, pour ça il y a Wikipédia : Plus d'informations sur le langage PHP avec Wikipédia

03 Qu'est-ce qu'un site web statique ?

1 site statique est généralement réalisé avec les langages Html et Css.
La problématique c'est que ces sites ne sont pas pratiques à mettre à jour (exemple de mise à jour : ajouter une image, modifier du texte, ajouter un
nouveau lien comme rubrique de menu, créer une nouvelle page).
Vous me direz peut-être que c'est simple et rapide pour vous d'adapter votre code-source
puisque vous êtes à l'aise en Html et Css mais ce n'est pas le cas de tous et encore moins
des clients qui achèterons les sites web (ils sont généralement peu techniques et veulent
pouvoir effectuer des réglages rapidement et efficacement).

Le principal inconvénient d'un site statique c'est qu'il faut quelques connaissances techniques
car nous sommes obligés de repasser par le code-source de chaque fichier pour effectuer des
modifications.

Gardez bien à l'esprit qu'un site est modifié en permanence ! Même quand vous pensez qu'il
est "terminé" il ne l'est pas vraiment. Il faut donc trouver des solutions pour faciliter les modifications et les mises à jour : c'est là que le site dynamique
(propulsé par PHP) rentre en jeu!

04 Qu'est-ce qu'un site web dynamique ?

1 site dynamique est 1 site dont les informations proviennent d'une base de données (pour cela il faudra mélanger le langage php et le langage sql
ensemble).

Attention
il ne faut pas confondre 1 site dynamique avec 1 site de mouvements ou d'animations et couleurs clinquantes dans la page web.

Pour obtenir un site dynamique, nous utiliserons le langage PHP, qui lui même accueillera le langage SQL afin d'obtenir des informations contenues dans
la base de données.

Si nous arrivons a récupérer des données (provenant d'une base de données) sur notre site, nous pourrions aussi récupérer ces mêmes données pour un
2e site.

Pourquoi 2 sites ? quel en serait l'intérêt ?

Le premier site sera destiné au grand public pour la consultation des informations par les internautes.
un Front (aussi appelé, front-office ou front-end)

Le deuxième site sera protégé par authentification et destiné à la mise à jour et modification de contenu par l'administrateur
(propriétaire du site).
un Back (aussi appelé, back-office, back-end ou interface de gestion).

Nous appelons donc « un site dynamique » un site dont les informations sont contenues dans une base de données et qui possède 2 interfaces :
un premier site FRONT (pour l'affichage du site normal),
un deuxième site BACK (pour la gestion et assurer les réglages du premier site).

L'avantage d'un site dynamique c'est que les modifications seront beaucoup plus faciles et ne devrons pas obligatoirement être réalisées dans le code-
source d'un fichier par une personne connaissant le code et ayant des compétences techniques.

Les modifications pourront être effectuées dans une interface de gestion backOffice simple et intuitive, et par tous !

Voici un schéma illustrant cette situation :


Dans une interface de gestion (BackOffice), nous retrouvons la plupart du temps un éditeur avec des icônes permettant de gérer les contenus :

Par exemple l'icone permettant de créer un lien ajoutera automatiquement les balises <a> </a> dans le code. Sans que le développeur n'ait besoin de
l'écrire.

Dans la plupart des cas, il n'y a pas qu'1 seul sites web mais 2 site web (1 front et 1 back). C'est ce qu'on appelle un site web dynamique.

Qu'est-ce qu'un site dynamique


Un site dynamique est un site modifiable sans avoir besoin de retourner dans le code-source obligatoirement.
Les sites web dynamiques sont majoritairement élaborés avec l'aide de php (d'autres langages de programmation peuvent être utilisés)

Le FRONT représente la partie que nous consultons en tant qu'internaute (pour l'affichage et la consultations des informations).

Le BACK reservé aux administateurs du site (gérants) permettant les mises à jour des informations.

Si nous voulions faire la liste des sites dynamiques incluant du php et du sql, la liste serait longue voire interminable, puisque tous les sites (ou presque)
sont concernés.

Prenons la chose à l'envers, quels sont les sites statiques (et donc non dynamiques ) et n'incluant ni de Php ni de Sql ?
Des sites n'étant jamais mis à jour (assez rare), certains sites développés par les développeurs eux même pour se présenter (et encore ce n'est pas une
majorité).

Contrairement aux idées reçues, la plupart du temps même un site vitrine est un site dynamique !
Les clients demandent un site vitrine car ils veulent se présenter mais aussi pouvoir effectuer des modifications via une interface de gestion BackOffice !
Sinon, sans connaissance technique, comment feraient-ils pour modifier les textes, les images et créer de nouvelles pages ?
Retenez le bien : La plupart du temps un site vitrine est un site dynamique !

Maintenant vous le savez, PHP est incontournable !

PHP est actuellement utilisé en version 7 sous forme de code procédural ou orienté objet.

En résumé
Pour construire votre page web vous aurez besoin de Html et Css (partie structure et mise en forme).
Pour la rendre fonctionnelle et dynamique vous aurez besoin de Php et Sql (pour effectuer des sauvegardes et mener des opérations sur la
base de données).
JavaScript permettra d'assurer la programmation côté client et viendra compléter les autres langages.

05 Architecture Client / Serveur avec un site statique

1. - L’internaute effectue une demande (via une adresse URL).

2. - Le serveur reçoit la demande et trouve le fichier (page web) intégrant uniquement du code Html et Css, il renvoie le contenu demandé à
l'internaute.

C'est aussi simple que ça. Les sites statiques n'utilisent que du code html et css.

06 Architecture Client / Serveur avec un site dynamique

Comment fonctionne le Php ?

Lorsqu'une page web s'affiche sur votre écran, elle respecte un processus particulier décrit ci-dessous :

1- Un internaute souhaite accèder à une page web, il utilise un navigateur par lequel il sollicite une adresse url.

2- Cette adresse url pointe vers une ressource (fichiers contenant texte, image, code-source, etc.) hebergée par un serveur (emplacement de stockage
applicatif).

3- Il arrive parfois que le serveur ait besoin de consulter une base de données pour intégrer des informations dans le contenu de la page web (requête
SQL).
1 - navigateur de l'internaute :

2 - serveur stockant la ressource :

3 - données de la base :
Si l'on résume, et pour faire un schéma, techniquement voici comment se déroule la consultation de page web :

1. - L’internaute effectue une demande (via une adresse URL).

2. - Le serveur reçoit la demande et trouve le fichier (page web) intégrant code Html + Php, du coup il passe par l'interpréteur pour décoder les lignes
de PHP.

3. - L’interpréteur commence à décoder les instructions php et voit des requêtes SQL, il communique donc avec la base de données.

4. - La base de données (SGBD) retourne les informations demandées.

5. - L’interpréteur intégre les données envoyées par la base et termine de décoder les instructions php et le fichier (page web) est renvoyé au serveur
au format 100% html (puisque l'interpréteur à transformé toutes les instructions Php en résultat Html).

6. - Le serveur renvoie la page Html au navigateur, sur l'ordinateur de l'internaute.

Comprenez-vous pourquoi vous ne verrez jamais 1 ligne de code Php dans le code-source d'une page web ?
En effet, même si la page web contient du code php, ce code est décoder par l'intérpréteur de manière à ne renvoyer que du html au navigateur de
l'internaute.

De toute façon, le navigateur ne pourrait pas comprendre des lignes PHP, ce n'est pas son rôle, il doit simplement afficher la page web et pour ça il a
uniquement besoin de garder le code Html et Css.

Si du code Php est tout de même passé au navigateur, il le considérera comme du texte et ne l'exécutera pas, du coup votre programmation ne
fonctionnera pas.

C'est aussi la raison pour laquelle vous ne pourrez jamais créer un fichier php sur votre bureau, ou le lancer directement et manuellement dans le
navigateur, sans aucun serveur web ou interpréteur.

En effet, il est impératif que votre fichier contenant le code php respecte tout ce cycle (schéma au dessus : interprétation et exécution, échange avec la
base de données éventuellement, etc.).

Afin de faire fonctionner notre code Php nous utilisons le serveur web WAMP (qui inclut tout ce dont nous avons besoin) :

Windows - système d'exploitation.


Apache - serveur web (HTTP).
Mysql - SGBD (Système de Gestion de Base de Données).
Php - Interpréteur Php.

Bon à savoir

PHP est un langage exécuté côté serveur, ce ne sera donc pas une exécution par l'ordinateur ou le navigateur de l'internaute.

PHP est un langage interprété, ses instructions sont traitées séquentiellement par le serveur (pas de compilation)

PHP est open source, tout le monde peut l'utiliser et même vendre une de ces créations à l'aide du langage PHP.
Les sites dynamiques utilisent plusieurs langages : html, css, php, sql, javascript.

07 Les langages de programmation

Y'a t'il d'a utres langages de programmation différents de Php pour construire un site web dynamique ?

Oui, d'autres langages exécutés côté serveur existent pour créer un site web dynamique : ASP (Active Server Page, développé par Microsoft), JSP (Java

Server Pages, développé par Oracle), CGI (Common Gateway Interface) , etc.

Nous nous concentrerons d'abord sur Php dans le cadre de ce cours.

08 Qu'est-ce qu'un serveur ?

1 serveur est généralement un ordinateur qui héberge un site web, mis à disposition par un hébergeur (hébergeur = une société de service informatique).

Cet ordinateur reste toujours allumé, c'est ce qui permet une consultation 24h/24 et 7j/7.

09 Php procédural ou Php Orienté Objet ?

Deux techniques de programmation sont souvent utilisées :

L'Approche Procédurale (le code est écrit séquentiellement).

L'Approche Orientée Objet (le code est encapsulé dans des méthodes de classes et fonctionne via l'interaction d'objets).

Avant de s'intéresser aux avantages et inconvénients de ces deux techniques, sachez que certaines notions de bases sont forcément apprises en approche
procédurale.

L'approche orientée objet est souvent priviligiée par les entreprises car cela permet d'encourager le travail collaboratif et simplifie grandement les mises à
jour. (surtout pour les projets de grande envergure, développés sur plusieurs mois et par plusieurs personnes).

Techniquement, nous ne pouvons pas aller plus loin en terme de finalité et de rendu fonctionnel avec l'orienté objet par rapport au procédural. C'est avant
tout une méthodologie de travail (et non pas une évolution pour créer davantage).

10 Développement : from scratch ? cms ? framework ?

A ce jour, il y a 3 grands moyens de créer un site web :

À la main (from scratch, en partant de 0),


avec l'appui d'un CMS,
avec l'aide d'un FRAMEWORK,

Lorsqu'on utilise un CMS ou un FRAMEWORK, le code peut être procédural ou orienté objet (et parfois le code reprend un peu des deux techniques).

Avant de s'intéresser à chacun de ces moyens, il est indispensable de bien connaitre et maitriser le PHP (dans sa forme basique).
11 Plan de cours

Notre plan de cours reprend les chapitres indispensables de la programmation et du PHP.

Toutefois, si vous êtes attirés par des boutiques ecommerce, des lightbox qui pop, des diaporamas qui slides, des sites dynamiques avec backOffice, des

reseaux sociaux avec connexions membres et espace de profil accompagné d'avatar, etc. et le tout en responsive web design... ce ne sera pas pour tout

de suite ! il y a quelques étapes à respecter et pour cela il va falloir s'armer de patience.

L'aprentissage prend du temps mais ce n'est pas une mauvaise chose car si tous ces sujets s'apprenaient en

10 minutes, ce serait payé au SMIC et ce ne serait pas un métier mais plutôt "un boulot". A l'issue de votre

apprentissage vous aurez un vrai savoir-faire que vous pourrez valoriser financièrement sur le marché de

l'emploi.

Avant de créer un site web, quel qu'il soit (du plus grand portail au plus simple site du type blog), vous devrez impérativement connaitre les sujets
suivants :

1. Intro : découverte et explications autour de PHP


2. Instructions d'affichage
3. Variable (et Constante) : Type / Déclaration / Affectation
4. Syntaxe et concaténation
5. Condition et Opérateurs
6. Fonction prédéfinie
7. Fonction utilisateur
8. Boucle
9. Inclusions de fichiers
10. Array
11. Classes et objets
12. Les Superglobale
13. Lien GET et Formulaire POST
14. Cookie
15. Session
16. Requête SQL (Mysqli, Pdo)
17. Réalisation d'un espace de dialogue (Cas Concret)
18. Approche Sécurité : Espace membre
19. Réalisation d'un site web (Cas concret : CRUD - tendance ecommerce)
20. Evaluation

Ce sera notre plan de cours et notre défi : apprendre le php en 20 chapitres !

Avant de démarrer, je préfère prévenir surtout tout ceux qui ont un fort besoin de visibilité et de compréhension immédiate du contexte.
La question « A quoi ça sert ? » est à bannir. Il faut d'abord comprendre « Comment ça fonctionne ? ». le contexte viendra plus tard.

Partez du principe que tout sert à quelque chose, sinon cela n'existerait pas et nous n'en parlerions pas !

Nous pouvons expliquer à quoi sert ces différents chapitres les uns après les autres mais cela ne sera pas représentatif car cela dépend du contexte dans
lequel ils sont utilisés.

C'est comme si je vous demandais : à quoi sert une brique ?


A première vue, comme ça... pas à grand chose !

Maintenant ça sert à quoi plusieurs briques ?

Plusieurs briques permettent de construire un mur. C'est concret !

Pour Php, c'est pareil, un sujet peut paraitre abstrait mais l'ensemble des sujets que nous allons aborder vous permettront de construire des sites web
dynamiques.
Pour cela ne soyez pas trop impatient (et surtout n'essayez pas d'aller plus vite que votre compréhension, au risque de voir l'effet inverse se produire :
retourner en arrière et être ralenti).

Etudions maintenant les mécanismes de PHP !

12 Environnement pour développer du code en PHP

Avant de construire un site web et écrire nos premières lignes en PHP, vous allez devoir préparer le terrain avec au minimum :

Un serveur web : WAMP (d'autres serveurs web existent : easyPhp, xampp, wamp est aussi décliné sous mac avec mamp et sous linux avec lamp)

Un éditeur de code : NOTEPAD (d'autres éditeurs type SublimeText existent, ou éventuellement un IDE (plus puissant mais pas nécessaire pour
débuter) : Eclipse, Phpstorm, Zend, etc.)

Un navigateur (type Firefox ou Google Chrome) permettant la consultation de page web.


13 Créons notre premier fichier PHP

Avant de créer votre premier fichier, vous devez impérativement avoir installer WAMP et pouvoir accèder à http://localhost/.

Pour créer notre premier fichier PHP, nous allons nous rejoindre dans le dossier nommé /www/

Créons un premier dossier nommé /php/ :

Une fois à l'intérieur de votre dossier /www/php/, créons un nouveau fichier nommé entrainement.php.

Le dossier /www/ se nomme htdocs sous MAMP (pour mac).


Pour inscrire et introduire du code dans votre fichier entrainement.php, vous pouvez effectuer un clic droit sur le fichier avec votre souris et éditer le code

avec l'aide de notepad :

Il est important que ce fichier possède l’extension « .php ».

Instruction d'affichage

14 Instruction d'affichage

Démarrons avec notre fichier entrainement.php

entrainement.php
?
<?php
echo 'Bonjour';
print 'Nous sommes vendredi et il fait beau !';

Ce code PHP permet d'afficher du texte.

echo et print peuvent être traduits par « affiche moi »s.

Chaque instruction se termine par un point-virgule « ; ».

Le texte peut être mis entre apostrophes (quotes) ou guillemets, nous reviendrons sur ces deux possibilités dans le chapitre 5 dédié à ce sujet.

15 Différence entre echo & print

Pour une première initiation vous pouvez retenir qu'il n'y a pas de différence entre echo et print, et qu'il vaut mieux utiliser le echo.

Pour les plus connaisseurs et ceux qui aiment bien creuser un sujet jusqu'au bout, sachez que le echo ressort comme étant légérement plus rapide (centième de
seconde) car il ne fait pas de return. print peut se retrouver à droite d'une expression pour être évalué. (Fermez les yeux sur cette partie si cette phrase n'est pas
claire, elle ne vous empêchera pas de suivre le déroulé du cours).

16 Instruction de debug

D'autres instructions permettent d'effectuer des affichages pour se débugger :

?
print_r
var_dump

Durant la création d'un site web, ces instructions seront très utiles pour se répérer.

Nous reviendrons sur leur utilisation un peu plus tard afin de faire un tour complet sur leur utilisation.

17 Commentaire

Pour introduire des commentaires dans une page web, nous pouvons le faire de plusieurs manières différentes :

entrainement.php
?
<?php
echo 'Bonjour';
echo 'Nous sommes vendredi et il fait beau !';
// commentaire sur 1 ligne
/* commentaire
sur plusieurs
lignes */
# commentaire sur 1 ligne

Ctrl+Q vous permettra d'utiliser le raccourci clavier afin d'appliquer des commentaires PHP sous notepad.

18 Mélange html et php

Pour introduire du code Html dans un fichier Php (et non pas du php dans du html /!\) nous avons deux solutions :

1- Html dans du PHP via l'instruction echo

entrainement.php
?
<?php
echo '<h1>Bonjour</h1>';
echo 'Nous sommes <strong>vendredi</strong> et il fait beau !<br>';
echo '<div class="mazone">
Je crée une zone html dans du php
</div>';

Vous pouvez remarquer la présence des balises <h1>, <br> et <strong> directement dans le code PHP.

Le code Html peut donc facilement être introduit à l'intérieur du Php.

Voici un autre moyen de mélanger les deux langages :


2- Entrée et sortie répétitives de PHP

entrainement.php
?
<h1><?php echo 'Bonjour'; ?></h1>
<?php echo 'Nous sommes'; ?> <strong>vendredi</strong> <?php echo ' et il fait beau !'; ?> <br>
<div class="mazone"><?php echo 'Je crée une zone html dans du php'; ?> </div>

Attention
Ce code est moins propre (ce qui veut dire "moins professionnel" dans le jargon du développement) car il fait sortir et rerentrer dans le code
php à plusieurs reprises.

D'autre part il n'est pas aisé à mettre en oeuvre sur plusieurs lignes d'affilée.

Ce code n'est donc pas montré dans le but de vous le faire retenir (car il ne s'agit pas d'une bonne pratique) mais plutôt vous le faire découvrir afin que
vous ne soyez pas surpris si vous le croisez dans le code d'un fichier écrit par un débutant, ou certains fichiers templates (notamment avec l'uitlisation de
CMS).

Il peut arriver que ce type de pratique (entrée et sortie répétitive de PHP) ait lieu dans le cadre de l'écriture de fichier template mélangeant html et php
(surtout dans l'univers des cms) car les développeurs pensent que c'est plus facile pour des intégrateurs (qui ne connaissent que HTML) de comprendre
une majorité de code HTML avec simplement quelques morceaux de PHP « posés » à l'intérieur.

Par défaut, même si l'extension du fichier est ".php", nous sommes par défaut en language Html avant d'ouvrir les balises php <?php ... ?>.

Bon à savoir
Nous pouvons écrire du HTML dans un fichier ayant l'extension PHP, l'inverse n'est pas possible !

19 Exécuter son code PHP pour tester

Voici le code que nous gardons pour les tests :

entrainement.php
?
<?php
echo '<h1>Bonjour</h1>';
echo 'Nous sommes <strong>vendredi</strong> et il fait beau !<br>';
// commentaire sur 1 ligne
/* commentaire
sur plusieurs
lignes */
# commentaire sur 1 ligne

Pour exécuter votre code php, il va falloir passer par l'adresse web du serveur.

Si vous aviez l'habitude de lancer votre fichier avec notepad (comme pour le html), il va falloir oublier :
Si vous ne comprenez pas pourquoi nous ne pouvons plus lancer l'exécution du fichier à partir de notepad, c'est parce que nous ne pouvons pas envoyer
du PHP au navigateur pour qu'il l'évalue, ce n'est pas son travail (le navigateur doit juste présenter la page et pour cela il a besoin de Html et Css).
Si ce n'est toujours pas clair, je vous invite à relire autant de fois que nécessaire ce schéma explicatif.

L'adresse du serveur web qui vous permettra d'exécuter votre code Php est accessible à partir du menu de wamp :
Et ensuite vous devrez cliquer sur le fichier nommé entrainement.php

résultat

Pensez à regarder le code-source ( CTRL+U ou clic droit > code source de la page), vous verrez qu'on n'y voit uniquement le code html et non pas le php
qui lui a été décodé, conformément à notre schéma de départ.

Si vous voyez une erreur apparaitre, vérifier bien votre code et aussi si vous avez bien fermé vos quotes (apostrophe) et mis vos points-virgules en fin de
ligne.

Les variables et constantes

20 Les Variables : Types - Déclaration - Affectation


Les Variables : Types - Déclaration - Affectation

Définition d'une variable

Une variable est un espace nommé permettant de conserver une valeur.

Une variable porte un nom (que l'on définit nous même) et elle permet de conserver une valeur pour la transporter dans notre script.

Il arrive régulièrement que nous ayons connaissance d'une information ligne 27 (par exemple) et que nous voulions la ré-utiliser ligne 232 (par exemple) .

Pour retenir une information en mémoire : nous utilisons une variable !

A quoi ça sert une variable ?


une variable permet de garder une informations en mémoire (durant l'exécution du script), nous pouvons la consulter ou l'utiliser plus tard
dans l'exécution du script.

Pourquoi utiliser des variables ?


Pour 1000 choses différentes, si nous évoquions toutes les situations cela risquerait de vous semer car vous n'avez pas encore le niveau pour comprendre les
réponses qui font appel à d'autres aspects techniques.
Alors tant que vous êtes encore jeune dév apprenti, n'oubliez pas de vous concentrer sur la question « comment ça marche? » plutôt que vous distraire sur la
question « à quoi ça sert? ».
J'insiste mais c'est important, avec mon expérience de formateur j'ai vu trop de gens se braquer et abandonner sous pretexte qu'ils ne voyaient pas où cet
apprentissage allait les emmener.

Voici un exemple pratique avec un prenom :

?
1 <?php
2 echo "<p>Bonjour Fred</p>";
3
4 echo "<p>Comment va-tu Fred ?</p>";
5
6 echo "<p>Voici tes informations de profil Fred ...</p>";

Vous voyez la répétition ? si nous avons besoin d'appeler le prénom Fred à plusieurs endroits différents, cela risque d'être embéttant.

Pour cela, nous pourrions prévoir une variable qui gardera en mémoire le prénom de l'internaute.

Exemple :

entrainement.php
?
1 <?php
2 $prenom = "Fred";
3
4 echo "<p>Bonjour $prenom</p>";
5
6 echo "<p>Comment va-tu $prenom ?</p>";
7
8 echo "<p>Voici tes informations de profil $prenom ...</p>";

Informations
pour que cet exemple fonctionne parfaitement, il faudra prévoir l'utilisation de guillemets plutôt que des quotes (apostrophes)

Avec cet exemple, vous verrez que nous déclarons (ligne 2) la variable prenom contenant la valeur "Fred", cela permet de garder l'information en mémoire
pour ensuite nous la ré-utiliser facilement à plusieurs reprises sur les lignes 4, 6 et 8. (nous transportons de lignes en lignes le prénom grâce à notre
variable !)

A vous de faire le test dans votre navigateur !

résultat
Bonjour Fred

Comment va-tu Fred ?

Voici tes informations de profil Fred ...

Explications et décomposition du code

Une variable est toujours déclarée avec le symbole $ (dollar),

Ensuite nous précisons le nom de la variable, ici nous avons choisi prenom, ce qui donne $prenom.

Le signe égal " = " est dans ce contexte un opérateur d'affectation.

"Fred" est la valeur entrante dans la variable pour être gardée en mémoire tout le temps d'exécution du script.

L'instruction echo permet quant à elle uniquement de faire des affichages.

Voici un peu de vocabulaire (utile si vous vous retrouvez à travailler à plusieurs, ou en entreprise) :

On dit que l'on déclare la variable $prenom et qu'on lui affecte la valeur Fred.

Autre avantage, si nous devons changer le prenom, nous le ferons qu'à un seul endroit et il sera répercuté partout :

entrainement.php
?
1 <?php
2 $prenom = "Nicolas";
3
4 echo "<p>Bonjour $prenom</p>";
5
6 echo "<p>Comment va-tu $prenom ?</p>";
7
8 echo "<p>Voici tes informations de profil $prenom ...</p>";

Imaginez qu'il y ait 1 000 lignes qui fassent appel à la variable $prenom, nous ferons qu'une seule modification ligne n°2 et elle sera répercutée partout
par la suite.

résultat

Bonjour Nicolas

Comment va-tu Nicolas ?

Voici tes informations de profil Nicolas ...

Pour mieux se représenter ce qu'est une variable, voici une métaphore :


Une variable est comme une petite boite dans laquelle nous rangeons quelque chose, plus tard nous rouvrons notre boite et retrouvons ce que nous
avions introduit.

A l'origine la variable n'existe pas :


Nous déclarons la variable $prenom avec l'information "Fred" à l'intérieur :

Cette information est conservée à l'intérieur de la variable :


Plus tard, nous avons besoin de connaitre l'information contenue dans notre variable (nous rouvrons notre boite) :

Comme son nom l'indique, une variable ça peut varier !

Le contenu d'une variable n'est pas "figé", il peut être modifié à tout moment, voici un exemple :

entrainement.php
?
1 <?php
2 $prenom = "Fred";
3
4 echo "<p>Bonjour $prenom</p>";
5
6 echo "<p>Comment va-tu $prenom ?</p>";
7
8 $prenom = "Marie";
9
10 echo "<p>Voici tes informations de profil $prenom ...</p>";

N'oubliez pas d'enregistrer votre fichier et de faire des tests dans le navigateur !

résultat

Bonjour Fred

Comment va-tu Fred ?


Voici tes informations de profil Marie ...

Cela n'a pas de sens dans le cas présent de modifier subitement le prénom d'une personne mais ce code vous démontre qu'une variable est
interchangeable et ce autant de fois qu'on le souhaite (même en cours de route) ! Ceci sera très pratique pour nos futures programmation.

21 Nom de variable

Le nom d'une variable doit être explicite, le nom peut être définit en fonction de l'information qu'elle contient.
Si ma variable est destinée à contenir "rouge", je pourrais la nommer $couleur.

Le nom d'une variable doit respecter certaines régles


Par exemple, elle ne doit pas commencer par 1 chiffre mais peut en contenir :
Exemple : $voiture2 mais pas $2voiture.

Nous pouvons mettre toutes les lettres de l'alphabet (A à Z) dans nos variables (en majuscule ou minuscule).
Nous ne pouvons pas mettre de caractères spéciaux, pas d'espace, et bien entendu on évite les accents sur des noms de variable : $prenom et non pas

$prénom.

Respecter une convention de nommage


Il faut absolument éviter (pour vous et pour les autres développeurs qui rejoindront ou récupérerons votre projet) de nommer des variables avec des noms
de convention différentes.
Exemple : $mon-prenom, $mon_prenom, $monPrenom, $MoNpReNoM, $pren, $info, $_monprenom.

Plusieurs conventions de nommage existent, l'essentiel c'est d'en choisir une et de la garder du début à la fin de votre programmation, je vous suggère la
syntaxe suivante : $monPrenom.

Cela consiste à inscrire une majuscule lorsqu'un espace doit avoir lieu. (la première lettre est une minuscule).

N'oubliez pas d'enregistrer votre fichier et de faire des tests dans le navigateur !

Les variables sont sensibles à la casse, par conséquent, si vous déclarez une variable contenant une majuscule, il ne faudra pas se tromper au moment
de lui demander de s'afficher.

Exemple :

?
1 <?php
2 $monPrenom = "Fred";
3
4 echo $monPrenom; // affiche : Fred
5
6 echo $monprenom; // affiche une erreur "undefined variable..." soit variable indéfinie (inconnue)

En effet, sur les lignes 2 et 4 les variables sont nommées de la même manière, il n'y a donc aucun problème.

Sur la ligne 6, le "p" de prenom ainsi que toutes les autres lettres sont en minuscule, ce qui ne correspond pas à la déclaration de notre variable ligne 2.

22 Les types de variables

Reprenons notre fichier entrainement.php pour les tests :

entrainement.php
?
1 <?php
2 $variable1 = 127;
3 echo gettype($variable1) . "<br>";

Sur la ligne n°2, nous faisons une affectation de la valeur 127 dans la variable nommée "$variable1".

Sur la ligne n°3, nous utilisons gettype() qui est une fonction prédéfinie (= prévue par le langage Php) nous permettant de voir le type d'une variable.
Dans notre cas, il s'agit d'un integer, ce qui correspond à un entier (un nombre).

Le point nous permet seulement de faire suivre des informations (avec l'utilisation du <br> pour passer à la ligne). Il s'agit de la concaténation dont nous

parlerons en détail au chapitre 5.

entrainement.php
?
1 <?php
2 $variable2 = 1.5;
3 echo gettype($variable2) . "<br>";

Cette variable est de type double correspondant à un nombre à virgule (déclaré avec un point).

entrainement.php
?
1 <?php
2 $variable3 = "une chaîne";
3 echo gettype($variable3) . "<br>";

Là non plus, nous ne regardons pas le contenu d'une variable mais son type : string

entrainement.php
?
1 <?php
2 $variable4 = '127';
3 echo gettype($variable4) . "<br>";

C'est toujours le type string, même s'il s'agit d'un nombre, l'utilisation des quotes fait que le php le considère comme une chaine de caractères

entrainement.php
?
1 <?php
2 $variable5 = TRUE;
3 echo gettype($variable5) . "<br>";

Type Boolean : TRUE (VRAI, assimilé a 1) ou FALSE (FAUX, assimilé à 0) uniquement.

entrainement.php
?
1 <?php
2 $variable6 = FALSE;
3 echo gettype($variable6) . "<br>"; // boolean

Type Boolean : TRUE (VRAI, assimilé a 1) ou FALSE (FAUX, assimilé à 0) uniquement.

résultat

integer

double

string

string

boolean
boolean

Pour débuter, voici les principaux types de variables :

Type Description

integer chiffre ou nombre

string chaine de caractères (texte)

boolean vrai ou faux (TRUE or FALSE)

Il existe d'autres types de variable.

23 Assignation par référence

Voici une notion importante à comprendre, l'assignation par référence :

entrainement.php
?
1 <?php
2 $fruit1 = 'pomme'; // affecte la valeur 'pomme' à $fruit1
3 $fruit2 = 'banane'; // affecte la valeur 'banane' à $fruit2
4 echo "fruit1 : $fruit1 <br>"; // affiche : pomme
5 echo "fruit2 : $fruit2 <br>"; // affiche : banane
6 $fruit2 = &$fruit1; // passage de référence (assigne la référence de $fruit1 à $fruit2)
7 echo "fruit1 : $fruit1 <br>"; // affiche : pomme (référence 1)
8 echo "fruit2 : $fruit2 <br>"; // affiche : pomme (référence 1)
9 $fruit2 = 'fraise'; // modifie la valeur de $fruit2 (et de $fruit1 par repercution, même espace mémoire)
10 echo "fruit1 : $fruit1 <br>"; // affiche : fraise
11 echo "fruit2 : $fruit2 <br>"; // affiche : fraise
12 // Si nous changeons $fruit2, $fruit1 change en conséquence (et vice versa), leur destin sont liés puisqu'il représente la même référence
qui pointe vers 1 seul et même espace mémoire

Ligne 1 : Ouverture de php (pas difficile ça ! :p)

Ligne 2 : Nous affectons la valeur 'pomme' à la variable $fruit1.

Voici ce qu'il se passe réellement :

Par habitude, on dit que la variable $fruit1 contient la valeur "pomme" pour gagner du temps et aller plus vite lors d'un dialogue.
En réalité, la variable $fruit1 ne contient pas directement de valeur, elle possède la référence 1 qui représente un espace mémoire (avec la même
référence, ce qui permet d'assurer la liaison). C'est dans l'espace mémoire 1 qu'est contenu la valeur "pomme".

C'est à dire que la variable n'est pas contenue directement dans la variable au sens propre du mot, la variable est un espace mémoire identifiable par une
référence (un numéro, ici le 1) qui mène vers la valeur "pomme".

Question : Pourquoi la variable $fruit1 possède la référence 1 et pas 56 (par exemple) ? Réponse : car c'est la 1ère variable qui a été déclarée.

Ligne 3 : Nous affectons la valeur 'banane' à la variable $fruit2.

Même principe, la variable $fruit2 possède la référence 2 qui mène vers la valeur 'banane'.

Ensuite ligne 4 et 5, nous demandons aux variables de nous donner les valeurs qu'elles contiennent dans leur espace mémoire (la liaison se fait grâce à
leur référence), voici l'affichage :

Ligne 6 : par l'utilisation du symbole &, nous assignons la référence 1 de $fruit1 à $fruit2.
Par conséquent, les deux variables $fruit1 et $fruit2 pointent vers la même référence (et donc le même espace mémoire), soit 2 variables qui pointent
vers la référence 1

Ligne 7 et 8 : nous demandons des affichages ce qui confirme le schéma d'au dessus.

Ligne 9 : Dorénavant, le destin de $fruit1 et $fruit2 sont liés.


Si je change la variable $fruit2, $fruit1 changera en conséquence puisqu'il pointe vers le même espace mémoire (même référence)
N'oubliez pas, nous ne changeons pas la variable en elle même mais le contenu quelle représente (dans l'espace mémoire) et la liaison se fait avec la
référence.

Si nous changeons $fruit2, $fruit1 change en conséquence (et vice versa), leur destin sont liés puisqu'ils représentent la même référence qui pointe vers 1
seul et même espace mémoire

C'est donc ce qu'on appelle un passage de référence.

résultat

fruit1 : pomme
fruit2 : banane

fruit1 : pomme

fruit2 : pomme

fruit1 : fraise

fruit2 : fraise

24 Assignation de valeur

Différent du passage de référence, voici le passage de valeur :

entrainement.php
?
1 <?php
2 $fruit1 = 'pomme'; // affecte la valeur 'pomme' à $fruit1
3 $fruit2 = 'banane'; // affecte la valeur 'banane' à $fruit2
4 echo "fruit1 : $fruit1 <br>"; // affiche : pomme
5 echo "fruit2 : $fruit2 <br>"; // affiche : banane
6 $fruit2 = $fruit1; // passage de valeur ($fruit2 contient maintenant "pomme")
7 echo "fruit1 : $fruit1 <br>"; // affiche : pomme (référence 1)
8 echo "fruit2 : $fruit2 <br>"; // affiche : pomme (référence 1)
9 $fruit2 = 'fraise'; // modifie la valeur de $fruit2 uniquement
10 echo "fruit1 : $fruit1 <br>"; // affiche : pomme
11 echo "fruit2 : $fruit2 <br>"; // affiche : fraise
12 // $fruit2 et $fruit1 ne sont pas liés, ils possèdent des références différentes et pointent vers des espaces mémoire différents.

Ligne 2 : Nous affectons la valeur 'pomme' à la variable $fruit1.

Ligne 3 : Nous affectons la valeur 'banane' à la variable $fruit2.

Ligne 4 : Nous affichons la valeur de la variable $fruit2, soit : pomme.

Ligne 5 : Nous affichons la valeur de la variable $fruit1, soit : banane.

Ligne 6 : Nous passons la valeur de la variable $fruit1 à la variable $fruit2 (uniquement la valeur, pas de passage de référence sans le symbole &.

Ligne 7 : Nous affichons la valeur de la variable $fruit1, soit : pomme.

Ligne 8 : Nous affichons la valeur de la variable $fruit2, soit : pomme.

Ligne 9 : Nous modifions la valeur de la variable $fruit2, soit : fraise.

Ligne 10 : Nous affichons la valeur de la variable $fruit1, soit : pomme.

Ligne 11 : Nous affichons la valeur de la variable $fruit2, soit : fraise.

Comme vous pouvez le constater, $fruit2 et $fruit1 ne sont pas liés, ils possède des références différentes et pointe vers des espaces mémoire
différent.

Voici le schéma final de nos variables :


résultat

fruit1 : pomme

fruit2 : banane

fruit1 : pomme

fruit2 : pomme

fruit1 : pomme

fruit2 : fraise

Ne l'oubliez pas
Une variable est une zone en mémoire du système, qui sert à conserver une valeur.

25 Les constantes

A quelques détails près une constante c'est comme une variable, son rôle est de conserver une valeur.

Sauf que dans son cas, la valeur ne pourra pas changer durant l'exécution du script, en effet comme son nom l'indique, une constante c'est constant !

Alors qu'une variable ça peut varier.

Au niveau de la convention de nommage, une constante s'écrit toujours en majuscule.

Au niveau de la syntaxe, la déclaration est différente :

entrainement.php
?
1 <?php
2 define("CAPITALE","Paris");
3 echo CAPITALE . "<br>";
4
define est une fonction prédéfinie (prévue par le langage PHP) permettant de définir une constante en annonçant d'abord son nom, puis ensuite sa
valeur.

Par convention, une constante se déclare toujours en majuscule.

Nous demandons ensuite l'affichage du contenu de la constante nommée CAPITALE : Paris.

résultat

Paris

Nous ne pourrons pas déclarer d'autres valeurs à l'intérieur de la constante nommée CAPITALE

A quoi peut bien servir une constante ? devons nous utiliser plutôt une variable ou une constante ?
Dans la majorité des cas nous utilisons des variables, cela dépend surtout de la nature de l'information à garder.
Comme nous l'avons évoqué, le contenu d'une constante ne pourra pas être redéfinie durant l'exécution du script, il peut donc être utile de garder certaines
informations de manière sûre comme les informations de connexion à une base de données, le chemin fixe vers un dossier du site, etc.

26 Les constantes magiques

D'autres constantes existent dans le langage PHP, on les appelle des constantes magiques, exemple :

entrainement.php
?
1 <?php
2 echo __FILE__ . "<br>"; // Affiche le chemin complet vers le fichier actuel
3 echo __LINE__ . "<br>"; // Affiche le numéro de la ligne
4

D'autres constantes magiques existent, voici le lien vers la documentation officielle de PHP.

Syntaxe et concaténation

27 Concaténation lors d'un affichage

La concaténation en PHP permet de faire suivre des informations sur la même ligne d'instruction (avec un echo par exemple).

entrainement.php
?
1 <?php
2 $x = "bonjour "; // affectation de la valeur "bonjour" dans la variable $x.
3 $y = "tout le monde"; // affectation de la valeur "tout le monde" dans la variable $y.
4 echo $x . " " . $y . "<br>"; // point de concaténation que l'on peux traduire par "suivi de".
5 echo "$x $y <br>"; // même chose que la ligne d'au dessus, sans concaténation.
6 echo "Hey ! " . $x . " " . $y; // concaténation de texte et de variables.
7 echo "<br>", "Hello ", $y, "<br>"; // concaténation avec l'utilisation d'une virgule (la virgule et le point de concaténation sont similaires).

Explications
Ligne 2 : affectation de la valeur "bonjour" dans la variable $x.
Ligne 3 : affectation de la valeur "tout le monde" dans la variable $y.
Ligne 4 : affichage de la variable $x, suivi d'un espace, suivi de la variable $y et d'un passage à la ligne (balise br).
Ligne 5 : Même chose que la ligne 4, inscrit différement.
Ligne 6 : Affichage du texte "Hey ! ", suivi de l'affichage de la variable $x, un espace et $y.
Ligne 7 : Affichage d'un passage à la ligne, du texte "Hello ", suivi de l'affichage de la variable $y.

La concaténation peut se faire avec l'utilisation d'un point ou d'une virgule (pas de virgule dans le cas de l'instruction print).
La virgule et le point de concaténation sont donc similaires lorsque nous utilisons echo.
résultat

bonjour tout le monde

bonjour tout le monde

Hey ! bonjour tout le monde

Hello tout le monde

28 Concaténation lors d'une affectation

entrainement.php
?
1 <?php
2 $prenom1 = "Bruno"; // Affectation de la valeur "Bruno" sur la variable : $prenom1
3 $prenom1 = "Claire"; // Affectation de la valeur "Claire" sur la variable : $prenom1. cela remplace Bruno par Claire.
4 echo $prenom1 . "<br>"; // Affiche : Claire
5 $prenom2 = "Nicolas"; // Affectation de la valeur "Nicolas" sur la variable : $prenom2
6 $prenom2 .= " Marie"; // Affectation de la valeur " Marie" sur la variable : $prenom2. Ajout SANS remplacement de la valeur précédente
7 grâce à l'opérateur .=
8 echo $prenom2. "<br>"; // Affiche : Nicolas Marie

Explications
Ligne 2 : affectation de la valeur "Bruno" dans la variable $prenom1.
Ligne 3 : affectation de la valeur "Claire" dans la variable $prenom1 (cela remplace Bruno par Claire).
Ligne 4 : affichage de la variable $prenom1, soit : Claire.
Ligne 5 : affectation de la valeur "Nicolas" dans la variable $prenom2.
Ligne 6 : affectation de la valeur "Marie" dans la variable $prenom2, avec l'utilisation de l'opérateur de concaténation lors de l'affectation ".=", cela ajoute

Marie dans la variable sans pour autant retirer ou remplacer la précédente valeur "Nicolas".
Ligne 7 : Affichage de la variable $prenom2, soit Nicolas Marie.

résultat

Claire

Nicolas Marie

Nous retiendrons que pour inscrire une nouvelle valeur dans une variable (sans pour autant remplacer la valeur précédente), nous utiliserons l'opérateur .=
permettant de faire une concaténation dans le contenu de la variable.

Pour autant, cela ne sera pas pratique lors de l'affichage, en effet, nous n'aurons pas la possibilité d'afficher soit Marie, soit Nicolas, les deux valeurs
s'afficheront systématiquement.

Nous voyons donc que nous n'utiliserons pas une variable pour conserver plusieurs valeurs (pour ça, nous verrons les array au chapitre 12), retenons qu'il
est préférable de réfléchir de la sorte :

1 variable = 1 valeur

29 Syntaxe : Différence entre l'utilisation des guillemets et des quotes

Voyons le code suivant :

entrainement.php
?
1 <?php
2 $jour = 'aujourd\'hui'; // utilisation des quotes avec l'anti-slash pour éviter une erreur sur lapostrophe du mot : aujourd'hui.
3 $jour = "aujourd'hui"; // utilisation des guillemets
4 $texte = 'bonjour'; // utilisation des quotes
5 echo $texte . " tout le monde<br>"; // Concaténation d'une variable et de texte
6 echo "$texte tout le monde<br>"; // Affichage dans des guillemets, la variable est évaluée. Pas de concaténation.
7 echo '$texte tout le monde<br>'; // Affichage dans des quotes, la variable n'est pas évaluée !

Explications
Ligne 2 : affectation de la valeur aujourd'hui dans la variable $jour, nous prévoyons un anti-slash "\" pour éviter que l'apostrophe du mot aujourd'hui soit
considéré par PHP comme la fin de l'affectation, ce qui n'est pas le cas et ferait une erreur php à coup sur.
Avez-vous compris à quoi servait l'anti-slash "\" ?

Ligne 3 : affectation de la valeur aujourd'hui dans la variable $jour en utilisant des guillemets, pas d'anti-slash à prévoir car pas de conflit possible sur ce
coup-là.

Ligne 4 : affectation de la valeur bonjour dans la variable $texte en utilisant des quotes (cela aurait pu aussi être fait avec des guillemets).

Ligne 5 : Affichage du texte "Bonjour tout le monde", avec un point de concaténation entre la variable et le texte.

Ligne 6 : Affichage du texte "Bonjour tout le monde", sans concaténation entre la variable et le texte.
Nous pouvons donc dire qu'entre guillemets la variable est évaluée et que la concaténation n'est pas indispensable

Ligne 7 : Affichage du texte '$texte tout le monde', sans concaténation entre la variable et le texte. Cela nous montre la différence entre les guillemets et
les quotes lors d'un affichage de variable.

Différence entre les guillemets et les quotes


Lors d'une affectation, il n'y a pas vraiment de différence (les développeurs utilisent plus couramment les quotes).
Lors d'un affichage en php, avec des guillemets la variable est évaluée (c'est son contenu qui s'affiche), tandis qu'en utilisant les quotes lors de ce même
affichage, c'est le nom de la variable qui est affiché (variable non évaluée)

résultat

bonjour tout le monde

bonjour tout le monde

$texte tout le monde

Condition et opérateur

30 Les Conditions

Les conditions est l'un des chapitres clé de notre apprentissage, c'est aussi un sujet présent dans tous les autres langages de programmation.

Par exemple, lorsque vous créerez un site web et que l'un de vos internautes voudra se connecter à son espace de profil, il rentrera son pseudo ainsi que

son mot de passe (normal, comme partout).

Il faudra exprimer la phrase suivante en PHP : "si (if) tu as un bon pseudo et un bon mot de passe, je te laisse rentrer dans ton espace de profil, sinon

(else) tu resteras sur la page de connexion avec un message d'erreur".

en clair, il faut voir une condition comme une intersection dans la ville pour une voiture, plusieurs routes existent et en fonction de la situation, l'une des

deux routes sera utilisée :


Avant de voir cela plus en détail par le code, voyons les conditions mises à notre disposition :

Condition Signification

if si

else sinon

elseif sinon si

31 Les Opérateurs

Voici les opérateurs mis à notre disposition :

Opérateur Signification

= est égal

== comparaison de la valeur

=== comparaison de la valeur et du type

!= différent de

! n'est pas

> supérieur à ...

< inférieur à ...

>= supérieur ou égal à ...

<= inférieur ou égal à ...

&&
et
AND

||
ou
OR

XOR ou exclusif

32 La condition IF/ELSE

entrainement.php
?
1 <?php
2 $a = 10;
3 $b = 5;
4 $c = 2;
5
5
6 if($a > $b) // Si A est supérieur à B
7 {
8 echo "A est bien supérieur à B <br>";
9 }
10 else // Sinon ... A n'est pas supérieur à B
11 {
12 echo "non, c'est B qui est supérieur à A <br>";
13 }

Nous déclarons 3 variables avec :

A égal à 10

B égal à 5

C égal à 2

Ensuite, nous demandons si la variable A est bien supérieure à B, en clair : est-ce que 10 est supérieur à 5 ?
Oui, 10 est plus grand que 5 ! alors la condition renvoie TRUE (vrai) et nous rentrons dans les accolades du IF.

résultat

A est bien supérieur à B

Si nous rentrons dans le IF, nous ne pouvons pas rentrer dans le ELSE. C'est soit l'un, soit l'autre.

L'instruction ELSE fonctionne après un IF et exécute les instructions correspondantes au cas où la condition du IF est fausse.

Informations
Le ELSE n'a jamais de parenthèse ni de condition particulière, il s'agit du cas par défaut.

33 La condition avec AND (&&)

Voici un exemple avec une double condition devant être parfaitement valable :

entrainement.php
?
1 <?php
2 if($a > $b && $b > $c) // Si A est supérieur à B et que dans le même temps B est supérieur à C
3 {
4 echo "A est supérieur à B, ET, B est supérieur à C <br>";
5 }

Nous pouvons mettre plusieurs lignes de traitement dans les accolades si nous en avions la nécessité

Cette fois ci, nous demandons si A est supérieur à B, donc : est-ce que 10 est plus grand que 5 ?
Et aussi, si B est supérieur à C, ce qui donne : est-ce que 5 est supérieur à 2 ?
Oui A est plus grand que B, et dans le même temps, B est supérieur à C ! Donc la condition renvoie TRUE (vrai) et nous rentrons dans les accolades du
IF.

résultat

A est supérieur à B, ET, B est supérieur à C

Notez qu'il n'y a pas de ELSE, il est possible de faire un IF sans ELSE.
Ca ressemblerait plutôt à ça au niveau de notre route :
en clair, nous devons continuer tout droit, mais toutefois si la condition renvoie vrai, nous serions alors déviés de notre chemin pour aller sur une autre
route.

Avec le signe && (pronnoncé AND, et commercial, esperluette), il faut absolument que les 2 conditions soient bonnes pour que l'évaluation du code
retourne TRUE et que l'on puisse rentrer dans les accolades du IF.

34 La condition avec OR (||)

Voici un exemple avec une double condition (où l'une des deux doit au minimum être valable) :

entrainement.php
?
1 <?php
2 if($a == 9 || $b > $c) // Si A contient 9 ou que B est supérieur à C
3 {
4 echo "Au moins l'une des 2 conditions est bonne (ou peut-être les 2), sinon vous ne me verriez pas m'afficher ! <br>";
5 }

Cette fois ci, nous demandons si A est égal à 9, donc : est-ce qu'il y a 9 dans A ?
Et aussi, si B est supérieur à C, ce qui donne : est-ce que 5 est supérieur à 2 ?
Non A n'est pas égal à 9 (mais a 10), par contre B est bien supérieur à C ! Donc le fait qu'au moins l'une des deux conditions renvoie TRUE (vrai) cela
nous permet de rentrer dans les accolades du IF.

résultat

Au moins l'une des 2 conditions est bonne (ou peut-être les 2), sinon vous ne me veriez pas m'afficher !

Si nous ne rentrions pas dans le IF, l'intérpréteur continuerait d'évaluer la suite du script en ignorant cette partie de notre code.

Pour rappel, voici les variables que nous avions déclarées précédemment :
?
1 <?php
2 $a = 10;
3 $b = 5;
4 $c = 2;

Notez qu'il n'y a pas de ELSE, il est possible de faire un IF sans ELSE.

Avec le signe || (prononcé OR, ou), il faut qu'au moins l'une des 2 conditions soit bonne pour que l'évaluation du code retourne TRUE et que l'on puisse
rentrer dans les accolades du IF.

Si les 2 conditions étaient bonnes en même temps, nous serions aussi rentrés dans le IF, exemple :

entrainement.php
?
1 <?php
2 if($a == 10 || $b > $c) // Si A contient 10 ou que B est supérieur à C
3 {
4 echo "Au moins l'une des 2 conditions est bonne (ou peut-être les 2), sinon vous ne me veriez pas m'afficher ! <br>";
5 }
A est bien égal à 10.
B est bien supérieur à C.
Comme tout à l'heure, nous rentrons dans le IF.

35 Différence entre AND (&&) et OR (||)

Dans le cas du AND, il faut absolument que les 2 conditions soient bonnes pour rentrer dans le IF.
Dans le cas du OR, les 2 conditions (ou seulement l'une des 2 conditions) doivent être bonnes pour rentrer dans le IF.

36 La condition XOR

Voici un exemple avec une double condition (où l'une des deux doit obligatoirement être valable) :

entrainement.php
?
1 <?php
2 if($a == 10 XOR $b == 6) // XOR : seulement l'une des 2 conditions doit être valide.
3 {
4 echo 'Une seule des 2 conditions est bonne !<br>';
5 }

Nous demandons si A est égal à 10, donc : est-ce qu'il y a 10 dans A ?


Ensuite nous demandons si B est égal à 6, donc : y'a t'il 6 dans B ?
Oui A est égal à 10 mais B n'est pas égal à 6.

L'une des 2 conditions est bonne, l'autre pas. C'est parfait ! c'est précisément ce dont nous avons besoin pour rentrer dans le IF.

Si les 2 conditions sont bonnes, nous ne rentrons pas dans le IF.


Si les 2 conditions sont mauvaises, nous ne rentrerons pas dans le IF.
Avec XOR, il faut précisément qu'une seule des 2 condition soit bonne pour rentrer dans le IF.

résultat

Une seule des 2 conditions est bonne !

Son utilisation est un peu plus rare mais très utile dans certains cas très spécifiques !

37 Les conditions avec IF / ELSEIF / ELSE

Voici un exemple avec une condition comprennant plusieurs cas :

entrainement.php
?
1 <?php
2 if($a == 8) // le double égal (==) permet de vérifier une information à l'intérieur d'une variable
3 {
4 echo "1 - A est égal à 8";
5 }
6 elseif($a != 10) // SinonSi A est différent de 10
7 {
8 echo "2 - A est différent de 10";
9 }
10 else // Sinon, c'est que je ne suis ni tombé dans le if, ni dans le elseif, je me trouve donc ici dans le else.
11 {
12 echo "3 - tout le monde a faux A n'est pas égal a 8 et n'est pas différent de 10. Du coup c'est moi le else qui gagne !<br>";
13 }

IF : Nous demandons si A est égal à 8, donc : est-ce qu'il y a 8 dans A ?


ELSEIF : Sinon si, est-ce que A est différent de 10 ?
ELSE : Sinon, si les 2 conditions d'au dessus ne sont pas bonnes, nous tomberons dans le else (cas par défaut). Non A n'est pas égal à 8 (mais a 10),
A n'est pas non plus différent de 10 ! Du coup nous tomberons forcément dans le cas par défaut, le ELSE.

résultat

3 - tout le monde a faux A n'est pas égal a 8 et n'est pas différent de 10. Du coup c'est moi le else qui gagne !

Nous aurions pu mettre plusieurs elseif d'affilée, le nombre n'est pas limité.

Pour imager le code, voici ce que cela donne au niveau de notre route :

Si nous ne rentrons pas dans le IF, ni dans le ELSEIF, nous rentrons forcément dans le ELSE, c'est le cas par défaut (la route restante, puisque nous ne
pouvons pas revenir en arrière).

38 Condition IF / ELSE sous forme contracté

Voici un exemple avec une condition sous forme contracté :


entrainement.php
?
1 <?php
2 echo ($a == 10) ? "A est égal à 10<br>" : "A n'est pas égal à 10<br>";

Le ? (point d'intérogation) remplace le IF, le : (double point) remplace le else.

Nous ne garderons pas forcément cette forme d'écriture durant le cours mais il est utile d'en avoir connaissance si vous récupérez du code écrit par
d'autres développeurs (utilisant les formes contractées) qu'il faudra comprendre.

Si A est égal à 10, nous rentrons dans le IF (point d'intérogation "?").


Sinon, A n'est pas égal à 10, nous rentrons dans le ELSE (double point ":").
résultat

A est égal à 10

39 Condition de comparaison

Voici un exemple avec une condition de comparaison :

entrainement.php
?
1 <?php
2 $vara = 1;
3 $varb = "1";
4 if($vara == $varb)
5 {
6 echo "il s'agit de la même valeur";
7 }

Nous demandons si la $vara contient la même valeur que la $varb.

Oui c'est bien, le cas, dans les deux variables se trouve la valeur 1.

résultat

il s'agit de la même valeur

entrainement.php
?
1 <?php
2 $vara = 1;
3 $varb = "1";
4 if($vara === $varb)
5 {
6 echo "il s'agit de la même valeur et du même type";
7 }

résultat

Le résultat est vide dans la mesure où la condition renvoie FALSE (faux), nous ne rentrons pas dans le IF, par conséquent le echo ne se déclenchera pas.
Nous demandons si la $vara contient la même valeur et le même type que la $varb.
Non ce n'est pas le cas, la $vara contient le chiffre 1 et est de type integer, la $varb contient le chiffre 1 et est de type string.

Comme vous avez pu le constater, dans notre code la variable $vara contient un 1 qui a été affecté normalement comme un chiffre (sans quotes ni
guillemets).
La variable $varb contient un 1 qui a été affecté comme un string (une chaine de caractères), avec des guillemets.

L'interpréteur ne fait pas de différenciation de type avec le double égal, mais avec le triple égal il voit une différence et n'est pas d'accord pour dire que le
type est le même.
Différence entre 1 égal, 2 égals et 3 égals en PHP ?

Opérateur Signification

= 1 égal permet de faire une affectation de valeur à une variable

== 2 égals permettent de faire une comparaison de la valeur et poser une question, par exemple : y'a t'il 1 dans la variable ?

3 égals permettent de faire une comparaison de la valeur et du type eafin de poser une question, par exemple : y'a t'il 1 dans la variable et
===
est-elle de type integer ?

40 Condition Switch

Lorsque vous avez un grand nombre de conditions à tester (supérieur à 3), nous utilisons généralement la structure conditionnelle SWITCH.

Voici ce que le code donnerait avec les structures que nous connaissons IF, ELSEIF, ELSE :

entrainement.php
?
1 <?php
2 $monPays = 'France';
3
4 if($monPays == 'Italie')
5 {
6 echo 'vous êtes Italien!<br>';
7 }
8 elseif($monPays == 'Espagne')
9 {
10 echo 'vous êtes Espagnol!<br>';
11 }
12 elseif($monPays == 'Angleterre')
13 {
14 echo 'vous êtes Anglais!<br>';
15 }
16 elseif($monPays == 'France')
17 {
18 echo 'vous êtes Français!<br>';
19 }
20 elseif($monPays == 'Suisse')
21 {
22 echo 'vous êtes Suisse!<br>';
23 }
24 else
25 {
26 echo 'vous n\'avez pas une nationalité connu dans notre liste de possibilités<br>';
27 }

résultat

vous êtes Français!

S'il y a beaucoup de tests à réaliser, l'utilisation de IF, ELSEIF, ELSE va être assez contraignante et peu optimisée pour les performances (temps d'exécution
du serveur plus faible une fois le code mis en ligne avec des multi connexions).

Par conséquent, retenez que dans le cas d'un grand nombre de conditions à tester, il sera préférable d'utiliser la structure conditionnelle switch :

entrainement.php
?
1 <?php
2 $monPays = 'France';
3
4 switch($monPays)
5 {
6 case 'Italie':
7 echo 'vous êtes Italien!<br>';
8 break;
9 case 'Espagne':
10 echo 'vous êtes Espagnol!<br>';
11 break;
12 case 'Angleterre':
13 echo 'vous êtes Anglais!<br>';
14 break;
15 case 'France':
16 echo 'vous êtes Français!<br>';
17 break;
18 case 'Suisse':
19 echo 'vous êtes Suisse!<br>';
20 break;
21 default:
22 echo 'vous n\'avez pas une nationalité connu dans notre liste de possibilités<br>';
23 break;
24 }

Je vous recommande d'être particulièrement vigilant(e) à l'écriture du code dans le mesure où nous alternons des quotes, des point-virgule, des doubles-
point, des accolades, des parenthèses, etc.

résultat

vous êtes Français!

Explications
Nous inscrivons la variable à tester dans les parenthèses de la structure switch.

Nous listons tous les cas à tester avec le mot-clé case et nous délimitons un cas avec le mot-clé break (en remplacement des accolades habituelles).

Le cas par défaut (équivalent du else) est mentionné par le mot-clé default.

41 Différence entre IF et ELSEIF

Beaucoup diront "c'est bon, pas besoin d'expliquer pendant 2 jours ce que veut dire IF et ELSE, on a capté !" mais il est très important de ne pas
confondre les IF et les ELSEIF, et par dessus tout, comprendre pourquoi.

La différence entre IF et ELSEIF :

Les instructions IF seront toutes testées à la chaine, les unes après les autres.
Les instructions ELSEIF seront testées uniquement si les conditions au dessus n'ont pas été évaluées comme TRUE (vrai) et n'ont pas donné satisfaction.

Pour mieux comprendre, voici un exemple avec une série de conditions comprennant plusieurs IF et un ELSE à la fin :

entrainement.php
?
1 <?php
2 $couleur = 'bleu';
3
4 if($couleur == 'bleu')
5 {
6 echo 'votre couleur est préférée est le bleu.<br>';
7 }
8 if($couleur == 'orange')
9 {
10 echo 'votre couleur est préférée est le orange.<br>';
11 }
12 if($couleur == 'rose')
13 {
14 echo 'votre couleur est préférée est le rose.<br>';
15 }
16 else
17 {
18 echo 'nous n\'arrivons pas à determiner votre couleur préférée !!<br>';
19 }

Qu'est-ce que donne ce code ? Voyons ça tout de suite...

résultat

votre couleur est préférée est le bleu.

nous n'arrivons pas à determiner votre couleur préférée !!


Explications
Et oui, vous ne vous trompez pas, le if de la couleur bleue est bien exécuté, mais aussi le else de fin.

Pourquoi ? Et bien c'est simple, l'interpréteur lit les instructions séquentiellement.


Ligne 4 : il voit que la couleur est bleu et rentre dans le IF.
Ligne 8 : la couleur n'est pas orange et ne rentre pas dans le IF.
Ligne 12 : la couleur n'est pas rose et ne rentre pas dans le IF.
Ligne 16 : Puisque la couleur n'était pas rose (cas juste au dessus), il rentre dans le ELSE (cas par défaut) car chaque else se réfère au IF qui le précède
!

C'est donc un problème ! voyons plutôt ce code :

entrainement.php
?
1 <?php
2 $couleur = 'bleu';
3
4 if($couleur == 'bleu')
5 {
6 echo 'votre couleur est préférée est le bleu.<br>';
7 }
8 elseif($couleur == 'orange')
9 {
10 echo 'votre couleur est préférée est le orange.<br>';
11 }
12 elseif($couleur == 'rose')
13 {
14 echo 'votre couleur est préférée est le rose.<br>';
15 }
16 else
17 {
18 echo 'nous n\'arrivons pas à determiner votre couleur préférée !!<br>';
19 }

Cette fois ce code est mieux formulé, voyons ce que ça donne :

résultat

votre couleur préférée est le bleu

Explications
Ligne 4 : il voit que la couleur est bleu et rentre dans le IF.
Ligne 8 : il ne cherche pas à rentrer dans un ELSEIF puisque le IF a été évalué comme étant positif (TRUE, vrai).
Ligne 12 : il ne cherche pas à rentrer dans un ELSEIF puisque le IF a été évalué comme étant positif (TRUE, vrai).
Ligne 16 : il ne cherche pas non plus à rentrer dans un ELSE puisque le IF a été évalué comme étant positif (TRUE, vrai).

En conclusion, nous pouvons dire qu'il y a une réelle et importante différence entre IF et ELSEIF.

Si votre objectif est de prévoir qu'un seul cas possible pour vos conditions, vous devrez privilégier la structure IF / ELSEIF / ELSE ou éventuellement la
structure conditionnelle SWITCH.
Fonction prédéfinie

42 Les Fonctions Prédéfinies

Qu'est-ce qu'une fonction prédéfinie ?

Une fonction est un morceau de code permettant d'automatiser un traitement ou de donner un affichage particulier.

Dans la langue Française, vous avez la possibilité de consulter un dictionnaire pour voir les mots et expressions existant(e)s.

Tout comme notre langue, Php possède plusieurs mots-clés et fonctions déjà existants dans le langage, nous pourrons les retrouver dans la documentation

officielle de PHP.

43 Afficher la date du jour avec la fonction date()

Prenons un exemple pour afficher la date du jour :

entrainement.php
?
1 <?php
2 echo 'Date : <br>';
3 echo date("d/m/Y");

Lorsque vous voyez un mot-clé (qui n'est pas le votre), en anglais, suivi de parenthèse, c'est qu'il s'agit d'une fonction prédéfinie de PHP.
résultat

10/04/2016

Explications

La fonction date permet d'afficher la date avec les arguments suivants :

d : pour day (jour)

m : pour month (mois)

Y : pour année

Le fait de mettre les arguments (d/m/Y) en minuscule ou majuscule à une incidence sur le résultat. Faites le test !

44 Qu'est-ce qu'un argument ?

Un argument (aussi appelé paramètre) est une information entrante dans la fonction.

45 Afficher la taille d'une chaine avec la fonction strlen()

entrainement.php
?
1 <?php
2 $phrase = 'Mettez une phrase différente ici à cet endroit!';
3 echo strlen($phrase);

Nous transmettons l'argument (argument = paramètre) $phrase à la fonction prédéfinie strlen().

résultat

47

strlen() est une fonction prédéfinie permettant de retourner la taille (nombre de caractères) d'une chaine.

Les valeurs de retours sont :


- En cas de succès : INT
- En cas d'échec : BOOLEAN FALSE

Argument(s) :
1. Nous devons lui fournir la chaine à évaluer (pour connaitre la taille).

Il faut lui envoyer un texte, une phrase ou un mot (par l'intermédiaire d'une variable ou non), car pour vous renvoyer "la taille de quelque chose", il lui
faut ce "quelque chose", cette fonction a donc besoin d'une information de départ pour compter le nombre de caractères, on appelle cette information un
argument (ou paramètre).

Contexte : cela pourra être pratique lorsque nous souhaiterons connaitre le nombre de caractères dans un pseudo qui nous est transmis (lors d'une
inscription).
46 Couper une chaine avec la fonction substr()

entrainement.php
?
1 <?php
2 $texte = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy
3 text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived
not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.";
echo substr($texte, 0, 20) . "...<a href="\"\""> Lire la suite </a>";

Nous transmettons l'argument (aussi appelé paramètre) $texte à la fonction prédéfinie substr() ainsi que 2 nombres (int).

résultat

Lorem Ipsum is simpl... Lire la suite

substr() est une fonction prédéfinie permettant d'afficher une partie coupée d'une chaine.

Les valeurs de retours sont :


En cas de succès : STRING
En cas d'échec : BOOLEAN FALSE

Argument(s) attendus :
1. nous devons lui fournir la chaine que l'on souhaite couper (string)
2. nous devons lui préciser la position de début (int)
3. nous devons lui préciser la position de fin (int)

Dans le cas présent, nous lui demandons d'afficher seulement les 20 premiers caractères de notre phrase (0,20).
Vous pouvez demander les 50 premiers caractères en modifiants les arguments entrants par : 0,50.

Contexte: substr est souvent utilisé pour afficher des actualités avec une "accroche".
Sur le web, il n'est pas rare de voir le début d'un article (l'accroche) puis ...lire la suite.

Cela ne veut pas dire que c'est toujours fait avec la fonction substr, parfois le texte affiché est un résumé et non le début de l'article.

Pour ne pas couper un mot il y a d'autres fonctions prédéfinies qui existent.

47 Tester l'existance d'une variable avec isset()

Il est possible de se servir de fonction prédéfinie dans le cadre de nos conditions, voici un exemple avec ISSET :

entrainement.php
?
1 <?php
2 $pseudo = "joker";
3 if(isset($pseudo))
4 {
5 echo 'la variable $pseudo existe!<br>';
6 }
7 else
8 {
9 echo 'la variable $pseudo n\'existe PAS!<br>';
10 }

Résultat

la variable $pseudo existe!


Autre cas, cette fois-ci, sans déclarer la variable $pseudo :

entrainement.php
?
1 <?php
2 if(isset($pseudo))
3 {
4 echo 'la variable $pseudo existe!<br>';
5 }
6 else
7 {
8 echo 'la variable $pseudo n\'existe PAS!<br>';
9 }

Résultat

la variable $pseudo n'existe PAS!

isset() est une fonction prédéfinie permettant de dire si une variable existe ou non (et différent de null).

Les valeurs de retours sont :


En cas de succès : boolean TRUE (la variable existe)
En cas d'échec : boolean FALSE (la variable n'existe pas)

Argument(s) attendus :
1. nous devons lui fournir la variable que l'on souhaite tester

48 Tester le contenu d'une variable avec empty()

Différent de isset, voici un exemple avec la fonction prédéfinie EMPTY :

entrainement.php
?
1 <?php
2 $pseudo = "joker";
3 if(empty($pseudo))
4 {
5 echo 'la variable $pseudo est vide!<br>';
6 }
7 else
8 {
9 echo 'la variable $pseudo n\'est pas vide (et est donc remplie).<br>';
10 }

Résultat

la variable $pseudo n'est pas vide (et est donc remplie)!

Autre cas, cette fois-ci, sans remplir la variable $pseudo :

entrainement.php
?
1 <?php
2 $pseudo = "";
3 if(empty($pseudo))
4 {
5 echo 'la variable $pseudo est vide!<br>';
6 }
7 else
8 {
9 echo 'la variable $pseudo n\'est pas vide (et est donc remplie)!<br>';
10 }

Résultat

la variable $pseudo est vide!


empty() est une fonction prédéfinie permettant de dire si une variable est vide ou non. (False sera considéré comme empty).

Les valeurs de retours sont :


En cas de succès : boolean TRUE (la variable est vide)
En cas d'échec : boolean FALSE (la variable n'est pas vide et est donc remplie)

Argument(s) attendus :
1. nous devons lui fournir la variable que l'on souhaite tester

Il est également possible de demander l'inverse "si ça n'est pas vide" avec l'opérateur !

entrainement.php
?
1 <?php
2 $pseudo = "joker";
3 if(!empty($pseudo))
4 {
5 echo 'la variable $pseudo n\'est pas vide (et est donc remplie)!<br>';
6 }

La simple présence du "!" (point d'exclamation) dans les parenthèses du IF permet de changer le sens de la condition, cette fois nous demandons : est-ce
que la variable $pseudo n'est pas vide ? (en gros, est-elle remplie ?).

Résultat

la variable $pseudo n\'est pas vide (et est donc remplie)!

De nombreuses autres fonctions prédéfinies existent et pour toute sorte de chose, nous y reviendrons, d'ici là vous pouvez mettre en favoris le site de la
documentation officielle de PHP.

On dit souvent qu'un bon développeur n'est pas celui qui connait le code par coeur mais celui qui sait lire et interpréter une documentation, avoir les bons mots-
clés dans ses recherches Google, et être autonome dans l'exploitation et la mise en oeuvre du code.

Fonction utilisateur

49 Les Fonctions Utilisateur

Qu'est-ce qu'une fonction utilisateur ?

Une fonction est un morceau de code permettant d'automatiser un traitement ou de donner un affichage particulier.

Cela permet également de ré-utiliser un morceau de code à plusieurs reprises.

Imaginez la problématique suivante :

Vous souhaitez calculer votre imposition, cela vous demande plusieurs lignes de calcul, de la réflexion et vous finissez par y parvenir.

Ensuite, vous devrez reprendre ces lignes chaque année puisque l'imposition est annuelle.

Plutôt qu'effectuer un copier/coller, il serait judicieux d'enfermer votre calcul dans une fonction que vous pourrez rappeler à tout moment lorsque vous en

aurez envie.

D'autre part, votre situation peut changer, vous vous mariez et avez des enfants, le calcul d'imposition n'est plus le même (car vous avez le droit a des

abatements).

Plutôt que modifier le coeur de votre calcul, vous pourriez ajouter ce que l'on appelle des paramètres (ou arguments). Ce sont des informations variables

qui peuvent venir modifier le comportement initialement prévu par la fonction ou bien compléter son traitement.

De cette manière votre fonction sera adaptée à tout le monde et à toutes les situations possibles (marié ou célibataire, avec ou sans enfants), pour
l'appliquer il faudra juste le préciser au moment d'exécuter la fonction.

A l'inverse des fonctions prédéfinies (qui sont déjà prévues par le langage), c'est à nous d'écrire nos propres fonctions spécifiques (lorsqu'aucune fonction

de la documentation peut nous convenir).

Cela pourrait s'appeler fonction développeur.

50 Créons notre première fonction pour calculer une TVA

Prenons le contexte d'un site ecommerce qui aura besoin d'ajouter la TVA sur ses produits.

Déclarons notre première fonction pour calculer la TVA sur 100 € :

entrainement.php
?
1 <?php
2 // déclaration d'une fonction
3 function calculTva()
4 {
5 return 100*1.2;
6 }
7
8 // exécution de notre fonction
9 echo calculTva() . '<br>';

Résultat

120

Explications

Pour déclarer une fonction, nous utilisons le mot-clé function et ensuite nous lui donnons un nom (sans espace, ni accent), ici elle s'appelle :
calculTva.

Les parenthèses permettent de préciser s'il y a des arguments entrants, ce n'est pas notre cas, notre fonction est donc destinée à ne pas recevoir
d'arguments.

Les accolades définissent le périmètre de la fonction. A l'intérieur des accolades nous pouvons écrire des lignes de traitement PHP (ces lignes feront partie
de la fonction).

le mot-clé return est utilisé pour retourner un résultat. Il est en général placé à la fin pour terminer la fonction.

Le calcul 120*1.2 (100 multiplié par 1, puis 0.2 fait bien 120). 1.2 correspond bien à 20 % (la TVA Française la plus courante en vigueur).

51 Créons une fonction avec un argument pour faire plus de calculs

Le site ecommerce (que nous avons pris comme sujet) ne vendra pas que des produits à 100 €.

Nous allons améliorer notre fonction afin de pouvoir effectuer tous les calculs et non pas que sur un nombre fixe de 100 €.

Pour cela nous allons avoir besoin d'un argument entrant (le prix, ici appelée $nombre) :

entrainement.php
?
1 <?php
1 <?php
2 // déclaration d'une fonction
3 function calculTva2($nombre)
4 {
5 return $nombre*1.2;
6 }
7
8 // exécution de notre fonction
9 echo calculTva2(500) . '<br>';
10 echo calculTva2(1000) . '<br>';

Résultat

600

1200

Explications

Cette fois-ci, dans les parenthèses de notre déclaration de fonction, nous avons prévu une variable nommée $nombre, cette variable pourrait très bien être
nommée $x ou $y. Peu importe tant qu'il y'a une variable de réception de prévue. J'ai choisi de la nommer $nombre car c'est plus cohérent avec le sujet.

Le calcul a également changé, ce n'est plus 100*1.2 car ce calcul est fixe et donne toujours le même résultat. Cette fois-ci nous allons calculer 20% sur

le nombre que nous allons recevoir $nombre*1.2, et il peut donc changer à tout moment.

En effet, une fonction est déclarée une fois mais peut être exécutée autant de fois que nécessaire.

Dans notre cas nous réalisons une première exécution :


?
1 echo calculTva2(500) . '<br>';

Ce qui donne comme calcul : 500 * 1.2 = 600 €

Et, une deuxième exécution :


?
1 echo calculTva2(1000) . '<br>';

Ce qui donne comme calcul : 1000 * 1.2 = 1200 €

La fonction a été renommée en calculTva2 pour éviter tout conflit avec la 1ère fonction calculTva si vous l'aviez gardée présente dans le même fichier.
En effet, nous ne pouvons pas déclarer 2 fonctions du même nom au sein du même fichier au risque d'avoir une erreur du type : Fatal error: Cannot
redeclare ... (previously declared in ...) on line ...

Ce message d'erreur précise l'endroit de la 1ère déclaration afin que vous puissiez faire un choix entre garder la première, ou la deuxième ou
éventuellement fusionner les deux.

Au moment de la déclaration, lorsqu'une fonction est destinée à recevoir 1 argument, vous devrez obligatoirement lui envoyer 1 argument au moment de
l'exécution au risque d'avoir une erreur du type : Warning: Missing argument ... for ...()

Pour une meilleure compréhension, voici le chemin parcouru par l'argument :


52 Créons une fonction avec un argument pour faire tous les calculs possibles

Dans notre précédente fonction utilisateur, nous pouvions calculer la TVA de nimporte quel nombre mais pas avec nimporte quel taux de TVA.

Nous allons améliorer notre fonction afin de pouvoir effectuer tous les calculs sur tous les nombres et sur tous les taux de TVA

Nous allons avoir besoin de deux arguments entrants :

entrainement.php
?
1 <?php
2 // déclaration d'une fonction
3 function calculTva3($nombre, $taux)
4 {
5 return $nombre*$taux;
6 }
7
8 // exécution de notre fonction
9 echo "500 € avec un taux de 5.5 % font : " . calculTva3(500, 1.055) . '<br>';
10 echo "1000 € avec un taux de 20 % font : "calculTva3(1000, 1.2) . '<br>';

Résultat

527.5

1200

Explications

Cette fois-ci, dans les parenthèses de notre déclaration de fonction, nous avons prévu deux variable nommées $nombre et $taux. Ce qui implique qu'il

faudra transmettre 2 informations au moment de l'exécution.

Le calcul a également changé, c'est $nombre*$taux. Le nombre et le taux peuvent changer à tout moment.

Dans notre cas nous réalisons une première exécution :


?
1 echo calculTva3(500) . '<br>';

Ce qui donne comme calcul : 500 * 1.055 = 527.5 €

Et, une deuxième exécution :


?
1 echo calculTva3(1000) . '<br>';

Ce qui donne comme calcul : 1000 * 1.2 = 1200 €

La fonction a été renommée en calculTva3 pour éviter tout conflit avec la 1ère fonction calculTva et calculTva2 si vous l'aviez gardée présente dans
le même fichier.
Au moment de la déclaration, lorsqu'une fonction est destinée à recevoir 2 arguments, vous devrez obligatoirement lui envoyer les 2 arguments au moment
de l'exécution, ne l'oubliez pas !

Dans une fonction nous pouvons déclarer autant de receptions d'argument que l'on souhaite à condition de les transmettre au moment de l'exécution. Si le
nombre d'arguments est conséquent, il est préférable de passer par une variable array.

53 Argument facultatif par défaut

Nous l'avons dit, si votre fonction est destinée a recevoir 1 argument c'est qu'il faut lui envoyer obligatoirement 1 argument, si elle est destinée a recevoir
2 arguments, il faut lui en envoyer 2 et ainsi de suite...
Toutefois, il est possible que votre fonction attende 2 arguments mais en déclarant l'un d'entre eux comme étant facultatif !
Pour rendre un argument facultatif, il faut absolument lui déclarer une valeur par défaut.

Reprenons notre calcul de TVA :

entrainement.php
?
1 <?php
2 // déclaration d'une fonction
3 function calculTva4($nombre, $taux = 1.2)
4 {
5 return $nombre*$taux;
6 }
7
8 // exécution de notre fonction
9 echo calculTva4(1500) . '<br>'; // exécution de la fonction avec 1 seul argument
10 echo calculTva4(800, 1.07) . '<br>'; // exécution de la fonction avec 2 arguments

Résultat

1800

856

Explications

La première fois la fonction est exécutée avec un seul argument. C'est donc le taux de TVA par défaut 1.2 qui est pris en compte.

La seconde fois la fonction est exécutée avec deux arguments. et le taux 1.07 vient remplacer le taux par défaut (1.2) qui ne sera pas appliqué en
présence d'un argument choisi.

On peux donc dire que nous avons une fonction destinée à recevoir 2 arguments, mais qu'1 seul peut suffire.

Si un seul argument est envoyé, le taux par défaut est appliqué soit 1.2 :

?
1 function calculTva4($nombre, $taux = 1.2)

En présence du 2e argument (lors de l'exécution) il est prioritaire et le taux par défaut (1.2) n'est pas appliqué.

?
1 calculTva4(800, 1.07)

54 Opérateurs Arithmétiques

Puisque nous parlons de calcul de TVA et de multiplications, voici ci-dessous quelques opérateurs arithmétiques

Dérrière ce mot impressionnant se cache simplement des additions, soustractions, multiplications et divisions que des élèves de ce2 pourraient faire :). C'est
souvent comme ça en informatique, sont utilisés "certains mots qui font peur" ou qui font croire qu'il faut bac+5 pour les comprendre et les maitriser alors
qu'avec des explications correctes il n'en est rien, du moment que c'est bien expliqué.

entrainement.php
?
1 <?php
2 $a = 10 ; $b = 2 ;
3 echo $a + $b . '<br>'; // affiche 12 (addition 10 + 2)
4
5 echo $a - $b . '<br>'; // affiche 8 (soustraction 10 - 2)
6
7 echo $a * $b . '<br>'; // affiche 20 (multiplication 10 * 2)
8
9 echo $a / $b . '<br>'; // affiche 5 (division 10 / 2)
10
11 echo $a % $b . '<br>'; // affiche 0 (reste de la division 10 / 2)

Résultat

12

20

Jusque la, rien de bien difficile !

Nous pouvons aussi réaliser ces opérations en affectant une variable (dans la même exécution) :

entrainement.php
?
1 <?php
2 $a += $b ; // équivaut à $a = $a + $b (ici $a vaut 12, voir ci-dessus)...10+2
3 $a -= $b ; // équivaut à $a = $a - $b (ici $a vaut 12)...12-2

Résultat

12

10

Explications :

$a += $b est pareil que $a = $a + $b


Cette notation de code peut être pratique lors d'un calcul sur un panier de site ecommerce.

55 Exercice fonction

Voici une simple fonction permettant de formuler une phrase au sujet de la météo :

entrainement.php
?
1 <?php
2 meteo("hiver", 5); // il est possible d'exécuter une fonction avant qu'elle soit déclarée dans le code.
3 function meteo($saison, $temperature) // 2 arguments attendus
4 {
5 echo "Nous sommes en $saison et il fait $temperature degrés<br>";
6 }
Comme vous pouvez le constater, cette fonction attend 2 arguments, c'est la raison pour laquelle nous lui envoyons 2 arguments "hiver" et "5".

Résultat

Nous sommes en hiver et il fait 5 degrés

Imaginons que nous envoyons le chiffre 1 en 2e argument, cela afficherait "1 degrés" avec une faute de Français pour le "s", du coup notre exercice va
être de gérer le pluriel et le singulier en fonction du nombre envoyé.

Exercice : pourriez-vous gérer le cas de la lettre S sur le mot degré en fonction du nombre envoyé ?

Pour 1 degré, cela doit s'écrire : 1 degré et non pas 1 degréS


Pour 2 degrés, cela doit s'écrire : 2 degrés et non pas 2 degré

Ne regardez pas la correction si vous souhaitez jouer le jeu

entrainement.php
?
1 <?php
2 meteo("hiver", 1); // il est possible d'exécuter une fonction avant qu'elle soit déclarée dans le code.
3 function meteo($saison, $temperature) // 2 arguments attendus
4 {
5 echo "Nous sommes en $saison et il fait $temperature";
6 if($temperature > 1 || $temperature < -1) echo " degrés<br>";
7 else echo " degré<br>";
8 }

Résultat

Nous sommes en hiver et il fait 1 degré

Nous pouvons remarquer le résultat sans la présence du S au mot degré

Vous pouvez constater que lorsque nous écrivons un IF / ELSE avec une seule instruction à l'intérieur nous pouvons le mettre sur la même ligne sans
accolades.

Cependant dans la majorité des cas, il est préférable de garder les accolades.

Attention, comme vous le savez le nombre d'arguments qu'attend une fonction est important, mais l'ordre des arguments l'est tout autant !
Voici un mauvais exemple avec l'inversion de l'ordre des arguments :

entrainement.php
?
1 <?php
2 meteo(30, "été"); // il est possible d'exécuter une fonction avant qu'elle soit déclarée dans le code.
3 function meteo($saison, $temperature) // 2 arguments attendus
4 {
5 echo "Nous sommes en $saison et il fait $temperature";
6 if($temperature > 1 || $temperature < -1) echo " degrés<br>";
7 else echo " degré<br>";
8 }

Cet exemple affichera :


Résultat

Nous sommes en 1 et il fait été degré

Nous pouvons donc constater que le nombre et l'ordre des arguments sont vraiment importants !

56 Portée des variables : espace global et espace local


Ce chapitre risque d'être abstrait sur le coup mais très important et indispensable lors de la création d'un site web.
je vous recommande donc de suivre les explications. Concentrez-vous :)

Qu'est-ce qu'un espace local ?

Un espace local est le code déclaré à l'intérieur d'une fonction.


Exemple :

entrainement.php
?
1 <?php
2 function affichageVille()
3 {
4 $ville = "Lyon"; // variable locale.
5 }

On dit que la variable $ville est déclarée dans un espace local.

Qu'est-ce qu'un espace global ?

Un espace global est le code déclaré à l'extérieur d'une fonction (partout ailleurs).
Exemple :

entrainement.php
?
1 <?php
2 function affichageVille()
3 {
4 // ...
5 }
6
7 $ville2 = "Marseille"

On dit que la variable $ville2 est déclarée dans l'espace global (espace par défaut).

Quelle est la différence entre 1 espace local et 1 espace global ?

Mieux qu'une succesion d'explications, voici une image qui représente parfaitement la chose :
Problématique avec l'espace local

entrainement.php
?
1 <?php
2 function affichageVille()
3 {
4 $ville = "Lyon"; // variable locale.
5 }
6 affichageVille();
7 echo $ville; // /!\ ne fonctionne pas car cette variable n'est connu qu'à l'intérieur de la fonction

Ce code ne fonctionnera pas, voici ce qu'il affichera :

Résultat

Notice: Undefined variable: ville in C:\wamp\www\php\entrainement.php on line ...

Quelques Explications :

Ligne 1 : Nous déclarons une fonction affichageVille().


Ligne 3 : Nous déclarons une variable locale. variable locale = variable déclarée à l'intérieur d'une fonction.
Ligne 5 : Exécution de la fonction... (dans le vide)
Ligne 6 : Tentative d'affichage de la variable locale $ville déclarée à l'intérieur de la fonction.

Nous obtenons une erreur car en dehors de la fonction (au dessus et en dessous) nous sommes dans un espace global (c'est l'espace par défaut), alors
qu'à l'intérieur de la fonction nous sommes dans un espace local.
Les informations de l'espace local ne sont pas connues dans l'espace global et vice-versa.

Comment véhiculer des informations de l'espace local vers l'espace global ?

Pour faire passer des informations déclarées dans l'espace local vers l'espace global, voici le code que nous pourrions mettre en oeuvre :

entrainement.php
?
1 <?php
2 function affichageVille()
3 {
4 $ville = "Lyon"; // variable locale.
5 return $ville; // une fonction peut retourner qqchose (à ce moment là on quitte la fonction)
6 echo 'test'; // /!\ cette ligne ne s'affichera pas car il y a un return avant.
7 }
8 $villeRecu = affichageVille();
9 echo $villeRecu;

Résultat

Lyon

Quelques Explications :

Ligne 1 : Nous déclarons une fonction affichageVille().


Ligne 3 : Nous déclarons une variable locale. variable locale = variable déclarée à l'intérieur d'une fonction.
Ligne 4 : Return permettra lors de l'exécution de la fonction, de retourner le contenu de la variable $ville (pour en avoir connaissance à l'extérieur de la
fonction).
Ligne 5 : Ajout d'un echo qui n'a aucun rapport, juste pour montrer qu'après un return nous quittons la fonction et la suite du code n'est pas exécutée.

Nous ne verrons pas le mot "test" s'afficher dans le résultat.


Ligne 7 : Nous récupérons l'exécution de la fonction dans une variable, la variable $villeRecu contiendra le contenu du return de la fonction

affichageVile() c'est à dire "Lyon".


Ligne 8 : Nous affichons le contenu de la variable $villeRecu soit "Lyon".

En conclusion, nous pouvons donc dire que l'utilisation du mot-clé return permettra de faire passer des informations déclarées en local dans l'espace
global.

Lorsque vous crérez une fonction perso, pensez à l'utilisation du mot-clé return pour préciser ce que votre fonction devra renvoyer !

Comment véhiculer des informations de l'espace global vers l'espace local ?

De la même manière, si les informations déclarées en local ne sont pas connues en global, nous retrouverons la même problématique dans l'autre sens
(déclaration de variable en global et utilisation souhaitée en local).

Problématique avec l'espace global

entrainement.php
?
1 <?php
2 $pays = 'France';
3 function affichagePays()
4 {
5 echo $pays; // générera une erreur PHP.
6 }
7 affichagePays();

Résultat

Notice: Undefined variable: pays in C:\wamp\www\php\entrainement.php on line ...

Quelques Explications :

Ligne 1 : Nous déclarons une variable $pays dans l'espace global (et oui nous sommes bien dans l'espace global puisque nous sommes à l'extérieur d'une

fonction).
Ligne 2 : Déclaration d'une fonction utilisateur.
Ligne 4 : Affichage de la variable $pays.

Ligne 6 : Exécution de notre fonction affichagePays().


Suite à l'exécution de notre fonction affichagePays(), nous aurons une erreur sur la variable $pays qui apparaitra pour l'interpréteur comme étant

indéfinie (undefined).
Cette erreur est normale dans la mesure où la variable est déclarée en global et on tente de l'afficher en local.

Pour faire passer des informations déclarées dans l'espace global vers un espace local (une fonction), voici le code que nous pourrions mettre en oeuvre :

entrainement.php
?
1 <?php
2 $pays = 'France';
3 function affichagePays()
4 {
5 global $pays; // importe la variable pays de l'espace global
6 echo $pays;
7 }
8 affichagePays();

Résultat

France

Quelques Explications :

Ligne 4 : Le mot-clé global permet d'importer une variable de l'espace global vers l'espace local, en l'ocurrence la variable $pays.

Nous aurions également pu envoyer $pays en argument à notre fonction.


Retenez bien que vous aurez besoin du mot-clé global lorsque vous aurez besoin de connaitre une variable dans une fonction.
Exemple : la connexion vers une base de données peut être représentée par une variable globale, et les requêtes SQL (permettant de récupérer des
données) pourraient se trouver dans des fonctions locales, du coup il faudrait connaitre la connexion globale pour effectuer des requetes en local.

En conclusion, global permet d'importer des informations globales dans un espace local. return permet de sortir des informations locales dans l'espace

global.

Boucle

57 Boucle (structures itératives)

Les boucles (structures itératives) est un moyen de faire répéter une portion de code plusieurs fois.

Nous appelons structure itérative (ou récursive), la structure qui permet d'exécuter plusieurs fois les mêmes instructions. Elle permet d'exécuter "en boucle"

un bloc d'instructions.

En 1 mot : Une boucle c'est une répétition !

58 Comprendre le principe des boucles

Là aussi, il s'agit d'un des chapitres les plus importants de notre apprentissage puisque tous les sites dynamiques du monde incluent forcément un
système de boucle à un moment donné.
Contexte : cela sera très utile au moment d'afficher une liste de produits sur un site ecommerce.

Imaginez que le code html suivant permet d'afficher l'un de vos produits :

entrainement.php
?
1 <?php
2 <div class="produit">
3 <h2>Tshirt Gris</h2>
4 <img src="tshirt.png">
5 <p>30 €</p>
6 <form method="post" action=""><input type="submit" name="ajout_panier" value="ajout au panier"></form>
7 </div>

PS : Ce code représente un exemple, il n'est pas à prendre à la lettre pour construire votre page produit ;).

Résultat (exemple)

Si vous aviez besoin d'afficher 50 produits par page, pensez-vous que vous copier/collerez votre code html 50 fois ?

NON ! bien entendu ce n'est pas comme cela que ça fonctionne pour plusieurs raisons.

Avec les boucles, nous allons déclarer 1 seule fois le code et le répéter 50 fois automatiquement (50 fois ou autant de fois que ce que l'on souhaite).

Résultat (exemple)
Bien entendu, dans la version finale les produits seront différents les uns des autres mais le principe est là.

Vous comprenez le principe et l'intérêt des boucles ?

Nous allons donc voir en pratique avec le code comment nous pourrions enclencher ce phénomène de répétition.

Soyons clair, les boucles c'est un sujet capital, dire "je ne comprends pas" ou "ca ne m'interesse pas, j'attends le concret" revient à dire "je ne
programmerais pas de site web dans ma vie".

4 techniques de boucles (répétition) : while, do-while, for, foreach.

59 La boucle While

entrainement.php
?
1 <?php
2 $i = 0; // valeur de départ
3 while ($i<5) // tant que $i est inférieur à 5
4 {
5 echo "$i /"; // affichage
6 $i++; // Ceci est une forme contractée de : $i = $i+1; l'incrémentation du "compteur" est effectuée à chaque tour de boucle.
7 }

Quelques Explications :

Tour de boucle 0
Ligne 2 : nous déclarons une variable $i et lui affectons la valeur 0

Nous utilisons en général une variable que l'on nomme $i pour INT (interger) mais nous aurions pu la nommer complétement différemment, il n'y a pas
d'obligations, juste des usages.

Ligne 3 : While (notre boucle) peut être traduit par "Tant que", ce qui donne tant que $i est inférieur à 5, nous rentrons dans la boucle.
Est-ce que $i est bien inférieur à 5 ? Oui pusique $i est égal à 0. (c'est ce que nous avons déclaré sur la ligne d'au dessus).
Ligne 5 : Nous affichons la valeur contenue dans la variable $i.
Qu'elle est cette valeur ? 0 ! et oui puisque nous avons mis $i = 0; il n'y a pas de raison que cette variable nous donne une autre valeur que 0.

Cela affichera donc "0 /", nous avons mis un slash de séparation mais nous aurions pu choisir un autre caractère.

Ensuite, si nous devons enclencher ce fameux phénomène de répétition (la boucle) il nous faut un système qui puisse compter et progresser dans le
nombre de tours que l'on effectuera dans notre boucle.
D'accord pour répéter une portion de code mais combien de fois ? pas à l'infini quand même !

Ligne 6 : Nous utilisons $i++; (forme contractée de $i = $i + 1) afin de rendre cette variable évolutive.

$i est la variable qui permettra d'entrer dans la boucle afin d'effectuer des tours.
C'est à dire que lorsque cette ligne s'exécutera, $i passera de 0 à 1. puis ensuite de 1 à 2. et ainsi de suite...

Au moment où la ligne 6 nous permet d'incrémenter notre variable $i, l'interpréteur remonte automatiquement (dans le cas d'une boucle comme ici) sur la
ligne 3 pour tenter d'exécuter à nouveau son contenu.

Ca veut dire que nous remontons dans le code et revenons sur la ligne n°3 !

Tour de boucle 1
Ligne 3 : Par conséquent, l'interpréteur test à nouveau la condition d'entrée dans la boucle : est-ce que $i est bien inférieur à 5 ?
Oui, encore 1 fois ! puisque cette fois-ci $i est passé à 1 (grâce au $i++; vu précedemment).

1 est bien inférieur a 5, nous rentrons à nouveau dans la boucle while.

Ligne 5 : Nous affichons à nouveau la valeur contenue dans la variable $i.

Cela affichera "1 /".

Ligne 6 : Nous repassons sur la ligne $i++; (forme contractée de $i = $i + 1) afin de passer $i à 2.

L'interpréteur remonte à nouveau dans le code (ligne 3 précisément) et nous observons à nouveau le cycle suivant :

Tour de boucle 2
Ligne 3 : la condition d'entrée renvoie TRUE (vrai) et nous entrons à nouveau dans la boucle while (puisque $i 2 < 5).
Ligne 5 : Nous affichons "2 /" (instruction d'affichage echo).
Ligne 6 : Nous incrémentons $i à 3 (2+1)

Tour de boucle 3
Ligne 3 : la condition d'entrée renvoie TRUE (vrai) et nous entrons à nouveau dans la boucle while (puisque $i 3 < 5).
Ligne 5 : Nous affichons "3 /" (instruction d'affichage echo).

Ligne 6 : Nous incrémentons $i à 4 (3+1)

Tour de boucle 4
Ligne 3 : la condition d'entrée renvoie TRUE (vrai) et nous entrons à nouveau dans la boucle while (puisque $i 4 < 5).
Ligne 5 : Nous affichons "4 /" (instruction d'affichage echo).

Ligne 6 : Nous incrémentons $i à 5 (3+1)

Ensuite l'interpréteur tente de retourner ligne 3 pour exécuter à nouveau la boucle mais ça n'est pas possible dans la mesure où $i est passé à 5 et 5
n'est pas inférieur à 5.

Résultat Final

0 / 1 / 2 / 3 / 4

De 0 à 4, ça fais bien 5 tours au total !

Reprenons les explications une à une :

?
1 $i = 0;

C'est ce qui représente notre valeur de départ.

?
1 while
Nous pouvons remplacer "while" par "tant que".

?
1 ($i<5)

C'est ce qui représente notre condition d'entrée dans la boucle ($i doit forcément être inférieur à 5 pour que l'on puisse rentrer).
Nous avons mis 5 pour réaliser 5 tours mais nous aurions pu mettre 10, 20, 100 ou le nombre que vous souhaitez.

?
1 while($i<5)

Traduction : Tant que $i est inférieur à 5 nous rentrons dans la boucle.


Notre condition d'entrée c'est ce qui permet de ne pas avoir une boucle infinie et de pouvoir s'arreter à un moment donné (après 5 tours).

?
1 { }

Les accolades permettent de fixer le périmètre de la boucle

?
1 echo "$i /";

Affiche le chiffre contenu dans la variable $i suivi d'un slash "/"

?
1 $i++;

$i est incrémenté (indispensable pour faire tourner la boucle), c'est l'équivalent de $i = $i + 1; et nous en avons besoin pour enclencher "le tour

suivant" à chaque fois.

?
1 <?php
2 $i = 0;
3 while ($i<5)
4 {
5 echo "$i /";
6 $i++;
7 }

Ce cycle est repétée 5 fois (5 tours de boucle).

60 La boucle DoWhile

Concernant la boucle do-while, il s'agit exactement du même principe que la boucle while, la seule différence réside dans le fait que la condition d'entrée
est testée à la fin plutôt qu'au début.

On entre d'abord et ensuite on vérifie si l'on peux continuer à boucler.

entrainement.php
?
1 $i = 0;
2 do {
3 echo $i;
4 } while ($i > 0);

Cette boucle ne fera qu'un seul tour car $i n'est pas supérieur à 0.

Nous l'utiliserons plus rarement, plutôt dans des cas spécifique.

Vous pouvez la garder à l'esprit pour savoir qu'elle existe si on vous en parle ou que vous la croisez dans un code mais vous n'êtes pas obligé de la connaitre par
coeur.

61 La boucle For

Tout comme la boucle while, l'objectif de cette boucle est aussi d'effectuer une répétition de code.
La structure est légérement différente au niveau de la syntaxe :

entrainement.php
?
1 for($j = 0; $j <= 15; $j++)
2 {
3 echo $j;
4 }

Quelques Explications :

?
1 for($j = 0; $j <= 15; $j++)

Voici à quoi correspond notre boucle :

$j= 0; - Valeur de départ c'est l'initialisation qui indique la variable qui servira de compteur ainsi que sa valeur initiale.
$j <= 15; - Condition d'entrée condition pour continuer les boucles. L'instruction s'achève dès que la condition renvoie faux.

$j++ - Evolution : évolution du compteur à chaque tour de boucle (généralement une incrémentation ou décrémentation).

?
1 echo $j;

L'instruction echo permet d'afficher la valeur contenue dans la variable $j.

Résultat

0123456789101112131415

La boucle fait 16 tours au total, de 0 à 15.

Exercice : serait-il possible de passer les nombres à la ligne les uns à la suite des autres ?

Voici le résultat attendu :

Résultat

4
5

10

11

12

13

14

15

A vous de jouer ! et ne regardez pas la correction en dessous avant d'y être parvenu, ça vous entrainera !

Correction :

entrainement.php
?
1 for($j = 0; $j <= 15; $j++)
2 {
3 echo "<p>$j</p>";
4 }

Il suffisait de mettre un <br> ou de faire appel aux balises <p> </p> pour faire succéder à la ligne les différents chiffres écrits par notre boucle.

En effet, avec l'écriture des balise <p> </p> ou <br> une seule fois, cela se répétera autant de fois que demandé puisque nous sommes dans les

accolades de la boucle et donc dans l'effet de répétition.

Pensez à regarder le code-source généré ! Ctrl+U ou clic droit -> code source de la page

Autre exercice, maintenant que vous avez vu que l'on pouvait mélanger du code php et html dans le cadre des boucles, pourriez vous proposer un champ
date de naissance en prévoyant les 31 jours existants dans notre calendrier :

Voici le résultat attendu :

Résultat attendu Quel est votre jour de naissance ?

L'exercice est donc de parvenir à ce résultat sans faire de copier/coller. A vous de jouer !

Pour vous aider (si vous aviez un doute sur le code html), voici les lignes permettant d'obtenir une liste de choix déroulante :

entrainement.php
?
1 <select>
2 <option>1</option>
3 <option>2</option>
4 </select>
5

L'objectif est donc d'avoir 1 seul select et 31 options (sans les écrire manuellement, sinon je vous en demande 10 000, on verra si vous faites toujours des
copiers/coller =D).

Voici la correction :

entrainement.php
?
1 echo '<select>';
2 for($j = 1; $j <= 31; $j++)
3 {
4 echo "<option>$j</option>";
5 }
6 echo '</select>';

Nous voulions qu'1 seul <select> mais 31 options, c'est la raison pour laquelle le select se trouve en dehors des accolades de la boucle (nous ne
souhaitons pas qu'il soit répété), les options se trouvent dans les accolades de notre boucle (pour qu'elles bénéficient de l'effet de répétition).

Nous commençons la boucle a 1, car personne est né le 0 ! nous nous arretons a 31 (car personne est né le 32).
Il y aura donc 31 tours et 31 options.

Nous aurions pu créer cette boucle dans l'autre sens ( de 31 à 1 et non de 1 à 31 ), on parle alors de décrémentation :

entrainement.php
?
1 echo '<select>';
2 for($j = 31; $j >= 1; $j--)
3 {
4 echo "<option>$j</option>";
5 }
6 echo '</select>';

Nous commençons notre compteur ($j) à 31,


Tant que nous sommes supérieur ou égal à 1 nous rentrons dans la boucle
$j-- permet de baisser le nombre à chaque tour afin de faire progresser la boucle

Résultat attendu Quel est votre jour de naissance ?

31

62 La boucle Foreach

La boucle foreach sera vue dans le chapitre dédié aux arrays.


(Elle permet d'afficher les valeurs d'un tableau de données array).

63 Choix : boucle while / for / foreach / dowhile

Dans tous les cas, l'objectif d'une boucle est de répéter une portion de code.

Selon la situation, il peut être plus aisé d'utiliser la structure de l'une d'entre elles.

Nous y reviendrons plus tard dans le cours et à force de les utiliser, nous serons quelle structure est la plus adaptée dans les différents cas.

64 Boucle imbriquée (Double boucle)

Voici une boucle permettant d'afficher des données dans une table (tableau) html

entrainement.php
?
1 echo "<table border=\"1\"><tr>";
2 for($i = 0; $i < 9; $i++)
3 {
4 echo "<td> $i </td>";
5 }
6 echo "</tr></table>";

Résultat

0 1 2 3 4 5 6 7 8

Exercice : essayez de reproduire ces données :

Résultat attendu

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

20 21 22 23 24 25 26 27 28 29

30 31 32 33 34 35 36 37 38 39

40 41 42 43 44 45 46 47 48 49

50 51 52 53 54 55 56 57 58 59

60 61 62 63 64 65 66 67 68 69

70 71 72 73 74 75 76 77 78 79

80 81 82 83 84 85 86 87 88 89

90 91 92 93 94 95 96 97 98 99

Voici la correction possible :

entrainement.php
?
1 echo '<table border="1">';
2 for($ligne = 0; $ligne < 10; $ligne++) //ligne est à zéro
3 {
4 echo '<tr>';
5 for($cellule = 0; $cellule < 10; $cellule++) // tant que ligne est à zéro, cellule s'incrémente 10 fois - ligne est à 1, cellule s'incrémente
6 10 fois - ligne est à 2, cellule s'incrémente 10 fois, etc...
7 {
8 echo '<td>' . (10 * $ligne + $cellule) . '</td>'; // 10 * 0 +0 , 10* 0 + 1, 10* 0 + 2, etc... --- 10* 1+0, 10* 1 + 1, 10* 1+2, etc. Permet
9 d'avoir les multiples de 10.
10 }
11 echo '</tr>';
}
echo '</table>';

Quelques Explications :

Tour de boucle $ligne 0, $cellule 0 :

$ligne est à 0. (<10) nous rentrons dans la première boucle.


Nous faisons le 1er <tr>

$cellule est à 0 (<10) nous rentrons dans la deuxième boucle.


Nous faisons le 1er <td> avec le calcul suivant 10*$ligne+$cellule, ce qui donne 10*0+0 = 0.

Tour de boucle $ligne 0, $cellule 1 :

$ligne reste à 0.

Très important pour la compréhension : nous ne rerentrons pas dans la première boucle mais restons "coincé" dans la deuxième (le temps que ses tours
soient terminés).

$cellule passe à 1 (<10) nous rentrons à nouveau dans la deuxième boucle.

Nous faisons le 2ème <td> avec le calcul suivant 10*$ligne+$cellule, ce qui donne 10*0+1 = 1.
0 1

Tour de boucle $ligne 0, $cellule 2 :

$ligne reste à 0.
Nous ne rentrons pas dans la première boucle mais restons toujours "coincé" dans la deuxième (le temps que ses tours soient terminés).

$cellule passe à 2 (<10) nous rentrons à nouveau dans la deuxième boucle.


Nous faisons le 3ème <td> avec le calcul suivant 10*$ligne+$cellule, ce qui donne 10*0+2 = 2.

0 1 2

Et ainsi de suite jusqu'à ce que $cellule atteigne 10.

0 1 2 3 4 5 6 7 8 9 10

C'est là que tout se joue.


Nous rentrons à nouveau dans la 1ère boucle et $ligne passe à 1.
$cellule est quant à elle remise à 0 puisque nous repassons dans les lignes qui initialisent la variable.

Tour de boucle $ligne 1, $cellule 0 :

$ligne est à 1. (<10) nous rentrons dans la première boucle.


Nous faisons le 2ème <tr> (ce qui a pour effet de passer à la ligne)

$cellule est à 0 (<10) nous rentrons dans la deuxième boucle.


Nous faisons le 1er <td> de cette nouvelle ligne (et 11e au total, puisqu'il s'agit du 11e tour) avec le calcul suivant 10*$ligne+$cellule, ce qui donne

10*1+0 = 11.

0 1 2 3 4 5 6 7 8 9 10

11

Tour de boucle $ligne 1, $cellule 1 :

$ligne reste à 1.(<10)

nous ne rerentrons pas dans la première boucle mais restons "coincé" dans la deuxième (le temps que ses tours soient terminés).

$cellule passe à 1 (<10) nous rentrons à nouveau dans la deuxième boucle.

Nous faisons le 2ème <td> de cette nouvelle ligne avec le calcul suivant 10*$ligne+$cellule, ce qui donne 10*1+1 = 12.

0 1 2 3 4 5 6 7 8 9 10

11 12

Tour de boucle $ligne 1, $cellule 2 :

$ligne reste à 1. (<10)

Nous ne rerentrons pas dans la première boucle mais restons "coincé" dans la deuxième (le temps que ses tours soient terminés).

$cellule passe à 2 (<10)


Nous rentrons à nouveau dans la deuxième boucle.

Nous faisons le 3ème <td> de cette nouvelle ligne avec le calcul suivant 10*$ligne+$cellule, ce qui donne 10*1+2 = 13.

0 1 2 3 4 5 6 7 8 9 10

11 12 13

Et ainsi de suite... voici les tours de boucles précis :

$ligne 0 , $cellule 0$ligne 0 , $cellule 1$ligne 0 , $cellule 2$ligne 0 , $cellule 3$ligne 0 , $cellule 4$ligne 0 , $cellule 5$ligne 0 , $cellule 6$ligne 0 ,
$cellule 7$ligne 0 , $cellule 8$ligne 0 , $cellule 9

$ligne 1 , $cellule 0$ligne 1 , $cellule 1$ligne 1 , $cellule 2$ligne 1 , $cellule 3$ligne 1 , $cellule 4$ligne 1 , $cellule 5$ligne 1 , $cellule 6$ligne 1 ,
$cellule 7$ligne 1 , $cellule 8$ligne 1 , $cellule 9

$ligne 2 , $cellule 0$ligne 2 , $cellule 1$ligne 2 , $cellule 2$ligne 2 , $cellule 3$ligne 2 , $cellule 4$ligne 2 , $cellule 5$ligne 2 , $cellule 6$ligne 2 ,
$cellule 7$ligne 2 , $cellule 8$ligne 2 , $cellule 9

$ligne 3 , $cellule 0$ligne 3 , $cellule 1$ligne 3 , $cellule 2$ligne 3 , $cellule 3$ligne 3 , $cellule 4$ligne 3 , $cellule 5$ligne 3 , $cellule 6$ligne 3 ,
$cellule 7$ligne 3 , $cellule 8$ligne 3 , $cellule 9

$ligne 4 , $cellule 0$ligne 4 , $cellule 1$ligne 4 , $cellule 2$ligne 4 , $cellule 3$ligne 4 , $cellule 4$ligne 4 , $cellule 5$ligne 4 , $cellule 6$ligne 4 ,
$cellule 7$ligne 4 , $cellule 8$ligne 4 , $cellule 9

$ligne 5 , $cellule 0$ligne 5 , $cellule 1$ligne 5 , $cellule 2$ligne 5 , $cellule 3$ligne 5 , $cellule 4$ligne 5 , $cellule 5$ligne 5 , $cellule 6$ligne 5 ,
$cellule 7$ligne 5 , $cellule 8$ligne 5 , $cellule 9

$ligne 6 , $cellule 0$ligne 6 , $cellule 1$ligne 6 , $cellule 2$ligne 6 , $cellule 3$ligne 6 , $cellule 4$ligne 6 , $cellule 5$ligne 6 , $cellule 6$ligne 6 ,
$cellule 7$ligne 6 , $cellule 8$ligne 6 , $cellule 9

$ligne 7 , $cellule 0$ligne 7 , $cellule 1$ligne 7 , $cellule 2$ligne 7 , $cellule 3$ligne 7 , $cellule 4$ligne 7 , $cellule 5$ligne 7 , $cellule 6$ligne 7 ,
$cellule 7$ligne 7 , $cellule 8$ligne 7 , $cellule 9

$ligne 8 , $cellule 0$ligne 8 , $cellule 1$ligne 8 , $cellule 2$ligne 8 , $cellule 3$ligne 8 , $cellule 4$ligne 8 , $cellule 5$ligne 8 , $cellule 6$ligne 8 ,
$cellule 7$ligne 8 , $cellule 8$ligne 8 , $cellule 9

$ligne 9 , $cellule 0$ligne 9 , $cellule 1$ligne 9 , $cellule 2$ligne 9 , $cellule 3$ligne 9 , $cellule 4$ligne 9 , $cellule 5$ligne 9 , $cellule 6$ligne 9 ,
$cellule 7$ligne 9 , $cellule 8$ligne 9 , $cellule 9

En conclusion, lorsque nous faisons un tour dans la boucle avec $ligne, cela en entraine 10 dans la boucle avec $cellule.
Au total la première boucle (avec $ligne) tourne 10 fois et la deuxième boucle (avec $cellule) tourne 100 fois.

Voici une autre correction possible :

entrainement.php
?
1 $z = 0;
2 echo '<table border="1">';
3 for($ligne = 0; $ligne < 10; $ligne++) //ligne est à zéro
4 {
5 echo '<tr>';
6 for($cellule = 0; $cellule < 10; $cellule++)
7 {
8 echo '<td>' . $z . '</td>';
9 $z++;
10 }
11 echo '</tr>';
12 }
13 echo '</table>';

Solution avec une seule boucle PHP et l'utilisation du modulo (code html non valide) :
entrainement.php
?
1 echo '<table border="1"><tr>';
2 for($i = 0; $i < 100; $i++) //ligne est à zéro
3 {
4 if($i % 10 == 0)
5 {
6 echo '</tr>';
7 }
8 echo '<td>' . $i . '</td>';
9 }
10 echo '</table>';
11

Solution différente :

entrainement.php
?
1 echo '<table border="1">';
2 $i = 0;
3 while($i <= 99)
4 {
5 echo '<tr>';
6 for($k = 0; $k <= 9 ; $k++)
7 {
8 echo "<td>$i</td>";
9 $i++;
10 }
11 echo '</tr>';
12 }
13 echo '</table>';
14

Inclusion de fichiers

65 Les inclusions de fichiers

Php permet d'inclure un fichier dans un autre. Nous appelons cela des inclusions de fichiers et c'est très pratique dans le cadre d'un site web !

Pour tester le prochain exemple, je vous recommande de créer un fichier que l'on nommera : fichier.inc.php

Inscrivons le contenu suivant :

fichier.inc.php
?
1 <p>Voici le texte du fichier qui se nomme fichier.php<br>
2 Pour rappel, même si ce fichier à l'extension ".php". Nous ne sommes pas obligés d'écrire du code php à l'intérieur !</p>
3

Le mot ".inc" n'est pas obligatoire mais par convention il indique que ce fichier n'est pas une page a part entière mais plutôt un fichier qui sera inclut
dans une page web.

Ensuite reprenons notre fichier de cours entrainement.php.

66 Include

entrainement.php
?
1 <?php
2 echo 'Nous sommes dans le fichier entrainement<br>';
3 include("fichier.inc.php");
4 echo 'Nous sommes toujours dans le fichier entrainement<br>';
5

Nous venons d'inclure notre fichier fichier.php à l'intérieur de notre fichier principal entrainement.php
Résultat

Nous sommes dans le fichier entrainement

Voici le texte du fichier qui se nomme fichier.php

Pour rappel, même si ce fichier à l'extension ".php". Nous ne sommes pas obligés d'écrire du code php à l'intérieur !

Nous sommes toujours dans le fichier entrainement

Ce n'est pas plus compliqué, la fonction prédéfinie include attend comme argument un nom de fichier valide pour pouvoir l'inclure !

Avouez que ce n'est pas la partie la plus difficile :p

67 Include_once

entrainement.php
?
1 <?php
2 echo 'Nous sommes dans le fichier entrainement<br>';
3 include_once("fichier.inc.php");
4 echo 'Nous sommes toujours dans le fichier entrainement<br>';
5

Tout comme include, include_once permet d'inclure un fichier dans un autre.


Le "_once" permet de vérifier qu'il n'a pas déjà été inclue (il n'incluera pas 2 fois le même fichier).

Si le fichier n'a jamais été inclue, l'interpréteur l'inclue, sinon il ignore la ligne et ne l'inclue pas.

68 Require

entrainement.php
?
1 <?php
2 echo 'Nous sommes dans le fichier entrainement<br>';
3 require("fichier.inc.php");
4 echo 'Nous sommes toujours dans le fichier entrainement<br>';
5

Tout comme include, require permet d'inclure un fichier dans un autre.

69 Require_once

entrainement.php
?
1 <?php
2 echo 'Nous sommes dans le fichier entrainement<br>';
3 require_once("fichier.inc.php");
4 echo 'Nous sommes toujours dans le fichier entrainement<br>';
5

Tout comme require, require_once permet d'inclure un fichier dans un autre.


Le "_once" permet de vérifier qu'il n'a pas déjà été inclue (il n'incluera pas 2 fois le même fichier).
70 Différence entre Include, Include_once, Require, Require_once.

Include est plutôt traduit par "inclue moi ce fichier" et Require par "fichier requis".

La seule différence réside dans le cas d'une erreur (nom de fichier incorrect) :

Include fera une erreur et poursuivra l'exécution du code.

Require fera une erreur et stopera l'exécution du code.

_once est juste présent pour s'assurer que le fichier soit inclut une seule fois dans le code.

71 Inclusion et code Html

Voici l'affichage classique d'un site web statique html et css :

Voici l'aborescence classique d'un site web statique html et css :

mon_site
----- css
---------- style.css
----- js
----- img
----- index.html
----- acualites.html
----- contact.html

Voici le code classique d'une page web html et css :

index.html - actualites.html - contact.html


?
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Site Web</title>
<meta name="viewport" content="=device-, initial-scale=1">
<meta name="description" lang="fr" content="DESCRIPTION DU SITE">
<meta name="author" content="AUTEUR">
<meta name="robots" content="index, follow">

<!-- Icones -->


<link rel="favicon-icon" href="img/favicon.png">
<link rel="shortcut icon" href="img/favicon.ico">

<!-- CSS -->


<link rel="stylesheet" href="css/style.css">

<!-- JS -->
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
</head>
<body>
<header>
<div class="container">
<div class="header-logo">
<h1 class="header-nom-site">Nom Du Site</h1>
</div>
<div class="header-slogan">
<p>Le Slogan du Site</p>
</div>
<div class="header-droite">
<span>Zone Haut Droite</span>
</div>
<div class="clear"></div>
</div>
</header>
<nav>
<div class="container">
<ul>
<li><a href="index.html">Accueil</a></li>
<li><a href="actualites.html">Actualités</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</div>
</nav>
<section>
<div class="container">
<main>
<h1>Accueil</h1>
<hr>

<!-- Titre et niveaux -->


<h2>Titre niveau 2</h2>
<p>Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de
notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le
texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil
Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page
d'accueil </p>
<hr>

<!-- Image Responsive -->


<h2>Titre 3</h2>
<p><img class="img-responsive" src="http://placehold.it/750x250" alt="explication PHP"></p>
<hr>
</main>
<aside>
<h2>Colonne</h2>
<p>Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour
la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite
pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de
droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne
de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la
colonne de droite pour la page d'accueil </p>
</aside>
<div class="clear"></div>
</div>
</section>
<footer>
<div class="container">
© Copyright 2016
</div>
</footer>
</body>
</html>
Cette structure de page peut être reprise pour composer les autres rubriques.

Vous pouvez donc copier/coller le code de la page index.html pour faire actualites.html et contact.html.
Seul le texte changera d'une page à l'autre.

Problématique : Si vous devez ajouter un logo sur votre site et que vous le faites sur la page index.html, cette modification ne sera pas repercutée sur les
autres pages.
1 modification s'applique sur 1 seul fichier

Si on imagine que vous avez 20 pages html statiques, et que vous souhaitez ajouter un logo (ou toutes informations : changement du nom de la feuille
de style, ajout d'un slogan, etc..) vous devrez effectuer 20 modifications (1 modification dans chaque page) ce qui risque d'être assez contraignant dans la
mesure où on est au moins sur d'une chose : le header (haut de site) et le footer (bas de site) sont communs à toutes les pages. (Seul le contenu
change).

Si le header et le footer sont communs à toutes les pages web, pourquoi ne pas en déclarer un seul qui sera appelé partout ?

Ceux d'entre vous qui ont déjà développé un site web statique en Html / Css comprendront aisément que l'objectif est de simplifier la maintenance et les
mises à jour.

72 Inclure pour simplifier la maintenance

Voyons l'aborescence suivante :

mon_site
----- css
---------- style.css
----- js
----- img
----- inc
---------- haut.inc.php
---------- menu.inc.php
---------- bas.inc.php
----- index.php
----- actualites.php
----- contact.php

Nous venons de passer les fichiers .html en extension .php et nous avons également créé un dossier nommé "/inc/" avec plusieurs fichiers à l'intérieur qui
vont nous permettre de découper notre site en différentes parties.

Les fichiers inc montrent (pour un développeur qui prendrait connaissance du projet en cours de route) qu'ils sont destinés à l'inclusion et ne sont pas des pages à
part entière.

73 Découpons notre site web

Pour mieux le gérer, découpons notre site web :


La partie du haut : haut.inc.php :

haut.inc.php
?
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Site Web</title>
<meta name="viewport" content="=device-, initial-scale=1">
<meta name="description" lang="fr" content="DESCRIPTION DU SITE">
<meta name="author" content="AUTEUR">
<meta name="robots" content="index, follow">
<!-- Icones -->
<link rel="favicon-icon" href="img/favicon.png">
<link rel="shortcut icon" href="img/favicon.ico">

<!-- CSS -->


<link rel="stylesheet" href="css/style.css">

<!-- JS -->
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
</head>
<body>
<header>
<div class="container">
<div class="header-logo">
<h1 class="header-nom-site">Nom Du Site</h1>
</div>
<div class="header-slogan">
<p>Le Slogan du Site</p>
</div>
<div class="header-droite">
<span>Zone Haut Droite</span>
</div>
<div class="clear"></div>
</div>
</header>

Comme vous pouvez le constater, nous gardons tout le code appartenant au haut du site.

Ce n'est pas grave si certaines balises tel que <body> <html> etc. ne sont pas fermées car nous n'avons pas terminé la découpe du site web.

La partie du menu de navigation : menu.inc.php :

menu.inc.php
?
<nav>
<div class="container">
<ul>
<li><a href="index.php">Accueil</a></li>
<li><a href="actualites.php">Actualités</a></li>
<li><a href="contact.php">Contact</a></li>
</ul>
</div>
</nav>

Nous modifions le menu avec l'extension ".php" au lieu de ".html".

La partie du bas : bas.inc.php :

bas.inc.php
?
<footer>
<div class="container">
© Copyright 2016
</div>
</footer>
</body>
</html>

Les balises que nous avions ouvertes plus haut (comme <body> <html>) sont refermées ici dans ce fichier.

Il reste uniquement la partie du milieu (spécifique à chaque page web) pour chaque fichier :

La page d'A ccueil : index.php

index.php
?
<?php require_once('inc/haut.inc.php'); ?>
<?php require_once('inc/menu.inc.php'); ?>
<section>
<div class="container">
<main>
<h1>Accueil</h1>
<hr>

<!-- Titre et niveaux -->


<h2>Titre niveau 2</h2>
<p>Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de
notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le texte de notre page d'accueil Voici le
texte de notre page d'accueil Voici le texte de notre page d'accueil </p>
<hr>

<!-- Image Responsive -->


<h2>Titre 3</h2>
<p><img class="img-responsive" src="http://placehold.it/750x250" alt="explication PHP"></p>
<hr>
</main>
<aside>
<h2>Colonne</h2>
<p>Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour
la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite pour la page d'accueil Voici la colonne de droite
pour la page d'accueil Voici la colonne de droite pour la page d'accueil </p>
</aside>
<div class="clear"></div>
</div>
</section>
<?php require_once('inc/bas.inc.php'); ?>

La page d'actualités : acualites.php

actualites.php
?
<?php require_once('inc/haut.inc.php'); ?>
<?php require_once('inc/menu.inc.php'); ?>
<section>
<div class="container">
<main>
<h1>Actualités</h1>
<hr>

<!-- Titre et niveaux -->


<h2>Titre niveau 2</h2>
<p>Voici le texte de notre page d'actualités Voici le texte de notre page d'actualités Voici le texte de notre page d'actualités Voici le
texte de notre page d'actualités Voici le texte de notre page d'actualités </p>
<hr>

<!-- Image Responsive -->


<h2>Titre 3</h2>
<p><img class="img-responsive" src="http://placehold.it/750x250" alt="explication PHP"></p>
<hr>
</main>
<aside>
<h2>Colonne</h2>
<p>Voici la colonne de droite pour la page d'actualités Voici la colonne de droite pour la page d'actualités Voici la colonne de droite
pour la page d'actualités Voici la colonne de droite pour la page d'actualités Voici la colonne de droite pour la page d'actualités Voici la
colonne de droite pour la page d'actualités Voici la colonne de droite pour la page d'actualités </p>
</aside>
<div class="clear"></div>
</div>
</section>
<?php require_once('inc/bas.inc.php'); ?>

La page de contact : contact.php

?
<?php require_once('inc/haut.inc.php'); ?>
<?php require_once('inc/menu.inc.php'); ?>
<section>
<div class="container">
<main>
<h1>Contact</h1>
<hr>

<!-- Titre et niveaux -->


<h2>Titre niveau 2</h2>
<p>Voici le texte pour nous contacter Voici le texte pour nous contacter Voici le texte pour nous contacter Voici le texte pour nous
contacter Voici le texte pour nous contacter Voici le texte pour nous contacter </p>
<hr>

<!-- Image Responsive -->


<h2>Titre 3</h2>
<p><img class="img-responsive" src="http://placehold.it/750x250" alt="explication PHP"></p>
<hr>
</main>
<aside>
<h2>Colonne</h2>
<p>Voici la colonne de droite pour la page de contact Voici la colonne de droite pour la page de contact Voici la colonne de droite
pour la page de contact Voici la colonne de droite pour la page de contact Voici la colonne de droite pour la page de contact Voici la colonne
de droite pour la page de contact Voici la colonne de droite pour la page de contact </p>
</aside>
<div class="clear"></div>
</div>
</section>
<?php require_once('inc/bas.inc.php'); ?>

Dans les 3 cas il s'agit à peu près du même code (seul le texte change).

Le header (haut.inc.php), le menu (menu.inc.php) et le bas (bas.inc.php) restent les mêmes, ce qui est normal.

L'avantage avec le système d'inclusion en php, c'est que vous pourrez effectuer 1 seule modification (par exemple dans le fichier haut.inc.php pour l'ajout
d'un logo) et cela sera repercuté et diffusé partout puisque ce fichier est inclut dans toutes les autres pages.
Reprenons notre problématique d'origine : si nous devions modifier le logo en haut de site, cela devait nécessiter autant de modifications que ce qu'il y
avait de pages.

haut.inc.php
?
<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Site Web</title>
<meta name="viewport" content="=device-, initial-scale=1">
<meta name="description" lang="fr" content="DESCRIPTION DU SITE">
<meta name="author" content="AUTEUR">
<meta name="robots" content="index, follow">

<!-- Icones -->


<link rel="favicon-icon" href="img/favicon.png">
<link rel="shortcut icon" href="img/favicon.ico">

<!-- CSS -->


<link rel="stylesheet" href="css/style.css">

<!-- JS -->
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
</head>
<body>
<header>
<div class="container">
<div class="header-logo">
<img src="img/logo.png">
<h1 class="header-nom-site">Nom Du Site</h1>
</div>
<div class="header-slogan">
<p>Le Slogan du Site</p>
</div>
<div class="header-droite">
<span>Zone Haut Droite</span>
</div>
<div class="clear"></div>
</div>
</header>

Nous pouvons nous permettre d'ajouter une seule ligne qui sera diffusée dans tous les hauts de pages.
Faites le test ! (pour ça vous aurez besoin d'une image nommée logo.png présente dans votre dossier img)

En conclusion pour un site composé de 20 fichiers sous forme de page web :

Site statique html (sans php) : 20 modifications = 20 fichiers.

Site statique html (avec php) : 1 modification = 20 fichiers.

Le chiffre 20 est pris à titre d'exemple, cela dépend du site web

Les inclusions c'est quand même pratique, ça simplifie grandement la maintenance, ça repartit mieux l'organisation et ça permet d'économiser du code !
:smiley:

De nombreux sites utilisent les fonctions include/require et grâce à ces fonctions, les systèmes de fichiers appelés « Template » ont fait leur apparition.

Les framework et cms incluent des fichiers et utilisent cette technique.

Tableau Array

74 Array

Une variable Array (appelée aussi tableau de données, ou tableau array) est une sorte variable améliorée, car elle nous permet de conserver en mémoire un
ensemble de valeurs (et non pas qu'une seule valeur comme dans le cas d'une variable classique).

1 variable = 1 valeur
1 array = plusieurs valeurs

Exemple avec 1 variable classique :

entrainement.php
?
1 <?php
2 $prenom = "Nicolas";
3 echo "<p>Bonjour $prenom</p>";

Résultat

Bonjour Nicolas

Jusque là, tout est normal, 1 variable peut conserver 1 valeur.


Si vous tentez de mettre plusieurs valeurs cela ne sera pas de bon augure :

entrainement.php
?
1 <?php
2 $prenom = "Nicolas, Marie, Grégoire, Sylvain, Celine";
3 echo "<p>Bonjour $prenom</p>";

Résultat

Bonjour Nicolas, Marie, Grégoire, Sylvain, Celine

Au moment de l'affichage via l'instruction echo nous ne pouvons pas choisir d'afficher 1 seul prénom, c'est donc toute la liste qui s'affiche. Ce qui montre

bien qu'une variable n'est pas faite pour conserver plusieurs valeurs.

75 Notre premier array : une liste de prenom

entrainement.php
?
1 <?php
2 $listePrenom = array("gregoire","nathalie","emilie","françois","georges");

Nous déclarons notre variable à peu près comme d'habitude à une exception près, nous utilisons le mot-clé array.

Si nous souhaitons voir l'ensemble des valeurs contenues dans notre variable array, nous pouvons utiliser l'instruction print_r :

entrainement.php
?
1 <?php
2 $listePrenom = array("gregoire","nathalie","emilie","françois","georges");
3 echo '<pre>'; print_r($listePrenom); echo '</pre>';

Nous ajoutons les balises html <pre> autour du print_r afin que les informations soient affichées de ligne en ligne.

print_r est une instruction d'affichage améliorée permettant de voir le contenu d'un tableau array.

var_dump est similaire à print_r avec des options supplémentaires comme le type et la taille de la valeur contenue dans notre tableau array.

entrainement.php
?
1 <?php
2 $listePrenom = array("gregoire","nathalie","emilie","françois","georges");
3 echo '<pre>'; print_r($listePrenom); echo '</pre>';
4 var_dump($listePrenom);
Résultat
Avec print_r :

Array
(
[0] => gregoire
[1] => nathalie
[2] => emilie
[3] => françois
[4] => georges
)

Avec var_dump :
array(5) { [0]=> string(8) "gregoire" [1]=> string(8) "nathalie" [2]=> string(6) "emilie" [3]=> string(9) "françois" [4]=> string(7) "georges" }
Avec une représentation plus compréhensible :

clé valeur

0 gregoire

1 nathalie

2 emilie

3 françois

4 georges

Le dernier résultat (sous forme de représentation) est légérement retouché afin de faciliter votre compréhension, il n'apparaitra pas aussi nettement sous forme de
tableau sur votre page web.

La variable array crée automatiquement des clés (aussi appelées indices) et range les valeurs à l'intérieur d'elle même.

Il y a bien 5 prénoms, de 0 a 4.

Par conséquent, si nous voulons afficher le prénom "émilie", nous passerons par la clé n°2. Exemple :

entrainement.php
?
1 <?php
2 $listePrenom = array("gregoire","nathalie","emilie","françois","georges");
3 echo '<pre>'; print_r($listePrenom); echo '</pre>';
4 echo $listePrenom[2] . '<br>';

Résultat

emilie

Nous pouvons également affecter des valeurs dans un tableau array au coup par coup (pratique lorsque nous n'avons pas toutes les valeurs sous la main
immédiatement), exemple :

entrainement.php
?
1 <?php
2 $listePays[] = 'France';
3 $listePays[] = 'Italie';
4 $listePays[] = 'Espagne';
5 $listePays[] = 'Angleterre';
6 echo "<pre>"; print_r($listePays); echo "</pre>";

Résultat
Avec print_r

Array
(
[0] => France
[1] => Italie
[2] => Espagne
[3] => Angleterre
)

Sous forme de représentation :

clé valeur

0 France

1 Italie

2 Espagne

3 Angleterre

Exercice, pourriez-vous afficher la valeur Italie en passant par votre tableau $listePays ?

Voici la correction :

entrainement.php
?
1 <?php
2 $listePays[] = 'France';
3 $listePays[] = 'Italie';
4 $listePays[] = 'Espagne';
5 $listePays[] = 'Angleterre';
6 echo "<pre>"; print_r($listePays); echo "</pre>";
7 echo $listePays[1] . '<br>';

Résultat

Italie

Et si nous voulions afficher tous les pays d'un seul coup ?

Nous pourrions utiliser la fonction implode. Exemple :

entrainement.php
?
1 <?php
2 $listePays[] = 'France';
3 $listePays[] = 'Italie';
4 $listePays[] = 'Espagne';
5 $listePays[] = 'Angleterre';
6 echo "<pre>"; print_r($listePays); echo "</pre>";
7 echo $listePays[1] . '<br>';
8 echo implode($listePays, '<br>');

implode permet d'extraire les valeurs d'un tableau array, cette fonction attends 2 arguments, 1 array à explorer et 1 séparateur (ce qui permettra de

séparer les valeurs une fois extraites).

implode est l'une des rares fonctions à ne pas respecter d'importance dans l'ordre des arguments (on peut mettre le array à explorer en premier ou en 2e.

Idem pour le séparateur du coup).

Résultat

France

Italie

Espagne

Angleterre

Nous aurions également pu utiliser une boucle.


76 Parcourrir un tableau array avec la boucle for

entrainement.php
?
1 <?php
2 for($i = 0; $i < sizeof($listePays); $i++)
3 {
4 echo $listePays[$i] . '<br>';
5 }

La fonction prédéfinie sizeof ou la fonction prédéfinie count permettent de connaitre la taille totale d'un tableau (dans notre cas, il y a 4 pays, donc nous
arreterons de faire des tours de boucles a 4 soit 0, 1, 2 et 3).

pour des raisons de performances il serait préférable de compter dans une variable hors de la boucle (pour éviter que le calcul soit refait à chaque tour). Pour le
moment, je ne cherche pas à faire une version de code optimisée mais fonctionnelle dans la mesure où l'on débute en php.

Comment cette boucle fonctionne ?

Nous demandons à $listePays de s'afficher et nous devons préciser le numéro d'une clé (ou indice), pour cela nous choisissons $i qui sera progressif.

Au tour de boucle 0, $i sera à 0, ce qui donnera echo $listePays[0] et donc affichera "France".

Au tour de boucle 1, $i sera à 1, ce qui donnera echo $listePays[1] et donc affichera "Italie".

Au tour de boucle 2, $i sera à 2, ce qui donnera echo $listePays[2] et donc affichera "Espagne".

Au tour de boucle 3, $i sera à 3, ce qui donnera echo $listePays[3] et donc affichera "Angleterre".

Résultat

France

Italie

Espagne

Angleterre

Une boucle est particulièrement adaptée pour parcourir les éléments d'un array, il s'agit de la boucle foreach puisqu'il ne sera pas nécessaire de lui fournir
un numéro.

77 Parcourir un tableau array avec la boucle foreach

entrainement.php
?
1 <?php
2 foreach($listePays as $cle => $valeur)
3 {
4 echo "$cle - $valeur <br>";
5 }

Résultat

0 - France

1 - Italie
2 - Espagne

3 - Angleterre

Dans la boucle (et dans le echo) les variables $cle et $valeur auraient pu être nommées $x et $y, leur nom n'a pas d'importance.
L'ordre représente la manière dans laquelle les colonnes seront parcourues : 1ère variable pour la colonne "clé" et 2e variable pour la colonne "valeur".

le mot clé "as" et symbole "=>" sont quant à eux prédéfinis dans le langage, il faut les respecter, c'est une régle de syntaxe lorsqu'on utilise la boucle
foreach.

La boucle foreach est prévue pour s'arreter toute seule lorsqu'il n'y a plus d'éléments à parcourir dans le tableau array.

C'est quand même bien pratique !

78 Choisir les clés (indices) et créer un tableau array associatif

Il est possible de choisir les clés d'un array (plutôt qu'avoir une numérotation classique), nous appelons cela un tableau array associatif.

Exemple :

entrainement.php
?
1 $couleur = array("j" => "jaune", "b" => "bleu", "v" => "vert");
2 echo '<pre>'; print_r($couleur); echo '</pre>';

Résultat
Avec print_r :

Array
(
[j] => jaune
[b] => bleu
[v] => vert
)

Sous forme de représentation :

clé valeur

j jaune

b bleu

v vert

Avec des clés lettrées (non numérique), nous atteindrons les éléments du tableau array de cette manière-là :

entrainement.php
?
1 $couleur = array("j" => "jaune", "b" => "bleu", "v" => "vert");
2 echo '<pre>'; print_r($couleur); echo '</pre>';
3 echo $couleur['j'] . '<br>' . $couleur['b'] . '<br>' . $couleur['v'] . '<br>';

Comme vous pouvez l'apercevoir, nous mettons des lettres entre crochet [] et non pas des numéros afin d'atteindre les éléments par leur clés.

Résultat

jaune

bleu

vert

79 Régle d'écriture pour tableau ARRAY

Pour l'array suivant :

entrainement.php
?
1 $listeFruit = array("fruit1" => "orange","fruit2" => "pomme", "fruit3" => "fraise");
2 echo '<pre>'; print_r($listeFruit); echo '</pre>';

Cela donne le résultat suivant :

Résultat
Avec print_r :

Array
(
[fruit1] => orange
[fruit2] => pomme
[fruit3] => fraise
)

Sous forme de représentation :

clé valeur

fruit1 orange

fruit2 pomme

fruit3S fraise

entrainement.php
?
1 $listeFruit = array("fruit1" => "orange","fruit2" => "pomme", "fruit3" => "fraise"); // déclaration array
2 echo 'fruit1 : ' . $listeFruit['fruit1'] . '<br>'; // quotes dans les crochets
3 echo "fruit1 : $listeFruit[fruit1] <br>"; // pas de quotes dans les crochets

Régle d'écriture à connaitre : lorsque nous affichons un élément dans un array associatif (avec des clés (indices) lettrées) il faut le faire soit avec de la
concaténation et des quotes (ou guillemets) DANS les crochets.

Ou alors, nous pouvons aussi réaliser la totalité de l'affichage entre guillemets à condition de ne pas mettre de quotes ou guillemets dans les crochets.

L'option consistant à écrire la totalité de l'affichage entre guillemets et sans caractère quotes ou guillemets dans les crochets fonctionne pour les array simple mais
pas pour les array multidimensionnels
80 Tableaux array Multidimensionnels

Il est possible de créer des tableaux array à l'intérieur d'autres tableaux array, lorsqu'une imbrication de tableau array est faite, nous parlons de tableaux
array multidimensionnels (en gros, il y a plusieurs dimensions).

Plus simplement, un tableau multidimensionnel désigne un ou plusieurs tableaux à l’intérieur d’un tableau principal .

Exemple :

entrainement.php
?
1 <?php
2 $tabMultidimensionnel = array(0 => array("prenom" => "Julien", "nom" => "Cottet"), 1 => array("prenom" => "Nicolas", "nom" => "Lafaye"));
3 echo '<pre>'; print_r($tabMultidimensionnel); echo '</pre>';

Résultat

Array
(
[0] => Array
(
[prenom] => Julien
[nom] => Cottet
)

[1] => Array


(
[prenom] => Nicolas
[nom] => Lafaye
)

Si nous voulions sortir le prénom "Julien" en passant par notre tableau, nous devrions faire suivre plusieurs crochets :

entrainement.php
?
1 <?php
2 $tabMultidimensionnel = array(0 => array("prenom" => "Julien", "nom" => "Cottet"), 1 => array("prenom" => "Nicolas", "nom" => "Lafaye"));
3 echo $tabMultidimensionnel[0]['prenom'];

Résultat

Julien
Lors de l'utilisation des tableaux ARRAY, il est possible d'indexer les clés numériquement mais aussi de façon "associative" (autrement dit, avec 1 nom).
Lorsque c'est possible, les développeurs utilisent et préfèrent l'indexation "associative" (nominative) afin de pouvoir donner des noms de clés clairs et ayant
du sens.

J'espère que ce chapitre est clair pour vous ! sinon n'hésitez pas à le relire autant de fois que nécessaire !

Classe et Objet

81 Classes & Objets

Les classes et objets sont avant tout un type de données regroupant des variables (appelées propriétés ou attributs) et des fonctions utilisateurs (appelées
méthode).

On parle de programmation orientée objet lorsque leur utilisation est généralisée à tout un site et que la conceptualisation suit cet état d'esprit.

Le vocabulaire diffère légèrement en Programmation Orientée Objet, nous ne parlerons plus de fonctions mais de méthodes, nous ne parlerons plus de
variables mais d’attributs (ou propriétés).

Créons une classe nommée Voiture :

entrainement.php
?
1 <?php
2 class Voiture
3 {
4 public $couleur = "rouge";
5 public $annee = 2010;
6 public function demarrer()
7 {
8 return "Je démarre comme ça...";
9 }
10 }

Une classe est donc un regroupement de propriétés (variables) et de méthodes (fonctions) sur un sujet en particulier.

Les variables sont plutôt présentes pour décrire le sujet et les méthodes pour indiquer le comportement du sujet.

Nous avons 2 propriétés qui sont $couleur et $annee, et 1 méthode qui est demarrer()

Le mot-clé public permet de préciser le niveau de visibilité des éléments (public = visible de partout).

3 niveaux de visibilité existent : public, protected et private mais il n'est pas nécessaire de les expliquer en détail pour l'instant (ce n'est pas indispensable pour
comprendre cet exemple).

Pour s'en servir, nous allons créer (instancier) un objet (issue de la classe Voiture).

entrainement.php
?
1 <?php
2 class Voiture
3 {
4 public $couleur = "rouge";
5 public $annee = 2010;
6 public function demarrer()
7 {
8 return "Je démarre comme ça...";
9 }
10 }
11 $voiture = new Voiture;
12 echo 'couleur de la voiture : ' . $voiture->couleur . '<br>';
13 echo 'annee de la voiture : ' . $voiture->annee . '<br>';
14 echo 'manière dont la voiture démarre : ' . $voiture->demarrer() . '<br>';

Résultat
couleur de la voiture : rouge

annee de la voiture : 2010

manière dont la voiture démarre : Je démarre comme ça...

Quelques Explications :

new est un mot-clé permettant d'instancier une classe et donc de produire un objet.

En programmation php, on dit alors que $voiture représente un objet (en réalité c'est une référence qui pointe vers un objet en espace mémoire, même
principe que pour une variable).

La fléche "->" permet d'atteindre une propriété ou une méthode de l'objet $voiture issue de la classe Voiture.

82 Qu'est-ce qu'une classe ?

Les classes sont présentes pour « fabriquer » des objets. Dans notre cas, la classe c'est un peu comme le plan de construction d'une voiture :

La classe Voiture n'est pas une voiture, c'est juste son plan de construction.

Un plan de construction voiture (classe Voiture) peut produire et créer plusieurs voitures (objet $voiture).
83 Qu'est-ce qu'un objet ?

En programmation orientée objet, un objet est créé sur le modèle de la classe à laquelle il appartient. Dans notre cas, l'objet c'est la voiture.

L'objet est une application concrète du plan, c'est une représentation de la classe.

Pour se servir du code déclaré dans une classe, il faut (dans la majorité des cas) créer un objet.

84 Développement Orienté Objet

Le développement Orienté Objet ne se résume pas qu'à élaborer quelques classes et créer des objets.
Regrouper son code aide à y voir clair, mais si l'on retrouve du code procédural dans les méthodes d'une classe, ce ne sera qu'un mi-chemin entre le
développement procédural et le développement orienté objet.

L'orienté objet c'est avant tout une conceptualisation différente. Nous verrons plus tard comment aborder le code.

Les superglobales
85 Les Superglobales

Les Superglobales sont des variables array, internes et prédéfinies par PHP, qui sont toujours disponibles, quel que soit le contexte.

Pour rappel, une variable array permet de conserver un ensemble de valeurs : chapitre sur les array.

Lorsqu'on parle de disponibilité, on exprime le fait que les superglobales sont à la fois disponibles dans l'espace global (espace par défaut de php) mais

aussi dans l'espace local (dans une fonction).

Pour utiliser une superglobale dans une fonction, il ne sera donc pas nécessaire d'effectuer un passage d'argument ou utiliser le mot-clé global ;

Les superglobales sont reconnaissables car elles s'inscrivent TOUJOURS en majuscule et commence toutes obligatoirement par un underscore "_" (sauf

$GLOBALS).

86 A quoi servent les superglobales en PHP ?

Superglobale Description Exemple d'utilisation

$GLOBALS Contient toutes les variables disponibles dans un contexte global -

Pratique pour connaitre le chemin du site, d'un


$_SERVER Contient toutes les informations fournies par le serveur web
dossier, etc.

Contient les informations fournies en paramètre au script via la méthode GET par l'URL Utile pour véhiculer des informations d'une page à
$_GET
et le protocole HTTP. l'autre.

Contient les informations fournies par un formulaire via la méthode POST du protocole Utile pour récupérer les saisies postées dans un
$_POST
HTTP. formulaire par un internaute.

Contient les informations liées à l'upload d'un (ou plusieurs) fichier(s) par un formulaire Utile pour récupérer le(s) fichier(s) uplaodé(s) dans
$_FILES
(fonctionne en complément de la superglobale $_POST). un formulaire par un internaute.

Utile pour conserver des informations sur un


$_COOKIE Contient les informations fournies par les cookies via le protocole HTTP.
internaute.

Utile pour maintenir une connexion avec un


$_SESSION Contient les informations de la session en cours.
internaute sur un site web

Utile pour récupérer des informations sans savoir


$_REQUEST Contient les variables fournies au script (peu importe la méthode utilisée).
précisément d'où elles proviennent

$_ENV Contient les variables fournies par l'environnement. -

Très important : Toutes les superglobales sont ARRAY car elles contiennent plusieurs informations.

Ce qui veut dire que nous pourrons utiliser un print_r pour afficher leur contenu

87 Superglobales $GLOBALS, $_ENV, $_REQUEST

Quelques tests :

entrainement.php
?
1 <?php
2 echo '<pre>'; print_r($GLOBALS); echo '</pre>';
3 echo '<pre>'; print_r($_ENV); echo '</pre>';
4 echo '<pre>'; print_r($_REQUEST); echo '</pre>';
Comme vous pouvez le constater au vue du résultat, $GLOBALS contient les autres superglobales.

$GLOBALS se contient elle même, c'est la raison pour laquelle vous voyez écrit *RECURSION* lors de l'affichage.

88 Superglobale $_SERVER

$_SERVER est une variable très pratique puisqu'elle nous permet d'obtenir des informations sur le serveur :

entrainement.php
?
1 <?php
2 echo '<pre>'; print_r($_SERVER); echo '</pre>';

$_SERVER est un array (comme toutes les superglobales).

Résultat

Même principe que pour un tableau array classique, si nous souhaitons obtenir une information en particulier, il suffit de passer par la clé (indice) du
tableau :

entrainement.php
?
1 <?php
2 echo $_SERVER['DOCUMENT_ROOT'];

La clé DOCUMENT_ROOT de la superglobale $_SERVER permet d'avoir accès au chemin dans lequel nous travaillons actuellement. Ce qui peut être très

pratique dans le cadre d'un développement.

Les autres superglobales n'étant pas détaillées dans cette page possèdent leurs propres exemples dans les chapitres suivants.
Lien GET et formulaire POST

89 Superglobale GET - Passage d'argument d'une page à l'autre

Dans la phase de construction d'un site web, il peut être utile de véhiculer des informations d'une page à une autre.

Pourquoi ?

Imaginons le catalogue (catalogue.php) d'une boutique ecommerce avec plusieurs produits :

L'affichage ci-dessus est généré grâce à une requête SQL qui rappatrie toutes les données de la base.

La plupart du temps, nous pouvons cliquer sur ces produits et arriver sur la fiche produit contenant davantages d'informations détaillées.

Maintenant imaginons la fiche produit détaillée (ficheProduit.php) :


Êtes vous d'accord sur le fait que s'il y a 1500 produits, il n'y aura pas 1500 fichiers du type ficheProduit1.php, ficheProduit2.php, ficheProduit3.php,

ficheProduit4.php, ficheProduit5.php, etc.

Bien entendu cela serait ingérable et le contraire de dynamique !

Par conséquent, nous aurons qu'un seul fichier se nommant ficheProduit.php et pouvant présenter potentiellement tous les produits. C'est ce qu'on appelle

un template (un modèle de page pouvant présenter différents contenus)

Mais s'il n'y a qu'un seul fichier, comment saura t'il quel produit il doit présenter ?

Et bien nous n'allons pas arriver sur la page ficheProduit.php les mains vides, nous irons sur la page ficheProduit.php?idProduit=1 ou par exemple

ficheProduit.php?idProduit=3 (pour le tshirt rouge).

Pour rappel, l'idProduit représente le numéro du produit dans la base de données

Ce système est le même pour tous les sites web ! Essayez donc de vous balader dans un site web ecommerce et vous verrez bien des informations

passées dans l'url (si vous y faites attention).

Voici un exemple avec le site web de ZARA :


Ces informations n'apparaitront peut être pas aussi nettement que ?idProduit=1 car souvent les sites font de l'url rewriting (réécriture d'url).

L'affichage va donc être généré grâce à une requête SQL qui rappatriera 1 produit en particulier de la base (1 ligne de résultat).

Pour afficher le bon produit dans la fiche produit, vous l'aurez compris, il nous faudra passer et récupérer le bon numéro de produit dans l'url.

Pour passer un numéro de produit c'est très simple puisque nous n'avons besoin que du HTML :

catalogue.php
?
1 <a href="ficheProduit.php?idProduit=1"> Produit 1 </a>

Le format a respecter est cle=valeur.

Créez le fichier catalogue.php et ficheProduit.php et vous verrez qu'en cliquant sur le lien de la page catalogue.php, vous arrivez sur la page
ficheProduit.php avec le numéro de produit dans l'url.

Pour récupérer cette information, nous aurons besoin de la superglobale $_GET :

ficheProduit.php
?
1 echo $_GET['idProduit'];

C'est tout simple, il suffit de mettre le nom de la clé (définie auparavant dans le html).

$_GET permet de récupérer une ou plusieurs information(s) contenue dans l'url afin de s'en servir dans la page web.

Nous utilisons les crochets car toutes les superglobales sont des tableaux ARRAY.

Résultat

Par précaution, si jamais pour une raison x ou y l'url ne contient pas d'arguments (parametres) ou que l'internaute tente d' aller directement sur
ficheProduit.php sans passer par notre lien créé sur la page catalogue.php, cela donnera une erreur unedfined variable car nous chercherons à récupérer
quelque chose de l'url qui n'existe pas.

Pour cette raison, il est préférable de prévoir une condition :

ficheProduit.php
?
1 <?php
2 if(!empty($_GET['idProduit']))
3 {
4 echo $_GET['idProduit'];
5 }

Nous demandons si l'url n'est pas vide (avec le point d'exclamation "!"), autrement dit, y'a t'il un idProduit à récupérer dans l'url ?
Si oui, nous le récupérons. Si non, l'interpréteur ignorera cette portion de code.

Autre exemple avec le fichier de test "get1.php" :

get1.php
?
1 <a href="get2.php?produit=tshirt&couleur=bleu&prix=30"> Cliquez ici ! </a>

Nous pouvons passer toutes les informations qui nous intéresse dans l'url à condition d'éviter les espaces, les accents, et de respecter le format
cle=valeur.

C'est ce format qui permettra de remplir le tableau array de la superglobale $_GET.

Voici le fichier get2.php (pour s'entrainer) :

get2.php
?
1 <?php
2 if(!empty($_GET))
3 {
4 echo "produit $_GET[produit] <br>";
5 echo "couleur $_GET[couleur] <br>";
6 echo "prix $_GET[prix] <br>";
7 echo implode ($_GET, " - ");
8 echo '<pre>'; print_r($_GET); echo '</pre>';
9 }

Pas de quotes dans les crochets d'un tableau array si l'instruction echo englobe le tout entre guillemets

Résultat
L'instruction echo:
produit tshirt
couleur bleu
prix 30

La fonction prédéfinie implode :


tshirt - bleu - 30

Avec le print_r :

Array
(
[produit] => tshirt
[couleur] => bleu
[prix] => 30
)

Avec une représentation plus compréhensible :

clé valeur

produit tshirt
couleur bleu

prix 30

C'est donc notre lien html <a> qui envoie des informations dans l'url et qui nous permet de construire le tableau ARRAY de $_GET.

Avez-vous compris l'intérêt et à quoi sert $_GET ? Avez-vous compris comment fonctionne $_GET ? C'est indispensable pour la suite !

90 Superglobale POST - Récupération des saisies d'un formulaire

Utiliser les formulaires avec PHP permet d’échanger des données avec l’internaute. C'est-à-dire, lui envoyer des données, mais aussi en recevoir de sa part.

Autant dire qu'un site web sans formulaire n'existe pas !

Les formulaires revienent très régulièrement sur les sites web, par exemple pour un formulaire de contact, un formulaire d'inscription en tant que membre,

un formulaire de recherche, un formulaire de recrutement, un formulaire de satisfaction, un formulaire de commande, etc..

Comment récupérer les informations d'un formulaire ?

Nous savons qu'avec les langages Html et Css il est possible de concevoir un formulaire.

Voici donc un simple formulaire demandant une adresse (avec ville et code postal).

formulaire1.php
?
1 <form method="post" action="">
2 <label for="ville">ville</label><br>
3 <input type="text" name="ville" id="ville" placeholder="saisir 1 ville"><br><br>
4 <label for="cp">code postal</label><br>
5 <input type="text" name="cp" id="cp" placeholder="saisir 1 code postal"><br><br>
6 <label for="adresse">adresse</label><br>
7 <textarea name="adresse" id="adresse" placeholder="saisir 1 adresse"></textarea><br><br>
8 <input type="submit">
9 </form>

Pour rappel, le formulaire html est contenu entre les balises <form> </form> .

L'attribut method permet de préciser comment vont circuler les données, 2 choix s'offrent à nous : POST ou GET.
Retenez que nous utilisons dans la majorité des cas POST.

L'attribut action permet de préciser la page de destination (sur laquelle l'internaute sera redirigée après avoir soumis le formulaire en cliquant sur le bouton
submit) pour effectuer les traitements.
Dans notre cas, nous resterons sur la même page web pour effectuer les traitements et n'emménerons l'internaute nulle part.

La balise <label> permet de créer une étiquette, son attribut for et est relié à l'attribut id de la balise <input> (lorsqu'on clique sur le texte, le curseur
se place dans la case de saisie).

L'id peut être utilisé comme un id css ou javascript, mais dans ce contexte ce n'est pas son rôle premier.

Label for et id n'est donc pas d'une importance capitale pour faire fonctionner notre formulaire mais je vous recommande de toujours le prévoir car
cela fait partie des normes accessiweb (pour les mal-voyants). Facilitons leur la navigation !

L'attribut placeholder est également facultatif, il permet d'afficher une indication supplémentaire avec un texte opaque présaisi qui s'effacera lorsque
l'internaute commencera à saisir au clavier des informations dans la case <input> .

L'attribut name est capital puisque sans lui nous ne pourrions pas récupérer les données même avec PHP.
Attention
L'attribut name est indispensable !!! Un attribut name doit être écrit par élément de formulaire (1 name = 1 saisie récupérée).

La valeur que vous placerez dans l'attribut name ne doit pas comporter d'espace, ni d'accent et de préférence ne pas contenir de majuscule
(senssible à la casse).

Nous avons mis le name "cp" pour le champ code postal

Le bouton submit est présent afin que l'on puisse valider le formulaire.

Vous pouvez consulter la page récapitulant tous les éléments des formulaires HTML

Résultat

Un formulaire est une porte ouverte sur le serveur… Ce qui signifie qu’une personne mal intentionnée peut potentiellement exploiter des failles de sécurité…

Ce formulaire est parfaitement valide en html mais ne pourra pas être exploité sans l'aide de PHP.

Alors voici la partie PHP pour la récupération des données sur un formulaire :

formulaire1.php
?
1 <?php
2 echo 'ville : ' . $_POST['ville'] . '<br>';
3 echo 'cp : ' . $_POST['cp'] . '<br>';
4 echo 'adresse : ' . $_POST['adresse'] . '<br>';
5 ?>
6 <form method="post" action="">
7 <label for="ville">ville</label><br>
8 <input type="text" name="ville" id="ville" placeholder="saisir 1 ville"><br><br>
9 <label for="cp">cp</label><br>
10 <input type="text" name="cp" id="cp" placeholder="saisir 1 code postal"><br><br>
11 <label for="adresse">adresse</label><br>
12 <textarea name="adresse" id="adresse" placeholder="saisir 1 adresse"></textarea><br><br>
13 <input type="submit">
14 </form>

Quelques Explications :

Comme d'habitude l'instruction echo peut être traduit par "affiche moi".

echo $_POST['ville'] peut être traduit par "affiche moi la ville postée".

Le texte contenu entre crochet est en liaison avec le name de l'élément HTML.

Faite le test en remplissant votre formulaire et en cliquant sur le bouton submit!


Résultat (avant d'avoir cliqué sur submit)

Des erreurs "undefined" s'affichent sur la page web car la toute première fois où l'interpréteur exécute le code, vous lui demandez d'aller chercher des
saisies postées mais s'il s'agit du moment où le formulaire est affiché par l'internaute, l'internaute n'aura pas encore eu le temps de poster quoi que ce
soit (puisqu'il vient d'arriver à la seconde).

L'interpréteur vous indique que les clés du tableau array $_POST (respectivement ville, cp, et adresse) ne sont pas connues (ces clés existeront uniquement
si l'internaute soumet le formulaire en cliquant sur le bouton submit).

Même si des erreurs apparaissent, vous pouvez quand même faire le test en remplissant le formulaire et en cliquant sur le bouton submit, vous verrez que
ce code fonctionne :

Résultat (après avoir cliqué sur submit)


Les saisies de l'internaute vont s'afficher correctement sur la page web.

C'est bien là que ça se joue, lorsque le bouton submit est cliqué par l'internaute, LA PAGE SE RECHARGE ET L'INTERPRETEUR RELIE LE CODE, cette fois-ci
l'interpréteur est capable d'afficher les saisies ville, cp et adresse postées.

Pour simuler la première visite sur la page, effectuer au clavier F6+Entrer


Pour recharger la page (et répéter la dernière action effectuée), appuyez sur la touche F5 ou Ctrl+R

Afficher la page pour la première fois (cliquer sur l'url et faire entrer au clavier ou F6+Entrer ) et recharger la page ( F5 ou Ctrl+R ) ne sont pas du tout
pareil !

Vous avez sans doute dû déjà voir ce message :

Il est important de prendre le temps de le comprendre ! Ne vous contentez pas de l'approximatif, ayez toujours envie de comprendre précisément et creuser
un sujet jusqu'au bout.

Ce message vous demande si vous êtes d'accord pour répéter la dernière action effectuée.
Si la dernière action était un POST (un clic sur le bouton submit), cela fera un 2e POST (comme un 2e clic sur le bouton submit).

Il était utile de porter un regard sur ces deux situations pour que vous en ayez connaissance (et prendre le temps de comprendre les mécanismes en
détail) mais maintenant que c'est fait, bien entendu nous n'allons pas garder ces erreurs.

Nous allons prévoir une condition IF qui réglera tous nos problèmes, car il n'y a jamais de problèmes mais que des solutions !

Nous allons dire :


...Si l'internaute a posté quelque chose, tu me l'affiches.
Sinon rien (il n'y aura pas de sinon (else)).

Voici le code final :

formulaire1.php
?
1 <?php
2 if(!empty($_POST))
3 {
4 echo 'Recuperation des données saisies : <br>';
5 echo 'ville : ' . $_POST['ville'] . '<br>';
6 echo 'cp : ' . $_POST['cp'] . '<br>';
7 echo 'adresse : ' . $_POST['adresse'] . '<br>';
8 }
9 ?>
10 <form method="post" action="">
11 <label for="ville">ville</label><br>
12 <input type="text" name="ville" id="ville" placeholder="saisir 1 ville"><br><br>
13 <label for="cp">cp</label><br>
14 <input type="text" name="cp" id="cp" placeholder="saisir 1 code postal"><br><br>
15 <label for="adresse">adresse</label><br>
16 <textarea name="adresse" id="adresse" placeholder="saisir 1 adresse"></textarea><br><br>
17 <input type="submit">
18 </form>

Quelques Explications :

Nous disons à l'interpréteur PHP : si le POST n'est pas (caractère "!") vide (c'est donc qu'il est rempli et que l'internaute a posté), à ce moment-là on peut
afficher les saisies sur la page web.

Dans le cas où l'internaute arrive pour la 1ère fois sur la page web, l'interpréteur ignorera les lignes PHP de récupération puisqu'il ne rentrera pas dans la
condition.
Pour être clair :

- La toute premiere fois quand on clique sur l'url et qu'on fait "entrer", nous ne rentrons pas dans le IF.
- Toutes les fois suivantes si nous cliquons sur le bouton "envoi", le code se ré-exécute et nous rentrons dans le IF.

Le texte contenu entre crochet est en liaison avec le name de l'élément HTML.

Résultat

Puisque toutes les superglobales sont ARRAY, nous pourrions également demandé un affichage avec l'aide de print_r :
?
1 <?php
2 if(!empty($_POST))
3 {
4 echo 'Recuperation des données saisies : <br>';
5 echo 'ville : ' . $_POST['ville'] . '<br>';
6 echo 'cp : ' . $_POST['cp'] . '<br>';
7 echo 'adresse : ' . $_POST['adresse'] . '<br>';
8 echo '<pre>'; print_r($_POST); echo '</pre>';
9 }
10 ?>

Résultat
clé valeur

ville Paris (saisie de l'internaute)

cp 75015 (saisie de l'internaute)

adresse 30 rue de la convention (saisie de l'internaute)

Formulaire modèle avec récupération de données $_POST

Si nous voulions ajouter la structure d'une page web (avec les entêtes, doctype, etc.), nous ferions comme ceci :

formulaireModele.php
?
<?php
$message = '';
if(!empty($_POST))
{
$message .= 'Recuperation des données saisies : <br>';
$message .= 'ville : ' . $_POST['ville'] . '<br>';
$message .= 'cp : ' . $_POST['cp'] . '<br>';
$message .= 'adresse : ' . $_POST['adresse'] . '<br>';
}
?>
<!Doctype html>
<html>
<head>

<link rel="stylesheet" href="structure.css">


<meta charset="utf-8">

</head>
<body>
<div><?php echo $message; ?></div>
<form method="post" action="">
<label for="ville">ville</label><br>
<input type="text" name="ville" id="ville" placeholder="saisir 1 ville"><br><br>
<label for="cp">cp</label><br>
<input type="text" name="cp" id="cp" placeholder="saisir 1 code postal"><br><br>
<label for="adresse">adresse</label><br>
<textarea name="adresse" id="adresse" placeholder="saisir 1 adresse"></textarea><br><br>
<input type="submit">
</form>
</body>
</html>

$_POST permet de récupérer et d'afficher la saisie qui a été postée.

Dans le cadre d'une page web complète, nous mettons le code php le plus en haut possible : d'abord les traitements avant l'affichage (norme et
architecture MVC).

Nous ne mettons plus d'instruction echo car sinon les informations s'afficheraient au dessus du doctype, leurs positionnements seraient assez contraignant

et le code ne passerait pas la validation w3c.

Par conséquent, nous passons par une variable $message qui va retenir l'affichage (les messages seront affectés à la variable).

La variable $message ne sera pas affichée immédiatement mais un peu plus bas, à l'endroit de notre choix, dans les balises body /body afin de respecter

la structure de la page web.

Vous pouvez garder ce formulaire comme modèle pour vos prochains développements avec la superglobale $_POST.

Sauvegarde des données venant d'un formulaire

Après avoir récupéré et affiché les saisies d'un formulaire que fait-on ?

Nous pourrions, plus tard, envoyer ces données dans une base de données (c'est comme cela que fonctionnent les pages d'inscription d'un site web).

Nous pourrions également afficher un message de confirmation à l'internaute pour dire que sa validation a été enregistrée.

Formulaire avec récupération de données $_POST sur 2 pages

Créons deux fichiers : formulaire2.html et formulaire3.php.

L'objectif sera d'avoir le formulaire HTML dans le fichier formulaire2.html et les traitements dans le fichier formulaire3.php

Nous prévoirons 2 champs : pseudo & email.

formulaire2.html
?
<!Doctype html>
<html>
<head>

<link rel="stylesheet" href="structure.css">


<meta charset="utf-8">

</head>
<body>
<form method="post" action="formulaire3.php">
<label for="pseudo">pseudo</label><br>
<input type="text" name="pseudo" id="pseudo" placeholder="saisir 1 pseudo"><br><br>
<label for="email">email</label><br>
<input type="email" name="email" id="email" placeholder="saisir 1 email"><br><br>
<input type="submit">
</form>
</body>
</html>

Le fichier HTML formulaire2.html contient le formulaire, l'action pointe vers le fichier formulaire3.php.
Par conséquent, en cliquant sur le bouton submit, l'internaute sera automatiquement envoyé sur le fichier formulaire3.php.
C'est donc dans ce fichier formulaire3.php que nous ferons les traitements PHP.
formulaire3.php
?
<?php
if(!empty($_POST))
{
echo 'Recuperation des données saisies : <br>';
echo 'pseudo : ' . $_POST['pseudo'] . '<br>';
echo 'email : ' . $_POST['email'] . '<br>';
}
?>

91 Sauvegarder les informations d'un formulaire dans un fichier texte

Votre dossier est composé de 2 fichiers :

------ formulaire2.html

------ formulaire3.php

Nous allons faire en sorte de sauvegarder les données saisies (postées par les internautes) dans un fichier texte qui sera généré à la volée.

Pour cela, utilisons les fonctions prédéfinie de PHP : fopen, fwrite, fclose.

Reprenons le code Html suivant :

formulaire2.html
?
<!Doctype html>
<html>
<head>

<link rel="stylesheet" href="structure.css">


<meta charset="utf-8">

</head>
<body>
<form method="post" action="formulaire3.php">
<label for="pseudo">pseudo</label><br>
<input type="text" name="pseudo" id="pseudo" placeholder="saisir 1 pseudo"><br><br>
<label for="email">email</label><br>
<input type="email" name="email" id="email" placeholder="saisir 1 email"><br><br>
<input type="submit">
</form>
</body>
</html>

Et voici le code PHP correspondant:

formulaire3.php
?
<?php
if(!empty($_POST))
{
echo 'Recuperation des données saisies : <br>';
echo 'pseudo : ' . $_POST['pseudo'] . '<br>';
echo 'email : ' . $_POST['email'] . '<br>';

$f = fopen("sauvegarde.txt","a");
fwrite($f, $_POST['pseudo'] . " - ");
fwrite($f, $_POST['email'] . "\n");
$f = fclose($f);
}
?>

La fonction prédéfinie fopen() permet d'ouvrir un fichier, ils attend 2 arguments, son nom et le mode d'ouverture.
Le mode "a" (que nous utilisons dans cet exemple) permet d'ouvrir le fichier, ou de le créer s'il n'est pas trouvé.
Le fichier est donc ouvert, ou bien créé + ouvert, la variable $f représente le fichier ouvert.
fwrite() permet d'écrire dans le fichier représenté par $f.
\n entre guillemets permet de passer à la ligne dans un fichier (équivalent de <br> dans une page web).
fclose(), n'est pas indispensable pour faire fonctionner l'exemple, cette fonction prédéfinie permet de fermer le fichier et ainsi libérer la ressource.

Après avoir posté un pseudo et un email, vous pouvez retourner dans votre dossier et vous devriez voir apparaitre un nouveau fichier nommé :
sauvegarde.txt

/post/
------ formulaire2.html
------ formulaire3.php
------ sauvegarde.txt

Ouvrez le fichier sauvegarde.txt avec notepad, vous verrez que les enregistrements se trouvent à l'intérieur.

La 1ère fois le fichier est créé et ouvert, toutes les fois suivantes le fichier est simplement ouvert.

Contexte et cas d'utilisation : Si l'on souhaite enregistrer des membres à une newsletter et que l'on ne possède pas de BDD, il serait interessant de le faire
via un fichier texte.

Résultat

Lire dans une page web les informations contenues dans un fichier texte

Suite à l'exemple précédent, le fichier liste.txt a été créé (généré) et contient des informations (pseudo et email) suite à la validation de notre formulaire.

Nous pouvons effectuer l'opération inverse, c'est à dire, se connecter au fichier en php et lire les informations contenues dedans à l'intérieur :

lecture.php
?
$nomFichier = "liste.txt";
$fichier = file($nomFichier); // la fonction file() fait tout le travail, elle retourne chaque ligne d'un fichier à des indices différents d'un tableau array.

print "<pre>"; print_r($fichier); print "</pre>"; // Affichage du tableau Array dans sa structure.

foreach($fichier as $ligne) // Parcours du tableau Array pour un affichage plus conventionnel.


{
echo $ligne."<br>";
}

echo '';

echo implode($fichier, "<br>"); // Affichage du tableau Array avec un passage à la ligne.

Explications

$nomFichier représente le nom du fichier à explorer (il faut que le fichier existe et soit dans le même dossier de préférence).

file est une fonction PHP prédéfinie permettant d'ouvrir un fichier et de retourner son contenu sous forme de tableau ARRAY (chaque ligne représentera

une nouvelle clé du tableau array). Nous lui transmettons la variable $nomFichier afin que le bon fichier soit ouvert.

print_r permet d'afficher le contenu et d'observer la structure du tableau Array

foreach permet de boucler et d'afficher toutes les informations du tableau Array

implode permet également d'afficher toutes les informations du tableau Array

Résultat
Avec print_r :

Array
(
[0] => le pseudo posté
[1] => l'email posté
)

Avec foreach :

le pseudo posté - l'email posté

Avec implode :

le pseudo posté - l'email posté

92 Créer un formulaire de contact et envoyer un email

Envoyer un email en PHP

Pour envoyer un email en PHP, il existe la fonction mail() très pratique.

La fonction mail prend 4 arguments (pas plus, pas moins) dans un ordre précis :

?
<?php
mail("[email protected]", "Le sujet", "Le message", "[email protected]");

Comme dans la plupart des fonctions, il faut respecter le NOMBRE et l'ORDRE des arguments que l'on transmet à une fonction prédéfinie de PHP.

La fonction mail() reçoit toujours 4 ARGUMENTS dans cet ordre précis : adresse email du destinataire, le sujet, le message, adresse email de l'expéditeur.

Bien entendu les adresses email doivent être valides, l'idéal est de privilégier gmail pour sa rapidité et sa flexibilité au niveau de la reception d'emails.

Si vous tester ce code en ligne (sur un hébergeur et une page web), ce code d'1 seule ligne fonctionnera instantanément.

Si vous êtes sous WAMP en localhost, vous devrez configurer légérement votre fichier php.ini.

Pour cela, rendez-vous dans wamp > php > php.ini :

Effectuer au clavier : Ctrl+F (édition>rechercher)


Rechercher la chaîne : "smtp".
Modifier la ligne smtp=localhost par votre SMTP.
Dans mon cas (j'ai la freebox), cela donnera : smtp=smtp.free.fr
Ensuite, vous pouvez effectuer un Ctrl+S (fichier>enregistrer)
Et pour finir : Alt+F4 (fermeture)
Une fois que vous avez modifié un fichier de configuration, pensez à redémarrer les services de wamp en cliquant sur l'icône "Redémarrer les services /
Restart All services" :

Si vous avez un antivirus (firewall), il peut bloquer le port 25 et donc l'envoi d'email, il faudra peut être le configurer ou le désactiver le temps des tests
(pareil pour le parefeu).

Si la configuration est difficile, n'hésitez pas à faire les tests directement sur internet (pour cela il faut posséder un hébergement).

Nous avons vu précédemment que la fonction mail() permettait d'envoyer un email.

Plutôt qu'avoir des valeurs fixes, nous pouvons gérer cela avec un formulaire d'envoi d'email ou un formulaire de contact (très répandu sur la plupart des

sites).

Prenons ce formulaire HTML :

email1.php
?
<form method="post" action="">
<label for="destinataire">Destinataire</label><br>
<input type="text" name="destinataire" id="destinataire" placeholder="destinataire"><br><br>
<label for="expediteur">Expediteur</label><br>
<input type="text" name="expediteur" id="expediteur" placeholder="expediteur"><br><br>
<label for="sujet">Sujet</label><br>
<input type="text" name="sujet" id="sujet" placeholder="sujet"><br><br>
<label for="message">Message</label><br>
<textarea name="message" placeholder="message"></textarea><br><br>
<input type="submit" value="envoyer l'email">
</form>

Ajoutons le code PHP :

email1.php
?
<?php
if(!empty($_POST))
{
// affichage des saisies pour être sur de les obtenir avant de les exploiter.
echo "destinataire : $_POST[destinataire] <br>";
echo "sujet : $_POST[sujet] <br>";
echo "message : $_POST[message] <br>";
echo "expediteur : $_POST[expediteur] <br>";

// entête email
$headers = 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n";
$headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n";
$headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n";
$headers .= 'Delivered-to: ' . $_POST['destinataire'] . "\n";

mail($_POST['destinataire'], $_POST['sujet'], $_POST['message'], $headers);


}
?>
<form method="post" action="">
<label for="destinataire">Destinataire</label><br>
<input type="text" name="destinataire" id="destinataire" placeholder="destinataire"><br><br>
<label for="expediteur">Expediteur</label><br>
<input type="text" name="expediteur" id="expediteur" placeholder="expediteur"><br><br>
<label for="sujet">Sujet</label><br>
<input type="text" name="sujet" id="sujet" placeholder="sujet"><br><br>
<label for="message">Message</label><br>
<textarea name="message" placeholder="message"></textarea><br><br>
<input type="submit" value="envoyer l'email">
</form>

Dans cet exemple, nous prévoyons une condition IF permettant de dire "si l'internaute à posté".

Quelques instructions echo sont présentes afin d'avoir un affichage et ainsi être certain que les saisies soient bien récupérées.

Ensuite, par l'intermédiaire de la variable $headers une partie est en place pour définir les entêtes du mail :

MIME-Version (Multipurpose Internet Mail Extensions). Il s'agit d'un standard.


Seule la version 1 existe, cette ligne n'est donc pas destinée à changer.

Content-type permet de définir l'encodage et le format html.

Reply-To permet d'indiquer une adresse email de réponse.

From permet de préciser le nom de l'expediteur et l'adresse email de l'expéditeur


Cela pourrait être géré avec un champ prenom et nom dans le formulaire html, dans notre cas nous avons préféré isoler le pseudo de l'expéditeur (avant
le caractère '@') avec la combinaison des fonctions substr (coupe une chaine), strpos (donne la position d'un caractère dans une chaine) et ucfirst (met la
1ère lettre en majuscule).

Delivered-to indique l'adresse du destinataire à qui l'email est adressé.

Ensuite, c'est bien la fonction mail qui permet d'envoyer le message :


1er argument : adresse email du destinataire.
2e argument : sujet / objet.
3e argument : message.
4e argument : adresse email de l'expéditeur avec les entêtes.
Nous utiliserons $headers (plus complet en informations et qui contient $_POST['expediteur']) plutôt que $_POST['expediteur'] tout seul (contenant seulement
l'adresse email de l'expéditeur).

Faites le test !
Vous pouvez aussi saisir du html :
?
<div style="background: #f80c43;">Bonjour!</div>

Résultat
Et oui, vous pouvez prendre l'adresse email de nimporte qui. On peut toujours réver !

Mais ce n'est pas le but, restez sage, pas d'usurpation d'identité sauf si c'est pour rire que ça ne porte préjudice à personne ;)

Les entêtes complet d'un email

En théorie, pour envoyer un email de qualité (et mettre toutes les chances de votre côté pour que celui-ci ne soit pas catégorisé en spam chez vos

internautes), vous devrez communiquer avec un serveur SMTP en lui fournissant certaines informations.

Voici un tableau récapitulatif :

Entête Description

Subject Le sujet/objet du message.

From Adresse email de l'auteur du message.

Sender Adresse email de l'expéditeur (souvent la même que From, sauf si l'envoyeur est différent de celui qui a écrit le message).

Reply-To Adresse email de réponse au message (pratique pour communiquer avec un site web lors d'envoi de mail automatique).

To Listing des adresse(s) email(s) des destinataire(s) direct du message (un même email peut être envoyé à plusieurs personnes).

Cc
Listing des adresse(s) email(s) des destinataire(s) en copie du message.
Carbon copy

Bcc
Listing des adresse(s) email(s) des destinataire(s) en copie invisible du message.
Blind carbon copy

Message-ID Code unique d'identification du message.

In-Reply-To Représente l'id du message (pratique pour grouper des échanges d'emails et en faire des conversations)

References Représente l'id de la conversation (lors d'échanges emails).

Comments Commentaires éventuels en lien avec le message.

X-Mailer Messagerie ou Logiciel émetteur du message.

Keywords Mots-clés devrivant le message.

Date Date et heure d'expédition.

MIME-Version Version MIME du mail (seule la version 1.0 existe).


Priority Niveau de priorité du mail.

Content-Type Type de message (par exemple : html ou texte).

Content-transfer-encoding Encodage du message.

Content-Description Description du message.

Créer un formulaire de contact et envoyer un email en PHP pour son site web

Si vous souhaitez être la seule personne à recevoir des emails, il suffit de retirer la case destinataire du formulaire HTML et adapter légérement le code

PHP en conséquence :

Ajoutons le code PHP :

email2.php
?
<?php
if(!empty($_POST))
{
// affichage des saisies pour être sur de les obtenir avant de les exploiter.
echo "sujet : $_POST[sujet] <br>";
echo "message : $_POST[message] <br>";
echo "expediteur : $_POST[expediteur] <br>";

// entête email
$headers = 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n";
$headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n";
$headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n";
$headers .= 'Delivered-to: [email protected]' . "\n";

mail("[email protected]", $_POST['sujet'], $_POST['message'], $headers);


}
?>
<form method="post" action="">
<label for="expediteur">Expediteur</label><br>
<input type="text" name="expediteur" id="expediteur" placeholder="expediteur"><br><br>
<label for="sujet">Sujet</label><br>
<input type="text" name="sujet" id="sujet" placeholder="sujet"><br><br>
<label for="message">Message</label><br>
<textarea name="message" placeholder="message"></textarea><br><br>
<input type="submit" value="envoyer l'email">
</form>

Résultat

Nous n'utilisons pas le $_POST['destinataire'], puisque ce sera toujours vous, nous avons retiré la case de saisie du formulaire HTML.

Ceci est mieux que l'utilisation d'un mailto() dans la mesure où votre adresse (dans le code php exécuté côté serveur) ne sera pas visible par les robots et
vous ne risquerez pas d'être spammé !

Créer un formulaire de contact et envoyer un email en PHP avec plusieurs informations

Si vous souhaitez ajouter récolter d'autres informations sur l'internaute, il suffit d'ajouter d'autres champs de formulaire HTML et de prévoir le code de
récupération en PHP :

Prenons ce code :

email3.php
?
<?php
if(!empty($_POST))
{
// affichage des saisies pour être sur de les obtenir avant de les exploiter.
echo "expediteur : $_POST[expediteur] <br>";
echo "nom : $_POST[nom] <br>";
echo "prenom : $_POST[prenom] <br>";
echo "societe : $_POST[societe] <br>";
echo "sujet : $_POST[sujet] <br>";
echo "message : $_POST[message] <br>";

// entête email
$headers = 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=ISO-8859-1'."\n";
$headers .= 'Reply-To: ' . $_POST['expediteur'] . "\n";
$headers .= 'From: "' . ucfirst(substr($_POST['expediteur'], 0, strpos($_POST['expediteur'], '@'))) . '"<'.$_POST['expediteur'].'>' . "\n";
$headers .= 'Delivered-to: [email protected]' . "\n";

$message = "Nom : " . $_POST['nom'] . "\nPrénom : " . $_POST['prenom'] . "\nSociété : " . $_POST['societe'] . "\nMessage : " .
$_POST['message'];

mail("[email protected]", $_POST['sujet'], $message, $headers);


}
?>
<form method="post" action="">
<label for="nom">Nom</label><br>
<input name="nom" id="nom" placeholder="nom" type="text"><br><br>
<label for="prenom">Prenom</label><br>
<input name="prenom" id="prenom" placeholder="prenom" type="text"><br><br>
<label for="societe">Société</label><br>
<input name="societe" id="societe" placeholder="societe" type="text"><br><br>
<label for="expediteur">Expediteur</label><br>
<input type="text" name="expediteur" id="expediteur" placeholder="expediteur"><br><br>
<label for="sujet">Sujet</label><br>
<input type="text" name="sujet" id="sujet" placeholder="sujet"><br><br>
<label for="message">Message</label><br>
<textarea name="message" placeholder="message"></textarea><br><br>
<input type="submit" value="envoyer l'email">
</form>

Résultat
Attention
Nous ne pouvons pas ajouter plus d'arguments à la fonction mail() et par conséquent nous ne pouvons pas lui passer tous les $_POST de
notre formulaire.

Notre code permet de mettre toutes les informations à l'intérieur de $_POST['message']. Et puisqu'on le redéfinit, il ne faut pas oublier de ré-affecter le
message lui même.

Les cookies

93 Découverte des cookies

Qu'est-ce qu'un cookie ? Un cookie est un fichier sauvegardé sur l'ordinateur de l'internaute avec des informations à l'intérieur.

Les informations à l'intérieur d'un cookie ne sont pas sensibles (pas de mot de passe), il s'agit en général de préférence, exemple : langue dans laquelle

l'internaute souhaite visiter le site, derniers produits consultés dans une boutique (cela permettra de relancer l'internaute sur d'autres produits durant ses

prochaines navigations, voir le remarketing en référencement), etc.

Depuis quelques années, les sites web Européens ont l'obligation d'informer les internautes lorsque des informations liées à leur navigation et utilisation

sont retenues dans un fichier cookie.

Yahoo (exemple) : cliquez ici pour connaitre le genre d'informations retenues sur vous et aussi leur utilisation

Pour créer un cookie, cela se fait avec la fonction prédéfinie de PHP setCookie :

cookie1.php
?
<?php
setCookie("nomCookie","contenuCookie",time()+31536000);

Explications

setCookie est donc une fonction prédéfinie permettant de créer un fichier (un fichier cookie) sur l'ordinateur de l'internaute pour sauvegarder des
informations.

Les arguments attendus sont :

1. Le nom du cookie, dans notre cas nous l'avons nommé "nomCookie".

2. Le contenu du cookie (les informations), ici nous avons inscrit "contenuCookie".

3. La date d'expiration du cookie (péremption), dans l'exemple ci-dessus nous avons pris le moment actuel (par l'intermédiaire de la foncion time(),
timestamp) et avons ajouté le nombre de secondes écoulées en 1 année, soit : 31536000 (secondes)

A noter, un internaute peut supprimer 1 cookie a tout moment (puisque le fichier se trouve sur son ordinateur)!

Qu'est-ce que la fonction time() en PHP :

La fonction PHP prédéfinie time() permet de donner le timestamp, cela représente le nombre de secondes écoulées entre le 01 janvier 1970 (date clé en
informatique) et maintenant (le moment présent).
Plus d'informations ici : Wikipédia TimeStamp

Pour voir le timestamp, essayons ce code :

?
echo time();
Rechargez la page plusieurs fois ( F5 ou Ctrl+R , vous verrez le résultat changer en conséquence (puisqu'à chaque instant des secondes s'écoulent).

Résultat
1460304745

Avant de nous interesser et d'observer les cookies sur notre ordinateur, je vous invite à faire du ménage en supprimant vous aussi tous vos cookies, voici
le raccourci clavier : Ctrl+Shift+Suppr (attention vous serez deconnecté des différents sites web où vous aviez enregistré votre connexion).

Reprenons notre code :

cookie1.php
?
<?php
setCookie("nomCookie","contenuCookie",time()+31536000);

Exécuter la page cookie1.php et ensuite pour voir le cookie apparaitre (sous le navigateur mozilla firefox), vous pouvez vous rendre dans la partie

suivante : Outils > Options > Vie privée > Régle de conservation : Utiliser les paramètres personnalisés pour l'historique > Afficher les cookies.
Après avoir exécuté dans le navigateur le fichier cookie1.php. Nous pouvons apercevoir notre cookie et son contenu.

setCookie() est une fonction prédéfinie permettant de créer un cookie, cependant il n'y a pas de fonction prédéfinie permettant de le supprimer. Pour rendre
inactif un cookie, on le met généralement à jour avec une date périmée.

94 Cas pratique : une page multilingue avec des cookies

Pour mieux se représenter à quoi peuvent nous servir les cookies dans le cadre d'un site web, je vous propose de créer une page multilingue. Ce sera plus

concret !

Je vous invite à créer le début de l'exemple vous même (sous forme d'exercice), nous ferons la partie cookie ensemble.

Voici les consignes :

Exercice :

1. Créer 1 fichier nommé langue.php

2. Créer 4 liens HTML pointant vers la même page (soit un href sur langue.php)
Les liens seront : French - English - Italy - Spain (vous pouvez aussi ajouter des drapeaux en image)

3. Lorsque l'on clique sur l'un des liens HTML, nous n'irons nulle part et devrons rester sur la même page (soit langue.php), cependant il faudra
transmettre une information dans l'url du type : ?pays=fr (pour french), ?pays=en (pour english), ?pays=it (pour Italy), ?pays=es (pour Spain)

4. Ensuite, l'idéal serait de récupérer l'argument passé dans l'url (via $_GET) et de l'afficher sur la page web.
Si l'internaute clique sur French on affichera fr, si l'internaute clique English on affichera en, si l'internaute clique Italy on affichera it, et enfin si
l'internaute clique Spain on affichera es. Toujours dans la même page web !

Voici la correction :
langue.php
?
<?php
if(!empty($_GET['pays']))
{
echo 'code pays : ' . $_GET['pays'];
}
?>

<ul>
<li><a href="?pays=fr"> French </a></li>
<li><a href="?pays=es"> Spain </a></li>
<li><a href="?pays=an"> Angleterre </a></li>
<li><a href="?pays=it"> Italie </a></li>
</ul>

Tant qu'il s'agit d'un entrainement (et tant que notre page n'est pas en ligne, sur le web), nous ne sommes pas obligé de mettre les balises d'entête doctype etc.

Résultat
Exemple avec un clic sur "Spain" pour la langue espagnol :

Si vous cliquez sur "Spain", vous verrez afficher le code pays es, cela fonctionne très bien mais votre préférence (dans le choix de la langue espangole) ne
sera pas gardée si vous partez en fermant la page et que vous revenez sur le site web plus tard.

Si ce code n'est pas clair pour vous, il faudra prendre le temps de relire le chapitre sur le passage d'argument dans une url et la récupération avec la
superglobale $_GET.

Plusieurs sites fonctionnent comme ça ! avec un argument dans l'url.

Cliquez ici et regardez bien la fin de l'url le site d'Apple (pour exemple) : Apple FR - Apple IT
Adaptons et modifions un peu le code pour sauvegarder la langue de l'internaute dans un cookie :

langue.php
?
<?php
if(isset($_GET['pays']))
{
$pays=$_GET['pays'];
}
elseif(isset($_COOKIE['pays']))
{
$pays=$_COOKIE['pays'];
}
else
{
$pays='fr';
}

$expiration = 365*24*3600;
setCookie("pays",$pays,time()+$expiration);
?>

<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Page Multilingue</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<ul>
<li><a href="?pays=fr"> French </a></li>
<li><a href="?pays=es"> Spain </a></li>
<li><a href="?pays=an"> Angleterre </a></li>
<li><a href="?pays=it"> Italie </a></li>
</ul><br>
<?php
switch($pays)
{
case 'fr':
echo '<p>Bonjour, <br> Vous visiter actuellement le site en français <br>Effectivement, la sauvegarde du cookie permet de retenir la
langue avec laquelle vous naviguer sur le site pour vos prochaines visites. <br>A bientôt.</p>';
break;
case 'es':
echo '<p>¡Hola <br>En este momento está visitando el sitio en español <br>De hecho, la cookie permite la copia de seguridad de
conservar el idioma que utilice el sitio para futuras visitas. <br>Pronto.</p>';
break;
case 'en':
echo '<p>Hello <br>You are currently visiting the site in English <br>Indeed, the cookie allows the backup to retain the language that you
use the site for future visits. <br>Soon.</p>';
break;
case 'it':
echo '<p>Ciao <br>Si sta attualmente visitando il sito in Italiano <br>Infatti, il cookie consente il backup di mantenere la lingua che si usa
il sito per visite future. <br>Presto.</p>';
break;
}
?>
</body>
</html>

Explications et décomposition du code

1ère condition IF :
?
if(isset($_GET['pays']))
{
$pays=$_GET['pays'];
}

Cette condition permet de savoir si un code pays est défini.


En gros : est-ce que l'internaute a cliqué sur l'un des liens pour afficher le site dans une langue particulière ?
Si l'url contient un code pays, c'est donc qu'un lien a été cliqué, nous l'affectons à la variable $pays

2ème condition ELSEIF :


?
elseif(isset($_COOKIE['pays']))
{
$pays = $_COOKIE['pays'];
}

Elseif = Sinon si, un cookie nommé "pays" existe sur l'ordinateur de l'internaute.
Nous le récupérons et affectons la variable $pays avec.
Cette condition s'exécutera uniquement si nous ne sommes pas rentrés dans le IF précédent et si l'internaute est déjà venu sur le site (sinon le cookie
n'existerait pas).

3ème condition ELSE :


?
else
{
$pays = 'en';
}

Else = Sinon, dans le scénario où le if (pas de clic sur 1 lien de la part de l'internaute) et le elseif (pas de cookie) ne se déclenchent pas, le cas par
défaut sera appliqué.
Nous mettons le code pays "en" dans la variable $pays
Ce cette manière, le site s'affichera par défaut en Anglais.
Cette condition (par défaut) s'exécutera uniquement si nous ne sommes pas rentrés dans le IF, ni dans le ELSEIF précédent.

Nous ressortirons forcément de cette série de conditions IF / ELSEIF / ELSE avec la variable $pays affectée par un code pays:

Affichage de $pays :
?
echo $pays;

Si vous souhaitez avoir connaissance du code pays dans la variable $pays, rien ne vous empêche d'écrire la ligne ci-dessus (le temps des tests).
Cela affichera le contenu de la variable $pays

Création / Mise à jour du cookie :


?
$expiration = 365*24*3600;
setCookie("pays",$pays,time()+$expiration);

$expiration nous permet de conserver le calcul d'1 année en secondes (365 jours x 24 heures x 3600 vient de 60sec x 60min nombre de seconde dans

1 heure).
setCookie nous permet de déposer le fichier cookie sur l'ordinateur de l'internaute.

Argument 1 - Nom du cookie : pays


Argument 2 - Valeur du cookie : "fr" ou "en" ou "it" ou "es"
Argument 3 - Date d'expiration : dans 1 an à partir d'aujourd'hui
Puisque ce code ne se trouve pas dans une condition, nous créerons (dans tous les cas) un cookie (sur l'ordinateur de l'internaute) avec le code pays
contenu dans la variable $pays.
Un cookie sera valable 1 an après la dernière visite de l'internaute (l'internaute qui se connecte tous les mois verra son choix gardé à l'infini sans
probleme d'affichage de texte pour la langue, puisqu'à chacun de ses passages son cookie est relancé pour 1 année à partir de sa dernière visite).

Condition Switch :
?
switch($pays)
{
case 'fr':
echo '<p>Bonjour, <br> Vous visiter actuellement le site en français <br>Effectivement, la sauvegarde du cookie permet de retenir la langue
avec laquelle vous naviguer sur le site pour vos prochaines visites. <br>A bientôt.</p>';
break;
case 'es':
echo '<p>¡Hola <br>En este momento está visitando el sitio en español <br>De hecho, la cookie permite la copia de seguridad de conservar
el idioma que utilice el sitio para futuras visitas. <br>Pronto.</p>';
break;
case 'en':
echo '<p>Hello <br>You are currently visiting the site in English <br>Indeed, the cookie allows the backup to retain the language that you use
the site for future visits. <br>Soon.</p>';
break;
case 'it':
echo '<p>Ciao <br>Si sta attualmente visitando il sito in Italiano <br>Infatti, il cookie consente il backup di mantenere la lingua che si usa il
sito per visite future. <br>Presto.</p>';
break;
}

La condition switch test la variable $pays et permet de faire sortir le bon texte à afficher en fonction de la langue de l'internaute.

Faites les tests !

Résultat et tests ! Etape 1 : Cliquez sur le lien "Italy", le texte s'affiche en italien.
Etape 2 : Fermer votre navigateur (ou onglet).
Etape 3 : Rouvrez votre navigateur (ou onglet) et allez sur la page web langue.php (sans argument pays dans l'url).
Etape 4 : Le texte reste affiché en italien. Ca fonctionne ! 1 fichier cookie a bien été créé sur l'ordinateur de l'internaute et a été pris en compte.
Etape 5 : Observer le cookie, dans firefox : outils > option > Vie Privée > Conserver les paramètres personnalisés pour l'historique > Afficher les cookies >
localhost > pays : voir les détails affichés.
Si votre test ne fonctionne pas, pensez à vérifier le code (voir s'il n'y a pas d'erreur) et aussi regardez si l'option "vider l'historique lors de la fermeture de firefox"
n'est pas cochée, ce qui empêcherait de garder les cookies.

L'anglais est choisi comme langue par défaut, mais il aurait par exemple été possible de détecter la langue du navigateur de l'internaute par l'utilisation de
la superglobale $_SERVER afin d'adapter l'affichage de la page web en conséquence.

Quelques Questions :

Question 1 : Est-ce possible de tomber dans plusieurs conditions (if/else/elseif) en même temps ?
Réponse 1 : Non.

Question 2 : Dans quelle condition rentre l'internaute lors de sa toute 1ère visite ?
Réponse 2 : else et donc l'affichage du site par défaut est en Anglais

Question 3 : Dans quelle condition l'internaute rentre lorsqu'il clique sur un lien ?
Réponse 3 : if

Question 4 : Dans quelle condition l'internaute rentre lorsqu'il revient sur le site 15 jours plus tard ?
Réponse 4 : elseif, car un cookie existe

Question 4 : Dans quelle condition rentre l'internaute lorsqu'il revient sur le site 15 jours plus tard après avoir cliqué sur 1 lien ?
Réponse 4 : if, car même si un cookie existe, nous vérifions d'abord si l'internaute a cliqué sur 1 lien (dans l'ordre du code) et si nous rentrons dans le if,
nous ne rentrerons donc pas dans le elseif.

Question 5 : Lors de la toute 1ère visite d'un internaute, est-ce qu'un cookie est créé ?
Réponse 5 : oui, a chaque fois, le setCookie() ne se trouve pas dans une condition et est toujours appliqué.

Question 6 : Lors des visites suivantes, que se passe t'il ? et que se passe t'il si l'internaute change de langue ?
Réponse 6 : Le cookie est mis à jour sur la durée de vie. Si la langue est changée, le cookie est mis à jour sur la durée de vie et le contenu.

Question 7 : Est-ce qu'on pourra mettre les informations (produits, prix, etc) d'un panier dans un cookie ?
Réponse 7 : Surtout pas ! l'internaute pourra modifier le prix, ca sera son fichier texte, étant sur son pc cela lui appartient.

Nous garderons donc l'utilisation des fichiers cookies pour des préférences mineures
Les sessions

95 Qu'est-ce qu'une session ?

Une session est un système mis en oeuvre dans le code PHP permettant de conserver sur le serveur, dans un fichier temporaire, des informations relatives

à un internaute.

L'avantage d'une session c'est que les données seront enregistrées dans un fichier sur le serveur disponible et consultable par toutes les pages durant

toute la navigation de l'internaute.

96 Contexte : Quels sont les cas d'utilisation ?

Habituellement pour sauvegarder des données, nous enregistrons des informations dans une base.

Mais nous ne devons pas avoir toujours recours à une base de données, parfois il est utile de sauvegarder des informations dans 1 fichier (1 fichier de
session).

Exemple pour un panier :


Nous ferons le panier d'un site ecommerce avec un système de session.
Nous n'enregistrerons pas les produits ajoutés au panier dans une base de données puisque la plupart du temps les paniers ne sont pas payés (les
internautes ne finalisent pas toujours la commande). Cela évitera de "polluer" la base de données pour rien. En revanche, (si le panier et le paiement sont
validés) la commande sera enregistrée dans une base de données.

Exemple avec la connexion d'un internaute (membre) :


Lorsqu'un internaute s'inscrit à 1 site, nous l'enregistrons dans une base de données.
Lorsqu'il se connecte (avec le bon pseudo et le bon mot de passe), nous gardons l'information (comme quoi l'internaute est actuellement connecté) en
mémoire dans 1 fichier de session.
En effet, nous n'allons pas solliciter une éventuelle table de la base "internaute_actuellement_connecte" car cela change souvent et les requêtes sql pour
cette tâche allourdiraient le site web.

Plus généralement, voici des cas d'utilisation :

La connexion d'un membre à un site web.


Le panier d'un site ecommerce (vente en ligne).
Les formulaires à plusieurs étapes.
D'autres informations générales. Cela peut être marketing (derniers produits vus, suggestions de produits adaptés aux préférences de l'internaute
selon sa navigation), etc.

Pour conclure, nous utiliserons les sessions pour sauvegarder des informations temporaires et garderons l'utilisation de base de données pour sauvegarder
des informations durables.

97 A quoi ça sert ?

Comme vous l'aurez compris, les sessions en PHP vont nous permettre de conserver des informations sur un internaute côté serveur.

Sans ce mécanisme, vous ne pourriez pas connecter un internaute à votre site et maintenir sa connexion durant la navigation (de page en page).

De la même manière, lorsqu'un internaute ajoute des produits dans un panier (ecommerce), comment se fait-il que les produits soient toujours présents en
mémoire même lorsque vous naviguez de page en page (pour partir et revenir du panier), ce n'est pas magique, là aussi ce sont grâce aux sessions !
1 page (ou fichier) représente 1 script qui s'exécute une fois, puis l'internaute se déplace dans le site pour se rendre vers un autre contenu (ce qui exécute
1 autre script).
Pour ne pas que les informations se perdent d'une page à un autre (d'un fichier script à un autre), nous utiliserons les sessions !

98 Comment cela fonctionne ?

2 besoins reviennent régulièrement :

Créer 1 fichier de session pour une première utilisation


Lire 1 fichier de session existant pour une seconde (ou énième) utilisation.

La bonne nouvelle c'est que pour ces 2 actions nous utiliserons la même fonction prédéfinie de PHP !

Pour créer ou lire un fichier de session, nous utiliserons la fonction prédéfinie session_start().

session1.php
?
<?php
session_start();

Quelques Explications :

session_start() permet de créer un fichier de session ou de l'ouvrir s'il existe déjà.

Où se trouve les fichiers de session ?

Les fichiers de session se trouvent sur le serveur, dans un dossier nommé /tmp/ (tmp pour temporaire).

Etant donné que nous possédons un serveur web local (sur notre pc), vous pourrez vous rendre à l'emplacement de wamp.
En passant dans "ordinateur", voici des chemins d'exemple : c:/wamp/tmp/ ou c:/programmes/wamp/tmp/

Votre page de code session1.php restera vierge mais pas votre dossier /tmp/ puisque vous devriez y retrouver un fichier temporaire :

Résultat

Nous avons donc 1 fichier temporaire sur le serveur.

Si nous avons plusieurs internautes différents, nous aurons donc plusieurs fichiers de session.

Comment le serveur peut savoir à qui appartient tel ou tel fichier ?

Pour cela, nous allons avoir besoin de créer des cookies, des cookies de session !

Et bonne nouvelle, c'est déjà fait ! Lorsque nous utilisons session_start(), cela crée 1 fichier de session (sur le serveur) mais aussi 1 fichier cookie (sur

l'ordinateur de l'internaute), comme si nous avions utilisé setCookie() !


Résultat
Exécuter la page session1.php et ensuite pour voir le cookie apparaitre (sous le navigateur mozilla firefox), vous pouvez vous rendre dans la partie

suivante : Outils > Options > Vie privée > Régle de conservation : Utiliser les paramètres personnalisés pour l'historique > Afficher les cookies.
A noter : Le nom du fichier de session correspond au contenu du fichier cookie, dans mon cas : qtscf8bkkkqirmqchaffuov7t5

C'est ce qui permet de les relier ensemble !


Dans le cas d'un panier (sur un site ecommerce), les informations relatives aux produits seront conservées dans le fichier de session (sur le serveur) et
seront reliées à l'internaute grâce au cookie.

Si l'internaute supprime son cookie, cela "casse" le lien avec le fichier de session (le panier sera donc vide, vous pouvez essayer ça sur nimporte quel site
web).

De la même manière, ce système (session+cookie) permet de maintenir une connexion à un site web. L'internaute ne peut pas supprimer le fichier de
session (puisqu'il n'a pas accès au serveur) mais il peut supprimer son cookie (sur son ordinateur) et donc la connexion sera perdue (pour faire le test :
n'hesitez pas à supprimer vos cookies, vous perdrez toutes vos connexions en cours).

Pour résumé :
session_start() permet de créer un fichier de session (ou de l'ouvrir s'il existe déjà), mais aussi de créer un cookie (ou s'il existe déjà, de le relier à un
fichier de session déjà existant).

Il faut toujours utiliser le code session_start() au plus haut de la page et si possible dans les toutes premières lignes !

Pour ne pas obtenir une erreur PHP du type : "Cannot modify header information - headers already sent by ...", ou encore "Cannot send session cookie - headers
already sent by ...". Il faut éviter d'inscrire une balise html, un espace, ou une instruction d'affichage du type "echo, print, var_dump, print_r", etc. avant
session_start().
99 Ecrire dans 1 fichier de session

Maintenant que nous avons obtenu 1 fichier de session, l'objectif est de conserver des données et donc pour cela d'écrire des informations.

Pour cela, une superglobale $_SESSION est prévue à cet effet.

Toutes les superglobales sont (par défaut) ARRAY, nous utiliserons donc des crochets pour y inscrire des valeurs.

session1.php
?
<?php
session_start();
$_SESSION['pseudo'] = "Mathieu";
$_SESSION['mdp'] = "Balmont";
print_r($_SESSION);

Quelques Explications :

$_SESSION['pseudo'] = "Mathieu"; La présence des crochets permet d'affecter des valeurs dans le tableau array superglobale $_SESSION.

print_r($_SESSION); L'instruction print_r permet d'afficher le contenu d'un tableau ARRAY et, dans notre cas, d'explorer la superglobale $_SESSION.

Retournons dans notre dossier /tmp/ (présent à l'intérieur de wamp).

Résultat

Ouvrons ce fichier (clic droit > éditer avec notepad++) :

pseudo|s:7:"Mathieu";mdp|s:7:"Balmont";
s correspond à string (chaine de caractère)
7 correspond à la taille du string (taille de la chaine de caractère)

Créons un deuxième fichier, qui n'a aucun rapport, et qui peut être placé dans le même dossier ou ailleurs sur le serveur (prenez l'emplacement de votre
choix dans le repertoire www).
Nous nommerons ce fichier : bonjour.php

bonjour.php
?
<?php
session_start();
echo 'Bonjour ' . $_SESSION['pseudo'] . '<br>';

Résultat

Bonjour Mathieu

Ce fichier n'a rien à voir avec l'autre, il n'y a pas d'inclusion, il pourrait être dans un autre dossier, s'appeler nimporte comment, les informations contenues seraient
quand même accessibles ! c'est la puissance et l'interêt des sessions !

Quelques Explications :

Ca fonctionne ! mais ce n'est pas magique, voici l'explication :


Dans notre cas, session_start(); permet d'ouvrir le fichier de session présent dans le dossier /tmp/ (il n'est pas créé ou recréé puisqu'un fichier de

session relié au cookie de l'internaute existe déjà).

echo 'Bonjour ' . $_SESSION['pseudo'] . '

'; Avec ce code, nous affichons le pseudo gardé en mémoire dans le fichier de session.
Nous pouvons le traduire par (echo) affiche moi, (bonjour) bonjour, (.) suivi de..., ($_SESSION['pseudo']) le pseudo conservé dans la session

Pour conclure, après avoir utilisé session_start() pour travailler avec les sessions, la superglobale $_SESSION nous permet d'intéroger le fichier de session
sur le serveur (présent dans le dossier /tmp/).

L'avantage c'est que les informations contenues dans le fichier de session seront disponibles sur tout le site durant la navigation de l'internaute !

C'est la raison pour laquelle vous etes parfois toujours connecté lorsque vous retournez sur un site web.

Le fichier bonjour.php pourrait retourner une erreur si la session était détruite car en l'absence d'une condition IF, nous tenterons toujours d'afficher le pseudo contenu
dans la session, il y a donc 1 risque d'erreur unedfined.

100 Vider une partie du fichier de session

Pour vider un fichier de session, nous utilisons la fonction prédéfinie unset() :

session1.php
?
<?php
session_start();
$_SESSION['pseudo'] = "Mathieu";
$_SESSION['mdp'] = "Balmont";
print_r($_SESSION);
unset($_SESSION['mdp']);
print_r($_SESSION);

Quelques Explications :

unset($_SESSION['mdp']); permet de vider la partie "mdp" (mot de passe).


Rouvrez le contenu de votre fichier temporaire (dossier /tmp/, présent à l'intérieur de wamp).

Résultat

Ouvrons ce fichier (clic droit > éditer avec notepad++) :

pseudo|s:7:"Mathieu";
101 Supprimer un fichier de session

Pour supprimer un fichier de session, nous utilisons la fonction prédéfinie session_destroy() :

session1.php
?
<?php
session_start();
$_SESSION['pseudo'] = "Mathieu";
$_SESSION['mdp'] = "Balmont";
print_r($_SESSION);
unset($_SESSION['mdp']);
print_r($_SESSION);
session_destroy();
print_r($_SESSION);

Quelques Explications :

session_destroy(); permet de supprimer physiquement le fichier de session dans le dossier /tmp/ et donc toutes les informations contenues dans le
fichier.

Petite particularité : il faut savoir que le session_destroy() est vu par l'interpréteur, gardé, puis exécuté qu'à la fin du script.

C'est la raison pour laquelle le dernier print_r vous donnera toujours accès aux informations de la session car l'exécution du script n'est pas terminé.

Cependant, si vous retourner dans votre dossier /tmp/, présent à l'intérieur de wamp, vous verrez que le fichier n'existe plus !

102 Explications supplémentaires

Comment se fait-il, techniquement, que quand vous vous rendez sur un site et que vous mettez le bon pseudo et le bon mdp, vous restez connecté
pendant 1h si votre navigation dure 1h ? pourquoi on ne vous demande pas de vous reconnecter à chaque changement de page ? ...car il existe une
session prouvant que vous êtes déjà passé par la porte d'entrée (vous êtes déjà identifié) ! Sans session, la connexion ne serait pas maintenue.

Les informations d'une session sont enregistrées dans la session coté serveur, cela crée (dans le même temps) un cookie précisement à l'identifiant de la
session, sur le pc du client.

C'est la raison pour laquelle nous enregistrerons le prix d'un panier dans un fichier de session, de cette manière il ne pourra pas être modifié (par
l'internaute) car il s'agit d'un fichier enregistré directement sur le serveur du site. Et, dans le cookie nous reliant au site, nous retrouverons uniquement
l'identifiant qui permet de mener à la bonne session (la notre).

Si le prix d'un panier était enregistré dans le cookie, l'internaute pourrait le modifier car il s'agit d'un fichier sur son ordinateur.
Sur 1 site web il peut y avoir des dizaines, des centaines, des milliers ou des millions de sessions, il ne suffit pas d'en créer 1 à un internaute, il faut
aussi que l'internaute soit relié à la sienne, c'est donc aussi grâce au cookie que le lien est établi. Si l'internaute supprime son cookie ou si le site décide
de supprimer la session : le lien est cassé.

Quand vous effectuer un session_start(), un fichier de session est créé coté serveur (/tmp/) et un cookie de session est créé automatiquement coté client
(pc) afin que le lien entre le site et le pc de l'internaute soit bien établit.

Quand vous cliquez sur "se déconnecter" :


cela effectue un "unset()" pour vider votre partie de membre mais quand même conserver le reste des informations (produit dans le panier par exemple).
cela peut aussi effectuer un "session_destroy()" pour supprimer le fichier de session complétement.

TOUS les sites qui vous proposent une connexion fonctionne avec les sessions. N'hesitez donc pas à relire ce chapitre s'il n'est pas parfaitement clair.

103 Exemple d'un formulaire avec session

Pour mieux comprendre le système de session, munissons-nous d'un formulaire simple.

formulaire_session.php
?
<?php
session_start();
if($_POST)
{
$_SESSION["pseudo"] = $_POST['pseudo'];
}
//--------------------------------------
if(isset($_SESSION['pseudo']))
{
echo "votre pseudo est: " . $_SESSION['pseudo'] . "<br>";
}
else
{
echo ' <form method="post" action="">
<label for="pseudo">Pseudo:</label><br>
<input type="text" name="pseudo" value=""><br>
<input type="submit" value="envoi">
</form>';
}

Quelques Explications :

session_start(); nous permet de créer 1 fichier de session la première fois (et de l'ouvrir les fois suivantes).

if($_POST) permet de déclarer une condition "si l'internaute à posté en cliquant sur le bouton submit", nous rentrons dans les accolades du IF et

exécutons le code présent


- Enregistrement du pseudo posté par l'internaute via le formulaire, dans le fichier de session.

if(isset($_SESSION['pseudo'])) permet de déclarer une condition "si un pseudo est défini dans le fichier de session de l'internaute", nous rentrons

dans les accolades du IF et exécutons le code présent


- Affichage du pseudo de l'internaute conservé dans le fichier de session.

else (ce else se réfère au IF précédent) permet de déclarer un cas par défaut "si aucun pseudo n'est défini dans le fichier de session de l'internaute", nous
rentrons dans les accolades du ELSE et exécutons le code présent
- Affichage d'un formulaire.

Résultat
Le formulaire sera affiché tant qu'un pseudo n'est pas saisi, posté, et conservé dans le fichier de session.

Lorsqu'un pseudo est conservé dans le fichier de session, le formulaire n'apparait plus.

Pour ré-initialiser la page et faire ré-apparaitre le formulaire, vous pouvez vider vos cookies ( ctrl+shift+suppr ) cela cassera le lien avec le fichier de
session.

104 Exemple avec l'inactivité d'une session

Il arrive parfois que la durée de vie des sessions soit limitée sur certains sites (par exemple sur les sites des banques vous êtes déconnécté
automatiquement au bout de 10 minutes d'inactivité).
Le réglage de la durée de vie d'une session peut se faire dans le paramètrage du serveur ou directement dans le script.

Voici un exemple :

inactivitee.php
?
<?php
session_start();
echo 'Temps Actuel : ' . time() . '<br>';
print "<pre>"; print_r($_SESSION); print "</pre>";

if(isset($_SESSION['temps']))
{
if(time()>($_SESSION['limite'] + $_SESSION['temps']))
{
session_destroy();
echo "déconnexion";
}
else
{
$_SESSION['temps'] = time();
echo "connexion mise à jour";
}
}
else
{
echo "connexion";
$_SESSION['limite'] = 20;
$_SESSION['temps'] = time();
}

Quelques Explications et déroulement du script :

Pour les tests il serait judicieux de spliter l'écran en deux avec d'un côté votre page web et de l'autre votre dossier /tmp/.

session_start() nous permet de créer 1 fichier de session la première fois (et de l'ouvrir les fois suivantes).

echo 'Temps Actuel : ' . time() . '

'; permet de voir le timestamp actuel

if(isset($_SESSION['temps'])) si une session du nom de "temps" existe nous rentrons dans le IF (ce qui n'est pas le cas, la toute première fois),
nous rentrerons donc dans le ELSE

else Nous rentrons dans le ELSE car aucune session du nom de "temps" existe.

$_SESSION['limite'] = 20; Nous rentrons le chiffre 20 dans une partie de la session que nous nommerons "limite". Cela nous permettra plus tard de
limiter la session à 20 secondes.

$_SESSION['temps'] = time(); Nous rentrons le timestamp actuel (nombre de secondes écoulées entre le 01/01/1970 et maintenant) dans une partie
de la session que nous nommerons "temps". Cela nous permettra plus tard d'interroger la dernière trace d'activité sur le site web.

...Relancer l'exécution de la page avec l'aide de F5 ou Ctrl+R .


...Le code se ré-exécute.

if(isset($_SESSION['temps'])) si une session du nom de "temps" existe nous rentrons dans le IF (ce qui est le cas, la seconde première fois, nous

ne rentrerons donc pas dans le ELSE

if(time()>($_SESSION['limite'] + $_SESSION['temps'])) si le timestamp actuel est supérieur au dernier timestamp enregistré dans la session +

la partie limite enregistrée dans la session (pour rappel, 20 secondes), c'est donc que nous avons dépassé notre temps de connexion inactive autorisée,
nous rentrerons dans les accolades du IF

session_destroy(); permet de supprimer le fichier de session.

... Dans l'autre cas, si vous affichez la page web une première fois et que vous la raffraichissez rapidement (moins de 20 secondes après), nous rentrons
dans le 1er IF puis dans le ELSE (présent à l'intérieur du premier IF)

$_SESSION['temps'] = time(); cela nous permet de mettre la connexion à jour en affectant le timestamp actuel dans la session (cela le modifiera
pour l'actualiser).

Pour conclure :
Nous n'avons pas autorisé l'internaute à garder une connexion de 20 secondes au total mais nous l'avons autorisé à conserver une connexion de 20
secondes après son dernier mouvement (clic, raffraichissement de page, etc.).

Résultat

Les résultats diffèrent selon l'état de la page web.

Démo conseillée : Lancer l'exécution de la page...attendre 2 sec, effectuer un ctrl+r , attente 2 sec, effectuer un ctrl+r , attendre 30 secondes, effectuer un
ctrl+r . Et surtout (au même moment) observer le dossier /tmp/ avec un écran splité en deux.

105 Gérer la durée de vie des sessions

Gérer la durée de vie des sessions et/ou supprimer les fichiers de session du serveur

Dans le fichier de configuration php.ini (pas toujours disponible, selon l'hebergement souscrit, mutualisé, dédié, vps, etc.)
session.gc_maxlifetime : permet de determiner la durée de vie des fichiers de sessions du dossier /tmp/ avant qu'ils ne soient supprimés. Cela
commence par "gc" pour Garbage Collector.

106 Sécurité des fichiers de sessions

Dans le fichier de configuration php.ini, nous pouvons modifier 2 ou 3 paramètres liés à l'utilisation des sessions :

session.use_cookies 1 permet de préciser que l'identifiant de session sera transmis par un cookie
session.use_only_cookies 1 permet de préciser que seulement le cookie sera en mesure de transmettre l'identifiant de session (les autres moyens
seront interdits et refusés)
session.use_trans_sid 0 L'argument/paramètre PHPSESSID transmis parfois dans les adresses url des sites web sera strictement refusé dans notre
cas.

Vous aimerez peut-être aussi