Les structures de contrôle PHP

Dans ce chapitre nous allons aborder les conditions et les boucles.
Si vous connaissez JavaScript vous constaterez que les structures de contrôle PHP sont très proches de celles de Javascript.

Les conditions

Les opérateurs de comparaison

Attention pour tester l'égalité il faut écrire == et pour tester la différence il faut écrire !=.

Les opérateurs logiques

La structure if

Le code de l'exemple (partie BODY) :

<h3> <?php $note = rand(1,20); echo "note : " . $note . "<br>"; if ($note>=12) {echo "Bonne note ! " ; echo "Continuez !" ; } if ($note <12) {echo "Insuffisant ! "; echo " Il faut travailler davantage"; } ?> </h3> <p class ="remarque">Actualisez la page pour générer un nouvel entier !

J'en profite pour introduire une fonction PHP très utile: rand().
Ici l'instruction génère un entier aléatoire compris entre 1 et 20 et l'affecte à la variable $note.

Dans une condition if le bloc d'instructions entre accolades est exécuté si la condition est VRAIE.
Testez la condition if

Actualisez la page pour générer de nouveau un entier de façon aléatoire.

La structure if ... else...

Reprenons le thème précédent. Plutôt que deux conditions if simples on peut utiliser une seule condition if ... else ...

Le code de la partie BODY avec if ... else ... :

<h3> <?php $note = rand(1,20); echo "note : " . $note . "<br>"; if ($note>=12) {echo "Bonne note ! " ; echo "Continuez !" ;} else {echo "Insuffisant !"; echo " Il faut travailler davantage"; } ?> </h3> <p class ="remarque">Actualisez la page pour générer un nouvel entier !
Testez la condition if...else ...

Actualisez la page pour générer de nouveau un entier de façon aléatoire.

Les if imbriqués

La note va être saisie via un formulaire et il y a désormais quatre appréciations possibles (et non pas plus deux).

<form method ="post" action ="#" > <label>Tapez une note (entier) comprise entre 1 et 20</label> <input type ="text" name ="note" required pattern ="[0-9]{1,2}" onchange ="this.form.submit()" > </form> <h3> <?php $note = $_POST['note']; if (!is_numeric($note) || $note >20 || $note <1 ){echo "erreur de saisie"; } elseif ($note >=14) {echo "très bonne note" ;} elseif ($note >=10) {echo "note correcte" ;} elseif ($note >=6) {echo "note insuffisante" ;} else {echo "note faible"; } ?> </h3>

Il y a une grosse erreur dans le code HTML mais ... une erreur volontaire.
Les contrôles de saisie HTML5 (attributs required et pattern de la balise input) sont ici inopérants !!!
Pour l'explication voir le chapitre précédant : "les fonctions PHP".

Donc je suis obligé de faire le contôle de saisie en PHP avec une condition complexe : ensemble de plusieurs conditions simples reliées par des opérateurs logiques.

La fonction PHP is_numeric(variable) retourne VRAI si la variable contient un nombre.
Donc!is_numeric($note) (lire NOT is_numeric) retourne VRAI si le contenu n'est pas un nombre.
Testez les if imbriqués

Lors de l'affichage de la page un message d'erreur peut apparaître :Undefined index : note in ...
Pas de panique ! C'est logique. Il n'y a pas encore eu de soumission donc le tableau $_POST n'existe pas encore.
Il aurait fallu rajouter un test basé sur la fonction isset() !

Alternative : structure switch

La structure switch existe en JavaScript ; elle existe aussi en PHP et avec la même restriction : le seul opérateur de comparaison admis est égal.

Donc le thème précédent ne peut être traité avec un switch !

Le nouveau thème est : affichage du nom de département en fonction du code minéralogique saisi.

<form method ="post" action ="#" > <label>Sélectionnez un département</label> <select name ="code" size = "5" onchange ="this.form.submit()"> <option value ="2">02</option> <option value ="59">59</option> <option value ="60">60</option> <option value ="62">62</option> <option value ="80">80</option> </select> </form> <h3> <?php if (isset($_POST['code'])) { switch ($_POST['code']) { case 2 : echo "département de l'Aisne" ; break ; case 59 : echo "département du Nord" ; break ; case 60 : echo "département de l'Oise" ; break ; case 62 : echo "département du Pas de Calais" ; break ; case 80 : echo "département de la Somme" ; } // fin switch } // fin if ?> </h3>

Code HTML du formulaire : saisie du code département via une liste.

Code PHP :
Un bon conseil : commentez les accolades fermantes et indentez bien les lignes de code.

Emploi d'un test basé sur la fonction isset pour ne pas avoir la mésaventure de l'exemple précédent.
Testez la structure switch

Les boucles

Le bloc d'instructions contenu dans un boucle est répété plusieurs fois. On parle d'itérations.

Thème : afficher la table de multiplication par 5 (50 premières lignes : 5*1 = 5 à 5*50 = 250).

Première solution : emploi de la boucle WHILE

... <table> <caption>Table de multiplication par 5</caption> <tr><th>5</th><th>fois</th><th>donne</th></tr> <?php $i =1 ; // initialisation du compteur while ($i <=50) { $produit = 5*$i ; echo "<tr>"; echo "<td>5</td>"; echo "<td>". $i ."</td>"; echo "<td>" . $produit ."</td>"; echo "</tr>" ; $i++ ; // incrémentation du compteur } ?> </table> ...

Le bloc d'instructions à l'intérieur des accolades est répété tant que $i est inférieur 51 (condition du while).
Pour éviter de boucler à l'infini il faut incrémenter $i dans la boucle.
Il faut aussi éviter que la condition du while ne soit jamais vérifiée ... ($i a une valeur initiale > à 50).

Ici $i est incrémenté de 1 : $i++
Et $i est initialisé à 1 ($i =1 ; ) avant l'entrée dans la boucle Affichez la table par 5 avec la structure while

Deuxième solution : emploi de la boucle FOR

Reprenons le même thème mais traitons le avec la structure for !

Le code de la partie BODY :

... <table> <caption>Table de multiplication par 5</caption> <tr><th>5</th><th>fois</th><th>donne</th></tr> <?php for ($i=1; $i<=50; $i++) { $produit = 5*$i ; echo "<tr>"; echo "<td>5</td>"; echo "<td>". $i ."</td>"; echo "<td>" . $produit ."</td>"; echo "</tr>" ; } // fin for ?> </table> ...
Affichez la table par 5 avec la structure for

Rien n'interdit d'incrémenter (ou décrémenter le compteur) d'un entier supérieur à 1 !

La table de multiplication inversée :

... <table> <caption>Table de multiplication par 5 inversée</caption> <tr><th>5</th><th>fois</th><th>donne</th></tr> <?php for ($i=50; $i>0; $i-=2) { // code identique ! } // fin for ?> </table> ...
Affichez la table par 5 inversée

La variable $i est initialisée à 50 et à chaque passage dans la boucle elle est décrémentée de 2 ($i-=2).

La bouche for each

Pour afficher toutes les valeurs d'un array vous pouvez utiliser while ou for mais la structure foreach est plus adaptée.
Pour revoir la structure foreach je vous invite à relir le chapitre précédent sur les "arrays".
Retour menu