formateur informatique

Optimiser les traitements serveur par les boucles

Accueil  >  Technique  >  Php  >  Php Débutant  >  Optimiser les traitements serveur par les boucles
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Traitements récursifs côté serveur

Dans cette formation PHP, nous poursuivons l'apprentissage des bases du langage. Il s'agit du troisième volet. L'objectif ici est d'aborder les traitements récursifs par les boucles. Ces instructions permettent d'optimiser le code lorsqu'il s'agit de réaliser des actions répétitives mais adaptées à chaque passage. On les exploite souvent pour traiter les informations de bases de données ou de fichiers. Cela, nous le verrons en temps voulu lorsque nous aurons acquis les compétences nécessaires.

Traitement récursif PHP selon valeur numérique transmise par formulaire Html soumis en Javascript



Sources et présentation de la problématique
Pour présenter les boucles PHP et leurs syntaxes, nous proposons de bâtir une petite application client-serveur dont la structure Html et ses sources sont disponibles au téléchargement. Comme vous le remarquez, la décompression conduit au fichier de la page Web principale nommé index.php. Ce dernier est accompagné de ses ressources externes, dont la feuille de styles CSS, placée dans le sous dossier styles.

Comme l'illustre la capture ci-dessus, l'internaute est invité à saisir une valeur numérique entière dans une zone de texte. Au clic sur le bouton du formulaire Html, sa donnée doit être est transmise au serveur. Ce dernier doit réceptionner la valeur par instructions Php pour réaliser un calcul de multiplication incrémenté. Le code Php doit restituer les lignes de cette multiplication autant de fois que la valeur seuille saisie le demande.

Mais pour le constater, nous devons commencer par référencer ce nouveau projet dans EasyPhp. Nous allons donc répliquer les procédures enseignées lors des deux formations précédentes.
  • A la racine du dossier de décompression, cliquer dans la barre d'adresse de l'explorateur Windows,
  • Copier cette dernière avec le raccourci clavier CTRL + C par exemple,
  • Démarrer EasyPhp,
  • En bas à droite de la barre des tâches Windows, déployer l'affichage des sentinelles,
  • Cliquer sur l'icône d'EasyPhp et choisir Open Dashboard dans la liste,
Démarrer EasyPhp pour référencer nouveau projet Web serveur PHP à émuler

Nous accédons ainsi à l'interface d'EasyPhp.
  • Démarrer les deux serveurs en cliquant sur leurs boutons Start respectifs,
Nous l'avons évoqué lors des deux précédents volets, il est encore trop tôt pour utiliser le serveur de base de données (Database Server). Nous n'avons pas encore acquis les compétences nécessaires. Mais il est utile de prendre les bonnes habitudes. Il s'agit maintenant de référencer le projet dans la liste des sites Web émulés par EasyPhp.
  • Cliquer sur le bouton Add Directory,
  • Dans la zone Working Directory Name, saisir par exemple : 03-boucles,
Ce nom explicite, sans espace ni accents, servira d'adresse virtuelle, comme une url de site internet.
  • Dans la zone Working Directory Path, coller l'adresse prélevée depuis l'explorateur Windows,
  • Puis, cliquer sur le bouton Save pour le voir apparaître dans la liste des projets référencés,
Nouveau site Web PHP référencé dans interface EasyPHP
  • Cliquer avec le bouton droit de la souris sur son lien et choisir de l'ouvrir dans un nouvel onglet,
Il peut être intéressant de copier et coller cette URL dans le navigateur de votre choix. A l'avenir, vous pourrez si vous le souhaitez modifier les propriétés d'EasyPhp afin qu'il soit associé par défaut à ce navigateur. Nous retrouvons l'interface que nous évoquions précédemment. Une petite zone de texte attend la donnée numérique que doit saisir l'internaute. Le bouton Envoyer doit soumettre le formulaire et donc transférer la valeur. Le traitement itératif doit alors débuter côté PHP pour restituer les résultats dans le cadre inférieur construit par un calque Html, soit une balise Div.

Pour le constater concrètement, nous devons accéder au code de la page Web.
  • A la racine du dossier de décompression, cliquer avec le bouton droit de la souris sur le fichier de la page Web index.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur de texte, si possible le Notepad++,
  • Atteindre la ligne 43 pour un éditeur Notepad,
Vous remarquez que le contrôle InputBox plafond destiné à la saisie de l'internaute, est encapsulé dans un formulaire Html, balise Form.

...
<div style='float:left; width:15%; height:100px; text-align:center;'>
<div id='cadre1'>
<form id='formulaire' name='formulaire' method='post' action='index.php'>
<div style='height:30px; width:100%; font-size:14px;'><strong>Valeur seuille :</strong></div>
<div style='height:30px; width:100%;'>
<input type='text' id='plafond' name='plafond' value='Saisir un nb entier' onclick='this.value=vider(this.value);'/></div>
<div style='height:40px;width:100%;'><input type='button' value='Envoyer' /></div>
</form>
</div>
</div>
...




Soumettre un formulaire Web
Comme nous l'avions démontré lors de la première formation consistant à découvrir le langage PHP, les données à transmettre au serveur doivent être encapsulées dans un formulaire Html. Mais faut-il encore que celui-ci soit soumis.

Ce formulaire est reconnu par l'identifiant formulaire. Il suffit d'exploiter cet ID en Javascript associé à la méthode Submit pour poster le formulaire et toutes les informations qu'il renferme.
  • Dans la balise Html du bouton (ligne 46), ajouter le gestionnaire d'évènement suivant :
<form id='formulaire' name='formulaire' method='post' action='index.php'>
<div style='height:30px;width:100%;font-size:14px;'><strong>Valeur seuille :</strong></div>
<div style='height:30px;width:100%;'><input type='text' id='plafond' name='plafond' value='Saisir un nb entier' onclick='this.value=vider(this.value);'/></div>
<div style='height:40px;width:100%;'><input type='button' value='Envoyer' onClick='document.getElementById('formulaire').submit();'/></div>
</form>


Comme nous l'avons démontré à maintes reprises dans les formations Javascript, la méthode getElementById de l'objet document permet d'accéder à un contenu Html référencé par son Id passé en paramètre. Nous pointons donc sur le formulaire Html. Sa méthode Submit permet de le soumettre au serveur, comme son nom l'indique. Cette action intervient au clic sur le bouton (onClick). De fait, le transfert s'opère sur demande de l'internaute.
  • Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur Web,
  • Rafraîchir la page avec la touche F5 du clavier et cliquer sur le bouton Envoyer,
Comme vous le constatez, la page Web semble se recharger pour se réinitialiser. Nous venons de réaliser un PostBack, soit un aller-retour serveur comme nous l'avions expliqué lors de la première formation. Les données du formulaire ont été transmises côté serveur. Mais comme nous n'avons pas encore pris soin de les réceptionner, le traitement semble transparent.

Réceptionner les données transmises par le client
Pour exploiter la volonté de l'internaute afin de réaliser un traitement itératif borné, nous devons commencer par récupérer la valeur saisie.
  • Revenir dans l'éditeur de code à hauteur de la ligne 72 pour un éditeur Notepad ++,
Nous sommes positionnés juste au-dessus du calque, balise Div, prévue pour accueillir les résultats du traitement côté serveur. La section de code Serveur PHP existe déjà. Nous devons coder les instructions capables de réceptionner la donnée transmise par le client.

Il s'agit d'exploiter l'instruction Php POST pour réceptionner la potentielle valeur sur laquelle nous devons réaliser un test d'existence. Il suffit de répliquer les techniques enseignées par la formation sur les traitements conditionnels en PHP. Ainsi nous gèrerons les erreurs lorsque le PostBack n'a pas encore eu lieu. En effet, tant que la donnée n'est pas transmise, la variable est considérée comme nulle.
  • Entre les balises de la section PHP, ajouter le code suivant :
<?php
if(isset($_POST['plafond']))
{
$le_plafond = $_POST['plafond'];
$restitution = 'La table de multiplication pour le chiffre 5 :<br/>';
}
else
{
$le_plafond = 0;
$restitution = '';
}

?>


Dans le cas où la valeur existe attestant qu'elle a bien été transmise, nous initialisons les deux variables pour préparer la restitution. La première récupère et stocke l'information tapée par l'internaute. A ce stade en revanche, nous ne nous assurons pas encore que la valeur proposée est bien numérique et positive. Cela signifie que nous ne sommes pas à l'abri des erreurs. Mais chaque chose en son temps. Ce test devrait d'ailleurs être effectué côté client en Javascript. Dans l'une des formations, nous avions conçu une fonction à ce sujet permettant de tester les valeurs numériques. Ainsi, nous ne solliciterions pas le serveur inutilement qui, dans le cas d'un site Web, doit gérer le trafic et les demandes. Dans le cas contraire, nous initialisons les variables sur des valeurs nulles afin de pouvoir les exploiter sans générer d'erreur en l'absence de PostBack, soit au chargement de la page.

A titre de vérification, avant d'aborder les traitements itératifs, leur syntaxe et intérêt, nous proposons de restituer ces données dans le calque inférieur, par imbrication de sections de code client et Server.
  • Dans le code Html du dessous, à partir de la balise H2, adapter les imbrications comme suit :
<h1>Découverte du PHP, Bienvenue!</h1>
<h2>Traitement itératif sur : <?php echo$ le_plafond; ?> passage(s)</h2>
<br /><div style='width:auto; text-align:left; font-size:18px; padding-left:30%;'>
<?php echo $restitution; ?>
</div><br />

</div>
  • Enregistrer les modifications et basculer sur le navigateur,
  • Cliquer dans sa barre d'adresse,
  • La valider en enfonçant la touche Entrée pour la recharger,
Précédemment, nous avions en effet posté le formulaire générant un PostBack. Il n'était donc plus possible de rafraîchir la page dans son état d'origine.

Comme vous le constatez, au premier chargement, l'indication sur le traitement itératif est initialisée à 0 grâce à la branche else de l'instruction conditionnelle. Elle permet d'éviter les erreurs qui se seraient déclenchées en l'absence de valeur pour initialiser les variables.
  • Taper une valeur numérique dans le champ prévu à cet effet, par exemple : 7,
  • Transmettre cette donnée en cliquant sur le bouton Envoyer,
Réception saisie numérique internaute sur page Internet par code Php côté serveur

Comme vous le remarquez, la valeur est parfaitement réceptionnée côté serveur et les deux variables sont restituées dans le calque inférieur.

Nous devons exploiter cette donnée pour réaliser des traitements itératifs bornés.



Traitements itératifs par les boucles en PHP
Plusieurs boucles sont disponibles en PHP. Tout d'abord, il y a la boucle for, parfaite pour des traitements itératifs bornés, soit entre une valeur inférieure et une valeur supérieure explicitement définies. Sa syntaxe est identique à celle que nous avons apprise lors des formations Javascript.
  • Dans la branche if de l'instruction conditionnelle PHP, ajouter le code suivant, noté en gras :
if(isset($_POST['plafond']))
{
$le_plafond = $_POST['plafond'];
$restitution = 'La table de multiplication pour le chiffre 5 :<br/>';
for($i=0;$i<$le_plafond;$i++)
{
$restitution.= 'Ligne'.($i+1).'&emsp;&emsp;'.$i.'*5 = <span style='color:#CC3300;'>'.$i*5;
$restitution.= '</span><br />';
}

}


Dans les parenthèses de l'instruction for, nous définissons les bornes séparées par un point-virgule, par le biais d'une variable déclarée et affectée à la volée. En troisième argument, nous définissons l'incrémentation ($i++). Ainsi la variable de boucle se voit affectée d'une unité supplémentaire à chaque passage jusqu'à atteindre la borne supérieure. C'est cette condition qui mettra fin au traitement itératif.

A l'intérieur des bornes de la boucle, nous exploitons cette variable incrémentée pour construire un calcul de multiplication. Bien qu'il s'agisse d'un code serveur Php, nous concaténons des informations dynamiques à des informations statiques Html. C'est le point (.) en Php qui autorise cette liaison entre chaque partie à associer. En Javascript, nous utilisions le symbole +. A chaque passage :
  • Nous affichons le numéro de la ligne par concaténation (Ligne '.($i+1)),
  • Nous ajoutons deux petites tabulations pour aérer la présentation (.'&emsp;&emsp;'),
  • Nous affichons le calcul réalisé (.$i.'*5=),
  • Nous encapsulons le résultat dans une balise Html de mise en forme pour un texte rouge (<span style='color:#CC3300;'>'.),
  • Nous concaténons avec le calcul (.$i*5),
  • Puis, nous fermons la balise ouverte et ajoutons un saut de ligne (</span><br />),
Il ne nous reste plus qu'à tester en réalisant une simulation complète d'envoi de la donnée numérique.
  • Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
  • Cliquer dans la barre d'adresse et recharger la page en enfonçant la touche Entrée,
  • Saisir un chiffre dans la zone de texte, par exemple 7,
  • Puis, cliquer sur le bouton Envoyer pour le transmettre,
La donnée est effectivement réceptionnée côté serveur dans la variable Php le_plafond, grâce à la branche If de l'instruction conditionnelle.

De fait, la boucle for est enclenchée pour réaliser un traitement itératif partant de la valeur 0 jusqu'à atteindre le nombre transmis par le formulaire Html. A chaque passage, le calcul de la multiplication est adapté du fait de l'incrémentation de la variable de boucle ($i++).

Traitement itératif Php par les boucles sur donnée numérique transmise par le formulaire client

Le code est donc optimisé pour des résultats différents. Il s'agira d'une très bonne méthode pour parcourir toutes les lignes d'un fichier présent sur le serveur ou encore tous les enregistrements d'une table de base de données.

Un traitement récursif peut aussi se faire dans l'autre sens, par décrémentation ($i--). Il suffit d'intervertir les bornes de la boucle pour partir du plus grand jusqu'à atteindre le plus petit.
  • Revenir dans l'éditeur de code et adapter la boucle for comme suit :
for($i=$le_plafond-1;$i>=0;$i--)
{
$restitution.= 'Ligne'.($i+1).'&emsp;&emsp;'.$i.'*5 = <span style='color:#CC3300;'>'.$i*5;
$restitution.= '</span><br />';
}
  • Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
  • Cliquer dans la barre d'adresse et recharger la page en enfonçant la touche Entrée,
  • Saisir un chiffre dans la zone de texte, par exemple 7,
  • Puis, cliquer sur le bouton Envoyer pour le transmettre,
Nous obtenons bien le même résultat que précédemment mais la restitution se fait dans un ordre inverse. Lorsque nous progresserons dans l'apprentissage du PHP, nous verrons que ces traitements récursifs inversés s'avèrent parfois précieux.

Nous avons retranché une unité à la variable plafond pour la borne supérieure de la boucle for. Nous restons ainsi cohérents avec la boucle incrémentée précédente dont le critère ne permettait pas d'atteindre sa valeur ($i<$le_plafond).

Traitement récursif inversé par les boucles avec décrémentation en PHP

L'autre type de boucle disponible est particulièrement intéressant. Il s'agit de la boucle While dont la syntaxe est identique à celle que nous avons apprise en Javascript. Elle n'effectue pas un traitement itératif borné. Elle réalise des actions récursives tant qu'une condition est remplie. Ce type de boucle est particulièrement adapté aux traitements de données de bases de données ou de fichiers. Dans ce cas la condition consiste à vérifier si la fin du fichier ou des enregistrements est atteinte. C'est ce critère qui met fin au traitement récursif. Nous le constaterons à l'avenir. La boucle Do While est une déclinaison de la boucle While. Dans ce second cas, le traitement itératif est d'abord enclenché. C'est seulement ensuite que le critère est vérifié.

Nous proposons d'atteindre le même résultat que précédemment avec cette nouvelle boucle. Comme le test doit être réalisé sur une variable à incrémenter, cette dernière doit tout d'abord être initialisée.
  • Revenir dans l'éditeur de code de la page Web,
  • Passer la précédente boucle en commentaire grâce aux symboles /* et */ :
Passer un bloc de plusieurs lignes instructions Php en commentaires
  • Après ces commentaires, ajouter la boucle while suivante :
$i=0;

while($i<$le_plafond)
{
$restitution.= $i.'*5 = <span style='color:#CC3300;'>'.$i*5;
$restitution.= '</span><br />';
$i++;
}


Le critère est énoncé dans les parenthèses de la boucle while. Comme il est réalisé sur une variable numérique, celle-ci doit d'abord être déclarée et initialisée ($i=0;). Tant que la variable n'a pas atteint la valeur indiquée par l'internaute sur le formulaire Web, le traitement continue. Ce traitement est identique au précédent. Mais pour qu'il puisse se faire, la variable du critère doit être incrémentée à chaque passage ($i++;). Sinon, le test est toujours vrai et la boucle ne s'arrête jamais.
  • Enregistrer les modifications et tester le résultat dans le navigateur,
Comme vous le constatez, les résultats sont strictement identiques. La méthode est différente en revanche.

Lorsque nous aurons les connaissances nécessaires, les boucles while seront précieuses pour parcourir les fichiers et les enregistrements de bases de données. La condition à remplir ne sera plus numérique. Et tant qu'elle ne sera pas remplie, le traitement se poursuivra.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn