Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Traitements conditionnels en PHP
Dans cette
formation PHP , nous poursuivons l'apprentissage des bases du langage. Il s'agit du deuxième volet. De nombreux autres suivront car les possibilités de la
programmation serveur sont illimitées. Dans le premier volet, nous avions appris à configurer le
serveur virtuel, EasyPhp . Ce dernier simule le
serveur distant sur lequel le
site Web est hébergé. Il interprète les actions codées en
PHP comme si elles étaient exécutées sur ce serveur. Et à ce titre, nous avions appris à transmettre des données du client, la machine de l'internaute, vers le serveur.
Pour cela, nous avions encapsulé les contrôles des valeurs à transmettre dans un
formulaire HTML .
Une fois les données soumises au clic sur un bouton, c'est une
instruction PHP (
$_POST ) qui s'était chargée de les réceptionner.
Et nous en avions fourni la preuve en les affichant dans un
calque Html . A ce titre, nous avions constaté que l'imbrication des codes client et serveur était très simple à mettre en oeuvre. Nous avions aussi remarqué que des
erreurs Php étaient générées tant que le
PostBack n'avait pas été réalisé. Nous avions choisi d'ignorer ces fautes grâce à une
fonction Php :
ini_set . Mais cette gestion n'est pas satisfaisante. En
programmation , nous devons maîtriser les causes. C'est pourquoi les
instructions conditionnelles sont nécessaires.
Sources et présentation de la problématique
Nous proposons de récupérer les travaux précédents. Ainsi, nous profiterons du code fonctionnel et de la soumission des données par formulaire.
Comme vous le constatez, la décompression conduit au fichier de la page Web principale,
index.php , accompagné de ses ressources externes, dont la
feuille de styles CSS dans le sous dossier styles. Nous devons référencer ce nouveau projet dans
EasyPhp pour l'émuler.
Dans l'explorateur Windows, cliquer dans la barre d'adresse pour la sélectionner,
Puis la copier (CTRL + C),
Nous la plaçons ainsi en mémoire dans le but de l'exploiter pour référencer le projet dans
EasyPhp .
Démarrer EasyPhp ,
En bas à droite de la barre des tâches de Windows, dans les sentinelles, cliquer sur l'icône d'EasyPhp ,
Dans la liste, choisir Open Dashboard pour accéder à son interface,
Démarrer les deux serveurs en cliquant sur les boutons Start pour Http et Database Server ,
Nous l'avons déjà évoqué dans la formation précédente pour
débuter avec Php , le second serveur n'est pas encore utile pour nous à ce stade. Nous n'avons pas encore les compétences nécessaires pour accéder aux données de bases de données.
Cliquer sur le bouton add directory pour référencer le projet,
Lui attribuer un nom en guise d'Url explicite dans la première zone de saisie,
Coller l'adresse du projet issue de l'explorateur Windows dans la seconde zone,
Cliquer sur le bouton Save pour le voir apparaître dans la liste des pages Web gérées et émulées par EasyPhp ,
Ne soyez pas tenté d'utiliser les espaces et les caractères latins (accents) dans les noms de projets. Aucune URL n'en propose sur le Web. Il s'agit de normes américaines.
Cliquer avec le bouton droit de la souris sur le lien du projet ainsi ajouté,
Dans le menu contextuel, choisir de l'ouvrir dans un nouvel onglet ,
Nous affichons ainsi la page Web de démarrage (index.php) tout en conservant l'interface d'EasyPhp active. Nous pouvons choisir de coller son url dans un autre navigateur, tel que Firefox par exemple.
Remarque : Notre page s'affiche instantanément car elle porte un nom (index.php) reconnu par défaut par les
serveurs Web .
Comme nous l'avons évoqué en préambule de cette formation, une
fonction Php placée en entête de code permet d'ignorer les erreurs si elles surviennent.
A la racine du dossier de décompression, cliquer avec le bouton droit de la souris sur le fichier de la page Web, nommé : index.php ,
Dans le menu contextuel, choisir de l'ouvrir avec un éditeur tel que le Notepad++,
Tout en haut du code, dans la section délimitée par les
balises Php , vous notez la présence de cette fameuse
fonction ini_set . La
fonction ini_set est en effet une fonction d'initialisation. Avec les paramètres que nous lui avons passés, cette initialisation concerne les erreurs à ignorer ou neutraliser.
<?php
ini_set('display_errors', 0);
?>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='fr' lang='fr'>
<head>
...
Nous proposons de passer l'
instruction Php de gestion d'erreur en
commentaire . Les commentaires sont identiques en
Php et en
Javascript . Deux méthodes sont offertes. Soit la ou les lignes doivent être préfixées de 2 slashs (//), soit il s'agit d'encadrer le bloc d'instructions, entre le point de départ et le point d'arrivée des symboles /* et */. Cette seconde notation est conseillée.
Passer la ligne de la fonction ini_set en commentaire,
Comme vous le constatez, l'instruction commentée passe en vert dans un éditeur tel que le Notepad++. Cela prouve qu'elle est neutralisée.
Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
Rafraîchir la page avec la touche F5 du clavier par exemple,
Avec certains navigateurs, il peut être nécessaire de rouvrir le lien du projet depuis l'
interface d'EasyPhp .
Quoiqu'il en soit et comme vous le remarquez, les erreurs que nous évoquions apparaissent de nouveau. Les valeurs n'ayant pas été postées, les
variables php destinées à les réceptionner au rechargement de la page ne sont pas initialisées, elles n'existent pas encore. Les instructions que nous avions codées lors de la première formation servent à récupérer les valeurs au
PostBack , soit à la soumission du
formulaire . Mais comme elles sont intégrées dans le flux de la page Web, rien ne les empêche pour l'instant de se déclencher.
Nous proposons donc de générer ce
PostBack .
Saisir un poids en Kg dans la première zone de texte, par exemple : 88,
Saisir une taille en cm dans la seconde zone de texte, par exemple : 185,
Puis, cliquer sur le bouton Calculer ,
Cette action a pour effet de
soumettre le formulaire qui encapsule ces
contrôles Html . De fait, les valeurs sont bien transmises au
serveur en réalisant un aller-retour (PostBack). La page Web est rechargée et les
variables Php réceptionnent les données transférées. De fait, les erreurs disparaissent.
Gérer les erreurs par traitements conditionnels
A ce stade, les données sont désormais gérées par le
serveur et non plus par le
client . L'objectif consistera, lorsque nous aurons acquis les compétences nécessaires, à les archiver en base de données par exemple. Nous pourrons ainsi commencer à constituer des fiches signalétiques personnalisées.
Comme nous le disions, cette
gestion d'erreur précédente est brutale. Les défauts ne doivent pas être ignorés mais gérés. Le raisonnement est le suivant : Si la valeur est bien postée, alors la
variable doit être affectée. C'est l'occasion de présenter les
instructions conditionnelles en Php . Elles ressemblent étrangement dans la syntaxe, aux
instructions conditionnelles Javascript . Ce sont les bases du
langage C qui ont servi à créer ces langages tout comme pour le C#, d'où les ressemblances intéressantes en termes de standard de développement.
Revenir dans l'éditeur de code dans la section PHP que nous avions conçue lors de la formation précédente pour réceptionner les données transmises du client vers le serveur,
Cette section débute à la ligne 134 pour un éditeur Notepad++.
Adapter le code PHP comme suit :
...
<?php
$la_date = date('d/m/y');
if(isset($_POST['zone_taille']))
{
$la_taille = $_POST['zone_taille'];
$le_poids = $_POST['zone_poids'];
}
else
{
$la_taille = 'Donnée pas encore transmise au serveur';
$le_poids = 'Donnée pas encore transmise au serveur';
}
?>
...
Un test sur l'une des deux variables suffit. Si l'une des deux n'est pas transmise, l'autre ne l'est pas non plus par déduction. Elles appartiennent au même
formulaire . Ce dernier est codé entre les lignes 46 et 50 :
<form id='formulaire' name='formulaire' method='post' action='index.php'>
<div style='height:30px;width:100%;'><input type='text' id='zone_poids' name='zone_poids' value='Votre poids en Kg' onclick='this.value=vider(this.value);'/></div>
<div style='height:30px;width:100%;'><input type='text' id='zone_taille' name='zone_taille' value='Votre taille en cm' onclick='this.value=vider(this.value);'/></div>
<div style='height:40px;width:100%;'><input type='button' value='Calculer' onClick='calculer(); document.getElementById('formulaire').submit();'/></div>
</form>
Et comme nous l'avait démontré la formation précédente, lorsque le
formulaire est soumis au serveur, c'est l'ensemble des valeurs qu'il contient, renfermées dans les
contrôles Html Imput qui sont transférées. Ces
instructions conditionnelles seront précieuses en temps voulu, pour questionner les données retournées par une requête sur une base de données, pour analyser une action utilisateur ou un contexte, pour vérifier la nature des fichiers à renseigner sur la machine distante par exemple...
Comme en Javascript donc, une
instruction conditionnelle débute par le
mot clé if suivi du critère à vérifier entre parenthèses. Cette condition consiste à savoir si la valeur transférée existe. Nous exploitons la
fonction Php isset . Celle-ci est booléenne. Elle permet de savoir si la variable qui lui est passée en paramètre est définie. Cette variable est la donnée potentiellement transférée sur le serveur, suite à la soumission du formulaire ($_POST['zone_taille']).
Si elle est bien définie, alors, selon la
syntaxe Php , nous listons les actions à réaliser entre accolades pour délimiter la section. Lorsqu'une seule action est à engager, les accolades ne sont pas nécessaires, comme en Javascript. Il s'agit d'une fantaisie permettant d'alléger les instructions de code. Dans le cas contraire (else), nous engageons les actions de secours, toujours entre accolades. Là encore, si une seule action est prévue, les accolades ne sont pas nécessaires afin de simplifier la syntaxe. Ces actions consistent à charger les variables d'une information textuelle indicative pour le visiteur. Au passage, nous remarquons qu'il est très simple de modifier le
type de données affecté à une
variable en Php . Dans le premier cas, nous leur affectons des valeurs numériques et dans le second, des valeurs textuelles.
Ces données sont restituées dans le calque Html inférieur par imbrications de code client et de code serveur. Les calculs que nous avions réalisés au cours de la première formation ne sont plus utiles.
Supprimer les trois lignes de code concernant l'addition, la multiplication et la division :
L'addition des deux valeurs est :<strong><?php echo $la_taille + $le_poids; ?></strong><br/>
La multiplication des deux valeurs est : <strong><?php echo $la_taille * $le_poids; ?></strong><br />
La division des deux valeurs est : <strong><?php echo $la_taille / $le_poids; ?></strong><br />
Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
Cliquer dans la barre d'adresse de ce dernier pour l'activer,
Recharger la page en enfonçant la touche Entrée ou en rouvrant le projet depuis EasyPhp,
En effet, comme nous avions précédemment soumis le formulaire, nous avions généré un
PostBack . Il ne s'agissait plus de la version d'origine de la page. Nous ne pouvions donc pas la rafraîchir avec la touche F5 du clavier.
Comme vous le constatez, les messages d'erreurs ont disparu. Pourtant le formulaire n'a pas encore été soumis. Nous les avons gérées grâce à l'
instruction conditionnelle en Php . Le message indicatif est très parlant. Les données n'ont pas encore été transmises.
Saisir un poids en Kg dans la première zone de texte,
Saisir une taille en cm dans la seconde,
Puis, cliquer sur le bouton Calculer pour soumettre le formulaire au serveur,
Toujours grâce à l'
instruction conditionnelle , lorsque les valeurs transmises sont détectées, les variables sont correctement affectées et restituées dans le flux Html par concaténation. Nous engageons des actions différentes selon le contexte. Au fur et à mesure de l'apprentissage, nous maîtriserons toujours plus de notions. Elles nous permettront à l'issue de monter de véritables
applications client-serveur pour le Web .
Transmettre des données du serveur au client
Nous souhaitons maintenant réaliser le cheminement inverse. Comment transmettre des données issues du serveur au client pour réaliser des calculs. En effet, comme le
PostBack a réinitialisé la page, les zones de texte se sont vidées. De même, le curseur sur la représentation schématique a disparu.
Le principe est simple. Il consiste à imbriquer les sections de code les unes dans les autres. Grâce à ce que nous avons appris, nous savons réaliser des
tests en PHP . Nous pouvons rompre la section de
code serveur pour y insérer une
section cliente Javascript ou
Html . Puis, nous pouvons reprendre la
section Php pour finaliser l'imbrication de code et notamment du test. L'objectif consiste à restituer les valeurs dans les zones de texte et à relancer le calcul. Mais pour ce faire, l'intégralité de la page doit avoir fini de charger. Ainsi, tous les contrôles et toutes les variables seront connues au moment de l'appel. Nous l'avions vu dans les différentes
formations Javascript , le chargement d'une page Web respecte la chronologie des éléments tels qu'ils s'enchaînent.
Tout en bas de la page de code, entre les sections fermantes du script (</script>) et de la page Html (</html>), ajouter le code suivant :
...
</script>
<?php
if(isset($_POST['zone_taille']))
{
?>
<script type='text/javascript' language='javascript'>
document.getElementById('zone_taille').value = <?php echo $la_taille ?>;
document.getElementById('zone_poids').value = <?php echo$ le_poids ?>;
calculer();
</script>
<?php
}
?>
</html>
Nous initions un
traitement serveur avec un test identique au précédent pour savoir si les données ont bien été postées. Si le test est concluant, nous abandonnons temporairement la
section PHP (?>) pour lui imbriquer un
traitement client , en
Javascript . Celui-ci consiste d'ailleurs en une nouvelle imbrication avant de pointer sur les zones de texte par leurs identifiants, pour y insérer les données issues du serveur. Comme nous l'avions appris, côté client, c'est la
méthode getElementById de l'
objet Javascript document qui permet de pointer sur un
contrôle Html . Ici, nous choisissons d'affecter son contenu (propriété value), sur la donnée correspondante, réceptionnée côté serveur (<?php echo $la_taille ?>). Puis nous lançons le calcul grâce à la
fonction calculer prévue à cet effet et que nous avions développée dans une
formation Javascript dédiée.
Après la
section de script , nous reprenons le flux du
code PHP pour le terminer, notamment en fermant la section de l'
instruction conditionnelle .
Ce procédé est particulièrement intéressant dans de nombreux cas, par exemple pour préremplir un
formulaire en fonction des informations connues et réceptionnées de l'internaute. Nous y reviendrons en temps voulu.
Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
Recharger la page en validant sa barre d'adresse avec la touche Entrée,
Saisir un poids et une taille puis cliquer sur le bouton Calculer ,
Tout d'abord les informations sont bien transmises au serveur et restituées dans le calque inférieur de la page Web cliente. Mais ça, nous le savions déjà . Cette fois, elles font le chemin inverse. Du serveur elles sont de nouveaux transmises au client, si bien que les données numériques sont restituées dans les champs qui se présentent préremplis donc. De plus, le calcul est parfaitement commandé dans l'enchaînement. De fait, le curseur se repositionne correctement sur la représentation schématique.
Analyse multicritère en PHP
Nous proposons de terminer ces
découvertes Php par une
instruction conditionnelle particulière permettant de gérer un grand nombre de conditions dans une syntaxe structurée et efficace. Comme en
Javascript , il s'agit de l'
instruction Switch . L'objectif consiste à livrer une conclusion textuelle variable côté serveur, dépendant du résultat du calcul de l'IMC et du positionnement du curseur sur la représentation schématique. Si le résultat est inférieur à 26, l'IMC est normale. Si elle est comprise entre 26 et 31, elle révèle un surpoids. Dans le cas restant qui doit se déduire (>31), elle révèle l'obésité.
Revenir dans l'éditeur de code du Notepad dans la première section Php débutant à partir de la ligne 134,
Adapter le code comme suit :
<?php
$la_date = date('d/m/y');
if(isset($_POST['zone_taille']))
{
$la_taille = $_POST['zone_taille'];
$le_poids = $_POST['zone_poids'];
$imc = ($le_poids * 10000) / pow($la_taille,2);
$conclusion = '';
switch($imc)
{
case ($imc<=26):
$conclusion = 'Votre indice de masse corporelle est tout à fait correcte';
break;
case ($imc<=31):
$conclusion = 'Vous êtes légèrement en surpoids';
break;
default :
$conclusion = 'Votre poids et trop important - Obésité';
break;
}
}
else
{
$la_taille = 'Donnée pas encore transmise au serveur';
$le_poids = 'Donnée pas encore transmise au serveur';
$imc = '';
$conclusion = '';
}
?>
Il convient ensuite de restituer ces données stockées sous forme de variables dans le calque Html, sous la balise H2, à la suite des autres. Pour ce faire :
Ajouter les instructions imbriquées notées en gras :
<div style='float:left; width:80%; height:auto; text-align:center;'>
<div class='titre_h1'>
<h1>Découverte du PHP, Bienvenue !</h1>
<h2>Bonjour et bienvenue, nous sommes le : <?php echo $la_date;?></h2>
<br />
Le poids de l'internaute est : <strong><?php echo $le_poids; ?></strong><br />
La taille de l'internaute est : <strong><?php echo $la_taille; ?></strong><br />
L'IMC de l'internaute est de :<strong><?php echo $imc; ?></strong><br /><br />
<?php echo $conclusion; ?><br /><br/>
<i>Données issues du serveur</i>
</div>
</div>
Tout d'abord, le
calcul de l'imc consiste à diviser le poids remis à l'échelle (*10 000) par la taille au carré. Nous découvrons et exploitons la
fonction Php pow qui permet d'élever un nombre à la puissance passée en valeur numérique en second paramètre. Ce nombre est la taille dont la variable est passée en premier paramètre. Nous divisons donc le calcul par la taille au carré (pow($la_taille,2)). Le résultat est stocké dans une nouvelle
variable imc . Nous déclarons la
variable conclusion dont l'information doit dépendre de la valeur de ce calcul, selon le raisonnement que nous avons proposé précédemment.
Nous initialisons une
instruction switch et énumérons tous les cas possibles. La syntaxe est identique à celle du
Javascript . Donc nos acquis sont particulièrement utiles. Tous les cas, sans limite, peuvent être listés les uns à la suite des autres. Chaque bloc doit être interrompu par l'
instruction break; . Chaque cas est annoncé par l'
instruction Case proposant le critère à vérifier dans les parenthèses. Les deux points qui suivent (:) sont essentiels dans la syntaxe. Ainsi lorsqu'un critère est vérifié, les autres ne sont pas traités. L'ordre et l'enchaînement de ces conditions est important.
La dernière
branche default permet de traiter implicitement le cas qui se déduit des autres non satisfaits. Nous concaténons ce résultat variable à la suite dans le
div Html .
Enregistrer les modifications et basculer sur la fenêtre du navigateur,
Recharger la page Web en validant sa barre d'adresse,
Saisir un poids puis une taille,
Soumettre les données du formulaire en cliquant sur le bouton Calculer ,
Le calcul et son interprétation sont effectivement livrés comme en atteste la capture ci-dessus. Le résultat de l'IMC mériterait d'être arrondi. Nous aborderons ce point en temps voulu. Si vous modifiez les valeurs et que vous les soumettez de nouveau, vous obtenez une conclusion adaptée au calcul de l'IMC. L'
instruction switch est précieuse pour épurer un code lorsqu'il s'agit de traiter un grand nombre de conditions.
Dans une prochaine formation, nous verrons comment automatiser les actions avec les
traitements récursifs en PHP .