ARS4:Supervision, contrôle des procédés Mise en ouvre d’une supervision 1 Mise en ouvre d’une supervision • Différentes stratégies de supervision • Outils de mise en ouvre de page web – Philosophie: statique/dynamique – Les bases du langage xhtml – Page web dynamique: le langage php 2 Stratégie de supervision Administration ERP (BDD) Commerciale CLIENT Bureaux d’étude (CFAO, GMAO) Heures, jours Minutes, Heures MES (BDD) CLIENT SERVEUR SUPERVISION (BDD) TCP/IP Intranet SERVEUR HMI Poste Opérateur CLIENT SERVEUR SERVEUR RS485 BDD Seconde HMI API Module E/S Capteurs/ Actionneurs RS485 BDD Poste Opérateur API Module E/S Milliseconde Capteurs/ 3 Actionneurs Stratégie de supervision Administration ERP (BDD) Commerciale CLIENT Bureaux d’étude (CFAO, GMAO) Heures, jours Minutes, Heures MES (BDD) CLIENT SERVEUR SUPERVISION (BDD) TCP/IP Intranet Seconde CLIENT SERVEUR SERVEUR SERVEUR HMI API HMI Module E/S API Module E/S Milliseconde Poste Opérateur Capteurs/ Actionneurs Poste Opérateur Capteurs/ 4 Actionneurs Stratégie de supervision • • • • • Communication avec les API Sauvegarde dans des Base De Données Communication Client Serveur Affichage Périodicité 5 Stratégie de supervision Besoins Logiciel de supervision Programmation Internet Communication API Driver fournis par le constructeur ActiveX et langade de script (VBscript, JavaScript, etc.) Communication Client/Serveur Implémenter dans le logiciel, configurable par l’utilisateur. Langage php (asp chez microsoft) Base de données Connexion à une BDD Serveur de base de extérieur, ou BDD données (MySQL, interne. SQLserver, ORACLE,etc.) Affichage des information Bibliothèque de symbole Programmatio des pages web en xhtml, php. Périodicité paramétrable Timer 6 Outils de mise en ouvre de page web • Philosophie: statique/dynamique • Les bases du langage xhtml • Page web dynamique: le langage php 7 Philosophie: statique/dynamique Statique Dynamique Envoie de l ’URL avec des paramètres Le serveur envoie la page html La page est la même quelque soit l ’utilisateur qui la lit. Il n ’y a pas d ’interaction de l ’utilisateur sur le contenu de la page. Le fichier php renvoie au serveur la page html Le serveur ouvre le fichier php Le fichier php interroge la BDD et construit la page html 8 Le langage XHTML 9 Les bases du langage xhtml La page minimum Balise ouvrante Balise fermante Le langage xhtml est un langage à balises Toutes les zones sont délimitées par une balise ouvrante et une balise fermante. Exemple: <head> … </head>, <body> … </body> Une page xhtml est décomposée en 2 parties: •l ’en-tête: délimité par les balises « head ». Il sert à donner des informations aux navigateur (titre de la page, langue (fr), l ’auteur, l ’encodage des caractère, etc.) •le corps (body): c ’est la partie affiché dans la fenêtre du navigateur. 10 Les bases du langage xhtml Les balises de contenu: •div: division, organisation du contenu. •p: paragraphe Les balises de liens, de listes et d ’image: •a: liens •ul, li, ol: listes •img: image Les tableaux •table, tr, td: éléments de tableaux Les formulaires: •form: déclaration de formulaire •input, select: interface avec l ’utilisateur, saisie d ’informations 11 Les balises de contenu 12 La balise de liens 13 Les listes 14 Les tableaux 15 Les tableaux 16 Les tableaux 17 Les tableaux 18 Les formulaires 19 Les formulaires 20 Les formulaires 21 Les formulaires 22 Les formulaires 23 Les formulaires 24 Les bases du langage XHTML Exercice 25 Exercice Donner le code de la page xhtml qui permet d ’obtenir l ’affichage suivant: 100 px 50 px 25 px 400 px 300 px 50 px 26 Le langage Dynamique PHP 27 PLAN Le langage SERVEUR PHP • Premier programme Eléments du langage php • Les constantes • Les opérateurs • Les tests • Les boucles • Les tableaux • Les fonctions (notion de librairies) Les formulaires • 1er formulaire • Traitement des contrôles (radio,coche,liste) • Problème de saisie: magic_quote • Exemple complet : ré-affichage • Contrôle des données en javascript Les BDD (MySQL) • Connexion/déconnexion • Requêtes ACTION • Requêtes SELECT • Exemple de formulaire d'édition Les SESSIONS • Cookies/ Variables de SESSION AJAX • Intérêt • Mise en œuvre (avec prototype) 28 Qu'est-ce que le PHP? PHP est un langage de traitement traité par le serveur qui permet de construire dynamiquement des pages HTML contenant les résultats provenant de calculs ou de requêtes SQL adressées à un système de gestion de bases de données (SGBD). 29 Mon premier programme PHP CONFIGURATION C:\EasyPHP Le dossier des pages web (par défaut) est donc : C:\EasyPHP\www On suppose que EasyPHP est installé dans le dossier Si on fait les tests de développement sur la machine locale où tourne le serveur, alors, dans le navigateur (FF ou IE), les pages sont accessibles à partir de l'adresse URL : http://localhost/ On crée la page C:\EasyPHP\www\page1.php <html> <head> <title>Ma premi&egrave;re page PHP</title> </head> <body> <?php echo "<p>bonjour, les GEII !<p>\n"; print("<p>G&eacute;niaux Etudiants Infatigables et Intelligents</p>\n"); ?> <p>Aujoud'hui nous sommes le <?php echo Date("l F d Y");"\n";?></p> </body> </html> 30 Mon premier programme PHP Remarques : • la page est généralement sauvegardée en lui donnant l'extension .php • le script PHP se trouve entre les balises <?php et ?> • la page contient ici une alternance de balises HTML 'classiques' et de 'morceau de code' PHP • echo ou print sont des fonctions PHP qui servent à produire un affichage • pour que echo affiche le texte tel quel, ce texte doit être entouré de guillemets (") . Sinon echo essaie de comprendre. par exemple echo 1+2; provoque l'affichage de 3. Tandis que echo "1+2"; provoque l'affichage de 1+2 . • date est une fonction PHP qui affiche la date (les paramètres permettent de définir le format) l - ('L' minuscule) - Jour de la semaine, F - Mois, textuel, version longue; en anglais, i.e. "January" (pour Janvier) d - Jour du mois, sur deux chiffres (éventuellement avec un zéro) : "01" à "31" Y - Année, 4 chiffres; i.e. "1999" 31 Mon premier programme PHP Sur notre navigateur, on va saisir : On obtient à l'écran : http://localhost/page1.php En allant voir le code source de la page reçue par le navigateur, on voit : <html> <head> <title>Ma premi&egrave;re page PHP</title> </head> <body> <p>bonjour, les GEII !<p> <p>G&eacute;niaux Etudiants Infatigables et Intelligents</p> <p>Aujoud'hui nous sommes le Wednesday March 03 2010</p> </body> </html> On constate qu'il n'y a plus aucune balise PHP. C'est normal : souvenez-vous que le serveur exécute le programme et n'envoie au client que le résultat, pas le programme lui-même. 32 Remarque sur echo La commande echo est légèrement plus rapide que print. On peut inclure des retours chariots, des sauts de ligne, des tabulations... Qui ne seront visibles que dans le formatage du code source HTML. Séquence d'échappement Signification Voici les principales nouvelle ligne séquences utilisables : \n \r retour chariot \t tabulation horizontale Si la chaîne à afficher contient un " (guillemet) il faut alors ajouter un antislash \ echo "un caractère \" guillemet"; echo 'un caractère " guillemet'; 33 ELEMENTS DU LANGAGE PHP Les Lesvariables variables Les constantes Les chaînes de caractères Les opérateurs Les tests Les boucles Les tableaux Les fonctions 34 Les variables en PHP Rappelons que les variables sont des zones mémoires où l'on stocke des valeurs. En PHP, tous les noms de variable commencent obligatoirement par le signe $. L'affectation d'une valeur à une variable s'effectue par le signe = (attention la comparaison s'effectue avec ==). En PHP, il n'est pas nécessaire de déclarer au préalable les variables qui seront utilisées, ni de préciser leur type. PHP est un langage dit de "typage faible et dynamique", dynamique car le type de la variable évolue en fonction de la valeur que vous lui assignez. PHP est sensible à la casse ! $val $calcul $unechaine $var_hexa $valeur_double $double2 $a = = = = = = = la variable $a n'est pas identique à $A 1; // une valeur entière $val/10; "Bonjour, tous le monde"; 0x1A; // en héxadécimal 26 12.3; 0.123E2; // 12.3 -123e-1; // -12.3 35 Quelques pièges sur les variables La présence de l'opérateur "+" convertit automatiquement le type en numérique. $var = "0"; echo "1. \$var=$var<br>"; $var++; echo "2. \$var=$var<br>"; $var = $var + 1; echo "3. \$var=$var<br>"; $var += 1.3; echo "4. \$var=$var<br>"; $var = 2 + "8 arbres"; echo "5. \$var=$var<br>"; //$var est la chaîne de caractères "0" (code ASCII 48) //$var est la chaîne de caractères "1" (code ASCII 49) //$var est un entier et vaut 2 //$var est de type "double" et vaut 3.3 //$var est de type "integer" et vaut 10 Quelques fonctions utiles sur les variables • isset(variable) permet de savoir si la variable a été définie (affectée). Elle renvoie TRUE si c'est le cas, FALSE sinon. • empty(variable) permet de savoir si la variable est vide ou non. • gettype() retourne le type de la variable.Les valeurs retournées sont les suivantes : "boolean" ,"integer","double" ,"string","array","object","resource","NULL" • unset(variable) détruit une variable 36 Portée des variables La portée d'une variable est le script dans lequel elle a été définie. La durée de vie est le temps d'exécution du script. Si le script est relancé plus tard , de nouvelles variables sont définies. Remarque : pour conserver la valeur de la variable, on peut utiliser les variables de SESSION Si on veut utiliser une variable globale dans une fonction, alors il faut spécifier le mot global Résultat du premier appel du script function ajouter() { global $var1 $var1=$var1. " et Hardy"; } echo "\var1=$var1<br>"; $var1 = "Laurel"; echo "\var1=$var1<br>"; ajouter(); echo "\var1=$var1<br>"; Var1= var1=Laurel var1=Laurel et Hardy Résultat du second appel du script Var1 est vide au début, car elle est redéfini au lancement du script Var1= var1=Laurel var1=Laurel et Hardy 37 ELEMENTS DU LANGAGE PHP Les variables Les Les constantes constantes Les chaînes de caractères Les opérateurs Les tests Les boucles Les tableaux Les fonctions 38 Les constantes Une constance est une référence à une valeur qui ne change pas define(nom, valeur) définit une constante (valeur fixe) : – le nom d'une constante suit la syntaxe PHP des identificateurs sans le $ ! – la valeur est de type integer, boolean, float ou string – sa portée est globale – elle est définie une et une seule fois par define() define("PI", 3.1416); define("BR", "<br>"); define("SITE", "<b>Intranet GEII</b>"); echo PI; echo <BR />; $a = 2 * PI ; echo $a; echo <BR />; echo SITE 3.1416 6.2832 Intranet GEII On peut enfin vérifier la présence d'une constante avec la fonction defined() qui renvoie 1 si cette première a été déclarée et 0 dans le cas contraire : if (defined("SITE")) { echo SITE; } 39 ELEMENTS DU LANGAGE PHP Les variables Les constantes Les Les chaînes chaînes de de caractères caractères Les opérateurs Les tests Les boucles Les tableaux Les fonctions 40 Chaîne de caractères L'opérateur "." sert à concaténer 2 chaînes de caractères Les caractères d'une chaîne sont indexés par leur position (début à 0) $a = echo echo echo echo echo echo echo position I U T 0 1 2 "abc"; "entre guillemets : $a <br>" ; 'entre quotes : $a <br>'; "combinaison de 'quottes' et de \"guillemets\"<br>"; 'autre combinaison de \'quottes\' et de "guillemets"<br>'; "le passage \n a la ligne doit être écrit en HTML !<br>"; "le backslash \\ lui-meme<br>"; "et le dollar \$"; entre guillemets : abc entre quottes : $a combinaison de 'quottes' et de "guillemets" autre combinaison de 'quottes' et de "guillemets" le passage à la ligne doit être écrit en HTML ! le backslash \ lui-même et le dollar $ 41 Quelques fonctions sur les chaînes • chr(0x65) e chr (num) retourne une chaîne d'un seul caractère, dont le code ASCII est égal à l'entier num • strtolower("aBCd") abcd • strtoupper("aBCd") ABCD • trim(" aBCd sdf ") aBCd sdf trim(chaîne) supprime les caractères invisibles en début et fin de chaîne •nl2br("ligne1\nligne2") ligne1<br/> ligne2 insère <br/> devant tout les caractères de fin de ligne de la chaîne • strlen("abcd") 4 longueur de la chaîne • strcmp("abcd","aac") 1 strcmp retourne < 0 si str1 est inférieure à str2 ; > 0 si str1 est supérieure à str2 , et 0 si les deux chaînes sont égales (sensible à la casse) • strpos("une ligne pour chercher","ne") 1 donne la position de la chaîne 2 dans la chaîne 1 • strpos("une ligne pour chercher","ne",2) 7 donne la position de la 2ième occurrence de la chaîne 2 dans la chaîne 1 strrev("abcd") dcba inverse la chaîne substr("une ligne pour chercher",4,5) ligne substr(chaîne, position, longueur) retourne la sous-chaîne de chaîne commençant en position et de longueur indiquée (l'indice de début d'une chaîne est 0!) 42 Quelques fonctions sur les chaînes str_replace("ne", "NE", "une ligne pour chercher") uNE ligNE pour chercher str_replace(ancien, nouveau, chaîne_a_modifier) remplace toutes les occurrences de la chaîne ancien par la chaîne nouveau dans la chaîne_a_modifier (depuis PHP4, les paramètres peuvent être des tableaux de chaînes et str-replace a alors d'autres fonctionnalités) addslashes(chaîne) ajoute des backslashes aux caractères ' " \ et le caractère nul pour les requêtes le nécessitant en requête de bases de données sprintf('$x = %d', 3) $x = 3 ; sprintf('$x =%1.1f', 3.42) $x =3.4 formate l'affichage comme le sprintf du C explode(séparateur, chaîne) découpe la chaîne en sous-chaînes en utilisant le séparateur (de type chaîne). Le résultat est le tableau de sous-chaînes obtenues. $pizza = "garniture1 garniture2 garniture3 garniture4"; $pieces = explode(" ", $pizza); $pieces[0] "garniture1", $pieces[1] "garniture2",..,$pieces[3]"garniture4" implode(séparateur, array) retourne une chaîne contenant tous les éléments du tableau séparés par le séparateur (de type chaîne). $array = array('nom', 'email', 'telephone'); $chained = implode(",", $array); $chaine "nom,email,telephone" 43 ELEMENTS DU LANGAGE PHP Les variables Les constantes Les chaînes de caractères Les Les opérateurs opérateurs Les tests Les boucles Les fonctions Les tableaux 44 Les opérateurs Les opérateurs vont permettre de manipuler les variables. opérateurs de calcul + - * / * (multiplier), + (additionner), - (soustraire), / (diviser), = (affecter) , % (prendre le reste de la division = modulo). $a=5;$b=2; ($a/$b) 2 ($a%$b) 1 opérateurs de comparaison ==, <, … Ils sont utilisés dans les instructions de conditions (if …. then ….). if ($x == 0) if ($x != 0) signifie si x = 0 signifie si x différent de 0 Les opérateurs associatifs += -= *= /= Ils permettent à la fois le calcul et l'affectation de la valeur calculée à une variable. $x+=$y est équivalent à $x=$x+$y 45 Les opérateurs (suite) Les opérateurs logiques && (ou and) || (ou or) ! Ils servent à comparer 2 expressions. if if if if if ( ( ( ( ( $x > 10 && $y < b ) … si x > 10 et y < b alors … $x < 0 || $z == 1) … si x < 0 ou z = 1 ou les deux alors … $x < 0 xor $z == 1) … si x < 0 ou z = 1 mais pas les deux alors … !$x) … si $x ne vaut pas true … $x) … si $x vaut true Les opérateurs d'incrémentation ++ et -Ils servent à augmenter (ou diminuer) de 1 la valeur d'une variable. Ils sont très utilisés . $i++ équivalent de $i = $i + 1 $i-- équivalent de $i = $i - 1 46 ELEMENTS DU LANGAGE PHP Les variables Les constantes Les chaînes de caractères Les opérateurs Les Lestests tests Les boucles Les tableaux Les fonctions 47 Les tests [1/2] Les structures de contrôle permettent notamment d'effectuer des tests sur des valeurs de variables, des résultats de fonction pour exécuter ou non d'autres instructions en fonction des résultats attendus de ces tests. IF … THEN …ELSE if (!isset($POST[‘nom’])) { //si la variable $_POST[‘nom’] n ’est pas affectée echo "Bonjour, inconnu, je vais vous appeler Michel!"; $nom= "Michel"; // on affecte la valeur «Michel» à la variable $nom } Ce test, fort utile par la suite, permet de vérifier qu'une variable existe via la fonction isset(). Ceci permet par exemple de savoir si un formulaire HTML a été rempli ou non en passant la variable "nom". $n1=mt_rand(0, 9); // nombre aléatoire entre 0 et 9 Pour recopier plusieurs fois $n2=mt_rand(0, 9); une chaîne de caractères $n3=mt_rand(0, 9); echo "NOMBRE=$n1$n2$n3<br>\n"; if ($n1==4 && $n2==2 && $n3==1) { echo "BRAVO, vous avez gagné ".str_repeat("!",50)."<br>\n"; } else { NOMBRE=588 echo "COURAGE, essayez encore. :-] <br>\n"; COURAGE, essayez } encore. :-] Remarque : PHP reconnaît aussi une syntaxe raccourci pour les tests : $a=($b>$c)? 1 : 2; Cette instruction d'affectation compare les valeurs de $b et $c. Si $b est supérieure à $c, la valeur 1 48 sera attribuée à $a, sinon ce sera la valeur 2. Les tests [2/2] SWITCH L'instruction switch clarifie le code et évite plusieurs if imbriqués ou l'utilisation de elseif. <?php $langue="anglais"; ?> <head> <title>les tests SWITCH en PHP</title> </head> <body> <?php switch ($langue) { case "français" : // 2 cas possibles case "québécois" : ?> <!--code HTML--> Hé, mon ami, tu aimes manger les bonnes patates <br> <?php break; case "espagnol": ?> <!--code HTML--> ola, amigo mio, a ti te le gusta comer las patatas buenas<br> <?php break; default: ?> <!--code HTML--> Hey, my friend, do you like good potatoes ???? <br> <?php } ?> </body> </html> 49 ELEMENTS DU LANGAGE PHP Les variables Les constantes Les chaînes de caractères Les opérateurs Les tests Les Lesboucles boucles Les tableaux Les fonctions 50 Les boucles [1/3] Les boucles sont des structures qui permettent d'exécuter plusieurs fois une ou plusieurs instructions en fonction d'une ou plusieurs conditions. WHILE Cette boucle permet d'effectuer le traitement tant que la valeur de l'expression est vraie. $i=1; echo "<h1>Table de multiplication de <b>6</b></h1>\n"; echo "<table width=\"100\" border=\"1\">\n"; while ($i<=10) { echo "<tr><td>$i</td><td>".(6*$i++)."</td></tr>\n"; } echo "</table>\n"; <h1>Table de multiplication de <b>6</b></h1> <table width="100" border="1"> <tr><td>1</td><td>6</td></tr> <tr><td>2</td><td>12</td></tr> <tr><td>3</td><td>18</td></tr> <tr><td>4</td><td>24</td></tr> <tr><td>5</td><td>30</td></tr> <tr><td>6</td><td>36</td></tr> <tr><td>7</td><td>42</td></tr> <tr><td>8</td><td>48</td></tr> <tr><td>9</td><td>54</td></tr> <tr><td>10</td><td>60</td></tr> </table> 51 Les boucles [2/3] DO …. WHILE Cette boucle appelée "jusqu'à" fonctionne comme la boucle while sauf que le bloc d'instruction est au moins exécuté une fois puisque le test se fait à la fin de la structure. $i=1; echo "<h1>Table de multiplication de <b>7</b></h1>\n"; echo "<table width=\"100\" border=\"1\">\n"; do { echo "<tr><td>$i</td><td>".(7*$i++)."</td></tr>\n"; } while ($i<=10); echo "</table>\n"; Le résultat est le même. Notons que l'utilisation de cette boucle est nécessaire lorsque l'on souhaite que les instructions soient au moins effectuées une fois. 52 Les boucles [3/3] FOR Cette boucle permet d'exécuter une ou plusieurs instructions un certain nombre de fois. for (initialisation; condition_de_poursuite; action_a_chaque_tour) { instructions; } Initialisation contient les conditions de départ de la boucle (ex.: $c=0) Condition_de_poursuite est une condition qui détermine si la boucle doit se poursuivre (ex.: $i<10) action_a_chaque_tour représente le traitement effectuer à chaque nouveau tour de boucle (ex. : $i++) $MAX_ETOILES=5; $nbre_etoiles=3; //nombre d'étoiles à afficher devant le LIVRE $etoiles=""; for ($i = 0 ; $i < $nbre_etoiles ; $i++) { $etoiles .= "<img src=\"img/et1.gif\">\n"; } for (;$i<$MAX_ETOILES;$i++) $etoiles .= "<img src=\"img/et2.gif\">\n"; echo $etoiles; 53 ELEMENTS DU LANGAGE PHP Les variables Les constantes Les chaînes de caractères Les opérateurs Les tests Les boucles Les Lestableaux tableaux Les fonctions 54 Les tableaux Pas de surprises avec les tableaux, l’utilisation est classique. Tableaux à une dimension $ville[0] $ville[1] $ville[2] Echo "Je = "toulouse"; = "paris"; = "Angoulême"; vis à ".$ville[1]."<BR>" ; L'indice du premier élément du tableau est 0 Dans les cas où l’on ne désire pas se préoccuper de mentionner les index, PHP le fera à votre place : $ville[] = "toulouse"; $ville[] = "paris"; $ville[] = "Angoulême"; Si l’on désire savoir combien de valeurs ont été entrées dans un tableau, on utilisera la fonction count(tab) : $limiteIndex=count($ville) ; et pour les afficher : for ($index = 0 ; $index < $limiteIndex ; $index++) { echo (“$bab[$index] <BR>”); } Il est également possible d'indexer les tableaux autrement qu'avec des entiers : $capitale[fr]="Paris"; $capitale[es]="Madrid"; print "La capitale de l'Espagne est : $capitale[es]"; 55 Les tableaux Initialisations Il est également possible de déclarer un tableau avec ses initialisations. Ce type de tableau est appelé associatif : $mois=array(2=>"Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre", "Novembre","Décembre") ; echo "Mois de $mois[5]" ; // affichera "Mois de Avril" L’opérateur => permet ici de faire démarrer le tableau à l’index 2 et non pas 0 comme c’est le cas par défaut. Enfin , il n'est pas nécessaire d'avoir des tableaux avec des indices numériques successifs. $tabbizarre[12] = "pas bien grand"; $tabbizarre[1025] = "plutôt grand"; $tabbizarre[15215] = "très grand"; Afin de réaliser un parcours efficace de ce genre de tableaux, on peut utiliser 2 méthodes : avec each et list : la fonction each permet de renvoyer uniquement les éléments du tableau contenant les données. La fonction list ($cle, $valeur) récupère l'indice et la valeur de l'élément. while (list($cle,$valeur) = each ($tabbizarre)) { echo "$cle $valeur<br>"; } avec foreach : la fonction foreach passe en revue le tableau. A chaque itération les éléments ($cle,$valeur) sont récupérés et le pointeur interne avance d'un élément. foreach ($tableau as $cle=>$valeur) { echo "$cle $valeur<br>"; } Tableaux à dimensions multiples L’utilisation de tableaux à dimensions multiples est là encore semblable aux autres langages. 56 $matrice[5][4] Les fonctions sur les tableaux • • • • • • • • • in_array(valeur,tableau) retourne true si la valeur se trouve dans le tableau explode(séparateur, chaîne) découpe la chaîne en sous-chaînes en utilisant le séparateur (chaîne). Le résultat est le tableau de sous-chaînes obtenues implode (séparateur, array) retourne une chaîne contenant tous les éléments du tableau séparés par le séparateur (de type chaîne) sort (array) trie le tableau array (associatif ou non) dans l'ordre croissant des éléments ! ksort (array) trie le tableau associatif suivant l'ordre croissant des clés. Elle maintient la correspondance entre les clés et les valeurs. array_key_exists(cle, tableau) retourne true si une clé existe dans un tableau array_keys(tableau) retourne un tableau de toutes les clés du tableau en paramètre array_slice(tableau, position, nombre) retourne un sous-tableau extrait du tableau à partir de la position et composé de nombre éléments array_sum(tableau) : retourne la somme des valeurs du tableau 57 ELEMENTS DU LANGAGE PHP Les variables Les constantes Les chaînes de caractères Les opérateurs Les tests Les boucles Les tableaux Les fonctions 58 Les fonctions RAPPEL une fonction réalise une succession d'instructions et renvoie une valeur issue d'un calcul (instruction return). une fonction peut (mais ce n'est pas obligé) accepter des valeurs (appelées "arguments" ou "paramètres"). Si il y en a plusieurs, les arguments sont séparés par des virgules. les instructions qui composent la fonction sont encadrées de { et } une fonction ne retourne pas OBLIGATOIREMENT une valeur (pas de return dans ce cas) /** * calcule la surface d'un cercle à partir du rayon passé en paramètre * @param rayon – la valeur du rayon. * @return un double. Il est intéressant de respecter une */ certaine forme d'écriture pour l'en tête function calcul_surface_cercle ($rayon) { de la fonction car on peut alors utiliser $surf=3.14 * $rayon * $rayon; des outils (comme DOXYGEN) de return $surf; // ou return ($surf); } génération automatique de Pour appeler l'exemple ci-dessus, on écrira : $surface=calcul_surface_cercle (5); // $surface78.5 documentation des fonctions du code 59 Transmission des valeurs Par défaut, le passage des paramètres s'effectue par valeur: c'est une copie de la valeur qui est passée à la fonction. Donc les modifications à l'intérieur de la fonction n'ont aucun effet sur les valeurs dans le script appelant. Il est possible de passer une référence directe (une adresse) aux paramètres en utilisant l'opérateur de référence &. La fonction travaille directement sur les variables du script appelant. Par valeur function par_valeur ($param) { $param++; // affichage du paramètre dans la fonction echo "paramètre=$param<br>"; } // init de la variable $x=1; echo "AVANT appel \$x=$x<br>"; par_valeur($x); echo "APRES appel \$x=$x<br>"; Résultat AVANT appel $x=1 paramètre=1 APRES appel $x=1 Par référence function par_valeur (&$param) { $param++; // affichage du paramètre dans la fonction echo "paramètre=$param<br>"; } // init de la variable $x=1; echo "AVANT appel \$x=$x<br>"; par_valeur($x); echo "APRES appel \$x=$x<br>"; Résultat AVANT appel $x=1 paramètre=1 APRES appel $x=2 60 Les librairies de fonctions Au fur et à mesure de votre travail , vous allez construire des fonctions PHP très utiles donc très souvent utilisées. Il faut alors organiser son code. Les fonctions importantes vont être regroupées dans des fichiers librairies séparés. Pour appeler ces fichiers librairies, on va écrire ou require (nom_de_fichier_librairie) include (nom_de_fichier_librairie) La fonction include() renverra une erreur de type WARNING si elle n'arrive pas à ouvrir le fichier en question. De ce fait l'exécution du code qui suit dans la page sera exécuté. En revanche, la fonction require() affichera une erreur de type FATAL qui interrompt l'exécution du script. Par exemple, on peut créer le dossier C:\EasyPHP\www\lib\ et placer dans ce dossier un fichier perso.php qui contiendrait la fonction calcul_surface_cercle Voici un exemple : <?php define("LIBRAIRIES",$_SERVER['DOCUMENT_ROOT']."/lib/"); require(LIBRAIRIES."perso.php"); Équivalent à l'écriture ?> C:/EasyPHP/www/lib/ <head> <title>les librairies en PHP</title> </head> <body> <?php echo "la surface d'un cercle de rayon=5 est :<b>".calcul_surface_cercle(5)."</b>"; ?> </body> 61 </html> PHP Et les formulaires 62 Les formulaires • Les formulaires permettent de doter les pages web d'éléments interactifs permettant un dialogue avec les internautes. La structure d'un formulaire de saisie est simple, elle se compose d'un élément FORM contenant essentiellement une suite de contrôles (éléments INPUT, TEXTAREA, SELECT, BUTTON, etc.) mais aussi des éléments de structuration de document afin d'aligner correctement les champs d'entrée. <FORM NAME="nom_du_formulaire" METHOD="GET" | "POST" ACTION="URL_de_traitement" > du texte, des boutons, des zones de saisie ... <INPUT TYPE="submit"> </FORM> 63 Les formulaires METHOD indique la méthode de transmission HTTP des données saisies dans le formulaire : • POST est la valeur qui correspond à un envoi de données stockées dans le corps de la requête (les données sont cachées mais PAS CRYTEES !!!) • GET correspond à un envoi des données visibles dans l'URL (séparées de l'adresse du script par un point d'interrogation) : à éviter mais pratique pendant la phase de mise au point. (si cet attribut est omis, il vaut "get" par défaut). ACTION permet d'indiquer l'URL absolue ou relative qui va recevoir les informations entrées dans le formulaire, lorsque l'on cliquera sur le bouton de validation. C'est généralement le nom d'un fichier script PHP. (si le champ ACTION est absent, l'URL sera celle du document courant). NAME est le nom de l'objet formulaire. Peu d'intérêt sauf, coté CLIENT, où le javascript peut manipuler l'objet formulaire (mais on préférera plutôt travailler avec la propriété ID). 64 Formulaires et PHP PHP peut intervenir à deux endroits par rapport au formulaire : • Pour la construction du formulaire (avec des informations dynamiques) • Pour le traitement des données du formulaire (les données utilisateur) On peut utiliser 3 méthodes pour faire interagir le formulaire et le script PHP : • Mettre le formulaire dans un document HTML pur et indiquer le nom du script PHP qui doit traiter les données dans l'option ACTION • Mettre le formulaire dans un script PHP (pour construire dynamiquement une partie du formulaire) et faire traiter les données par un autre script PHP • Mettre le formulaire dans un script PHP (pour construire dynamiquement une partie du formulaire) et le faire traiter par le même script PHP Dans la pratique, il est souhaitable de séparer au maximum • la partie affichage des informations (le HTML pur) • la partie mise en forme des informations (le CSS) • la partie traitement des données (le PHP) 65 1er exemple de formulaire Voici un premier exemple de formulaire (très simple) qui permet d'identifier le client : <head> <title>Mon premier formulaire</title> </head> <body> <form action="formulaire1.php" method="get" id="login"> <fieldset> <legend> Identification </legend> <p><label> Nom : </label><input type="text" name="nom" /></p> <p><label> Mot de passe : </label><input name="mdp" type="password" /></p> <input type="submit" value="Ok" id="ok"/> </fieldset> </form> </body> </html> Le formulaire contient 2 zones de texte (nom et mdp), dont l'une est de type Password (remplacement des caractères par des * à la saisie). Il faut toujours veiller à bien structurer les éléments de la page dans la perspective prochaine de leur appliquer une mise en forme par feuille de style. On ajoutera donc toujours un LABEL devant les en têtes : <label> Nom : </label> et un attribut ID ou CLASS sur les balises importantes <form id="login"> , <input type="submit" value="ok" id="ok"> 66 1er exemple de formulaire 1 Lorsque l'on appelle la page http://localhost/formulaire1.php 2 On obtient l'écran suivant : 3 Saisie d'une valeur : fwateau fwateau *** 4 Après clic sur le bouton OK, les paramètres du formulaire sont transmis dans l'URL sous la forme de couple nom1=valeur1&nom2=valeur2 …. http://localhost/form1.php?nom=fwateau&mdp=iut Remarque : le mot de passe est en 'clair' !!!! Le SERVEUR reçoit les informations dans des variables $_GET[ ] fwateau fwateau nom=fwateau&mdp=iut F/ 67 1er exemple de formulaire REMARQUES Si l'attribut METHOD est réglé sur POST <form action="formulaire1.php" method="post" id="login"> … </form> alors après clic sur le bouton OK, les paramètres du formulaire n'apparaissent pas dans l'URL mais sont transmis dans la trame TCP/IP Le SERVEUR reçoit les informations dans des variables $_POST[ ] Si 2 zones portent le même nom dans un formulaire, c'est la dernière zone rencontrée qui fixe la valeur <label> Nom : </label><input type="text" name="nom" /> <label> prénom : </label ><input type="text" name="nom" /> La valeur de cette zone S'il y a 2 formulaires dans la page, les variables transmises sont celles du formulaire qui a été validé. 68 1er exemple de formulaire REMARQUES Pour récupérer facilement les variables, on peut aussi utiliser la fonction extract. Elle exporte le tableau associatif et créé une variable pour chaque clé du tableau. extract($_POST,EXTR_OVERWRITE); Cette fonction va créer une variable pour chaque clé du tableau associatif $_POST. Si l'on a : $_POST['nom'] $_POST['prenom'] $_POST['age'] alors la fonction extract($_POST, EXTR_OVERWRITE) va créer les variables suivantes : $nom $prenom $age Signification du second paramètre : EXTR_OVERWRITE écrase les variables existantes EXTR_SKIP n'écrase pas les variables existantes 69 Modification du 1er formulaire Maintenant, quand le formulaire est validé, le SERVEUR doit vérifier le login et le comparer à l'utilisateur attendu (nom=prof,mdp=iut) Une variable pour le message d'erreur et une autre pour le message de bienvenue Vérifier que des données ont été reçues : Si FAUX alors c'est le premier appel de la page Si VRAI alors le formulaire a été validé Tests de contrôle du login (comparaison avec les constantes) Si LOGIN OK $message est renseignée Si LOGIN nOK $err est renseignée … sinon affichage (normal) de la page (avec éventuellement un message d'erreur desi Affichage du message de bienvenue login) l'utilisateur vient de s'identifier correctement … 70 Commentaires sur la page de login La page est structurée : déclaration des constantes et variables, traitement des données et présentation des données. C'est une bonne pratique à adopter en programmation. On traite toujours les informations avant de les présenter. Avec cette méthode, nous pourrons par exemple effectuer des redirections sans risque d'erreur d'en-têtes déjà envoyés. Voici quelques explications : • 2 variables globales sont créées : $message pour contenir le message de bienvenue $err pour le message d'erreur pour un login incorrect • La première condition vérifie que le tableau $_POST existe et n'est pas vide. Si c'est le cas, alors elle renverra vrai (TRUE) [ce qui signifie que c'est le premier appel de la page] et sera franchie pour accéder aux tests suivants. • On effectue ensuite une série de tests pour contrôler le login (correspondance avec les constantes définies en-tête du fichier). Si le login est correct alors la variable $message est renseignée sinon c'est la variable $err qui est renseignée. • Dans le corps de la page, nous vérifierons si la variable $message existe. Si c'est le cas, on l'affiche sinon c'est le reste du code HTML qui est présenté (avec éventuellement l'indication d'erreur de login). 71 Une autre mécanique pour le login On souhaite rediriger l'utilisateur vers une autre page lorsqu'il est correctement identifié. Pour cela, PHP dispose de la fonction header qui se charge d'envoyer les entêtes passés en paramètre. Règle importante : l'appel de cette fonction doit se faire avant tout envoi au navigateur (instruction echo, print, espace blanc, balise html...) sous peine de générer une erreur de type Headers already sent by.... Cette erreur signifie que la page a déjà été envoyée au navigateur avant de vouloir envoyer des en-têtes HTTP. L'utilisateur est maintenant redirigé vers la page index.php qui se trouve dans le if (!empty($_POST)) { même dossier que la page en cours // vérifier le login if ($_POST['nom']==NOM && $_POST['mdp']==MDP) { header('location: index.php'); exit(); } else $err="identification incorrecte : RECOMMENCEZ"; } Note 1 : l'instruction exit() qui succède la fonction header() permet de couper l'exécution du script car la redirection aura lieu immédiatement et le reste du code n'a pas d'intérêt à être interprété. Note 2 : pour rediriger vers un autre serveur on écrira : 72 l'instruction exit() qui succède la fonction header("location : http://www.monserveur.com/page2.php) Traitement des contrôles de formulaire Groupe de bouton radio utilisé pour sélectionner un choix et un seul parmi plusieurs. Au maximum, un seul radio-bouton reste coché. Si l'option "checked" est ajoutée, le radio-bouton sera pré-coché. Sexe : <input name="sexe" type="radio" value="M" checked="checked" /> Masculin <input name="sexe" type="radio" value="F" /> F&eacute;minin <input name="sexe" type="radio" value="?" /> Ne sait pas Le résultat est récupéré dans la variable $_POST['sexe'] valeurs possibles ={'M','F','?'} Case à cocher ici $_POST['sexe'] ='M' utilisées pour des valeurs de type "oui" (case cochée) ou "non" (case décochée) si l'option "checked" est ajoutée, la case sera pré-cochée. Couleur : <input type="checkbox" <input type="checkbox" <input type="checkbox" <input type="checkbox" name="couleur[bleu]" checked="checked" /> Bleu name="couleur[blanc]" /> blanc name="couleur[rouge]" /> rouge name="couleur[nsp]" /> ne sait pas Le résultat est récupéré dans une variable tableau. Seules les cases qui sont cochées créent un élément dans le tableau. ici $_POST['couleur']['bleu']='on', $_POST['couleur']['rouge']='on' et les autres sont empty 73 Traitement des contrôles de formulaire Liste à sélection simple utilisée pour afficher une liste de valeurs qui se déroule quand on clique sur la flèche <label>Langue : </label> <select name="langue"> <option value="F">Francais <option value="A">Anglais <option value="C">Chinois </select> Le résultat est récupéré dans la variable $_POST['langue'] valeurs possibles ={'F','A','C'} ici $_POST['langue'] ='F' Liste à sélection multiple Comme une liste simple mais avec l'attribut multiple <label>J'aime : </label><br> <select name="fruits[]" size="5" multiple> <option value="abricot">les abricots <option value="peche">les péches <option value="poire">les poires <option value="pomme">les pommes </select> Le résultat est récupéré dans une variable tableau. Seuls les éléments qui sont sélectionnés créent un élément dans le tableau. ici $_POST['fruits'][0]='peche', $_POST['fruits'][1]='poire' 74 PHP Et les Bases de données 75 Présentation Il est souvent incontournable d'utiliser une base de données dans un site web dynamique car c'est un moyen standardisé pour stocker les données. PHP propose un support natif pour plusieurs types de bdd : • MySQL (la plus utilisée), • Oracle, • Microsoft SQL server, • Sybase PHP supporte aussi les connexions ODBC pour une liaison sur ACCESS par exemple. La plupart des interactions entre un script PHP et une bdd (ici MySQL) correspondent à la séquence suivante : 1 Ouverture d'une connexion avec le serveur MySQL 2 Spécification de la bdd concernée par l'accès 3 Lancement de requêtes, récupération et traitement des données 4 Fermeture de la connexion avec le serveur MySQL 76 Notion de fetch Avec une bdd, l'instruction SELECT (en vue de lire les données) se contente d'exécuter la requête; aucune donnée n'est retournée. Il faut donc extraire les lignes du résultat : c'est la notion de fetch. Pour résumer : L'instruction SELECT identifie un résultat et positionne un pointeur interne sur la première ligne de ce résultat Ligne Ligne Ligne …. Ligne 1 2 2 N L'instruction FETCH permet de lire la ligne courante du résultat, de ramener les valeurs dans des variables PHP et de faire avancer le pointeur sur la ligne suivante Ligne Ligne Ligne …. Ligne 1 2 3 Ligne Ligne Ligne …. Ligne 1 2 3 FETCH Variable(s) PHP N N 1er FETCH FETCH Variable(s) PHP 2cd FETCH 77 Connexion à la bdd PHP va faire l'intermédiaire entre l'internaute et MySQL. Problème : PHP ne peut pas dire à MySQL simplement "Récupère-moi ces valeurs" En effet, MySQL demande d'abord un nom d'utilisateur et un mot de passe. S'il ne faisait pas ça, tout le monde pourrait accéder à votre BDD et lire les informations qu'il y a dedans (parfois confidentielles !). Il va donc falloir que PHP s'authentifie, on dit qu'il établit une connexion avec MySQL. Une fois que la connexion sera établie, il est possible de travailler sur la bdd dans le script. La connexion Pour se connecter, on utilise la fonction : mysql_connect. Cette fonction a besoin de 3 arguments : • Le nom de l'hôte : c'est l'IP de l'ordinateur où MySQL est installé. Le plus souvent, MySQL est installé sur le même ordinateur que PHP. Dans ce cas, mettez la valeur "localhost" et ça marchera • Le login : c'est l'identifiant MySQL de l'utilisateur. Il faut se renseigner auprès de l'administrateur de la bdd pour l'obtenir. Chez un hébergeur, c'est souvent le même login que celui de la liaison FTP). • Le mot de passe : c'est le mot de passe MySQL (à voir avec l'administrateur). 78 Connexion à la bdd On va supposer que le nom de l'hôte est "localhost" (c'est valable dans la quasi-totalité des cas), que le login est »geii" et que mon mot de passe est "open". Le code suivant permet d'établir une connexion à MySQL : $bd=mysql_connect("localhost", "geii", "open"); Remarque: par défaut, mysql_connect() essaie de se connecter au service MYSQL sur le port 3306, port standard. On peut préciser un autre numéro de port en écrivant : localhost:3310 $bd=mysql_connect ("univ:3005", "geii", "open"); Ici, on se connecte sur une base hébergée sur une autre machine serveur nommée univ (en port 3005) Le choix de la base Il faut maintenant définir le nom de la base de données avec laquelle on souhaite travailler. La fonction qui permet de sélectionner la BDD est : mysql_select_db(nom_base) Par exemple, si la base s'appelle "bd_test", voici comment faire: mysql_connect ("localhost", "geii", "open"); // Connexion à MySQL mysql_select_db("bd_test"); // Sélection de la base bd_test 79 Connexion à la bdd La déconnexion Une fois que la travail sur la BDD est fini, il faut vous déconnecter. Il faut utiliser la fonction mysql_close() [pas de paramètre] Il n'est généralement pas nécessaire d'invoquer cette fonction dans la mesure où PHP ferme automatiquement les connexions au serveur quand le script est terminé (en fin de page). Par exemple, pour fermer la connexion, on écrira : mysql_close(); // ferme la connexion à MySQL Pourquoi la fonction mysql_close existe-t-elle si elle est inutile? 1. Fermer la connexion AVANT la fin du script permet de libérer des ressources système sur la machine. 2. Quand on travailler avec plusieurs serveurs MySQL, généralement on ne conserve qu'une seule connexion ouverte à la fois 80 Connexion à la bdd :: gestion des erreurs Lors du processus de connexion, il peut toujours se produire une erreur (la base n'existe pas, le mot de passe est erroné,…) La librairie MYSQL fournit deux fonctions de gestion d’erreur : mysql_errno() retourne le texte associé à l'erreur générée, s'il y a, de la dernière requête du SGBD MySQL et mysql_error() retourne le numéro d'erreur de la dernière commande MySQL mysql_connect ("localhost", "geii", "open"); or die("Impossible de se connecter : " . mysql_error()); mysql_select_db("bd_test"); if (mysql_errno()) { die "<br>".mysql_errno().": ".mysql_error()."<br>"; } … … mysql_close(); if (mysql_errno()) { die "<br>".mysql_errno().": ".mysql_error()."<br>"; } 81 Exécution des requêtes La fonction mysql_query() lance l'exécution d'une requête sur le SERVEUR mysql_query(requête, connexion) – – – – envoie une requête SQL à la BD de la connexion retourne une ressource de résultat MySQL si succès, sinon false et envoie un message d'erreur le paramètre "requête" est une chaîne comprenant une requête SQL qui ne doit pas être terminée par un point-virgule ! Attention !! le paramètre "connexion" est une ressource de connexion ouverte à un serveur MySQL (s'il n'est pas spécifié, la dernière connexion est prise en compte). Remarque : mysql_query peut contenir des requêtes d'interrogation, mais aussi d'insertion, de mise à jour, de suppression de données ! Pour la suite, nous allons créer une table ARTICLE ayant la structure suivante : Colonne contenu Id Identifiant de l'article Libelle Le nom de l'article Prix Le prix en euros 82 CREATE,INSERT,UPDATE Voici le script qui permet de créer la table en PHP (sans traitement d'erreur) : le script qui permet d'ajouter des enregistrements dans la table : mysql_connect ("localhost", "root", ""); mysql_select_db("bd_test"); $sql ="CREATE TABLE article ( "; $sql.="id INT NOT NULL AUTO_INCREMENT , "; $sql.="libelle VARCHAR( 30 ) NOT NULL , "; $sql.="prix FLOAT NOT NULL,"; $sql.="PRIMARY KEY (id));"; mysql_query($sql); $sql ="INSERT INTO article (id,libelle,prix) VALUES $resultat=mysql_query($sql); echo "clé primaire utilisée : ".mysql_insert_id(); $sql ="INSERT INTO article (id,libelle,prix) VALUES $resultat=mysql_query($sql); $sql ="INSERT INTO article (id,libelle,prix) VALUES $resultat=mysql_query($sql); $sql ="INSERT INTO article (id,libelle,prix) VALUES $resultat=mysql_query($sql); $sql ="INSERT INTO article (id,libelle,prix) VALUES $resultat=mysql_query($sql); ('', 'Abricots', '2')"; ('', 'Cerises', '1.2')"; ('', 'Pommes', '1')"; ('', 'Fraises', '3')"; ('', 'Pêches', '2.75')"; La fonction mysql_insert_id() permet de retourner la valeur de la clé primaire attribuée automatiquement par MySQL. le script qui permet de modifier le prix des fraises $sql ="UPDATE article SET prix=3.15 WHERE libelle='Fraises'"; $resultat=mysql_query($sql); echo "Nombre de lignes affectées: ".mysql_affected_rows(); La fonction mysql_affected_rows() retourne le nombre d'enregistrements affectés par la dernière requête 83 Traiter les requêtes SELECT La requête SELECT retourne les enregistrements d'une table. Ces enregistrements sont contenus dans une structure appelée Resultset. PHP dispose d'une fonction toute prête, mysql_fetch_array, qui va créer un array à partir du Resultset. mysql_fetch_array(liste_résultat_requête) – – – parcourt les enregistrements du Resultset retourne un tableau associatif : les valeurs d'index du tableau sont les noms des colonnes retourne False s'il ne reste plus de ligne. $sql ="SELECT * FROM article"; $resultat= mysql_query ($sql); $total_produit= mysql_num_rows ($resultat); echo "<b>$total_produit</b> produits dans la table ARTICLE<br>"; echo "<ul>\n"; while ($enr= mysql_fetch_array ($resultat)) { echo "<li>Prix des ".$enr['libelle']." : ".$enr['prix']."</li>\n"; } echo "</ul>\n"; 84 Quelques utilitaires …. Pour obtenir le nombre de colonnes mysql_num_fields $sql ="SELECT * FROM article"; $resultat= mysql_query($sql); $nombre_col=mysql_num_fields($resultat); Pour obtenir le nom d'une colonne mysql_field_name $nom_col2=mysql_field_name($resultat,1); Pour obtenir le type d'une colonne mysql_field_type $type_col1=mysql_field_type($resultat,0); 85 Le langage php Exercices 86 exo1.php Modifier le code de la page TD1_exo_1.html pour que le formulaire ressemble à la figure suivante. Ce formulaire doit envoyer les données à la page TD2.exo2.php. exo2.php Ecrire le code de la page TD2.exo2.php qui affiche les données reçues de TD2_exo1.php sous la forme suivante. Le nom des lignes doit correspondre aux propriétés « name » des balises input de la page TD2_exo1.php. 87 exo3.php Modifier le code de la page ci-dessus de façon à faire apparaître « utilisateur » ou « administrateur » à la place de « 0 » ou « 1 » en face de profil. exo4.php On considère une base de données « td » qui comporte une seule table nommée td. Cette base de données se trouve sur un serveur MySql dont les caractéristiques sont les suivantes: • nom: localhost • utilisateur: root • mot de passe: « » La table td est composée des champs et données suivants: Modifier la page TD2_exo1.php en TD2_exo4.php de telle sorte que: Si la personne qui se connecte existe dans la base de données, elle est réorienté vers la page TD2_exo3.php, Sinon, elle est réorientée vers TD2_exo4.php, en effaçant les données du formulaire et en affichant un message d'erreur : « Données incorrectes, veuillez recommencer! ». 88