PHP - Index of
Transcription
PHP - Index of
SysCom SysCom CGI PHP PHP Contenu Miguel Tomasena SysCom Quelques références : •http://fr.php.net/tut.php3 •http://php.developpez.com/sources/ •http://www.wampserver.com/ •http://www.toutestfacile.com •http://www.w3schools.com/ 1 Introduction PHP CGI Programme côté "serveur" Insertion du code Variables Types Tableaux Chaînes Portée des variables Variables des formulaires Exemple factoriel Instructions Quelques fonctions Exemples : compteur liste nom-adresse en-têtes et cookies sessions bases de données 2 SysCom SysCom Introduction à PHP - CGI Programme côté "serveur" •Dans le langage que vous souhaitez : • CGI « Common Gateway Interface ». Est une spécification qui permet au client d ’envoyer des donnés et au serveur de retourner des données vers le client. • Perl : adapté à la manipulation de chaînes de caractères • C, Pascal, Java • PHP : adapté pour produire de pages HTML • Le programme doit : •obtenir les informations envoyés par la requête name1=value1&name2=value2&name3=value3… •faire un traitement et construire la page de réponse 3 4 SysCom SysCom Introduction PHP Introduction PHP Origines de PHP • PHP est un langage fortement associé à HTML. • 1995 Rasmus Lerdorf. Première version de Personal Home Page. • Il s'exécute sur le serveur. • Interprétation des formulaires (FI, Form Interpreter) : version 2 (1995). Nb sites : 15000 fin 1996, puis 50000 en milieu d'année 1997. • Sa syntaxe est proche de celle de C, Java, JavaScript, ou Perl. • Le but du langage est de faciliter la génération dynamique de pages. • 1998 : PHP 3. • Une des applications courantes de PHP est l ’interface vers de Bases de Données. • 1999 : PHP 4. • 2009 : PHP 5.3 5 6 SysCom SysCom Introduction PHP Introduction PHP L'interprétation du code par le serveur • • L'interprétation du code par le serveur Un script ou programme PHP est un fichier texte contenant des instructions incluses dans un code HTML. Extension ".php" permet d'identifier le type au serveur. mon_fichier.php ...... 7 Code html tel quel ...... Lorsqu'un navigateur (le client) désire accéder à une page dynamique réalisé en php : 1. le serveur reconnaît qu'il s'agit d'un fichier php 2. l'interpréteur php analyse les lignes du fichier : • le code html est envoyé au serveur inchangé • code php est exécuté, les sorties éventuelles sont envoyés au serveur 3. à la fin du script, le serveur transmet le résultat au client. PHP est interprété par le serveur, les utilisateurs ne peuvent pas voir le source! vers le client document produit ...... ...... .CODE . . . . . PHP ...... exécution de php .. .. .. .. .. .. .. .. .. .. .. .. ...... print ou echo .. .. .. .. .. .. ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... 8 SysCom SysCom Introduction PHP Introduction PHP Remarques sur Wamp • Première page PHP. Insertion du PHP (fichier .php) : Environnement de travail PHP et bases de données. Serveur local Apache et base de données MySQL. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Premier exemple PHP</title> <body> <h1> <?php print("Salut <em>tous</em>"); ?> </h1> </body> </html> Utile pour la mise au point de vos pages. Exécution d'un programme à travers Wamp : 1. Lancer Wamp . Une icone se place dans la barre des tâches à coté de l'horloge. Vérifier que le serveur Wamp est démarré. 2. Pour que vos pages PHP soient interprétées, il est impératif de placer vos fichiers dans le répertoire www ou bien dans un dossier pointé par un alias. 9 interpréteur php 3. L'URL du WebLocal est : "http://127.0.0.1/" ou "http://localhost/" Exemple 1 Hello 10 SysCom SysCom Variables •Variables : <body> <p> Ecriture d ’une variable : <?php $nom $ma_variable = "Salut tous"; print ($ma_variable); Attention : majuscules ?> et minuscules </p> </body> • Si on affiche la source chargée par notre navigateur on obtient : ... <body> Exemple 2 Salut <p> Salut tous </p> 11 </body> Types • Quatre types scalaires : integer double string bool Deux types structurés : array object Le type est déterminé lors de l'exécution (pas besoin de déclaration). Constantes : Exemple 3 Source ppt Exemple 3 types define("Nom_de_la_constante", Valeur); Le nom d'une constante ne doit pas commencer par $ Exemple : <?php define("CONSTANTE", "Salut tous"); print (CONSTANTE); // produit "Salut tous" ?> 12 SysCom SysCom Tableaux Tableaux • Différents types dans un même tableau : $tab[] = 12; // Les indices de tableau commencent à zéro $tab[] = "hello"; // tous les types peuvent être contenus •Remarques : •Les indices de tableau commencent à zéro •Tous les types de variables peuvent être contenus dans un tableau • Deux dimensions : $tab[0][0] = 12; $tab[0][1] = "hello"; $tab[1][0] = 1245.652; $tab[1][1] = "Au revoir"; • Initialisation • par simple affectation • en tenant compte de la séquence pour les tableaux. Exemple Très utilisés !! • Tableaux associatifs : $Toto["Age"] = 12; $Toto["Adresse"] = "22 rue des bois fleuris"; $noms[ ] = "Jacques"; // $noms[0] = "Jacques" $noms[ ] = "Pascal"; // $noms[1] = "Pascal" Exemple tableaux Associatif 13 14 SysCom SysCom Tableaux Tableaux • Remplir un tableau <?php $a1 = array("un","deux","trois","nous irons au bois"); $a2 = array(1 => "un","deux","trois","nous irons au bois"); // pour commencer à 1 ?> Fonctions pour trier le contenu d ’un tableau : • arsort -- Sort an array in reverse order and maintain index association • asort -- Sort an array and maintain index association • krsort -- Sort an array by key in reverse order • ksort -- Sort an array by key • rsort -- Sort an array in reverse order • sort -- Sort an array • uasort -- Sort an array with a user-defined comparison function and maintain index association • uksort -- Sort an array by keys using a user-defined comparison function • usort -- Sort an array by values using a user-defined comparison function Exemple ppt • Quelques fonctions pour gérer des tableaux : • count($tab) ou sizeof($tab) retourne le nombre d ’éléments. • next($tab), prev($tab) avance ou recule le pointeur interne et retourne l'élément. Chaque variable tableau possède un pointeur interne repérant l'élément courant. • each($tab) pour « parcourir » un tableau • reset($tab) place le pointeur interne sur le premier élément. • end($tab) place le pointeur interne sur le dernier élément. 15 Exemple 4 tableaux 16 SysCom SysCom Chaînes Chaînes • suite exemples avec des chaînes • Exemples des chaînes /* avec apostrophe : '<p>Numero : $num</p>' */ $str = '<p>Salut tous</p>'; <?php /* Affectation avec guillemets */ $str = "Voici une chaîne"; $s = "Voici un apostrophe ' à l'intérieur de double guillemets"; $s = 'Et voici guillemets " à l\'intérieur '; /* Concatenation */ $str = $str . " avec qq chose"; print ("c:\windows\system.ini"); // produit c:windowssystem.ini print ("c:\\windows\\system.ini"); // produit c:\windows\system.ini /* escaped newline. */ $str = $str . " et une nouvelle ligne\n"; $str = 'Test.'; // premier caractère de la chaîne $first = $str[0]; /* "<p>Numero : 9</p>" */ $num = 9; $str = "<p>Numero : $num</p>"; 17 Exemple 5 tri 18 // dernier $last = $str[strlen($str)-1]; ?> SysCom SysCom Chaînes Portée des variables • Portée des Variables : déterminée par le contexte. Exemple : $a = 1; /* globale */ function test () { print ($a); /* référence à une variable locale */ } Les variables globales test (); ne sont pas accessibles • Le traitement des guillemets doubles est différent de celui des apostrophes (guillemets simples) : Les doubles guillemets sont interprétés. !!! Exemples : $foo = 2; print ("foo est $foo"); print ('foo est $foo'); print ("foo est $foo\n"); print ('foo est $foo\n'); // écrits : foo est 2 // écrits : foo est $foo // écrits : foo est 2 (avec retour à la ligne) // écrits : foo est $foo\n print ("value = $a[$i][$j]"); print ('value = ' . $a[$i][$j]); // attention ca ne fonctionne pas !! // il faut utiliser la concaténation 19 20 SysCom • Avec la déclaration global : $a = 1; $b = 2; function sum () { global $a, $b; $b = $a + $b; } sum (); print ($b); La sortie produit : 3 SysCom Portée des variables • Variables « statiques » function test () { static $a = 0; /* lors du premier appel $a prend 0 */ print ($a); Chaque fois que test() est $a++; appelée on écrit la valeur } de $a et on l’incrément. test(); // écrits 0 test(); // écrits 1 Variables des formulaires Exemple • Variable dont sa valeur est le nom d ’une variable $a = "hello"; /* hello peut être utilisé comme variable */ $$a = "world"; print ("$a $hello"); /* équivalent à : print("$a ${$a}"); */ La sortie produit : hello world 21 SysCom • Source HTML 22 <form action="exemple_6formulaire.php" method="post"> <p>Exemple : Que pensez vous de ce site ? <br /> Votre nom : <br /> <input type="text" name="nom" size="40" /> <br /> Commentaire : <br /> <textarea name="texte" cols="40" rows="3"> </textarea> <br /> <input type="submit" value="Envoyer" /> </p> </form> SysCom Variables des formulaires Récupérer les variables transmises Deux tableaux sont utilisés pour récupérer les données d'un formulaire : $_POST['donnée'] donnée :- Nomdans du champ Nom du champ dans le formulaire le formulaire S'utilise lorsque l'attribut $_GET['donnée'] 23 par défaut dans les fonctions. La sortie ne produit aucun résultat dans l’exemple method du formulaire est post. S'emploie lorsque l'attribut method du formulaire est get ou bien lorsque celui-ci n'est pas spécifié. Variables des formulaires Suite de l'exemple Le code du fichier "exemple_6formulaire.php" est : <body> method="post" name="nom" <h1> Réponse formulaire</h1> <p> <?php $nom = $_POST['nom']; $texte = $_POST['texte']; print ("Merci $nom <br /><br />"); print ("Votre commentaire : <em>$texte</em>"); ?> </p> </body> Exemple 6 formulaire 24</html> SysCom SysCom Variables des formulaires Variables des formulaires Les boutons radio. Code de "exemple_7formulaire.php" : Les cases à cocher. Code de "exemple_8formulaire.php" : <form action="exemple_7formulaire.php" method="post"> <p> Quel est votre niveau en programmation ? <input type="radio" name="niveau" value="débutant" /> débutant <br /> <input type="radio" name="niveau" value="moyen" checked="checked" /> moyen <br /> <input type="radio" name="niveau" value="expert" />expert <br /> <input type="submit" value="Valider" /></p> </form> tester l'existence <?php if (isset($_POST['niveau'])) { d'un élément $niveau = $_POST['niveau']; print ("Etes vous sûr(e) d'avoir le niveau $niveau ?"); } Exemple 7 formulaire 25 ?> <form action="exemple_8formulaire.php" method="post"> Indiquez toutes vos couleurs préférées<br /> <table><tr> <td bgcolor="red" width="50"> </td> <td> <input type="checkbox" name="choix[]" value="rouge" /> Rouge </td> </tr> <tr> <td bgcolor="blue" width="50"> </td> <td><input type="checkbox" name="choix[]" value="bleu" /> Bleu</td></tr> <tr> <td bgcolor="green" width="50"> </td> <td> <input type="checkbox" name="choix[]" value="vert" /> Vert </td></tr> </table> <input type="submit" value="Valider" /> </form> 26 SysCom SysCom Variables des formulaires (Suite) Les cases à cocher. Exemple factoriel L'exemple a seulement un intérêt pédagogique <?php if (isset($_POST["choix"])) { $choix=$_POST["choix"]; echo "<h1>Vos couleurs préférées sont </h1>"; for ($i=0 ; $i< count($choix) ; $i++) if (isset($choix[$i]) ) print("$choix[$i] - "); } else { print ("<h1>vous n'avez pas de préférence</h1>"); } ?> Exemple fact Exemple 8 formulaire 27 28 SysCom SysCom Exemple factoriel fact.html : Exemple factoriel fact.php : <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>factoriel</title> </head> <body > <h1>Calcul du factoriel d'un nombre</h1> <form action="fact.php" method="post"> <p> Valeur de n : <br /> <input type="text" name="n" size="4" /> <br /> <input type="submit" value="Envoyer" /> </p> </form> </body> </html> 29 30 Définition d'une fonction <!DOCTYPE html> <html><head><meta charset="utf-8" /> <title> Calcul du factoriel </title> <?php function fact($n) { $f = 1; for ($i=1; $i<=$n; $i++) { $f = $f * $i; } return $f; } ?> </head> <body> <h4> Voici le résultat </h4> <p> <?php $n = $_POST['n']; print("Le factoriel de $n est : " . fact($n) ); ?> </p> </body> </html> SysCom SysCom Instructions Instructions • Expressions et affectation : • Expressions de comparaison : > , >= , ==, != , <, <= • Opérateurs logiques : &&, ||, ! function double($i) { // definition d'une fonction return $i*2; } $b = $a = 5; $c = $a++; /* post-increment */ $e = $d = ++$b; /* pre-increment */ trace trace de de ces ces affectation affectation :: =5 $a $a =6 =6 $b = = 6565 $b $c = = 55 $c $d $d = = 76 $e $e = = 76 $f = 12 $g = 24 14 $h = 24 $f = double($d++); $g = double(++$e); $h = $g += 10; 31 32 SysCom • Conditionnel if ($a > $b) { /* instruction composée */ print ("a est plus grand que b"); $b = $a; } /* autre exemple avec else */ if ($a > $b) { print ("a est plus grand que b"); } else { print ("b est plus grand que a"); } SysCom Instructions Instructions • Syntaxe alternative pour le conditionnel: if(): . . . Exemple: endif; • Exemples de while : /* exemple 1 */ $i = 1; while ($i <= 10) { print ($i++); } HTML ou PHP <?php if ($a==5): ?> A=5 <?php endif; ?> Le texte "A = 5" sera inséré dans le document HTML (si la condition est satisfaite) PHP /* exemple 2 (identique) */ • while Syntaxes : • while(expr) {instructions ..} • while(expr): instructions ... endwhile; 33 $i = 1; while ($i <= 10): print ($i++); endwhile; 34 SysCom SysCom Instructions Instructions • do .. while : /* On exécute la boucle au moins une seule fois */ $i = 0; do { print ($i); } while ($i>0); 35 /* utilisation de break do { if ($i < 5) { print "i trop petit"; break; } print ("i est ok"); …traitement i... } while(true); • for : for ($i = 1; $i <= 10; $i++) { print ($i); } • continue permet de revenir à la boucle. Exemple On quitte la boucle quand $i < 5 36 while ($i !=0) { if (($i % 2) != 0) { // ignorer les impairs continue; } traitement_pair ($i); $i = suivant($i); } SysCom SysCom Instructions Gestion des fichiers • Déclaration d'une fonction function fun ($arg_1, $arg_2, ..., $arg_n) { print ("Exemple de fonction.\n"); return $retval; } • Remarques : • Une fonction peut contenir d ’autres fonctions. • Une fonction peut être récursive • Return function factoriel($n) { // fonction récursive if ($n == 0) { return 1; } else { return $n * factoriel($n-1); } } 37 Fonctions spécialisées dans la création et l'accès aux fichiers de données : • Ouverture $f=fopen($nomFichier, $mode) $mode est une chaîne qui fixe la façon d'utiliser le fichier. La fonction renvoie un identificateur $f de type entier qui vaut 0 (ie FALSE) en cas d'échec de l'accès. Valeurs de $mode : •"r" Ouverture en lecture seule, accès au début du fichier •"w" Ouverture en écriture seule; son contenu est perdu. •"a" Ouverture en ajout; si le fichier existe, le contenu est conservé. •"w+", "r+", "a+" possibilité de lecture et écriture. 38 SysCom SysCom Gestion des fichiers Remarque : il est possible d'ouvrir un fichier WEB ($nomFichier="http://www.univ-savoie.fr"), en lecture seule. Gestion des fichiers • Lecture Voici quelques fonctions de lecture : Exemples : if (! $f = fopen("essai.txt", "r") ) echo ("ouverture du fichier impossible"); $f = fopen("/home/jean/essai.txt", "a"); $f = fopen("http://www.php.net/", "r"); •fread($f, $lon) : lit une chaîne de caractère de longueur $lon. •fgets($f, $lon) : lit une chaîne de caractère de longueur $lon, mais s'arrête à la lecture d'un caractère de fin de ligne. •file($nom) : retourne le fichier dans un tableau. • Fermeture fclose($f) $f étant l'identifiant du fichier. Exemple : $f = fopen("/home/jean/essai.txt", "r"); $texte = fread($f,40); fclose($f); •fpassthru($f) : pour une lecture complète du fichier •fgetss($f, $lon) : fonctionnement identique, mais les balises HTML et PHP sont filtrées. Exemple 9 fichier 39 40 SysCom SysCom Gestion des fichiers • Exemple de lecture ligne par ligne : Gestion des fichiers • Résultat : <h2> Voici le contenu de 'http://localhost/ppt/fact.html' </h2> <p> <?php // Lire une page web dans un tableau, et l'afficher $t = file( 'http://localhost/ppt/fact.html' ); while ( list( $num_ligne, $ligne ) = each( $t ) ) { print("Ligne $num_ligne: ".htmlspecialchars($ligne) . "<br />\n"); } ?> </p> 41 Les Balises HTML ne sont pas interprétés Exemple 10 lecture 42 SysCom SysCom Gestion des fichiers • Ecriture On peut utiliser 2 syntaxes identiques fwrite ou fputs fwrite($f, $chaine [, $lon] ); écrit la chaîne dans le fichier identifié par $f sur une longueur $lon caractères. <?php /* exemple : ajouter une chaine */ $msg = "hello tous"; if ( $f = fopen("exemple10.txt", "a") ) { fputs( $f, "$msg\n"); } fclose($f); // il faut penser à fermer le fichier ?> Quelques fonctions • Système de fichiers chgrp chmod chown delete fclose feof fgetc fgets file file_exists fopen change le groupe propriétaire du fichier change le mode du fichier change le possesseur du fichier efface un fichier ferme un fichier test pour savoir si le pointeur est à la fin du fichier renvoie le carac sur lequel se trouve le pointeur du fichier renvoie la ligne sur laquelle se trouve le pointeur lit le fichier et renvoie le résultat dans un tableau vérifie si un fichier existe ouverture d'un fichier ou d'une URL Exemple 11 Ecriture 43 44 SysCom SysCom Quelques fonctions Quelques fonctions • Système de fichiers • Fonctions de dates et heures fputs fread fseek fwrite is_file rmdir stat checkdate date getdate gettimeofday time écrit dans le fichier vers lequel le pointeur est dirigé lecture du fichier en mode binaire. modifie le pointeur de fichier écriture du fichier, identique à fputs vérifie si un fichier existe efface un dossier renvoie les informations à propos d'un fichier • Mathématiques abs asin ceil cos exp floor 46 45 SysCom valeur absolue arc sinus arrondi à l'entier supérieur cosinus e à la puissance de (exponentielle de) arrondi à l'entier inférieur SysCom Quelques fonctions • Mathématiques log pi pow rand round sqrt logarithme naturel retourne la valeur de pi calcul de puissance génère une valeur aléatoire arrondi racine carrée • Chaînes de caractères. chr echo explode flush 47 Valide une date/heure Formate une date/heure locale Retourne la date/heure Retourne l'heure actuelle Retourne le timestamp UNIX actuel Retourne un caractère Affiche une ou plusieurs chaînes Scinde une chaîne en morceau, grâce à un délimiteur Vide les buffers de sorties Quelques fonctions implode Regroupe tous les éléments d’un tableau dans une chaîne, avec une chaîne de jointure . ord Retourne la valeur ASCII du caractère print Affiche une chaîne printf Affiche une chaîne formatée similar_text Calcule la similarité de deux chaînes strchr Recherche la première occurrence d’un caractère strip_tags Enlève les balises HTML et PHP strlen Retourne la longueur de la chaîne strpos Recherche la première occurrence d’une chaîne dans une chaîne strrev Inverse une chaîne strstr Recherche la première occurrence d’une chaîne dans une chaîne. 48 SysCom SysCom Exemple compteur Exemple compteur 49 50 SysCom Fichier : <!DOCTYPE html> <html> exemple_12compteur.php <head> <meta charset="utf-8" /><title> php</title></head> <body > <h1> Bienvenue à la page personnelle de Tintin </h1> Vérification de <hr width="95%" align="center" /> <?php l’existence d ’un $fichier = "no_visites.txt" ; fichier if (is_file($fichier)) // existe ? { On ouvre en $fp = fopen("$fichier", "r"); $numero = (int) fgets($fp,20); lecture $numero++; fclose($fp); } else $numero = 1; echo("<br /> <h2>vous êtes le visiteur No $numero </h2>"); $fp = fopen("$fichier", "w"); On ouvre en fwrite($fp,$numero); écriture fclose($fp); Exemple 12 compteur ?> </body> </html> SysCom Exemple liste nom-adresse •Formulaire de saisie : Exemple liste nom-adresse • Fichier HTML du formulaire : ... Exemple 13 CarnetAdresses 51 52 SysCom SysCom Exemple liste nom-adresse • Fichier php rajout_liste.php : Exemple liste nom-adresse • Formulaire consultation : <!DOCTYPE html> Nom du fichier <html> <head> <meta charset="utf-8" /><title> rajout php </title> ouverture d'un fichier ou d'une URL. </head> int fopen(string filename, string mode); <body> Bienvenue à la construction <br /> <?php Concaténation de chaînes $fichier = "liste_couples.txt" ; $fp = fopen("$fichier", "a"); $item = $_POST['nom'] . " " . $_POST['adresse'] . "\n"; fwrite($fp,$item); print("<br /> c'est fait pour : $item"); fclose($fp); ?> int fwrite(int fp, string string); </body> fwrite() écrit le contenu de la chaîne </html> string dans le fichier pointé par fp. 53 <h1>Manipulation d'une liste de couples <br />Nom - Adresse mail</h1> <h2>Choisisez le formulaire de l'action à réaliser :<br /> Nom du rajout / suppression / consultation <br /> </h2> fichier php <hr /> <h1> Rajout </h1> <br /> <form method="POST" action="rajout_liste.php" > <p> Nom de la personne : <input type="text" name="nom" size="40" maxlength="80" /> <br /> Les noms des champs Adresse mail : sont: nom et adresse <input type="text" name="adresse" size="40" maxlength="80" /> <input type="submit" value="oui" /> <input type="reset" value="annuler" /> </p> </form> <hr /> ... Ferme le fichier fp Exemple 13 CarnetAdresses 54 SysCom SysCom Exemple liste nom-adresse Exemple liste nom-adresse • Fichier de consultation « lecture_liste.php » : • Formulaire de la consultation : ... <html> <head><title>php</title> </head> lit le fichier et renvoie <body> le résultat dans un tableau Bienvenue à la consultation <br /> <?php $fichier = "liste_couples.txt" ; Nb d ’éléments $tab = file($fichier); d ’un tableau $nom = $_POST['nom']; $i = 0; $trouve = FALSE; while ($i < count($tab) && !$trouve) // on cherche l'element $nom if (strstr($tab[$i], $nom)) $trouve=TRUE; Vérifie si le else $i++; nom se trouve if ($trouve) print ("<br /> voici : $tab[$i] "); dans $tab[$i] else print ("<br /> $nom n'est pas dans la liste"); ?> </body> </html> Nom du <h1> fichier php Consultation </h1> <br /> <form method="POST" action="lecture_liste.php" > <p> Nom de la personne : <input type="text" name="nom" size="40" maxlength="80" /> Le nom du <br /> <input type="submit" value="oui" /> champs : nom <input type="Reset" value="annuler" /> </p> </form> ... 55 56 SysCom SysCom Exemple liste nom-adresse Exemple liste nom-adresse • Suppression d ’un nom de la liste : • Formulaire HTLM de suppression : ... <h1> Suppression </h1> <form method="POST" action="suppression_liste.php" > <p> Nom de la personne : <input type="text" name="nom" size="40" maxlength="80" value="Tintin" /> <br /> <input type="submit" value="oui" /> <input type="Reset" value="annuler" /> </p> </form> Exemple 13 CarnetAdresses 57 58 SysCom SysCom Exemple liste nom-adresse • Fichier « suppression_liste.php » : ... Exemple liste nom-adresse ... if ($trouve) { /* 'w' Ouvre en écriture seule; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.*/ $fp = fopen($fichier, "w"); for ($j=0; $j<$i; $j++) { fwrite($fp,$tab[$j] ); } for ($j=$i+1; $j < count($tab); $j++) { fwrite($fp,$tab[$j] ); } fclose($fp); print ("<br /> <h1>$nom est supprimé</h1>"); } else print ("<br /> <h1>$nom n'est pas dans la liste</h1>"); } Retourne true si filename existe et est un fichier Bienvenue à la suppression <br /> <?php $nom = $_POST['nom']; $fichier = "liste_couples.txt" ; if (is_file($fichier)) // liste_couples existe ? { $tab = file($fichier); $i = 0; $trouve = FALSE; while ($i < count($tab) && !$trouve) // on cherche l'element $nom if (strstr($tab[$i], $nom)) $trouve=TRUE; else $i++; if ($trouve) { .... 59 else 60 print ("<br /> <h1>fichier noms-adresses inexistant</h1>"); ?> </body> SysCom SysCom Exemple "demande inscription" Variables d'environnement • Exercice manipulation de fichier • Informations sur son environnement : •Le serveur « demande de dossiers d’inscriptions » •Le client Exemple 14 Inscription • Accessible depuis le tableau $_SERVER[] Exemple 14 Consultation et Suppression Inscription •Elles permettent notamment d'avoir des informations sur le type de serveur, son administrateur, la date à laquelle le script a été appelé, l'adresse IP et le type de navigateur du client,... 61 62 SysCom SysCom Variable d'environnement Variable d'environnement • Elles sont pour la plupart accessible depuis le tableau $_SERVER[] (depuis PHP 4.1). • Affichage des variables d'environnement : phpinfo() affiche un tableau récapitulatif de l'environnement. Exemple 15 Environnement Proposées par Apache (serveur) $_SERVER["DOCUMENT_ROOT"] L'espace où sont stockées les pages webs $_SERVER["PHP_SELF"] Le chemin du script par rapport à DOCUMENT_ROOT <? echo "Votre adresse IP est : "; echo $_SERVER["REMOTE_ADDR"]; echo "<br />Votre navigateur est : "; echo $_SERVER["HTTP_USER_AGENT"]; ?> Déterminées par le navigateur (client) $_SERVER["REMOTE_ADDR"] L'IP du visiteur $_SERVER["HTTP_USER_AGENT"] L'identifiant du navigateur $_SERVER["HTTP_REFERER"] L'url du site d'où vient le visiteur de la page (pas toujours renseigné ou exact) Les langues préférées du visiteur $_SERVER["HTTP_ACCEPT_LANGUAGE"] 63 Résultat 64 SysCom SysCom Classes Php intègre un soupçon de caractéristiques des Langages Orientés Objet Classes Instanciation de la classe : $Nom_de_l_objet = new Nom_de_la_classe; •Une classe est composée de deux parties: •Les attributs •Les méthodes Accéder aux propriétés d'un objet : $objet -> propriete = Valeur; •Déclaration d'une classe : 65 class Nom_de_la_classe { // Déclarations des données membres var $Donnee_Membre_1; var $Donnee_Membre_2; var $... // Déclarations des méthodes function Nom_de_la_fonction(parametres) { instructions; } } Accéder aux méthodes d'un objet : $objet -> methode(parametre1,parametre2,...); 66 SysCom SysCom Classes Dates "$this" fait référence à l'objet courant. Exemple : La fonction time() retourne le nombre de secondes écoulées depuis le 1er Janvier 1970. class Personne{ var $age; var $sexe; var $adresse; <?php echo "Il s'est écoulé ". time() . " secondes depuis le 1er Janvier 1970"; ?> function definePersonneAge($age){ $this->age = $age; } La fonction mktime() converti une date quelconque en nombre de secondes depuis le 1er Janvier 1970. Ordre des paramètres : heure, minute, seconde, mois, jour et année. } $toto = new Personne; $toto -> definePersonneAge(10); echo "L'age de TOTO : " . $toto -> age; 67 68 SysCom <?php echo "Noël 2000 c'était il y a ". (time()-mktime(0,0,0,12,25,2000)) . " secondes "; ?> SysCom Dates Dates Pour contrôler la validité d'une date vous pouvez avoir recours à la fonction checkdate(). <?php $mois = 12; $jour = 35; $annee = 2001; if (checkdate($mois, $jour, $annee)) { echo "La date $jour/$mois/$annee existe bien"; } else { echo "La date $jour/$mois/$annee n'est pas valide"; } ?> strftime() converti une date en chaîne. <?php echo "Affichage au format jour/mois/annee heure:minute:seconde " . strftime("%d / %m / %y %H : %M : %S") . "<br />" ; ?> Par défaut la fonction strftime() formate la date et heure courante mais on peut spécifier un second paramètre pour afficher une autre date. <?php echo "Dans 15 jours nous serons le " . strftime("%d/%m/%y",time()+15*24*3600) . "<br />"; ?> 69 70 SysCom SysCom A condition que la bibliothèque appelée GD soit installée Images Il est possible de créer des images dynamiquement. Exemple fichier exemple_17image.php : Images Le fichier exemple_17image.html : Hello, voici un carré rouge : <br /> <br /> <img src="exemple_17image.php" /> Content-type: indique au navigateur que ce qui suit est une image au format PNG (Portable Network Graphic) <?php header("Content-type: image/png"); // Ce qui suit est le code d'une image PNG $largeur = 200; // L'image fait 200x100 $hauteur = 100; $img = imageCreate($largeur, $hauteur); Exemple 16Date produit : création du "contexte" // couleur de fond : rouge $rouge = imageColorAllocate($img, 255, 0, 0); imagePNG($img); 71 // Envoie l'image imageDestroy($img); // Libere les ressources ?> Exemple 17Image 72 SysCom SysCom Images : Exemple Histogramme Texte dans l'image (fichier exemple_17image.php) : <?php header("Content-type: image/png"); $largeur = 250; $hauteur = 200; $img = imageCreate($largeur, $hauteur); $rouge = imageColorAllocate($img, 200, 0, 0); $noir = imageColorAllocate($img, 0, 0, 0); Par défaut, la première couleur est la couleur de fond $titre = "Histogramme"; $titre_police = 5; // type police par défaut Images : Exemple "histogramme" Pour dessiner des rectangles (pleins), il suffit de faire appel à la fonction imageFilledRectangle : <?php // On pourra supposer que les données sont lues // dans une base de données mais dans l'immédiat // a titre d'exemple elles sont simplement codées "en dur" $valeurs = array(12,23,9,58,23,26,57,48,12); header("Content-type: image/png"); Produit imageString($img, $titre_police, ($largeur-imageFontWidth($titre_police)*strlen("$titre"))/2, 0, $titre, $noir); $largeur = 250; $hauteur = 200; $img = imageCreate($largeur, $hauteur); $rouge = imageColorAllocate($img, 200, 100, 100); //c. de fond $noir = imageColorAllocate($img, 0, 0, 0); $fond = imageColorAllocate($img, 240, 240, 240); $barreCouleur = imageColorAllocate($img, 0, 255, 0); imagePNG($img); imageDestroy($img); ?> 73 74 SysCom SysCom Images : Exemple "histogramme" abscisse et ordonnée du coté gauche supérieur Suite : Images : Exemple "histogramme" Suite : $titre = "Histogramme"; abscisse et ordonnée du $titrePolice = 5; coté droit inférieur imageString($img, $titrePolice, ($largeur-ImageFontWidth($titrePolice)*strlen($titre))/2, 0, $titre, $noir); // Tracé du fond de l'histogramme imageFilledRectangle($img, 10, 20, $largeur-25, $hauteur-10, $fond); 75 produit imageFilledRectangle($img, $x, $hauteur-15-$barreHauteur, $x+$barreLargeur, $hauteur-15, $barreCouleur); // Connaissant le nombre de barres = sizeOf($valeurs) // et la largeur de l'image (en tenant compte des bords) // il est possible de déterminer la largeur d'une barre $barreLargeur = (int)(($largeur-35)/(1.5*sizeOf($valeurs)+0.5)); // Pour ajuster l'échelle (en hauteur) il faut déterminer la plus grande valeur $max = 0; for ($i=0; $i<sizeOf($valeurs); $i++) { if ($valeurs[$i]>$max) $max = $valeurs[$i]; } Exemple 18 histogramme // Nous avons toutes les informations nécessaire // il est alors possible de tracer toutes les barres for ($i=0; $i<sizeOf($valeurs); $i++) { $x = 10+(int)($barreLargeur*(0.5+$i*1.5)); $barreHauteur = (int)(($valeurs[$i]*($hauteur-40))/$max); } imagePNG($img); imageDestroy($img); ?> 76 SysCom SysCom Les en-têtes et cookies Les en-têtes et cookies Fonction PHP permettant d'envoyer des en-têtes : • En-têtes. Echanges entre : navigateur header(chaîne en-tête HTTP) serveur Remarque : la fonction header() doit être utilisée avant tout envoi de données HTML au navigateur. •Les en-têtes HTTP permettent d'effectuer des actions sur le navigateur comme le transfert de cookies ou bien une redirection vers une autre page. Exemple : rediriger le navigateur • Forme (http) : en-tête: valeur Exemple : envoyer une image créé à la volée <?php header("location: http://www.commentcamarche.net/"); <?php header("Content-Type: image/gif"); // code générant l'image imagegif($image); ?> // envoi de l'image au navigateur Remarque : La syntaxe doit être rigoureusement respectée! 77 78 ?> SysCom SysCom Les en-têtes et cookies • Récupérer les en-têtes de la requête : getallheaders(); Les en-têtes et cookies • Résultat : permets de récupérer dans un tableau l'ensemble des en-têtes HTTP envoyées par le navigateur. Exemple : récupération de tous les en-têtes $headers = getallheaders(); while (list ($header, $value) = each ($headers)) { echo "$header: $value <br />\n"; } Remarque : On se déplace dans le tableau ligne par ligne. Pour chaque ligne, l'indice est affectée à la variable $header, et la valeur à la variable $value. 79 80 SysCom SysCom Les en-têtes et cookies • Cookies : petits fichiers texte chez le client permettant de mémoriser des données individuelles. Les en-têtes et cookies • Envoi des cookies au serveur. L'en-tête se présente alors sous la forme : Cookie : NOM1=VALEUR1; NOM2=VALEUR2; ... •Les requêtes et réponses HTTP contiennent des en-têtes permettant d'envoyer des informations particulières de façon bilatérale. Un de ces en-têtes est réservé à l'écriture de fichiers : les cookies. En PHP, la fonction SetCookie() permet d'envoyer les informations relatives aux cookies dans les en-têtes HTTP. Voici la syntaxe : boolean setCookie(chaîne NomDuCookie, chaîne Valeur, • Envoi des cookies au client. L'en-tête HTTP réservé à l'utilisation des cookies s'appelle Set-Cookie, il s'agit d'une simple ligne de texte de la forme : entier expiration, chaîne chemin, chaîne domaine, Set-Cookie : NOM=VALEUR; domain=NOM_DE_DOMAINE; ... entier securisé); 81 domaine du serveur, celui-ci doit obligatoirement contenir 2 points (par exemple www.commentcamarche.net). 82 SysCom SysCom Les en-têtes et cookies • Exemple. Combien de fois un visiteur est venu sur le site pendant le mois. Envoi du cookie : <?php setCookie("Visites", "1", time()+15*24*60*60 ); ?> // nom du cookie // valeur // date d'expiration en seg Attention : le « setCookie » doit apparaître avant tout autre ligne ou caractère à destination du client !! 83 chemin désigne le répertoire pour lequel votre cookie est valide Les en-têtes et cookies • Récupération du cookie en PHP. La valeur est accessible à travers le tableau associatif : $_COOKIE['Nom_du cookie'] • Dans l'exemple : <?php if (isset($_COOKIE['Visi'])) $Visi = $_COOKIE['Visi'] +1; // on recupere le cookie. else $Visi = 0; // zéro s'il n'existe pas SetCookie( // on place un cookie "Visi", $Visi, time()+ 15 * 24 * 60 * 60); ?> 84 Exemple 19 cookieVisites SysCom SysCom Les en-têtes et cookies Exemples Gestionnaire de cookies Firefox : Exemple 20 cookiePannier • Cookies. Exemple le « Caddie ». Le premier fichier que l'on appelera marche0.php servira à mettre à 0 les cookies. <?php SetCookie("panier[pomme]",0); SetCookie("panier[poire]",0); SetCookie("panier[peche]",0); SetCookie("panier[banane]",0); Header("location: marche1.php"); ?> Exemple Cookie 85 Remarques: On met à 0 tous les éléments du panier. On fait ensuite une redirection vers marche1.php. SetCookie et Header requièrent qu'il n'y ait pas de données émises avant dans le script. 86 SysCom SysCom Exemples Exemples marche1.php Résultat de la redirection vers marche1.php. <?php if (isset($_COOKIE['panier'])) $panier = $_COOKIE["panier"]; // on recupere le cookie. else { // panier vide, première visite $panier["pomme"]=0;SetCookie("panier[pomme]",$panier["pomme"]); $panier["poire"]=0;SetCookie("panier[poire]",$panier["poire"]); $panier["peche"]=0;SetCookie("panier[peche]",$panier["peche"]); $panier["banane"]=0;SetCookie("panier[banane]",$panier["banane"]); } if (isset($_GET["ajout"])) $ajout = $_GET["ajout"]; else $ajout = null; // attention a l'initialisation 87 88 SysCom SysCom Exemples Exemples marche1.php switch ($ajout) { case "pomme": $panier["pomme"]++; SetCookie("panier[pomme]",$panier["pomme"]); break; case "poire" ... ... } ?> <html> <head> <title>Le marché</title> </head> <body> <center> 89 marche1.php <table border="1" style="text-align:center; font-size:120%"> <tr><td>Ajouter</td><td>Votre commande</td></tr> <tr align="center"> <td><a href="marche1.php?ajout=pomme">Une pomme</a> (0.50 euros)</td> <td><?php echo $panier["pomme"]?> pomme(s)</td> </tr> <tr align="center"> <td><a href="marche1.php?ajout=poire">Une poire</a> (0.80 euros)</td> <td><?php echo $panier["poire"]?> poire(s)</td> </tr> ... </table> <a href="marche0.php">vider mon panier</a><br /> <a href="marche2.php">calculer le total</a> </center> </body> </html> 90 SysCom SysCom Exemples • marche2.php calcule et affiche le prix total du panier. 91 <?php $panier = $_COOKIE["panier"]; $total=0; $total+=$panier[pomme]*1; $total+=$panier[poire]*1.5; $total+=$panier[peche]*2; $total+=$panier[banane]*1; ?> <html> <head> <title>Le total du panier</title> </head> <body> <p align="center">Le total de votre panier: <?php echo $total?> F.</p> <p align="center"><a href="marche1.php">Modifier mon panier</a></p> <p align="center"><a href="marche0.php">Vider mon panier</a></p> </body> </html> Chaînes de caractères Quelques fonctions : $chaine = "bonjour, ceci est un test de recherche"; echo strpos($chaine, "t"); // affiche 16 echo strrpos($chaine, "t"); // affiche 24 echo strstr($chaine, "t"); // affiche "t un test de recherche" echo strrchr($chaine, "t"); // affiche "test de recherche" echo substr($chaine, 14, 3); // affiche "est" str_replace remplace toutes les occurrences d'une chaîne par une autre : $chaine = "Le mot remplacé est : le_mot"; $modif = str_replace("le_mot", "test", $chaine); echo $modif; // affiche "Le mot remplacé est : test" Exemple compteur d'un caractère 92 SysCom SysCom Expressions régulières Introduction aux expressions régulières Expressions régulières Expression régulière : "Modèles" permettant de définir de sous chaînes de caractères. Ce sont des modèles ou motifs (patterns) dont on recherche la présence dans les chaînes de caractères. Cette recherche s'effectue pour tester et filtrer des données, et aussi effectuer des remplacements. L'expression régulière en elle-même est une chaîne contenant des caractères spéciaux et des caractères standards Les symboles ^ et $ indiquent le début ou la fin d'une chaîne Les modèles les plus simples à rechercher sont les suites de caractères usuels, jouant leur propre rôle. Il s'agit alors du cas trivial de la recherche de sous-chaînes dans une chaîne. Exemples : "^debut" "fin$" "^chaine$" "abc" L'intérêt des expression régulières réside dans la généralisation de cette recherche. La description du modèle nécessite alors l'apprentissage d'un mini-langage utilisant des méta-caractères. 93 94 SysCom "abc+" "abc*" "abc?" "^abc+" SysCom Expressions régulières Les symboles *, + et ? indiquent, respectivement, "zéro ou plusieurs", "un ou plusieurs", "un ou aucun". Exemples : 95 : chaine qui commence par "debut" : chaine qui se termine par "fin" : chaine qui commence et se termine par "chaine" : chaine contenant la chaine "abc" : "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..) : "ab" suivie de zero ou plusieurs "c" ("ab", "abc" etc..) : "ab" suivie de zero ou un "c" ("ab" ou "abc") : "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..) Expressions régulières Tableau des caractères des expressions régulières Car Utilité [] liste de caractères autorisés () élément composé de l'expression régulière {} exemple p{2,5} correspond à ppp, pppp ou ppppp - entre deux caractères dans une liste représente un intervalle (par exemple [a-d] représente [abcd]) . un caractère unique quelconque * répétition indéterminée de l'élément la précédant 96 SysCom SysCom Expressions régulières Tableau des caractères des expressions régulières Expressions régulières Fonctions de manipulation d'expressions régulières : ereg() et eregi() Car Utilité Booleen ereg(chaine modele,chaine texte[,tableau occurrences]) ? indique la présence éventuelle de l'élément la précédant | ^ $ Renvoie true lorsque la fonction trouve des occurrences du modèle dans le texte. La fonction stocke éventuellement toutes les occurrences dans un tableau passé optionnellement en paramètre. Occurrence de l'élément situé à gauche de cet opérateur ou de celui situé à droite (a|e) •Placé en début d'expression il signifie "chaîne commençant par .. " •Utilisé à l'intérieur d'une liste il signifie "ne contenant pas les caractères suivants... Placé en fin d'expression il signifie "chaîne finissant par .. " 97 Booleen eregi(chaine modele,chaine texte[,tableau occurrences]) Effectue le même travail que ereg(), à la différence près qu'elle n'est pas sensible à la casse (pas de différenciation minuscules/majuscules) 98 SysCom SysCom Expressions régulières Exemple : Expressions régulières Fonctions de manipulation d'expressions régulières : ereg_replace() et eregi_replace() <? $fp = fopen("http://www.liberation.fr/","r"); //lecture du fichier while (!feof($fp)) { //on parcoure toutes les lignes $page .= fgets($fp, 4096); // lecture du contenu de la ligne } $titre = eregi("<title>(.*)</title>",$page,$regs); //on isole le titre /* Le titre commence par <title>, puis contient n'importe quelle chaine, et se termine par </title> */ echo $regs[1]; // retourne la premiere parenthèse capturante // Les occurrences se trouvent entre parenthèses // $regs[0] renvoie toute la chaine, par exemple : "<title>Libération.fr</title>" fclose($fp); ?> chaine ereg_replace(chaine modele,chaine remplacement,chaine texte) Exemple : <?php $chaine="J'ai mangé trois pommes."; $chaine=ereg_replace("trois","3",$chaine); echo $chaine; // affichera : J'ai mangé 3 pommes. ?> produit Exemple 23 Exp Regulière 99 Exemple 24 Exp Regulière 100 SysCom SysCom Exemples • Exemples Exemple « Parsing à distance » • Source html <html> <head> <title>Résultats du Loto</title> <meta http-equiv="Pragma" content="no-cache"> <!-- FICHIER DE RESULTATS DU LOTO POUR LES UTILISATEURS --> </head> <body bgcolor="#FFFFFF" text="#000000"> <a name="#SOMMAIRE"></a> <br /> <center> <img src="../../img/general/logo_loto_p.gif" border=0 alt=loto> <br><br><b>Intro FR</b> : <br> Pour jouer au jeu téléphonique du Loto, inscrivez-vous au n° <b>0892 704 105</b> (0,34 €/mn)<br> <br><br> <P> <font face="arial" size=4 color="#003D65"> <b>Tirages N°24<br> du <br>Samedi 23 Mars 2002</b> </font> </center> <br> 101 102 SysCom SysCom Exemples Exemples • Résultat du parsing • Source html <center><a href="#joker"><img src="../../img/general/joker.gif" width=80 border=0></a></center><br> <p> <p> <center> <font face="arial" size=3 color="#003D65"> <b>COMBINAISON GAGNANTE DU PREMIER TIRAGE :</b></font> <p> <TABLE border=0> <th colspan=8 ><br><font face="arial" size=2 color="#003D65">Boules dans l'ordre du tirage</font><br></th> <TR> <td align=left> <img src="../../img/boules/2.gif" border=0 alt=2> </td> <td align=left> <img src="../../img/boules/47.gif" border=0 alt=47> </td> 103 . . . . 104 SysCom SysCom Exemples 105 Exemples • fichier parser.php • fichier parser.php (suite) <?php class parser { var $filename; function parser($filename) { // constructeur $this->filename=$filename; } function get_1er_tirage() { $file=fopen($this->filename,"r"); if (!$file) { echo "<p>Impossible d'ouvrir le fichier</p>.\n"; exit; } while(!strstr($line,"PREMIER")) { $line=fgets($file,1024); } while (count($result)!=7) { if (ereg("/([0-9]*).gif",$line,$no)) $result[ ]=$no[1]; $line=fgets($file,1024); } fclose($file); return $result; } function get_date() { $file=fopen($this->filename,"r"); if (!$file) { echo "<p>Impossible d'ouvrir le fichier</p>.\n"; exit; } $line=fgets($file,1024); Remarque : Une fois obtenue la ligne avec le mot while(!strstr($line,"Tirages")) { « tirage », il faut utiliser une expression régulière $line=fgets($file,1024); pour trouver la date. La date était juste entre <br> et </b>. On utilise } l'expression régulière suivante:<br>([^<]*)</b> fclose($file); ereg("<br>([^<]*)</b>",$line,$no); entre parenthèse, on met le "motif" que l'on veut récupérer. Ici n'importe quels caractères sauf <. return $no[1]; Le résultat est stocké dans $no[1] } function get_2eme_tirage() {….. } } 106 ?> SysCom SysCom Exemples Exemples • fichier loto.php <?php require "parser.php"; // similaire à "#include" de C $parser= new // instantiation de l'objet $parser parser("http://resultats2.francaise-des-jeux.fr/validee/loto/resultat.html"); ?> <html> <head> <title>Mes résultats du Loto</title> </head> <body> <center> <h1>Mes résultats du Loto</h1> <h2><font color="blue"> <?php echo $parser->get_date(); // appel de la methode "get_date() ?> </font> 107 </h2> • fichier loto.php (suite) <h2>1er tirage</h2> <?php $nums=$parser->get_1er_tirage(); // appel de la methode ?> <h2> <font color="red"> <?php for ($i=0; $i<count($nums)-1; $i++) echo $nums[$i] . "-"; echo $nums[count($nums)] . $nums[$i] . "-"; ?> </font> </h2> <h2>2ème tirage</h2> …. <!------- suite similaire -----</body> </html> 108 SysCom SysCom Exemple include Exemple include • Lorsqu'un script inclus par include() ou include_once() lève une erreur, le script principal poursuit son exécution comme si de rien n'était. Aussi, si vous préférez que le script principal s'arrête en cas d'échec utilisez require() ou require_once(). • include() suivi d'un nom de fichier a pour effet d'inclure son contenu à l'endroit de l'appel. <?php // Exemple de fichier faisant appel à include include("include_inc.php"); ?> Remarque : include_once() est identique si ce n'est qu'un script déjà inclus ne sera pas inclus une seconde fois 109 include() diffère aussi de require() car le fichier inclus est réévaluée à chaque fois que la commande est exécutée, tandis que require() est remplacée par le fichier cible lors de la première exécution. De plus, cela se fait même s'il est placé dans une structure conditionnelle, comme dans un if. 110 SysCom SysCom Exemple include Exemple include • Exemple "mise en page" • Pseudo-frames avec include : Une page d'un site classique ressemble fortement à un tableau dont le code HTML serait Résultat de l'appel à index.php après avoir cliqué sur "Page 1" : Exemple 25 include <html> <body> <table width="100%"> <tr bgcolor="lightblue"> <td colspan="2" align="center"> Placez ici, l'entête de votre site </td> </tr> <tr> <td bgcolor="yellow"> Placez ici, votre menu gauche <br /> </td> <td width="100%" align="center"> Placez ici votre page principale </td> </tr> </table> </body> </html> 111 112 SysCom SysCom Exemple include • index.php : 113 Exemple include • suite Include(fichier en-tête) <html> <body> <table width="100%"> <tr bgcolor="lightblue"> <td colspan="2" align="center"> <? include("en_tete.html"); ?> </td> </tr> <tr> <td bgcolor="yellow">Menu<br> <a href="?page=0">Accueil</a><br> <a href="?page=1">Page 1</a><br> <a href="?page=2">Page 2</a><br> </td> <td width="100%" align="center"> <?php // Ici, c'est la zone centrale // Contenu dépendant de la valeur du paramètre if (isset($_GET["page"])) $page = $_GET["page"]; else $page = null; switch ($page) { case 1 : include("page1.html"); break; case 2 : include("page2.html"); break; default : include("accueil.html"); break; } ?> </td> </tr> </table> </body> </html> 114 SysCom SysCom Sessions Sessions • Notion introduite dans la version 4 de PHP. Elles permettent un suivi fiable du visiteur dans un site. • Exemple Exemple sessions • Les sessions permettent d'enregistrer des variables propres à un utilisateur. Par exemple dans le cas d'un caddie virtuel, on souhaite garder en mémoire ce que le client a mis dans son caddie. • Fonctions : •session_start() permet de spécifier que la page fait appel aux sessions. •session_destroy() permet de supprimer la session (nettoyage des fichiers sur le serveur). •Pour utiliser une variable de session, il suffit d'accéder au tableau $_SESSION[] ayant pour clé, le nom de la 115 variable. SysCom SysCom créer ou reprendre une session Sessions • Exemple 116 Exemple sessions Sessions • Exemple (suite) if (isset($_GET["raz"])) { // On a demandé à reinitialiser une valeur switch ($_GET["raz"]) { case "pomme": $_SESSION["pommes"]=0; break; case "poire": $_SESSION["poires"] =0; break; case "banane": $_SESSION["bananes"] =0; break; } header("Location: $url"); die(); } <?php // Dans ce script nous utilisons les sessions session_start(); $url = $_SERVER["PHP_SELF"]; // lui même if (!isset($_SESSION["pommes"])) $_SESSION["pommes"]=0; if (!isset($_SESSION["poires"])) $_SESSION["poires"]=0; if (!isset($_SESSION["bananes"])) $_SESSION["bananes"]=0; if (isset($_GET["action"]) && $_GET["action"]=="destroy") { // on a demander à tout supprimer session_destroy(); header("Location: $url"); die(); } 117 118 SysCom SysCom Sessions Sessions • Exemple (suite) if (isset($_GET["achat"])) { // On a demandé à incrémenter une valeur switch ($_GET["achat"]) { case "pomme": $_SESSION["pommes"]++; break; case "poire": $_SESSION["poires"]++; break; case "banane": $_SESSION["bananes"]++; break; } header("Location: $url"); die(); } ?> 119 Exemple sessions • Exemple (suite) Exemple sessions <table border="1"> <tr><td> Nb Pommes : <?php echo $_SESSION["pommes"];?> </td><td> <a href="<?php echo $url;?>?achat=pomme">Acheter une pomme</a></td><td> <a href="<?php echo $url;?>?raz=pomme">vider</a></td> </tr><tr><td> Nb Poires : <?php echo $_SESSION["poires"];?></td><td> <a href="<?php echo $url;?>?achat=poire">Acheter une poire</a></td><td> <a href="<?php echo $url;?>?raz=poire">vider</a></td> </tr><tr><td> Nb Bananes : <?php echo $_SESSION["bananes"];?></td><td> <a href="<?php echo $url;?>?achat=banane">Acheter une banane</a></td><td> <a href="<?php echo $url;?>?raz=banane">vider</a></td> </tr> </table> Exemple sessions 120 SysCom SysCom Sessions • Exemple (suite) Exemple Téléchargement Exemple sessions <a href="<?php echo $url?>?action=destroy">Détruire la session</a> <? $total = $_SESSION["bananes"] + $_SESSION["poires"] + $_SESSION["pommes"]; echo "<h3> Nombre d'articles : $total</h3>"; ?> 121 Voir EXEMPLE 122 SysCom SysCom Identification en PHP Vérification d'une identité : header("WWW-Authenticate: Basic realm='private'"); Identification en PHP Exemple 27 identification Exemple : <?php if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) { header("WWW-Authenticate: Basic realm='private'"); a pour effet de faire demander (et retenir) un nom et un mot de passe par le navigateur. else } { $user = $_SERVER['PHP_AUTH_USER']; $pw = $_SERVER['PHP_AUTH_PW']; Le nom et le mot de passe retenus peut être obtenus avec : echo "<html><body> <h1>"; $_SERVER['PHP_AUTH_USER'] echo "les données connues sont : <br />". "<i>$user</i> et <i>$pw</i>\n"; $_SERVER['PHP_AUTH_PW'] echo "</h1></body></html>"; } 123 124 SysCom SysCom Identification en PHP Exemple naïf de contrôle des mots de passe : <?php $user = $_SERVER['PHP_AUTH_USER']; $pw = $_SERVER['PHP_AUTH_PW']; if (($user=="tintin") && ($pw=="bidule")) { echo "<html><body><h1>"; echo "Bravo, identification réussie.<br />\n"; echo "Vous êtes $user<br />\n"; echo "</h1></body></html>"; } else { header("WWW-Authenticate: Basic realm='private'"); } ?> Exemple 27 identification2 125 ?> Identification en PHP Exemple 27 identification3 Plusieurs mots de passe : <?php //la liste des informations $liste=file("mots.txt"); //création des tableaux for ($i=0;$i<count($liste);$i++) { $l=explode("/", trim($liste[$i])); $nom[$i]=$l[0]; //identité réelle de l'utilisateur n°i $login[$i]=$l[1]; //identifiant de l'utilisateur n°i $pass[$i]=$l[2]; //mot de passe de l'utilisateur n°i } //contrôle de l'identité $nbusers=count($liste); $user = $_SERVER['PHP_AUTH_USER']; $pw = $_SERVER['PHP_AUTH_PW']; $ok=-1; //on démarre sans connaître l'utilisateur 126 SysCom SysCom Identification en PHP Plusieurs mots de passe (suite): $ok=-1; //on démarre sans connaître l'utilisateur for ($i=0;$i<$nbusers;$i++) { if (($user==$login[$i]) && ($pw==$pass[$i])) { //reconnu l'utilisateur -> on garde son numéro $ok=$i; } } //si l'identification a raté, $ok contient toujours -1 //on demande le nom et le mot de passe if ($ok==-1) { header("WWW-Authenticate: Basic realm='private'"); return; //rmq l'utilisation de return //pour sortir du programme. } Identification en PHP Plusieurs mots de passe (suite): //si on arrive ici, c'est que l'identification a réussi //et que $ok contient le numéro de l'utilisateur echo "<html><body><h2>"; echo "Bravo, identification réussie.<br />\n"; echo "Vous êtes <em>$nom[$ok]</em>,\n"; echo "votre identifiant est <em>$login[$ok]</em>,\n"; echo "votre mot de passe est" . "<em>$pass[$ok]</em>.<br />\n"; //À vous d'ajouter ici tout ce qui concerne l'utilisateur //... //... echo "</h2></body></html>"; ?> Exemple 27 identification3 127 128 SysCom SysCom Bases de données Bases de données • Un très grand avantage de PHP, c'est l'accès facile à différentes bases de données. •Les fonctions de base: •La fonction de connexion au serveur •La fonction de choix de la base de données •connexion à la base de données <?php $idConnexion = mysql_connect("Nom_Hote", "Nom_Utilisateur", "Password"); // retourne un identifiant de connexion ou FALSE en cas d'échec. $connexionReussie = mysql_select_db("Ma_bd"); //nom de la BD // Et pour mettre fin à la connexion mysql_close(); ?> •La fonction de requête •La fonction de déconnexion mysql_connect mysql_select_db mysql_query mysql_close 129 Remarques : •Nom_Hote est le nom de l'hôte où se trouve MySQL ("sql", localhost") •Nom_Utilisateur est le login de celui qui peut se connecter à la BD 130 SysCom SysCom Bases de données Bases de données • exemple concret en local •Exemple : "sondage" sondage.html affiche la page suivante <?php $idConnexion = mysql_connect("localhost", "root", ""); if ($idConnexion) echo "Connexion au serveur réussie"; else echo "Connexion au serveur ratée"; $connexionReussie = mysql_select_db("mabase"); if ($connexionReussie) echo "Connexion à la base réussie"; else echo "Connexion à la base ratée"; // Et pour mettre fin à la connexion mysql_close(); ?> Autre manière : 131 <?php mysql_connect("localhost", "root", "") or die("Impossible de se connecter au serveur de bases de données."); mysql_select_db("mabase") or die("Cette base de données n'existe pas"); // Et pour mettre fin à la connexion mysql_close(); ?> 132 SysCom SysCom Bases de données Bases de données sondage.html Avant d'utiliser le fichier sondage.php on doit créer la base de données avec MyAdmin: <html> <body> <h2>Comment avez-vous découvert PHP Facile ?</h2> <form method="post" action="sondage.php"> <input type="radio" name="choix" value="presse" />Par la presse spécialisée<br /> <input type="radio" name="choix" value="annuaire" />Par un annuaire<br /> <input type="radio" name="choix" value="moteur" />Par un moteur de recherche<br/> <input type="radio" name="choix" value="forum" />Par un forum<br /> <input type="radio" name="choix" value="news" />Par les news<br /> <input type="radio" name="choix" value="ami" />Par un ami<br /> <input type="radio" name="choix" value="autre" />Autre<br /> Merci de laisser votre pseudo: <input type="text" name="pseudo" /><br /> <input type="submit" /> </form> </body> </html> 133 134 SysCom SysCom Bases de données Bases de données Puis on doit créer la table qui va accueillir les résultats. La requête SQL est la suivante: Exécution de la requête SQL : CREATE TABLE sondage (nom varchar(20), resultat varchar(20), date timestamp(14)) Remarques : •sondage sera le nom de la table, nom, resultat et date ses champs. Le type de nom et de resultat est une chaîne de caractères de taille variable mais de maximum 20. Le type de date est un timestamp sur 14 caractères les 4 premiers correspondront à l'année puis 2 pour le mois 2 pour le jour et 6 pour les heures, minutes et secondes. 135 136 SysCom SysCom Bases de données Bases de données sondage.php Visualiser les résultats du sondage avec sondage_reponses.php: <?php $serveur = "localhost"; $utilisateur = "root"; $motDePasse = ""; $base = "mabase"; $pseudo = $_POST["pseudo"]; $choix = $_POST["choix"]; mysql_pconnect($serveur, $utilisateur , $motDePasse) or die("Impossible de se connecter au serveur de basesinsert de données."); dans sondage, $pseudo et $choix aux champs respectifs nom et resultat. date prend automatiquement mysql_select_db($base) la valeur de la date courante. or die("Base de données non trouvée."); mysql_query("INSERT INTO sondage (nom, resultat)". " VALUES ('$pseudo', '$choix') ") or die("Impossible d'insérer le résultat du sondage"); mysql_close(); echo "Merci"; ?> 137 138 SysCom SysCom Bases de données Bases de données Fichier sondage_reponses.php: 139 <html> <head> <title>Résultat du sondage PHP Facile !</title> </head> <body> <center>A la question:<h2>Comment avez vous découvert PHP Facile!</h2> il a été repondu:<br><br> <table border="1"> <tr> <td><b>Pseudo</b></td> <td><b>Réponse</b></td> </tr> <?php function reponse($texte) { switch ($texte) { case "presse" : return "Par la presse spécialisée"; break; case "annuaire": return "Par un annuaire"; break; case "moteur" : return "Par un moteur de recherche"; break; case "forum" : return "Par un forum"; break; case "news" : return "Par les news"; break; case "ami" : return "Par un ami"; break; case "autre" : return "Par un autre moyen"; break; } } // fin reponse suite: $serveur = "localhost"; $utilisateur = "root"; $motDePasse = ""; $base = "mabase"; La requête sélectionne tous les éléments de la table. mysql_pconnect($serveur, $utilisateur, $motDePasse); mysql_select_db($base) or die("Connexion ratée"); 140 $requete = mysql_query("SELECT * FROM sondage"); while ($ligne = mysql_fetch_array($requete)) { print "<tr> <td>".$ligne["nom"]."</td> <td>".reponse($ligne["resultat"])."</td> </tr>"; } mysql_close(); ?> </table> </body> </html> $ligne, correspond à une ligne de la table on récupère le champ nom puis le champ resultat