PHP Partie 1
PHP Partie 1
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)
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
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
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!
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.
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 !
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.
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 !
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.
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.
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 :
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 :
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.
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).
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) :
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.
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.
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.
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).
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
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
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 :
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.
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).
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.)
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/
Une fois à l'intérieur de votre dossier /www/php/, créons un nouveau fichier nommé entrainement.php.
Instruction d'affichage
14 Instruction d'affichage
entrainement.php
?
<?php
echo 'Bonjour';
print 'Nous sommes vendredi et il fait beau !';
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.
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
?
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.
Pour introduire du code Html dans un fichier Php (et non pas du php dans du html /!\) nous avons deux solutions :
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.
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 !
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.
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) .
?
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 !)
résultat
Bonjour Fred
Ensuite nous précisons le nom de la variable, ici nous avons choisi prenom, ce qui donne $prenom.
"Fred" est la valeur entrante dans la variable pour être gardée en mémoire tout le temps d'exécution du script.
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
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
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.
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.
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.
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
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>";
entrainement.php
?
1 <?php
2 $variable6 = FALSE;
3 echo gettype($variable6) . "<br>"; // boolean
résultat
integer
double
string
string
boolean
boolean
Type Description
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
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.
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.
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
résultat
fruit1 : pomme
fruit2 : banane
fruit1 : pomme
fruit2 : pomme
fruit1 : fraise
fruit2 : fraise
24 Assignation 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 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 &.
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.
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 !
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.
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.
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
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
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
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.
résultat
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
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
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
Condition Signification
if si
else sinon
elseif sinon si
31 Les Opérateurs
Opérateur Signification
= est égal
== comparaison de la valeur
!= différent de
! n'est pas
&&
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 }
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
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.
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
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.
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.
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 }
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.
résultat
Son utilisation est un peu plus rare mais très utile dans certains cas très spécifiques !
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 }
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).
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.
A est égal à 10
39 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 }
Oui c'est bien, le cas, dans les deux variables se trouve la valeur 1.
résultat
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
== 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
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
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.
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.
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 }
résultat
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 }
résultat
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
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.
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
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 !
Un argument (aussi appelé paramètre) est une information entrante dans la fonction.
entrainement.php
?
1 <?php
2 $phrase = 'Mettez une phrase différente ici à cet endroit!';
3 echo strlen($phrase);
résultat
47
strlen() est une fonction prédéfinie permettant de retourner la taille (nombre de caractères) d'une chaine.
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
substr() est une fonction prédéfinie permettant d'afficher une partie coupée d'une chaine.
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.
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
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
isset() est une fonction prédéfinie permettant de dire si une variable existe ou non (et différent de null).
Argument(s) attendus :
1. nous devons lui fournir la variable que l'on souhaite tester
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
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
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
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
Une fonction est un morceau de code permettant d'automatiser un traitement ou de donner un affichage particulier.
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
Prenons le contexte d'un site ecommerce qui aura besoin d'ajouter la TVA sur ses produits.
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).
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.
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 ...()
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
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
Le calcul a également changé, c'est $nombre*$taux. Le nombre et le taux peuvent changer à tout moment.
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.
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.
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
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 :
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
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é ?
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
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 }
Nous pouvons donc constater que le nombre et l'ordre des arguments sont vraiment importants !
entrainement.php
?
1 <?php
2 function affichageVille()
3 {
4 $ville = "Lyon"; // variable locale.
5 }
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).
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
Résultat
Quelques Explications :
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.
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 :
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 !
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).
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
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.
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.
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
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.
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à.
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".
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).
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).
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).
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
?
1 $i = 0;
?
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)
?
1 { }
?
1 echo "$i /";
?
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
?
1 <?php
2 $i = 0;
3 while ($i<5)
4 {
5 echo "$i /";
6 $i++;
7 }
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.
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.
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++)
$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;
Résultat
0123456789101112131415
Exercice : serait-il possible de passer les nombres à la ligne les uns à la suite des autres ?
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
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 :
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>';
31
62 La boucle Foreach
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.
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
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
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 :
$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).
Nous faisons le 2ème <td> avec le calcul suivant 10*$ligne+$cellule, ce qui donne 10*0+1 = 1.
0 1
$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).
0 1 2
0 1 2 3 4 5 6 7 8 9 10
10*1+0 = 11.
0 1 2 3 4 5 6 7 8 9 10
11
nous ne rerentrons pas dans la première boucle mais restons "coincé" dans la deuxième (le temps que ses tours soient terminés).
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
Nous ne rerentrons pas dans la première boucle mais restons "coincé" dans la deuxième (le temps que ses tours soient terminés).
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
$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.
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
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
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.
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
Pour rappel, même si ce fichier à l'extension ".php". Nous ne sommes pas obligés d'écrire du code php à l'intérieur !
Ce n'est pas plus compliqué, la fonction prédéfinie include attend comme argument un nom de fichier valide pour pouvoir l'inclure !
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
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
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
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) :
_once est juste présent pour s'assurer que le fichier soit inclut une seule fois dans le code.
mon_site
----- css
---------- style.css
----- js
----- img
----- index.html
----- acualites.html
----- contact.html
<!-- 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>
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.
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.
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">
<!-- 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.
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>
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 :
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>
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>
?
<?php require_once('inc/haut.inc.php'); ?>
<?php require_once('inc/menu.inc.php'); ?>
<section>
<div class="container">
<main>
<h1>Contact</h1>
<hr>
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">
<!-- 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)
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.
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
entrainement.php
?
1 <?php
2 $prenom = "Nicolas";
3 echo "<p>Bonjour $prenom</p>";
Résultat
Bonjour Nicolas
entrainement.php
?
1 <?php
2 $prenom = "Nicolas, Marie, Grégoire, Sylvain, Celine";
3 echo "<p>Bonjour $prenom</p>";
Résultat
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.
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
)
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
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
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.
Résultat
France
Italie
Espagne
Angleterre
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.
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.
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.
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
)
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
entrainement.php
?
1 $listeFruit = array("fruit1" => "orange","fruit2" => "pomme", "fruit3" => "fraise");
2 echo '<pre>'; print_r($listeFruit); echo '</pre>';
Résultat
Avec print_r :
Array
(
[fruit1] => orange
[fruit2] => pomme
[fruit3] => fraise
)
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
)
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
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).
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
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.
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.
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
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).
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.
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
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>';
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
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
Dans la phase de construction d'un site web, il peut être utile de véhiculer des informations d'une page à une autre.
Pourquoi ?
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.
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
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
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
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>
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.
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.
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.
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.
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
Avec le print_r :
Array
(
[produit] => tshirt
[couleur] => bleu
[prix] => 30
)
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 !
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.
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,
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).
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.
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 :
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.
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 !
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 !
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
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>
</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>
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
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
Vous pouvez garder ce formulaire comme modèle pour vos prochains développements avec la superglobale $_POST.
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.
L'objectif sera d'avoir le formulaire HTML dans le fichier formulaire2.html et les traitements dans le fichier formulaire3.php
formulaire2.html
?
<!Doctype html>
<html>
<head>
</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>';
}
?>
------ 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.
formulaire2.html
?
<!Doctype html>
<html>
<head>
</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>
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.
echo '';
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.
Résultat
Avec print_r :
Array
(
[0] => le pseudo posté
[1] => l'email posté
)
Avec foreach :
Avec implode :
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.
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).
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).
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>
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";
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 :
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 ;)
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.
Entête Description
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
In-Reply-To Représente l'id du message (pratique pour grouper des échanges d'emails et en faire des conversations)
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 :
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";
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é !
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'];
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
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
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
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.
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)!
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
?
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).
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.
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.
Exercice :
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.
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>
1ère condition IF :
?
if(isset($_GET['pays']))
{
$pays=$_GET['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).
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
$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.
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.
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
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
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).
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 !
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 :
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
Si nous avons plusieurs internautes différents, nous aurons donc plusieurs fichiers de session.
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
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
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.
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.
Résultat
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 :
'; 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.
session1.php
?
<?php
session_start();
$_SESSION['pseudo'] = "Mathieu";
$_SESSION['mdp'] = "Balmont";
print_r($_SESSION);
unset($_SESSION['mdp']);
print_r($_SESSION);
Quelques Explications :
Résultat
pseudo|s:7:"Mathieu";
101 Supprimer un fichier de session
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 !
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.
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.
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
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
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.
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();
}
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).
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.
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
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
... 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
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.
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.
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.