Vous êtes sur la page 1sur 153

PHP4 et MySQL

1/154

Sommaire
PARTIE 1 : PHP La programmation en PHP. Des centaines de fonctions dtailles et des exemples expliqus en dtail. PARTIE 2 : MySQL La cration et linterrogation dune base de donnes. PARTIE 3 : Exemple concret Ltude dune application web relle. PARTIE 4 : Mthodologie Quelques trucs pour choisir au mieux les solutions les plus adapts pour rsoudre vos problmes.

2/154

Liens
PHP*
http://www.php.net http://www.phpinfo.net http://www.phpfrance.com http://www.developpez.com/php/

MySQL
http://www.mysql.com/ http://dev.nexen.net/docs/mysql/

HTML
http://cyberzoide.developpez.com/html/

Exemple concret
http://www.miag-rezo.net

* PHP Hypertext Preprocessor (encore un acronyme rcursif !)

3/154

Modle
requte

Client

internet rponse

Serveur

appel de la page

Base de donnes MySQL

extraction de donnes

Script PHP

excution

Document Html

4/154

Documentation en ligne
Pour obtenir en ligne toute la documentation officielle (en franais) sur une commande, tapez lURL suivante dans la barre dadresse de votre navigateur Internet : http://fr.php.net/ Et rajouter en fin dURL le nom de la commande. Exemple : http://fr.php.net/echo

5/154

Partie 1 : PHP

6/154

La petite histoire du PHP


Il a t cr en 1994 par Rasmus Lerdorf pour les besoins des pages web personnelles (livre dor, compteurs, etc.). A lpoque, PHP signifiait Personnal Home Page. Cest un langage incrust au HTML et interprt (PHP3) ou compil (PHP4) ct serveur. Il drive du C et du Perl dont il reprend la syntaxe. Il est extensible grce de nombreux modules et son code source est ouvert. Comme il supporte tous les standards du web et quil est gratuit, il sest rapidement rpandu sur la toile. En 1997, PHP devient un projet collectif et son interprteur est rcrit par Zeev Suraski et Andi Gutmans pour donner la version 3 qui sappelle dsormais PHP : Hypertext Preprocessor (acronyme rcursif lexemple du systme Open Source Linux : Is Not UniX). Il existe par ailleurs des applications web prtes lemploi (PHPNuke, PHP SPIP, PHPSlash) permettant de monter facilement et gratuitement son portail. En juillet 2000 plus de 300.000 sites tournaient dj sous PHP !
7/154

Intgration dun script dans une page


Les pages web sont au format html. Les pages web dynamiques gnres avec PHP4 sont au format php. Le code source php est directement insrer dans le fichier html grce au conteneur de la norme XML : <?php ?> Exemple: <html> <body> <?php echo Bonjour; ?> </body> </html>

Autres syntaxes dintgration : <? ?> <script language=php> </script> <% %>
8/154

Exemple de script
Exemple de script, code source (ct serveur) :
<html> <body> <h1>Mon premier script</h1> <?php echo Bonjour\n; ?> </body> </html>

Autre criture du mme script :


<?php echo <html>\n<body>\n; echo <h1>Mon premier script</h1>\n; echo Bonjour\n; echo </body>\n</html>\n; ?>

Rsultat affich par le navigateur :

Code source (ct client) de la page essai.ph3 rsultant du script

9/154

Commentaires
Un script php se commente comme en C : Exemple : <?php // commentaire de fin de ligne /* commentaire sur plusieurs lignes */ # commentaire de fin de ligne comme en Shell ?> Tout ce qui se trouve dans un commentaire est ignor. Il est conseill de commenter largement ses scripts.

10/154

Variables, types et oprateurs (I)


Le typage des variables est implicite en php. Il nest donc pas ncessaire de dclarer leur type au pralable ni mme de les initialiser avant leur utilisation. Les identificateurs de variable sont prcds du symbole $ (dollars). Exemple : $toto. Les variables peuvent tre de type entier (integer), rel (double), chane de caractres (string), tableau (array), objet (object), boolen (boolean).

Il est possible de convertir une variable en un type primitif grce au cast(1) (comme en C). Exemple : $str = 12; // $str vaut la chane 12 $nbr = (int)$str; // $nbr vaut le nombre 12
(1) : Le cast est une conversion de type. Laction de caster consiste en convertir une variable dun type un autre.

11/154

Variables, types et oprateurs (II)


Quelques fonctions : empty($var) : renvoie vrai si la variable est vide isset($var) : renvoie vrai si la variable existe unset($var) : dtruit une variable gettype($var) : retourne le type de la variable settype($var, type) : convertit la variable en type type (cast) is_long(), is_double(), is_string(), is_array(), is_object(), is_bool(), is_float(), is_numeric(), is_integer(), is_int()

Une variable peut avoir pour identificateur la valeur dune autre variable. Syntaxe : ${$var} = valeur; Exemple : $toto = foobar; ${$toto} = 2002; echo $foobar; // la variable $foobar vaut 2002

12/154

Variables, types et oprateurs (III)


La porte dune variable est limite au bloc dans lequel elle a t cre. Une variable locale une fonction nest pas connue dans le reste du programme. Tout comme une variable du programme nest pas connue dans une fonction. Une variable cre dans un bloc nest pas connue dans les autres blocs, mmes suprieurs. Oprateurs arithmtiques : + (addition), - (soustraction), * (multipli), / (divis), % (modulo), ++ (incrment), --(dcrment). Ces deux derniers peuvent tre pr ou post fixs Oprateurs dassignement : = (affectation), *= ($x*=$y quivalent $x=$x*$y), /=, +=, -=, %= Oprateurs logiques : and, && (et), or, || (ou), xor (ou exclusif), ! (non) Oprateurs de comparaison : == (galit), < (infrieur strict), <= (infrieur large), >, >=, != (diffrence)

13/154

Variables, types et oprateurs (IV)


Signalons un oprateur trs spcial qui quivaut une structure conditionnelle complexe if then else la diffrence quil renvoie un rsultat de valeur pouvant ne pas tre un boolen : loprateur ternaire. Syntaxe : (condition)?(expression1):(expression2); Si la condition est vrai alors value et renvoie lexpression1 sinon value et renvoie lexpression2.

Exemple : $nbr = ($toto>10)?($toto):($toto%10); Dans cet exemple, la variable $nbr prend $toto pour valeur si $toto est strictement suprieur 10, sinon vaut le reste de la division entire de $toto par 10.

14/154

Constantes
Lutilisateur peut dfinir des constantes dont la valeur est fixe une fois pour toute. Les constantes ne portent pas le symbole $ (dollars) en dbut didentificateur et ne sont pas modifiables. define(var,valeur) : dfinit la constante var (sans $) de valeur valeur Exemple 1 : define(author,Foobar); echo author; // affiche Foobar Exemple 2 : define(MY_YEAR,1980); echo MY_YEAR; // affiche 1980 Contrairement aux variables, les identificateurs de constantes (et aussi ceux de fonction) ne sont pas sensibles la casse.

15/154

Rfrences
On peut la manire des pointeurs en C faire rfrence une variable grce loprateur & (ET commercial). Exemple 1 : $toto = 100; // la variable $toto est initialise la valeur 100 $foobar = &$toto; // la variable $foobar fait rfrence $toto $toto++; // on change la valeur de $toto echo $foobar; // qui est rpercute sur $foobar qui vaut alors 101

Exemple 2 : function change($var) { $var++; // la fonction incrmente en local largument } $nbr = 1; // la variable $nbr est initialise 1 change(&$nbr); // passage de la variable par rfrence echo $nbr; // sa valeur a donc t modifie

16/154

Mathmatiques (I)
Il existe une miriade de fonctions mathmatiques. abs($x) : valeur absolue ceil($x) : arrondi suprieur floor($x) : arrondi infrieur pow($x,$y) : x exposant y round($x,$i) : arrondi de x la ime dcimale max($a, $b, $c ) : retourne largument de valeur maximum pi() : retourne la valeur de Pi Et aussi : cos, sin, tan, exp, log, min, pi, sqrt Quelques constantes : M_PI : valeur de pi (3.14159265358979323846) M_E : valeur de e (2.7182818284590452354)

17/154

Mathmatiques (II)
Nombres alatoires : rand([$x[,$y]) : valeur entire alatoire entre 0 et RAND_MAX si x et y ne sont pas dfinis, entre x et RAND_MAX si seul x est dfini, entre x et y si ces deux paramtres sont dfinis. srand() : initialisation du gnrateur alatoire getrandmax() : retourne la valeur du plus grand entier pouvant tre gnr L'algorithme utilis par la fonction rand() - issu de vieilles bibliothques libcs est particulirement lent et possde un comportement pouvant se rvler prvisible. La fonction mt_rand() quivalente rand() est plus rapide et plus sre puisque l'algorithme utilis se base sur la cryptographie. En cas dutilisation de la fonction mt_rand(), ne pas oublier dutiliser les fonctions de la mme famille : mt_rand([$x[,$y]]), mt_srand() et mt_getrandmax().

18/154

Mathmatiques (III)
Formatage dun nombre : number_format ($nbr[,$dec,[$a,$b]]) : retourne une chane de caractres reprsentant le nombre $nbr avec $dec dcimales aprs formatage. La chane $a reprsente le symbole faisant office de virgule et $b le sparateur de milliers. Par dfaut, le formatage est anglophone : $a = . et $b = ,. Trs utile pour reprsenter les nombres levs au format francophone. Exemples : number_format (1000000.3333); number_format (1000000.3333,2); number_format (1000000.3333,2,",",".");

// affiche 1,000,000 // affiche 1,000,000.33 // affiche 1.000.000,33

19/154

Expressions
Presque tout en php est une expression. On les construit de faon trs souple. De faon rduire la taille du code (comme en C). Linconvnient est lillisibilit du code ainsi crit sauf le commenter suffisamment. Il faut donc les construire avec parcimonie et ne pas hsiter les fractionner.

Exemple : echo change( $nbr += ($toto>0)?(0):(--$toto) );


Attention utiliser les parenthses afin de palier aux priorits des oprateurs.

20/154

Boolens
Les variables boolennes prennent pour valeurs TRUE (vrai) et FALSE (faux). Une valeur entire nulle est automatiquement considre comme FALSE. Tout comme une chane de caractres vide . Ou encore comme les chanes 0 et 0 castes en lentier 0 lui mme cast en FALSE.

Exemple : if(0) echo 1; // faux if('''') echo 2; // faux if(''0'') echo 3; // faux if(''00'') echo 4; if('0') echo 5; // faux if('00') echo 6; if('' '') echo 7; Cet exemple affiche 467. Donc lespace ou la chane 00 ne sont pas considrs casts en FALSE.

21/154

Chanes de caractres (I)


Une variable chane de caractres nest pas limite en nombre de caractres. Elle est toujours dlimite par des simples quotes ou des doubles quotes. Exemples : $nom = Etivant; $prenom = Hugo; Les doubles quotes permettent lvaluation des variables et caractres spciaux contenus dans la chane (comme en C ou en Shell) alors que les simples ne le permettent pas. Exemples : echo Nom: $nom; // affiche Nom: Etivant echo Nom: $nom; // affiche Nom: $nom Quelques caractres spciaux : \n (nouvelle ligne), \r (retour la ligne), \t (tabulation horizontale), \\ (antislash), \$ (caractre dollars), \ (double quote). Exemple : echo Hello Word !\n;

22/154

Chanes de caractres (II)


Oprateur de concatnation de chanes : . (point) Exemple 1 : $foo = Hello; $bar = Word; echo $foo.$bar; Exemple 2 : $name = Henry; $whoiam = $name.IV; Exemple 3 : $out = Patati; $out .= et patata;

23/154

Chanes de caractres (III)


Affichage dune chane avec echo: Exemples: echo Hello Word.; echo Hello ${name}\n; echo Nom : , $name; echo(Bonjour); Quelques fonctions: strlen($str) : retourne le nombre de caractres dune chane strtolower($str) : conversion en minuscules strtoupper($str) : conversion en majuscules trim($str) : suppression des espaces de dbut et de fin de chane substr($str,$i,$j) : retourne une sous chane de $str de taille $j et dbutant la position $i strnatcmp($str1,$str2) : comparaison de 2 chanes addslashes($str) : dspcialise les caractres spciaux (, , \) ord($char) : retourne la valeur ASCII du caractre $char
24/154

Chanes de caractres (IV)


On peut dlimiter les chanes de caractres avec la syntaxe Here-doc. Exemple : $essai = <<<EOD Ma chane essai sur plusieurs lignes. EOD; echo $essai; La valeur de la variable $essai est dlimite par un identifiant que vous nommez librement. La premire apparition de cet identifiant doit tre prcde de 3 signes infrieurs <. Sa deuxime apparition doit se faire en premier sur une nouvelle ligne. Cette valeur chane se comporte comme si elle tait dlimite par des doubles quotes dans le sens o les variables seront values. Par contre il est inutile dchapper les guillemets, cest--dire que la dspcialisation des doubles quotes devient inutile.

25/154

Affichage
Les fonctions daffichage : echo() : criture dans le navigateur print() : criture dans le navigateur printf([$format, $arg1, $arg2]) : criture formate comme en C, i.e. la chane de caractre est constante et contient le format daffichage des variables passes en argument Exemples : echo Bonjour $name; print(Bonjour $name); printf(Bonjour %s, $name);

26/154

Tableaux (I)
Une variable tableau est de type array. Un tableau accepte des lments de tout type. Les lments dun tableau peuvent tre de types diffrents et sont spars dune virgule. Un tableau peut tre initialis avec la syntaxe array. Exemple : $tab_colors = array(red, yellow, blue, white); $tab = array(foobar, 2002, 20.5, $name); Mais il peut aussi tre initialis au fur et mesure. Exemples : $prenoms[ ] = Clment; $villes[0] = Paris; $prenoms[ ] = Justin; $villes[1] = Londres; $prenoms[ ] = Tanguy; $villes[2] = Lisbonne; Lappel dun lment du tableau se fait partir de son indice (dont lorigine est zro comme en C). Exemple : echo $tab[10]; // pour accder au 11me lment
27/154

Tableaux (II)
Parcours dun tableau. $tab = array(Hugo, Jean, Mario); Exemple 1 : $i=0; while($i <= count($tab)) { echo $tab[$i].\n; $i++; }

// count() retourne le nombre dlments

Exemple 2 : foreach($tab as $elem) { echo $elem.\n; } La variable $elem prend pour valeurs successives tous les lments du tableau $tab.

28/154

Tableaux (III)
Quelques fonctions: count($tab), sizeof : retournent le nombre dlments du tableau in_array($var,$tab) : dit si la valeur de $var existe dans le tableau $tab list($var1,$var2) : transforme une liste de variables en tableau range($i,$j) : retourne un tableau contenant un intervalle de valeurs shuffle($tab) : mlange les lments dun tableau sort($tab) : trie alphanumrique les lments du tableau rsort($tab) : trie alphanumrique inverse les lments du tableau implode($str,$tab), join : retournent une chane de caractres contenant les lments du tableau $tab joints par la chane de jointure $str explode($delim,$str) : retourne un tableau dont les lments rsultent du hachage de la chane $str par le dlimiteur $delim array_merge($tab1,$tab2,$tab3) : concatne les tableaux passs en arguments array_rand($tab) : retourne un lment du tableau au hasard

29/154

Tableaux (IV)
Il est possible deffectuer des oprations complexes sur les tableaux en crant par exemple sa propre fonction de comparaison des lments et en la passant en paramtre une fonction de tri de php. usort($tab, fonction); Trie les lments grce la fonction fonction dfinie par l'utilisateur qui doit prendre 2 arguments et retourner un entier, qui sera infrieur, gal ou suprieur zro suivant que le premier argument est considr comme plus petit, gal ou plus grand que le second argument. Si les deux arguments sont gaux, leur ordre est indfini. Attention, les variables tableaux ne sont pas values lorsquelles sont au milieu dune chane ce caractre dlimite par des doubles quottes. Exemple : echo $tab[3]; // syntaxe invalide echo $tab[3]; // syntaxe valide

30/154

Tableaux associatifs (I)


Un tableau associatif est appel aussi dictionnaire ou hashtable. On associe chacun de ses lments une cl dont la valeur est de type chane de caractres. Linitialisation dun tableau associatif est similaire celle dun tableau normal. Exemple 1 : $personne = array(Nom => Csar, Prnom => Jules);

Exemple 2 : $personne[Nom] = Csar; $personne[Prnom] = Jules;


Ici la cl Nom est associe la valeur Csar.

31/154

Tableaux associatifs (II)


Parcours dun tableau associatif. $personne = array(Nom => Csar, Prnom => Jules); Exemple 1 : foreach($personne as $elem) { echo $elem; } Ici on accde directement aux lments du tableau sans passer par les cls. Exemple 2 : foreach($personne as $key => $elem) { echo $key : $elem; } Ici on accde simultanment aux cls et aux lments.

32/154

Tableaux associatifs (III)


Quelques fonctions : array_count_values($tab) : retourne un tableau contenant les valeurs du tableau $tab comme cls et leurs frquence comme valeur (utile pour valuer les redondances) array_keys($tab) : retourne un tableau contenant les cls du tableau associatif $tab array_values($tab) : retourne un tableau contenant les valeurs du tableau associatif $tab array_search($val,$tab) : retourne la cl associe la valeur $val Llment dun tableau peut tre un autre tableau. Les tableaux associatifs permettent de prserver une structure de donnes.

33/154

Tableaux associatifs (IV)


Quelques fonctions alternatives pour le parcours de tableaux (normaux ou associatifs) : reset($tab) : place le pointeur sur le premier lment current($tab) : retourne la valeur de llment courant next($tab) : place le pointeur sur llment suivant prev($tab) : place le pointeur sur llment prcdant each($tab) : retourne la paire cl/valeur courante et avance le pointeur Exemple : $colors = array(red, green, blue); $nbr = count($colors); reset($colors); for($i=1; $i<=$nbr; $i++) { echo current($colors).<br />; next($colors); }

34/154

Fonctions (I)
Comme tout langage de programmation, php permet lcriture de fonctions. Les fonctions peuvent prendre des arguments dont il nest pas besoin de spcifier le type. Elles peuvent de faon optionnelle retourner une valeur. Lappel une fonction peut ne pas respecter son prototypage (nombre de paramtres). Les identificateurs de fonctions sont insensibles la casse. Exemple : function mafonction($toto) { $toto += 15; echo Salut !; return ($toto+10); } $nbr = MaFonction(15.1); /* retourne 15.1+15+10=40.1, les majuscules nont pas dimportance */

35/154

Fonctions (II)
On peut modifier la porte des variables locales une fonction. global permet de travailler sur une variable de porte globale au programme. Le tableau associatif $GLOBALS permet daccder aux variables globales du script ($GLOBALS[var] accde la variable $var). Exemple : function change() { global $var; // dfinit $var comme globale $GLOBALS[toto] ++; // incrmente la variable globale $toto $var++; // cela sera rpercut dans le reste du programme } static permet de conserver la valeur dune variable locale une fonction. Exemple : function change() { static $var; // dfinit $var comme statique $var++; // sa valeur sera conserve jusquau prochain appel }
36/154

Fonctions (III)
On peut donner une valeur par dfaut aux arguments lors de la dclaration de la fonction. Ainsi, si un argument est oubli lors de lappel de la fonction, cette dernire lui donnera automatiquement une valeur par dfaut dcide lavance par le programmeur. Exemple : function Set_Color($color=black) { global $car; $car[color] = $color; }

Forcer le passage de paramtre par rfrence (quivalent user de global): Exemple : function change(&$var) { // force le passage systmatique par rfrence $var += 100; // incrmentation de +100 } $toto = 12; // $toto vaut 12 change($toto); // passage par valeur mais la fonction la prend en rfrence echo $toto; // $toto vaut 112
37/154

Fonctions (IV)
Les paramtres sont passs par copie et les rsultats sont retourns par copie (sauf forcer la rfrence). Mme sans paramtre, un entte de fonction doit porter des parenthses ( ). Les diffrents arguments sont spars par une virgule , . Et le corps de la fonction est dlimit par des accolades { }.

Quelques exemples : function afficher($str1, $str2) { echo $str1, $str2; }


function bonjour() { echo Bonjour; } function GetColor() { return black; }

// passage de deux paramtres

// passage daucun paramtre

// retour dune variable de type chane

38/154

Fonctions (V)
Une fonction peut tre dfinie aprs son appel (en PHP4 du fait de la compilation avant excution contrairement au PHP3 qui est interprt). Exemple : function foo() { // dfinition de la fonction foo echo Foo; } foo(); // appel de la fonction foo dfinie plus haut bar(); // appel de la fonction bar pas encore dfinie function bar() { // dfinition de la fonction bar echo bar!<br />; }

Cet exemple affichera : Foobar!.

39/154

Fonctions (VI)
Grce une petite astuce, il est possible de faire retourner plusieurs valeurs dune fonction. En retournant un tableau ayant pour lments les variables retourner. Dans lappel de la fonction, il faudra alors utiliser la procdure list() qui prend en paramtre les variables qui ont doit affecter les valeurs retournes. On affecte list() le retour de la fonction. Exemple : function trigo($nbr) { return array(sin($nbr), cos($nbr), tan($nbr)); // retour dun tableau } $r = 12; list($a, $b, $c) = trigo($r); /* affectation aux variables $a,$b et $c des lments du tableau retourn par la fonction trigo */ echo sin($r)=$a, cos($r)=$b, tan($r)=$c; // affichage des variables Cet exemple affichera ceci : sin(12)=-0,5365729180, cos(12)=0,8438539587, tan(12)=-0,6358599286
40/154

Fonctions dynamiques (I)


Il est possible de crer dynamiquement des fonctions. Pour les dclarer, on affecte une variable chane de caractres le nom de de la fonction dupliquer. Puis on passe en argument cette variable les paramtres normaux de la fonction de dpart.

Exemple : function divers($toto) { echo $toto; } $mafonction = divers; $mafonction(bonjour !);

// affiche bonjour ! par appel de divers()

41/154

Fonctions dynamiques (II)


Quelques fonctions permettant de travailler sur des fonctions utilisateur : call_user_func_array, call_user_func, create_function, func_get_arg, func_get_args, func_num_args, function_exists, get_defined_functions, register_shutdown_function.

call_user_func_array($str [, $tab]) : Appelle une fonction utilisateur $str avec les paramtres rassembls dans un tableau $tab.
Exemple : function essai($user, $pass) { // fonction appeler echo USER: $user PASSWORD: $pass; } $params = array(hugo,0478); // cration du tableau de paramtres call_user_func_array(essai, $params); // appel de la fonction Le nom de la fonction appeler doit tre dans une chane de caractres.

42/154

Fonctions dynamiques (III)


call_user_func($str [, $param1, $param2, ]) : Appelle une fonction utilisateur ventuellement avec des paramtres. Exemple : function essai($user, $pass) { echo USER: $user PASSWORD: $pass; } call_user_func(essai, hugo,0478);

Similaire call_user_func_array la diffrence quici les arguments envoyer la fonction appeler ne sont pas dans un tableau mais envoys directement en paramtre call_user_func.

43/154

Fonctions dynamiques (IV)


create_function($params,$code) : Cre une fonction anonyme (style lambda). Prend en argument la liste $params des arguments de la fonction crer ainsi que le code $code de la fonction sous la forme de chanes de caractres. Il est conseill dutiliser les simples quotes afin de protger les noms de variables $var, ou alors dchapper ces noms de variables \$var. Le nom de la fonction cre sera de la forme : lambda_x o x est lordre de cration de la fonction. Exemple : $newfunc = create_function($a,$b,return \$a+\$b;); echo Nouvelle fonction anonyme : $newfunc <br />; echo $newfunc(5,12).<br />; On fabrique ici une fonction qui prend en argument 2 paramtres et renvoie leur somme. On lappelle avec les nombres 5 et 12. On va donc afficher le nombre 17. Cet exemple est quivalent : function lambda_1($a,$b) { return $a+$b; }

44/154

Fonctions dynamiques (V)


func_num_args() : Retourne le nombre d'arguments passs la fonction en cours. func_get_arg($nbr) : Retourne un lment de la liste des arguments envoys une fonction. Elle ne doit tre utilise quau sein dune fonction. Lindice $nbr commence zro et renvoie le $nbr-1 me paramtre. Exemple : function foobar() { $numargs = func_num_args(); echo Nombre d'arguments: $numargs<br />; if ($numargs >= 2) { echo Le 2me param : .func_get_arg(1).<br />; } } foobar(foo, bar, 10.5); Cet exemple affiche la chane : Le 2me param : 10.5
45/154

Fonctions dynamiques (VI)


func_get_args() : Retourne les arguments de la fonction en cours sous la forme dun tableau. Exemple : function somme() { $params = func_get_args(); $nbr = 0; foreach($params as $elem) { $nbr += $elem; } return $nbr; } echo somme(50,20,3,98,50); Cette fonction somme retourne la somme de tous ses arguments quel quen soit le nombre.

46/154

Fonctions dynamiques (VII)


function_exists($str) : Retourne TRUE si la fonction $str a dj t dfinie. get_defined_functions() : Retourne un tableau associatif contenant la liste de toutes les fonctions dfinies. A la cl internal est associ un tableau ayant pour lments les noms des fonctions internes PHP. A la cl user, ce sont les fonctions utilisateurs. register_shutdown_function($str) : Enregistre la fonction $str pour excution l'extinction du script.

47/154

Classes (I)
Php gre la programmation oriente objet laide de classes. Exemple : class Voiture { // dclaration de la classe var $couleur; // dclaration dun attribut var $belle = TRUE; // initialisation dun attribut function voiture() { // constructeur $this->couleur = noire; } // le mot cl $this faisant rfrence lobjet est obligatoire function Set_Couleur($couleur) { $this->couleur = $couleur; } } $mavoiture = new Voiture(); // cration dune instance $mavoiture->Set_Couleur(blanche); // appel dune mthode $coul = $mavoiture->couleur; // appel dun attribut
48/154

Classes (II)
Le systme de classes de php est trs succint, il ne gre que lhritage simple. Exemple : class Voituredeluxe extends Voiture { // dclaration de la sous classe var $couleur; function voituredeluxe() { // constructeur $this->Voiture(); } function Set_Couleur($couleur) { $this->couleur = $couleur; } function Get_Couleur() { return $this->couleur; } } La nouvelle classe Voituredeluxe hrite de tous les attributs et mthodes de la classe parente Voiture dont elle est une extension (extends). Il est possible de surcharger les mthodes, den dclarer de nouvelles, etc.
49/154

Classes (III)
Quelques fonctions : get_declared_classes() : retourne un tableau listant toutes les classes dfinies class_exists($str) : vrifie qu'une classe dont le nom est pass en argument a t dfinie get_class($obj), get_parent_class : retournent le nom de la classe de lobjet $obj get_class_methods($str) : retourne les noms des mthodes de la classe $str dans un tableau get_class_vars($str) : retourne les valeurs par dfaut des attributs de la classe $str dans un tableau associatif get_object_vars($obj) : retourne un tableau associatif des attributs de lobjet $obj les cls sont les noms des attributs et les valeurs, celles des attributs si elles existent is_subclass_of($obj,$str) : dtermine si lobjet $obj est une instanciation dune sous-classe de $str, retourne VRAI ou FAUX method_exists($obj,$str) : vrifie que la mthode $str existe pour une classe dont $obj est une instance, retourne VRAI ou FAUX
50/154

Classes (IV)
Tout objet instanci est une variable et peut se titre tre pass en argument une fonction ou bien tre un retour de fonction ou encore tre sauvegarde en donne de session. Il nexiste pas de destructeur : comme en Java, les objets qui cessent dtre utiliss sont automatiquement dtruits. Il ny a pas de notion de visibilit : tous les attributs et mthodes sont publiques et une classe hrite forcment de tous les attributs et mthodes de son pre. Une classe fille hrite de tous les attributs et mthodes de la classe parente dont elle est une extension (dou la syntaxe extends). Il est possible de surcharger les mthodes, den dfinir de nouvelles

51/154

Structures de contrle (I)


Structures conditionnelles (mme syntaxe quen langage C) : if( ... ) {

} elseif {
} else { } switch( ) { case : { } break default : { } }

52/154

Structures de contrle (II)


Structures de boucle (mme syntaxe quen langage C) : for( ; ; ) { } while( ) { } do { } while( );

53/154

Structures de contrle (III)


Linstruction break permet de quitter prmaturment une boucle. Exemple : while($nbr = $tab[$i++]) { echo $nbr.<br />; if($nbr == $stop) break; } Linstruction continue permet dluder les instructions suivantes de litration courante de la boucle pour passer la suivante. Exemple : for($i=1; $i<=10; $i++) { if($tab[$i] == $val) continue; echo $tab[$i]; }

54/154

Inclusions
On peut inclure dans un script php le contenu dun autre fichier. require insert dans le code le contenu du fichier spcifi mme si ce nest pas du code php. Est quivalent au prprocesseur #include du C. Exemple : require(fichier.php); include value et insert chaque appel (mme dans une boucle) le contenu du fichier pass en argument. Exemple : include(fichier.php);

55/154

Arrt prmatur
Pour stopper prmaturment un script, il existe deux fonctions. die arrte un script et affiche un message derreur dans le navigateur. Exemple : if(mysql_query($requette) == false) die(Erreur de base de donnes la requte : <br />$requet); exit larrte aussi mais sans afficher de message derreur. Exemple : function foobar() { exit(); }

Ces fonctions stoppent tout le script, pas seulement le bloc en cours.

56/154

Variables denvironnement
Le langage php est dot dune multitude de variables denvironnement que la fonction phpinfo() permet dafficher (ainsi que bien dautres informations sur la configuration du serveur Apache). Ces variables permettent au script daccder des informations trs utiles voire quelques fois indispensables.

Quelques variables : $PHP_SELF : nom du script en cours $HTTP_ACCEPT : liste des types MIME supports par le client $HTTP_USER_AGENT : signature du navigateur du client $REMOTE_ADDR : adresse IP du client $QUERY_STRING : chane au format URL contenant les paramtres passs la page en cours $HTTP_REFERER : URL de la source ayant renvoye le client sur la page en cours (en lanalysant, on peut connatre le moteur de recherche utilis ainsi que les mots cls entrs par linternaute, sil vient effectivement dun moteur de recherche; permet dvaluer la qualit du rfrencement dun site web)

57/154

Constantes du PHP (I)


Le langage php met disposition du programmeur des constantes propres au script qui ne peuvent pas tre redfinies et qui sont bien utiles pour la gestion des erreurs internes au script. Les constantes prdfinies du PHP : __FILE__ : nom du fichier en cours __LINE__ : numro de ligne en cours PHP_VERSION : version de PHP PHP_OS : nom du systme d'exploitation qui est utilis par la machine qui fait tourner le PHP TRUE : la valeur vraie boolenne FALSE : la valeur faux boolenne Exemples : $test = true; echo __file__, __line__;

58/154

Constantes du PHP (II)


Les constantes suivantes, lorsquelles sont dclares par le programmeur (en gnral avant toute les autres instructions du script), permettent de spcifier linterprteur php du serveur quel niveau de rigueur appliquer face aux erreurs lors du droulement du script.

E_ERROR : dnote une erreur autre qu'une erreur d'analyse (''parse error'') qu'il n'est pas possible de corriger. E_WARNING : dnote un contexte dans lequel le PHP trouve que quelque chose ne va pas. Mais l'excution se poursuit tout de mme. Ces alertes-l peuvent tre rcupres par le script lui-mme. E_PARSE : l'analyseur a rencontr une forme syntaxique invalide dans le script, correction de l'erreur impossible. E_NOTICE : quelque chose s'est produit, qui peut tre ou non une erreur. L'excution continue. Par exemple, la tentative d'accder une variable qui n'est pas encore affecte. E_ALL : toutes les constantes E_* rassembles en une seule. Si vous l'utilisez avec error_reporting(), toutes les erreurs et les problmes que PHP rencontrera seront notifis.
59/154

Constantes du PHP (III)


La fonction error_reporting($nbr) permet de fixer le niveau de rapport d'erreurs PHP. Par dfaut php est assez permissif puisque autorise lutilisation des variables avant leur cration, le cast implicite, lappel de fonction retournant une valeur sans variable pour la rcuprer Cette fonction permet de forcer une plus grande svrit tout comme loption explicite du Visual Basic ou le paramtre Wall du compilateur gcc. Exemples : error_reporting( E_ERROR | E_WARNING | E_PARSE ); error_reporting(E_NOTICE);
constante
1 2 4 8 16 32

valeur
E_ERROR E_WARNING E_PARSE E_NOTICE E_CORE_ERROR E_CORE_WARNING

64
128 256 512 1024

E_COMPILE_ERROR
E_COMPILE_WARNING E_USER_ERROR E_USER_WARNING E_USER_NOTICE
60/154

Passage de paramtres un script (I)


Mthode des formulaires. La mthode POST permet de passer des variables saisies par lutilisateur dun script php lautre. Exemple :
echo <form method=\post\ action=\check.php\> Login : <input type=\text\ name =\login\ value=\$login\ /><br /> Password : <input type=\password\ name =\pass\ value=\$pass\ /><br /> <input type=\submit\ value=\Identifier\ /> </form>;

Cet exemple affiche un formulaire simple dans le navigateur : un champs de saisie de texte et un champ de saisie de mot de passe. Lorsque lutilisateur valide et envoie les donnes au serveur, les variables du formulaire seront connues comme variables globales du script php destination (dsign par la valeur de lattribut action de la balise FORM). Les variables porteront le nom des balises (dsign par lattribut name ou id des balises de saisie).
61/154

Passage de paramtres un script (II)


Toutes les variables passes en paramtres par cette mthode seront considres comme des chanes des caractres. Mais les casts implicites permettront de les rcuprer directement dans des variables dautre type (entier, rel). Exemple : if($pass==xrT12) echo Ok, valid user.; /* + donnes importantes */ else echo Acces forbiden.; Dans cet exemple, on contrle la validit du mot de passe du formulaire prcdent qui a t pass en paramtre au script check.php par la mthode POST. Par exemple, on affiche des donnes confidentielles seulement si le mot de passe est le bon. Les donnes saisies napparatront pas dans lURL et ne seront donc pas stockes dans les fichiers de log du serveur, contrairement la mthode GET (attention, HTTP1.1 implique que les appels de GET doivent tre idempotents cest--dire doivent toujours retourner la mme valeur).
62/154

Passage de paramtres un script (III)


Mthode des ancres. Les variables peuvent directement tre passes par lintermdiaire des URL. Exemple : $id = 20; echo <a href=\fichier.php?action=buy&id=$id\>Acheter</a>; Cet exemple va crer dans le script destination les variables globales $action et $id avec les valeurs respectives buy et 20. La barre dadresse affichera lURL suivante :

Ainsi une application web crite en php peut interagir avec lutilisateur de faon dynamique.

63/154

Chargement de fichiers (I)


Les formulaires permettent de transmettre des informations sous forme de chanes de caractres. Ils peuvent aussi permettre un internaute de transmettre un fichier vers le serveur. Cest la balise HTML suivante : <input type=file /> qui permet le chargement de fichiers. La balise FORM doit ncessairement possder lattribut ENCTYPE de valeur multipart/form-data. La mthode utilise sera POST. De plus, il est utile dimposer au navigateur une taille de fichier limite par le paramtre MAX_FILE_SIZE dont la valeur numrique a pour unit loctet. Exemple : echo <form action=\$PHP_SELF\ method=\POST\ ENCTYPE=\multipart/form-data\>\n <input type=\hidden\ name=\MAX_FILE_SIZE\ value=\1024000\ />\n <input type=\file\ name=\mon_fichier\ /><br />\n <input type=\submit\ value=\envoyer\ />\n </form>\n;
64/154

Chargement de fichiers (II)


Pour rcuprer le fichier, il faut utiliser la variable denvironnement $HTTP_POST_FILES qui est un tableau associatif dont les champs sont les noms des champs HTML file du formulaire. Par exemple : $HTTP_POST_FILES[mon_fichier] o mon_fichier est le nom donn au champs du formulaire HTML de type file. La variable $HTTP_POST_FILES[mon_fichier] est elle aussi un tableau associatif possdant les champs suivants :
Champ Description

name nom du fichier chez le client


type type MIME du fichier size taille du fichier en octets tmp_name nom temporaire du fichier sur le serveur

Si aucun fichier na t envoy par le client, la variable mon_fichier vaudra la chane de caractres : none ou bien (chane vide). La dure de vie du fichier temporaire sur le serveur est limite au temps dexcution du script. Pour pouvoir exploiter ultrieurement le fichier sur le serveur, il faut le sauvegarder dans un rpertoire et lui donner un vrai nom.
65/154

Chargement de fichiers (III)


Exemple du cas du chargement de ce qui doit tre une image GIF de moins de 1024.000 octets : // cration dune variable contenant toutes les infos utiles $file = $HTTP_POST_FILES[mon_fichier]; // si un fichier a bel et bien t envoy : if($file || ($file != none)) { // extraction du nom du fichier temporaire sur le serveur : $file_tmp = basename($file[tmp_name]); // vrification de la taille et du type MIME if(($file[size] <= 1024000) || ereg(gif$,$file[type])) // nouveau nom, emplacement et extension du fichier : $file_def = $dir./.$name...$ext; // copie du fichier temporaire dans son nouvel emplacement : copy($file_tmp, $file_def); } }
66/154

Chargement de fichiers (IV)


Il est important de vrifier avec is_file() si un fichier du mme nom existe dj sur le serveur lemplacement o on veut copier le nouveau fichier. On pourra supprimer lancien fichier avec unlink() (qui ne fonctionne pas avec les serveurs fonctionnant sous Windows). basename() permet de connatre le nom du fichier partir de son chemin (+nom) complet. Mme si le paramtre MAX_FILE_SIZE est inclus dans le formulaire, il est important de vrifier la taille du fichier rceptionn car rien nempche un internaute malveillant de modifier en local sur sa machine le formulaire pour y soustraire le champs cach MAX_FILE_SIZE afin de saturer le serveur avec des fichiers trop volumineux. La vrification du type MIME du fichier est galement importante dans le cas o on ne souhaite rceptionner que des types de fichiers bien particuliers (des images GIF, JPEG ou PNG par exemple).

67/154

Chargement de fichiers (V)


Pour charger simultanment plusieurs fichiers, il suffit de rajouter des crochets au nom du champ HTML file, et de mettre autant de champs file que dsir. Exemple : <input type=file name=mes_fichiers[] /> <input type=file name=mes_fichiers[] /> <input type=file name=mes_fichiers[] /> <input type=file name=mes_fichiers[] />

Dans cet exemple, linternaute pourra charger jusqu quatre fichiers.

68/154

Chargement de fichiers (VI)


A la rception, la variable $HTTP_POST_FILES sera un tableau de tableaux associatifs. Exemple : $files_tab = $HTTP_POST_FILES[mes_fichiers]; foreach($files_tab as $file) { /* faire le traitement vu prcdemment : - extraire le nom du fichier temporaire sur le serveur - vrifier la taille et le type MIME - donner un nouveau nom, emplacement et extension du fichier - copier le fichier temporaire dans son nouvel emplacement */ }

Les fichiers temporaires sont gnralement placs dans le rpertoire /tmp du serveur. Cest la directive de configuration upload_tmp_dir du fichier php.ini qui dtermine lemplacement des fichiers chargs par la mthode POST.

69/154

Chargement de fichiers (VII)


On aurait pu procder autrement quavec des crochets, en utilisant directement dans le formulaire HTML des champs file de noms compltement diffrents. Exemple : <input type=file name=mon_fichier /> <input type=file name=mon_autre_fichier /> Par contre, la rception, on ne peut plus utiliser de boucle !

Exemple : $file = $HTTP_POST_FILES[mon_fichier]; // puis faire le traitement vu prcdemment $file = $HTTP_POST_FILES[mon_autre_fichier]; // puis refaire encore le mme traitement
Lapproche utilisant des crochets convient au cas o le nombre de fichiers charger est dynamique (non connu lavance, dpend de paramtres divers).
70/154

Chargement de fichiers (VIII)


Pour les versions PHP 3 suprieures la 3.0.16, PHP4 suprieures la 4.0.2, il existe une autre mthode, plus simple : Exemple 1 : // vrification que le fichier a bien t envoy par la mthode POST if (is_uploaded_file($mon_fichier)) { // dplace le fichier dans le rpertoire de sauvegarde copy($userfile, $dest_dir); } Exemple 2 : /* dplace directement le fichier dans le rpertoire de sauvegarde en faisant les vrifications ncessaires */ move_uploaded_file($mon_fichier, $dest_dir);

71/154

Sessions (I)
Les sessions sont un moyen de sauvegarder et de modifier des variables tout au cours de la visite dun internaute sans quelles ne soient visibles dans lURL et quelque soient leurs types (tableau, objet). Cette mthode permet de scuriser un site, despionner le visiteur, de sauvegarder son panier (e-commerce), etc. Les informations de sessions sont conserves en local sur le serveur tandis quun identifiant de session est post sous la forme dun cookie chez le client (ou via lURL si le client refuse les cookies). Quelques fonctions : session_start() : dmarre une session session_destroy() : dtruit les donnes de session et ferme la session session_register(var) : enregistre la variable $var dans la session en cours, attention, ne pas mettre le signe $ (dollars) devant le nom de variable session_unregister(var) : dtruit la variable $var de la session en cours
72/154

Sessions (II)
Une session doit obligatoirement dmarrer avant lenvoi de toute information chez le client : donc pas daffichage et pas denvoi de header. On peut par exemple avoir une variable globale contenant le code HTML de la page et lafficher la fin du script. Les variables de session sont accessibles comme des variables globales du script. Exemple : <? $out = <html><body>; session_start(); // dmarrage de la session if(! isset($client_ip)) { $client_ip = $REMOTE_ADDR; session_register(client_ip); // enregistrement dune variable } /* + code de la page */ $out .= </body></html>; echo $out; ?>
73/154

Sessions (III)
Sauvegarder des variables de type objet dans une session est la mthode de scurisation maximum des donnes : elles napparatront pas dans lURL et ne pourront pas tre forces par un passage manuel darguments au script dans la barre dadresse du navigateur.

Les donnes de session tant sauvegardes sur le serveur, laccs aux pages nest pas ralenti mme si des donnes volumineuses sont stockes.
Une session est automatiquement ferme si aucune requte na t envoye au serveur par le client durant un certain temps (2 heures par dfaut dans les fichiers de configuration Apache). Une session est un moyen simple de suivre un internaute de page en page (sans quil sen rende compte). On peut ainsi sauvegarder son parcours, tablir son profil et tablir des statistiques prcises sur la frquentation du site, la visibilit de certaines pages, lefficacit du systme de navigation

74/154

Fichiers (I)
La manipulation de fichier se fait grce un identifiant de fichier. Quelques fonctions: fopen($file [,$mode]) : ouverture du fichier identifi par son nom $file et dans un mode $mode particulier, retourne un identificateur $fp de fichier ou FALSE si chec fopen($fp) : ferme le fichier identifi par le $fp fgets($fp, $length) : lit une ligne de $length caractres au maximum fputs($fp, $str) : crit la chane $str dans le fichier identifi par $fp fgetc($fp) : lit un caractre feof($fp) : teste la fin du fichier file_exists($file) : indique si le fichier $file existe filesize($file) : retourne la taille du fichier $file filetype($file) : retourne le type du fichier $file unlink($file) : dtruit le fichier $file copy($source, $dest) : copie le fichier $source vers $dest readfile($file) : affiche le fichier $file rename($old, $new) : renomme le fichier $old en $new
75/154

Fichiers (II)
Exemple typique daffichage du contenu dun fichier : <?php $file = fichier.txt ; if( $fd = fopen($file, r)) { // ouverture du fichier en lecture while ( ! feof($fd) ) { // teste la fin de fichier $str .= fgets($fd, 1024); /* lecture jusqu fin de ligne o des 1024 premiers caractres */ } fclose ($fd); // fermeture du fichier echo $str; // affichage } else { die(Ouverture du fichier <b>$file</b> impossible.); } ?>

76/154

Fichiers (III)
La fonction fopen permet douvrir des fichiers dont le chemin est relatif ou absolu. Elle permet aussi douvrir des ressources avec les protocols HTTP ou FTP. Elle renvoie FALSE si louverture choue. Exemples : $fp = fopen(../docs/faq.txt, r); $fp = fopen(http://www.php.net/,r); $fp = fopen(ftp://user:password@cia.gov/, w);

Les modes douverture : 'r' (lecture seule), 'r+' (lecture et criture), 'w' (cration et criture seule), 'w+ (cration et lecture/criture), 'a(cration et criture seule ; place le pointeur de fichier la fin du fichier), 'a+' (cration et lecture/criture ; place le pointeur de fichier la fin du fichier)

77/154

Accs aux dossiers (I)


Il est possible de parcourir les rpertoires grce ces quelques fonctions : chdir($str) : Change le dossier courant en $str. Retourne TRUE si succs, sinon FALSE. getcwd() : Retourne le nom du dossier courant (en format chane de caractres). opendir($str) : Ouvre le dossier $str, et rcupre un pointeur $d dessus si succs, FALSE sinon et gnre alors une erreur PHP qui peut tre chappe avec @. closedir($d) : Ferme le pointeur de dossier $d. readdir($d) : Lit une entre du dossier identifi par $d. Cest--dire retourne un nom de fichier de la liste des fichiers du dossier point. Les fichiers ne sont pas tris. Ou bien retourne FALSE sil ny a plus de fichier. rewinddir($d) : Retourne la premire entre du dossier identifi par $d.

78/154

Accs aux dossiers (II)


Exemple 1: <?php if ($dir = @opendir(.)) { while($file = readdir($dir)) { echo $file<br />; } closedir($dir); } ?>

// ouverture du dossier // lecture dune entre // affichage du nom de fichier // fermeture du dossier

$dir est un pointeur vers la ressource dossier $file est une chane de caractres qui prend pour valeur chacun des noms de fichiers retourns par readdir()

79/154

Accs aux dossiers (III)


Il existe un autre moyen daccder aux dossiers : lutilisation de la pseudoclasse dir. En voici les attributs : handle : valeur du pointeur path : nom du dossier En voici les mthodes : read() : quivalent readdir($d) close() : quivalent closedir($d) Constructeur : dir($str) : retourne un objet dir et ouvre le dossier $str

80/154

Accs aux dossiers (IV)


Exemple 2 : <?php $d = dir(.); // ouverture du dossier courant echo Pointeur: .$d->handle.<br />; echo Chemin: .$d->path.<br />; while($entry = $d->read()) { // lecture dune entre echo $entry.<br />; } $d->close(); // fermeture du dossier ?> Cet exemple est quivalent au prcdent. Ils listent tous les deux les fichiers et sous rpertoires du dossier courant.

81/154

Dates et heures (I)


Les fonctions de dates et heures sont incontournables sur Internet et sont indispensables pour la conversion en franais des dates fournies par la base de donnes MySQL qui les code au format anglophone (YYYY-DD-MM hh:mm:ss).

Quelques fonctions : date($format) : retourne une chane de caractres contenant la date et/ou lheure locale au format spcifi getdate() : retourne un tableau associatif contenant la date et lheure checkdate($month, $day, $year) : vrifie la validit dune date mktime ($hour, $minute, $second, $month,$day, $year) : retourne le timestamp UNIX correspondant aux arguments fournis cest--dire le nombre de secondes entre le dbut de l'poque UNIX (1er Janvier 1970) et le temps spcifi time() : retourne le timestamp UNIX de lheure locale

82/154

Dates et heures (II)


Exemple 1 : echo date(''Y-m-d H:i:s''); /* affiche la date au format MySQL : 2002-03-31 22:30:29 */

Exemple 2 : if(checkdate(12, 31,2001)) echo La St Sylvestre existe mme chez les anglais !!!; Exemple 3 : $aujourdhui = getdate(); $mois = $aujourdhui['mon']; $jour = $aujourdhui['mday']; $annee = $aujourdhui['year']; echo ''$jour/$mois/$annee'';

// affiche 31/3/2002

83/154

Dates et heures (III)


Les formats pour date :
d Jour du mois sur deux chiffres [01..31] j Jour du mois sans les zros initiaux l Jour de la semaine textuel en version longue et en anglais D Jour de la semaine textuel en trois lettres et en anglais w Jour de la semaine numrique [0..6] (0: dimanche) z Jour de l'anne [0..365] m Mois de l'anne sur deux chiffres [01..12] n Mois sans les zros initiaux F Mois textuel en version longue et en anglais M Mois textuel en trois lettres Y Anne sur 4 chiffres y Anne sur 2 chiffres h Heure au format 12h [01..12] g Heure au format 12h sans les zros initiaux H Heure au format 24h [00..23] G Heure au format 24h sans les zros initiaux i Minutes [00..59] s Secondes [00.59] a am ou pm A AM ou PM L Boolen pour savoir si l'anne est bisextile (1) ou pas (0) S Suffixe ordinal anglais d'un nombre (ex: nd pour 2) t Nombre de jour dans le mois donn [28..31] U Secondes depuis une poque Z Dcalage horaire en secondes [-43200..43200]

84/154

Dates et heures (IV)


Les cls du tableau associatif retourn par getdate :
seconds : secondes minutes : minutes hours : heures mday : jour du mois wday : jour de la semaine, numrique mon : mois de l'anne, numrique year : anne, numrique yday : jour de l'anne, numrique weekday : jour de la semaine, textuel complet en anglais month : mois, textuel complet en anglais

85/154

Expressions rgulires (I)


Les expressions rgulires sont un outil puissant pour la recherche de motifs dans une chane de caractres. Fonctions : ereg($motif, $str) : teste lexistence du motif $motif dans la chane $str ereg_replace($motif, $newstr, $str) : remplace les occurrences de $motif dans $str par la chane $newstr split($motif, $str) : retourne un tableau des sous-chanes de $str dlimites par les occurrences de $motif Les fonctions eregi, eregi_replace et spliti sont insensibles la casse (cest-dire ne diffrencient pas les majuscules et minuscules). Exemple : if (eregi(Paris, $adresse)) echo Vous habitez Paris.;

86/154

Expressions rgulires (II)


Les motifs peuvent tre trs complexes et contenir des caractres spciaux. Les caractres spciaux : [abcdef] : intervalle de caractres, teste si lun deux est prsent [a-f] : plage de caractres : teste la prsence de tous les caractres minscules entre a et f [^0-9] : exclusion des caractres de 0 9 \^ : recherche du caractre ^ que lon dspcialise par lantislash \ . : remplace un caractre ? : rend facultatif le caractre quil prcde + : indique que le caractre prcdent peut apparatre une ou plusieurs fois * : pareil que + Mais le caractre prcdent peut ne pas apparatre du tout {i,j} : retrouve une chane contenant entre au minimum i et au maximum j fois le motif quil prcde {i,} : idem mais pas de limite maximum {i} : retrouve une squence dexactement i fois le motif quil prcde ^ : le motif suivant doit apparatre en dbut de chane $ : le motif suivant doit apparatre en fin de chane
87/154

Expressions rgulires (III)


Exemples de motifs : [A-Z] : recherche toutes les majuscules [a-zA-Z] : recherche toutes les lettres de lalphabet minuscules ou majuscules [^aeyuio] : exclu les voyelles ^Le : toute chane commenant par le mot Le suivi dun espace $\.com : toute chane se terminant par .com (dspcialise le point) Exemples : if ( ereg(^.*@wanadoo\.fr, $email) ) { echo Vous tes chez Wanadoo de France Tlcom.; }

$email = eregi_replace(@, -nospam@, $email);


Ce dernier exemple remplace moi@ici.fr en moi-nospam@ici.fr.

88/154

Expressions rgulires (IV)


Il existe des squences types : [[:alnum:]] : [A-Za-z0-9] caractres alphanumriques [[:alpha:]] : [A-Za-z] caractres alphabtiques [[:digit:]] : [0-9] caractres numriques [[:blank:]] : espaces ou tabulation [[:xdigit:]] : [0-9a-fA-F] caractres hexadcimaux [[:graph:]] : caractres affichables et imprimables [[:lower:]] : [a-z] caractres minuscules [[:upper:]] : [A-Z] caractres majuscules [[:punct:]] : caractres de ponctuation [[:space:]] : tout type despace [[:cntrl:]] : caractres dchappement [[:print:]] : caractres imprimables sauf ceux de contrle

89/154

Enttes HTTP (I)


Il est possible denvoyer des enttes particuliers du protocole HTTP grce la commande header. Syntaxe : header($str); Exemples : header(Content-type: image/gif); // spcifie le type dimage gif header(Location: ailleurs.php); // redirection vers une autre page header(Last-Modified: .date(D, d M Y H:i:s). GMT);

Les enttes doivent obligatoirement tre envoyes avant laffichage de tout caractre dans la page en cours. Car laffichage force lenvoi des enttes de base.
headers_sent() : Retourne TRUE si les enttes ont dj t envoyes, FALSE sinon.

90/154

Enttes HTTP (II)


Le rle des enttes est dchanger des mta informations entre serveur et client propos du document, de la connexion, etc. Voici quelques enttes HTTP :
HTTP/1.0 404 Not Found HTTP/1.0 301 Moved Permanently Date: Sun, 07 Apr 2002 14:39:29 GMT Server: Apache/1.3.9 (Unix) Debian/GNU Last-Modified: Sun, 07 Apr 2002 14:39:29 GMT Connection: keep-Alive Keep-Alive: timeout=15, max=100 Content-type: text/html Content-length: 1078 Transfert-Encoding: chunked Pragma: no-cache WWW-Authenticate: Basic realm="Domaine scuris" Location: home.html

91/154

Enttes HTTP (III)


Exemple pratique 1 : <?php header(Location: home2.php); exit(); ?> Ce script effectue une redirection vers une autre page. Cest--dire que le navigateur du client en voyant cet entte Location va charger directement la page indique sans regarder la suite du script. La fonction exit est l pour parer au cas impossible o le script continuerait son excution. Note: en rgle gnrale, le format dun entte est le suivant Champ: valeur Avec un espace entre les deux points : et la valeur.

92/154

Enttes HTTP (IV)


Exemple pratique 2 : <?php if(!isset($PHP_AUTH_USER)) { header(WWW-Authenticate: Basic realm=\Mon domaine\); header(HTTP/1.0 401 Unauthorized); echo Echec de lidentification.; exit(); } else { echo Bonjour $PHP_AUTH_USER.<br />; echo Votre mot de passe : $PHP_AUTH_PW.; } ?> Cet exemple fait intervenir les variables denvironnement $PHP_AUTH_USER et $PHP_AUTH_PW qui contiennent le login et mot de passe dun utilisateur pralablement identifi. Si lutilisateur nest pas identifi, alors on demande au navigateur dafficher une boite de saisie de mot de passe et on spcifie que laccs est interdit. Une fois que lutilisateur est identifi on peut contrler la validit des login et mot de passe et sils sont corrects afficher des donnes sensibles. Attention, cette mthode ne fonctionne pas lorsque PHP est install en tant que module dApache mais seulement lorsquil est compil en mme temps que le serveur Apache.
93/154

Mail (I)
La fonction mail envoie un message lectronique. Syntaxe : mail($recipient, $subject, $message[, $headers, $params]); Exemple : $message = Allez sur le site du CyberZode Qui Frtille, vous y trouverez un tutoriel complet sur le PHP4 et MySQL.; mail(vous@labas.fr, Aide sur PHP, $message); Les arguments obligatoires sont le destinataire, le sujet du message ainsi que le message proprement dit. Les enttes et paramtres additionnels sont facultatifs. Note: cette fonction ne marche que si un programme de messagerie lectronique (appel mailer ) est pralablement install sur le serveur.

94/154

Mail (II)
Exemple plus complet : <?php $recipient = Tony <tony@labas.com>, ; $recipient .= Peter <peter@pwet.net>; $subject = Notre rendez-vous; $message = Je vous propose le samedi 15 juin \n; $message .= --\r\n; // Dlimiteur de signature $message .= Le CyberZode Qui Frtille; $headers = From: Hugo Etivant <cyberzoide@multimania.com>\n; $headers .= Content-Type: text/html; charset=iso-8859-1\n ; $headers .= Cc: bruno@ici.fr\n; mail($recipient, $subject, $message, $headers); ?>

95/154

Mail (III)
Quelques enttes : From: Hugo Etivant <theboss@php-help.com>\n X-Mailer: PHP\n X-Priority: 1\n X-Files: Truth is out there\n Return-Path: <deamon@php-help.com>\n Content-Type: text/html; charset=iso-8859-1\n Cc: archives@php-help.com\n Bcc: bill@php.net, tony@phpinfo.net\n Reply-To: <hugo@php-help.com> Format gnral des enttes : Nom-Entete: valeur\n

// maileur // Message urgent! // entte fantaisiste ! // @ retour pour erreurs // Type MIME // Champs CC // Champs BCC // @ de retour

96/154

Evaluation dune portion de code PHP


La fonction eval($str) value la chane de caractres $str comme du code php. Les variables ventuellement dfinies dans cette chane seront connues dans le reste du programme principal. Grce cette fonction, on peut conserver dans une base de donnes, des portions de code utilisables ultrieurement. Le code de la chane $str doit respecter les mmes contraintes que le code normal. Notamment : - point virgule aprs chaque instruction - respect des squences dchappement - etc Exemple : $foobar = Hello Word; eval(echo $foobar;); // affiche Hello Word

97/154

Colorisation syntaxique (I)


PHP dispose de fonctions qui permettent dafficher le code source de scripts php et den coloriser la syntaxe. Il nest pas recommand dutiliser les fonctions suivantes afin que vos visiteurs ne connaissent pas votre code source et ne puissent ainsi pas exploiter des vulnrabilit de votre application web. highlight_file($file), show_source : Colorisation de la syntaxe d'un fichier. Affiche la syntaxe colorise du fichier $file, en utilisant les couleurs dfinies dans le moteur interne de PHP. highlight_string($str) : Colorisation d'une chane de caractres contenant du code php.

98/154

Colorisation syntaxique (II)


Exemple : <?php highlight_file(sondage.php); ?> Rsultat affich : <?php $out = "<html><body>"; ConnexionSQL(); echo date("D, d M Y H:i:s"); if($action == "add") { AddNew(); } elseif($action == "stats") { ShowStats(); } /* ShowSubmitForm(); */ ShowStats(); $out .= "</body></html>"; echo $out; ?>
99/154

Colorisation syntaxique (III)


La configuration de la colorisation se trouve dans le fichier php.ini :

Et voici comment la commande phpinfo() affiche ces informations :

Couleur de fond Couleur des commentaires Couleur par dfaut Couleur des balises HTML Couleur des mots rservs Couleur des chanes

100/154

URL (I)
Les URL (Uniform Ressource Location) sont les chemins de ressources sur internet. Exemples dURL: http://www.google.fr/?q=cours+php http://cyberzoide.developpez.com/php/php4_mysql.ppt ftp://foo:0478@ftp.download.net Leur format spcifique leur interdit de comporter nimporte quel caractre (comme lespace par exemple). Une URL est une chane de caractres compose uniquemment de caractres alphanumriques incluant des lettres, des chiffres et les caractres : - (tirt), _ (soulign), . (point). Tous les autres caractres doivent tres cods. On utilise le code suivant : %xx. O % introduit le code qui le suit et xx est le numro hexadcimal du caractre cod.

101/154

URL (II)
Le passage de valeur dun script lautre se fait soit par les sessions, soit par les formulaires ou encore par lURL. Exemple par lURL : <a href=index.php?imprim=yes&user_id=75>Version imprimable</a> Dans cet exemple on transmet deux variables au script index.php : $imprim de valeur yes et $user_id de valeur 75. Les valeurs sont des chanes de caractres qui pouront tre castes implicitement en entier. Le caractre ? Indique que la suite de lURL sont des paramtres et ne font pas partie du nom de fichier. Le caractre = spare un nom de paramtre et sa valeur transmise. Le caractre & sparer deux paramtres.

Pour faire face au cas gnral dun paramtre dont la valeur contient des caractres interdits, on utilise les fonction de codage.

102/154

URL (III)
Quelques fonctions de codage sur lURL : Codage de base : urlencode : Encode une chane en URL. urldecode : Dcode une chane encode URL. Codage complet : rawurlencode : Encode une chane en URL, selon la RFC1738. rawurldecode : Dcode une chane URL, selon la RFC1738. Codage plus volu : base64_encode : Encode une chane en MIME base64. base64_decode : Dcode une chane en MIME base64

103/154

URL (IV)
urlencode($str) : code la chane $str. Les espaces sont remplacs par des signes plus (+). Ce codage est celui qui est utilis pour poster des informations dans les formulaires HTML. Le type MIME utilis est application/x-www-formurlencoded.

Exemple 1 : echo <a href=\$PHP_SELF?foo=.urlencode($foo).\>Foo</a>;


rawurlencode($str) : code la chane $str. Remplace tous les caractres interdits par leur codage quivalent hexadcimal. Exemple 2 : echo <a href=\$PHP_SELF?foo=.rawurlencode($foo).\>Foo</a>;

Pour tre accessible, la valeur du paramtre devra par la suite tre dcode dans le script darriv par la fonction rciproque adquate.

104/154

URL (V)
base64_encode($str) : code la chane $str en base 64. Cet encodage permet des informations binaires d'tre manipules par les systmes qui ne grent pas correctement les codes 8 bits (code ASCII 7 bit tendu aux accents europens), comme par exemple, les corps de mail qui en gnral sont amricains et ne gre que les 7 bits. Une chane encode en base 64 a une taille denviron 33% suprieure celle des donnes initiales. Exemple 3 : echo <a href=\$PHP_SELF?foo=.base64_encode($foo).\>Foo</a>;

Comparatif des trois encodages : Sans codage : Ren & Cie : 30%-5*20 urlencode : Ren%E9+%26+Cie+%3A+30%25-5%2A20 rawurlencode : Ren%E9%20%26%20Cie%20%3A%2030%25-5%2A20 base64_encode : UmVu6SAmIENpZSA6IDMwJS01KjIw

105/154

URL (VI)
parse_url($str) : retourne un tableau associatif contenant les diffrents lments de lURL passe en paramtre. Les champs sont les suivants : scheme (protocol), host (domaine), port (n de port), user (nom dutilisateur ftp), pass (mot de passe ftp), path (chemin de la ressource), query (paramtres et valeurs), et fragment. Exemple : $tab = parse_url(http://www.cia.gov:8080/form.php?var=val); Cet exemple retourne le tableau suivant :
Champ Valeur scheme http host www.cia.gov

port 8080
path form.php query var=val
106/154

URL (VII)
parse_str($str) : analyse la chane $str comme si ctait une URL et en extrait les variables et valeurs respectives qui seront alors connues dans la suite du script. Cette fonction vite davoir crer ses propres fonctions danalyse de champs de base de donnes o lon aurait sauvegard une url. Exemple : $str = nom=jean+pierre&email[]=moi@ici.fr&email[]=moi@labas.com; parse_str($str); echo $nom, $email[0], $email[1];

107/154

Cryptage et autres rjouissances


crypt($str [, $salt]) : Retourne une chane de caractres. Crypte la chane de caractres $str. La chane optionnelle $salt sert de base au cryptage. Cet argument optionnel est appel grain de sel limage des germes de nuclation lorigine des dendrites. Lalgorythme de cryptage utilis par PHP nest a priori pas dfini (il peut varier dun systme un autre), mais cest en gnral le DES standard ou bien encore MD5. On sait aussi que le systme utilis quel quil soit est injectif, cest--dire quil nexiste pas dalgorithme symtrique pour dcrypter la chane code rsultante (du moins officiellement, il est toujours possible que la NSA ait pu le faire et aurait alors tout intrt garder cela secret). md5($str) : Crypte la chane $str en utilisant la mthode MD5. crc32($str) : Retourne la somme de vrification de redondance cyclique (32bit) de la chane $str. Cette valeur sert gnralement vrifier l'intgrit de donnes transmises. uniqid($str [, $lcg]) : Retourne un identifiant en chane de caractres prfix unique, bas sur l'heure courante, en micro-secondes. Si le paramtre optionnel boolen $lcg est vrai, uniqid() ajoutera une entropie combined LCG la fin de la valeur retourne, ce qui renforcera encore l'unicit de l'identifiant. $x = md5 (uniqid (rand())); // $x est une chane difficile prdire !!!

108/154

Fonctions de hachage (I)


Les fonctions de hachage sappliquent des donnes afin den produire un condensat (dit aussi hashcode). Ce condensat est calcul partir des donnes dorigine grce un algorithme injectif. Cest--dire que lapplication de cet algorithme produira toujours le mme condensat si on utilise les mmes donnes de dpart. Par contre, deux condensats gaux ne proviennent pas forcment des mmes donnes. Les fonctions de hachage sont gnralement utilises pour crer des sommes de vrification ou signer des messages. La gnration de condensats joints aux donnes est une mthode trs utilise pour assurer lintgrit des donnes contre le piratage. Mthodologie : X veux envoyer un message Y de faon a sassurer que personne ne pourra altrer le message (le modifier) sans que Y sen rende compte. X va calculer un condensat C du message et lenvoier Y avec le message. A rception du message, Y calcul lui aussi un condensat K du message et le compar au condensat C envoy par X. Si K est diffrent de C, alors le message reu est diffrent du message envoy ! mhash($hash,$data) : retourne le condensat (binaire) de la chane $data, calcul partir de lalgorithme didentifiant numrique $hash.

109/154

Fonctions de hachage (II)


Il existe diffrents algorithmes de hachage :
Algorithme CRC32 Constante (identifiant) MHASH_CRC32 Valeur 0 Taille du bloc 4

MD5
SHA1 HAVAL256 RIPEMD160 TIGER

MHASH_MD5
MHASH_ SHA1 MHASH_HAVAL256 MHASH_RIPEMD160 MHASH_TIGER

1
2 3 5 7

16
20 32 20 24

GOST
CRC32B HAVAL224 HAVAL192 HAVAL160

MHASH_GOST
MHASH_CRC32B MHASH_HAVAL224 MHASH_HAVAL192 MHASH_HAVAL160

8
9 10 11 12

32
4 28 24 20

Lidentifiant numrique pass en paramtre mhash() est une constante. Les algorithmes agissent sur les donnes par bloc de x octets. Cette taille x est spcifie dans le tableau ci-dessus.
110/154

Fonctions de hachage (III)


Exemple : $data = TOP SECRET : mise en alerte des missiles nuclaires.; $condensat = mhash(MHASH_SHA1, $data); echo bin2hex($condensat); /* affiche : 28424f16ae4a53ae865601372a3462a014614c3b (la fonction bin2hex() convertit le binaire en hexadcimal) */ mhash_get_hash_name($hash) : retourne le nom de lalgorithme dont lidentifiant numrique est pass en paramtre. mhash_get_block_size() : retourne la taille des blocs utiliss par lalgorithme dont lidentifiant numrique est pass en paramtre. mhash_count() : retourne le plus grand identifiant dalgorithme de hachage connu par linterprteur PHP. mhash_keygen_s2k($hash, $pass, $salt, $nbr) : retourne une clef de $nbr octets partir du mot de passe $pass et du grain de sel $salt (chane de 8 octets complte par des zros sil le faut) en utilisant lalgorithme didentifiant $hash associ lalgorithme Salted S2K spcifi dans OpenPGP (RFC 2440).
111/154

Fonctions de hachage (IV)


Pour connatre les algorithmes disponibles sur votre systme, vous pouvez procder ainsi : $nbr = mhash_count(); echo <table>; for($i = 0; $i <= $nbr; $i++) { if(mhash_get_hash_name($i)) echo <tr><td>$i</td><td>.mhash_get_hash_name($i).</td><td>. mhash_get_block_size($i).</td></tr>; } echo </table>;

112/154

Divers
defined($str) : Vrifie qu'une constante existe. Renvoie VRAI si la constante dont le nom est pass en paramtre existe ou FAUX sinon. sleep($nbr) : Retarde l'excution du script durant $nbr secondes. Attention, Apache peut tre configurer pour limiter la dure dexcution des scripts. usleep($nbr) : Retarde l'excution du script durant $nbr microsecondes.

113/154

Requtes Apache (I)


getallheaders() : renvoie un tableau associatif contant tous les enttes de la requte en cours. Exemple : $headers = getallheaders() ; foreach($headers as $key => $elem) // affichage des enttes recueillies echo $key : $elem<br />\n ; Cet exemple affiche : Accept : */* Accept-Encoding : gzip, deflate Accept-Language : fr Connection : Keep-Alive Host : 127.0.0.1 User-Agent : Mozilla/4.0 (compatible; MSIE 5.5; Windows 98;) Les fonctions dcrites ici de fonctionnent que si PHP est install en tant que module du serveur HTTP Apache.
114/154

Requtes Apache (II)


apache_lookup_uri($str) : effectue une requte partielle sur l'URI spcifie en paramtre et retourne un objet contenant toutes les informations importantes la concernant. Les proprits de lobjet retourn sont : status (n erreur HTTP), the_request (requte HTTP complte), status_line, method (mthode HTTP utilise), content_type (type MIME de la ressource), handler, uri, filename (nom et chemin de la ressource en local sur le serveur), path_info (chemin du rpertoire distant), args, boundary, no_cache (vaut 1 si mise en cache interdite), no_local_copy (vaut 1 si copie locale interdite), allowed, send_bodyct, bytes_sent, byterange, clength, unparsed_uri, mtime, request_time (date de la requte au format timestamp UNIX).

115/154

Requtes Apache (III)


Exemple : $obj = apache_lookup_uri('http://127.0.0.1/cyberzoide/essai.php') ; $tab = get_object_vars($obj) ; foreach($tab as $key => $elem) echo $key : $elem <br />\n ; Cet exemple affiche :
status : 403 the_request : GET /cyberzoide/essai.php HTTP/1.1 method : GET uri : /cyberzoide/http://127.0.0.1/cyberzoide/essai.php filename : d:/internet/cyberzoide/http: path_info : //127.0.0.1/cyberzoide/essai.php no_cache : 0 no_local_copy : 1 allowed : 0 sent_bodyct : 0 bytes_sent : 0 byterange : 0 clength : 0 unparsed_uri : /cyberzoide/http://127.0.0.1/cyberzoide/essai.php request_time : 1034444645
116/154

Rseau
checkdnsrr Rsolution DNS d'une adresse IP. gethostbyaddr Retourne le nom d'hte correspondant une IP. gethostbyname Retourne l'adresse IP correspondant un hte. gethostbynamel Retourne la liste d'IP correspondants un hte. getprotobyname Retourne le numro de protocole associ au nom de protocole getprotobynumber Retourne le nom de protocole associ au numro de protocole getservbyname Retourne le numro de port associ un service Internet, et un protocole. getservbyport Retourne le service Internet qui correspond au port et protocole. ip2long Convertit une chane contenant une adresse (IPv4) IP numrique en adresse littrale. long2ip Convertit une adresse IP (IPv4) en adresse IP numrique

117/154

Exercice 1 : conversion de date (I)


Etudions lexemple complet de la conversion dune date au format anglophone MySQL en format francophone. Une date MySQL se prsente ainsi : YYYY-DD-MM hh:mm:ss YYYY : lanne numrique avec 4 chiffres, DD : le jour numrique, MM : le mois numrique, hh : heures, mm : minutes, ss : secondes Tous les nombres sur 2 chiffres prennent un zro devant si ncessaire. Par exemple : 2002-20-04 15:08:20 correspond au 20 avril 2002 15h08 et 20 secondes. Ce format correspond au type DATETIME. Soit lastmodified un attribut dune table MySQL. La requte suivante permet dextraire la date de dernire modification dun enregistrement. SELECT lastmodified FROM citations WHERE id=$id;
118/154

Exercice 1 : conversion de date (II)


Etape 1 : extraction de la date dune base de donnes MySQL $requet = SELECT lastmodified FROM citations WHERE id=\$id\; if($result = mysql_query($requet)) { if($ligne = mysql_fetch_row($result)) { $lastmodifed = $ligne[0]; } else die(Erreur base de donnes); } else die(Erreur base de donnes); Etape 2 : sparation de la date et de lheure Le seul espace de la chane de caractres qui constitue la variable $lastmodified est un sparateur entre la date et lheure. On va donc la scinde en ses deux morceaux grce la fonction explode qui renvoie les sous chanes dans un tableau dont est extrait grce list les deux variables $date et $time. list($date, $time) = explode( , $lastmodified);

119/154

Exercice 1 : conversion de date (III)


Etape 3 : extraction des jour, mois, anne On procde selon le mme schma que prcdemment sauf quici cest le tiret qui est sparateur dans la date. list($year, $day, $month) = explode(-, $date); Etape 4 : extraction facultative des heure, minute, seconde Ici, le sparateur sont les deux points. list($hour, $min, $sec) = explode(:, $time);

Etape 5 : affichage au format francophone echo $lastmodified = $day/$month/$year $time; Affiche 20/04/2002 15:08:20. On a donc transcrit en franais notre date anglaise. On peut aller encore plus loin en affichant les mois en toutes lettres et en franais.

120/154

Exercice 1 : conversion de date (IV)


Etape 6 : affichage en toutes lettres du mois On cre dabord le tableau des mois de lanne. $months = array("janvier", "fvrier", "mars", "avril", "mai", "juin", "juillet", "aot", "septembre", "octobre", "novembre", "dcembre"); Ensuite, on affiche llment du tableau des mois de lanne dont lindice est gale au numro du mois. Comme lindice du tableau commence zro, il faut soustraire 1 $month, cela aura aussi pour effet de caster cette chane en entier (et de supprimer le zro ventuel en premire position). echo $lastmodified = le $day .$months[$month-1]. $year ${hour}h${min}m${sec}s; Affiche le 20 avril 2002 15h08m20s. Et voil !

121/154

Exercice 2 : compteur de visites (I)


On souhaite comptabilis le nombre de chargement dune page (la page daccueil par exemple). On va procder de la faon suivante : le compteur numrique sera stock dans un fichier, la premire ligne. Ce fichier contiendra seulement un nombre, celui des visites.

Phase 1 : incrmenter la valeur dans le fichier Ce fichier va sappeler compteur.cpt. Principe de lalgorithme : si le fichier nexiste pas encore (file_exists), alors on le cre et on louvre en criture (fopen w) et on initialise le compteur zro en crivant la chane 0 en premire ligne (fputs) et on le referme (fclose). Ensuite, ouverture du fichier en lecture plus criture (fopen r+), lecture du nombre (fgets), incrmentation dune unit du nombre (++), positionnement du pointeur courant du fichier en premire ligne (fseek 0) et rcriture du nombre (fputs) puis fermeture (fclose). Cet algorithme (crit dans la diapo suivante) est crit directement dans le code source de la page daccueil.

122/154

Exercice 2 : compteur de visites (II)


Algorithme : $fichier = "compteur.cpt"; // affectation du nom de fichier if( ! file_exists($fichier)) { // test dexistence // initialisation du fichier si nexiste pas encore $fp = fopen($fichier,"w"); // ouverture en criture fputs($fp,"0"); // criture fclose($fp); // fermeture } $fp = fopen($fichier,"r+"); // ouverture $hits = fgets($fp,10); // lecture $hits++; // incrmentation fseek($fp,0); // positionnement fputs($fp,$hits); // criture fclose($fp); // lecture

123/154

Exercice 2 : compteur de visites (III)


Phase 2 : gnralisation aux autres pages Comme les internautes peuvent atterrir sur des pages internes votre site sans passer par laccueil, il peut tre intressant de pouvoir comptabilit des visites des autres pages. Cela permettra aussi de comparer la popularit relative de vos diffrentes rubriques. Crons donc une fonction que lon placera dans un fichier part par exemple compteur.php et que lon appellera par inclusion comme ceci : <?php include("compteur.php"); Mon_Compteur("ma_page") ?> Remplacez "ma_page" par un identifiant unique pour chaque page. <? function Mon_Compteur($page) { $fichier = $page.".cpt"; if(!file_exists($fichier)) { $fp = fopen($fichier,"w"); fputs($fp,"0"); fclose($fp); } $fp = fopen($fichier,"r+"); $hits = fgets($fp,10); $hits++; fseek($fp,0); fputs($fp,$hits); fclose($fp); } ?>

124/154

Exercice 2 : compteur de visites (IV)


Phase 3 : protection contre la redondance Comme un visiteur peut charger plusieurs fois la mme page au cours dune mme visite, ce mode de dcompte nest pas assez prcis et va surestim le nombre rel de visiteurs. Il faut donc garder en mmoire le fait quun visiteur est dj pass par la page et incrmenter le compteur seulement si ce nest pas le cas. On va donc crer une variable de session : un tableau contenant la liste des pages visites. Principe du nouvel algorithme : on teste lexistence de la variable de session $PAGES_LIST, si elle nexiste pas on la cre, on y ajoute la page en cours et on appelle la fonction Mon_Compteur. Si elle existe, on teste la prsence de la page en cours dans ce tableau, si elle ny est pas alors on ly met et on appelle Mon_Compteur. Lappel est lgrement diffrent : <?php $page = "ma_page"; // dfinition du nom de la page include("compteur.php"); // chargement de lalgorithme ?>

125/154

Exercice 2 : compteur de visites (V)


Voici le code rajouter dans le fichier compteur.php : session_start(); // dmarrage de la session if( ! isset($PAGES_LIST)) { // test de lexistence de la variable de session $PAGES_LIST = array($page); // cration de la variable session_register($PAGES_LIST); // ajout de la page en cours Mon_compteur($page); // incrmentation du compteur } else { if( ! in_array($page, $PAGES_LIST)) { // test de redondance $PAGES_LIST[ ] = $page; /* ajout dans la variable de session pour viter la redondance */ Mon_compteur($page); // incrmentation du compteur } }

126/154

Le phnomne PHP
Sa gratuit et le libre accs ses sources en fait un langage trs populaire surtout auprs de la communaut GNU Linux. Sa syntaxe C universellement connue, et sa programmation intuitive en font le langage qui a fait la plus grande perce auprs des webdesigners en 2001. De nombreux sites lui sont consacrs, on y trouve des scripts, des astuces et mme des concours de logos

127/154

Partie 2 : MySQL

128/154

Prsentation
MySQL est une base de donnes implmentant le langage de requte SQL un langage relationnel trs connu. Cette partie suppose connue les principes des bases de donnes relationnelles. Il existe un outil libre et gratuit dvelopp par la communaut des programmeurs libres : phpMyAdmin qui permet ladministration aise des bases de donnes MySQL avec php. Il est disponible sur : http://sourceforge.net/projects/phpmyadmin/ et http://www.phpmyadmin.net. Avec MySQL vous pouvez crer plusieurs bases de donnes sur un serveur. Une base est compose de tables contenant des enregistrements. Plus d'informations sont disponibles http://www.mysql.com/.

La documentation de MySQL est disponibles http://www.mysql.com/documentation/, ainsi qu'en franais chez nexen : http://dev.nexen.net/docs/mysql/.

129/154

Connexion (I)
Pour se connecter une base depuis php, il faut spcifier un nom de serveur, un nom dutilisateur, un mot de passe et un nom de base. Les fonctions de connexion : mysql_connect($server,$user,$password) : permet de se connecter au serveur $server en tant quutilisateur $user avec le mot de passe $password, retourne lidentifiant de connexion si succs, FALSE sinon mysql_select_db($base[,$id]) : permet de choisir la base $base, retourne TRUE en cas de succs, sinon FALSE mysql_close([$id]) : permet de fermer la connexion mysql_pconnect : idem que mysql_connect sauf que la connection est persistante, il ny a donc pas besoin de rouvrir la connexion chaque script qui travaille sur la mme base.

Les identifiants de connexion ne sont pas ncessaires si on ne se connecte qu une seule base la fois, ils permettent seulement de lever toute ambigut en cas de connexions multiples.

130/154

Connexion (II)
Exemple 1 : if( $id = mysql_connect(localhost,foobar,0478) ) { if( $id_db = mysql_select_db(gigabase) ) { echo Succs de connexion.; /* code du script */ } else { die(Echec de connexion la base.); } mysql_close($id); } else { die(Echec de connexion au serveur de base de donnes.); }

131/154

Connexion (III)
Exemple 2 : @mysql_connect(localhost,foobar,0478) or die(Echec de connexion au serveur.); @mysql_select_db(gigabase) or die(Echec de slection de la base.); Cet exemple est quivalent au prcdent mais plus court crire. Le symbole @ (arobase) permet dviter le renvoie de valeur par la fonction quil prcde. On pourra avantageusement intgrer ce code dans un fichier que lon pourra joindre par include(). Cest aussi un moyen de scuriser le mot de passe de connexion. Une connexion persistante vite davoir rouvrir une connexion dans chaque script. Les connexions sont automatiquement fermes au bout dun certain temps en cas dabsence de toute activit

132/154

Interrogation
Pour envoyer une requte une base de donne, il existe la fonction : mysql_query($str) qui prend pour paramtre une chane de caractres qui contient la requte crite en SQL et retourne un identificateur de rsultat ou FALSE si chec.

Les requtes les plus couramment utilises sont : CREATE (cration dune table), SELECT (slection), INSERT (insertion), UPDATE (mise jour des donnes), DELETE (suppression), ALTER (modification dune table), etc.
Exemple : $result = mysql_query(SELECT address FROM users WHERE name=\$name\); Cet exemple recherche ladresse de lutilisateur portant pour nom la valeur de la chane $name. Lidentificateur de rsultat $result permettra dautres fonctions dextraire ligne par ligne les donnes retournes par le serveur. Attention, contrairement Oracle SQL, les requtes MySQL ne se terminent pas par un point virgule ; et nautorisent pas les SELECT imbriqus.
133/154

Extraction des donnes (I)


Une fois la requte effectue et lidentificateur de rsultat acquis, il ne reste plus qu extraire les donnes retournes par le serveur. Sous Oracle, laffichage des rsultats dune requte se fait ligne par ligne, sous MySQL, cest pareil. Une boucle permettra de recueillir chacune des lignes partir de lidentifiant de rsultat.
SQL > SELECT * FROM users; ID NAME ADDRESS ---------------------------1 Boris Moscou 2 Bill Washington 3 William London

1re ligne 2me ligne 3 ligne

Une ligne contient (sauf cas particulier) plusieurs valeurs correspondants aux diffrents attributs retourns par la requte. Ainsi, une ligne de rsultat pourra tre sous la forme dun tableau, dun tableau associatif, ou dun objet.

134/154

Extraction des donnes (II)


mysql_fetch_row($result) : retourne une ligne de rsultat sous la forme dun tableau. Les lments du tableau tant les valeurs des attributs de la ligne. Retourne FALSE sil ny a plus aucune ligne. Exemple 1 : $requet = SELECT * FROM users; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_row($result)) { $id = $ligne[0]; $name = $ligne[1]; $address = $ligne[2]; echo $id - $name, $address <br />; } } else { echo Erreur de requte de base de donnes.; } Ici, on accde aux valeurs de la ligne par leur indice dans le tableau.
135/154

Extraction des donnes (III)


mysql_fetch_array($result) : retourne un tableau associatif. Les cls tant les noms des attributs et leurs valeurs associes leurs valeurs respectives. Retourne FALSE sil ny a plus aucune ligne. Exemple 2 : $requet = SELECT * FROM users; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_array($result)) { $id = $ligne[id]; $name = $ligne[name]; $address = $ligne[address]; echo $id - $name, $address <br />; } } else { echo Erreur de requte de base de donnes.; } Ici, on accde aux valeurs de la ligne par lattribut dans le tableau associatif.
136/154

Extraction des donnes (IV)


mysql_fetch_object($result) : retourne un objet. Les attributs de lobjet correspondent ceux de la ligne de rsultat. Et les valeurs des attributs de lobjet correspondent ceux de la ligne de rsultat. Retourne FALSE sil ny a plus aucune ligne.

Exemple 3 : $requet = SELECT * FROM users; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_object($result)) { $id = $ligne->id; $name = $ligne->name; $address = $ligne->address; echo $id - $name, $address <br />; } } else { echo Erreur de requte de base de donnes.; } Ici, on accde aux valeurs par leur attribut dans lobjet.
137/154

Fonctions additionnelles
Quelques fonctions supplmentaires trs utiles : mysql_free_result($result) : efface de la mmoire du serveur les lignes de rsultat de la requte identifies par $requet. Trs utile pour amliorer les performances du serveur. mysql_insert_id([$id]) : retourne lidentifiant dun attribut cl primaire AUTO_INCREMENT de la dernire insertion. mysql_num_fields($result) : retourne le nombre dattributs du rsultats. mysql_num_rows($result) : retourne le nombre de lignes du rsultats. Et ainsi permet de remplacer le while par un for. Penser bien tester la valeur de retour des fonctions (mysql_query et les autres) afin de dtecter toute erreur et dviter de polluer votre page avec des Warnings.

138/154

Partie 3 : Un exemple concret

139/154

Prsentation
Cet exemple concret dapplication dynamique crite en php et utilisant une base MySQL sinspire directement de la rubrique Citations de profs que jai eu raliser pour le site web de lAssociation des Miagistes Lyonnais dont je suis le webmaster (anne 2001-2002).

Le site web en question est : http://www.miag-rezo.net


Cette rubrique consiste en un seul script qui propose les services suivants : 1) soumettre une nouvelle citation (laisse lapprobation pralable dun administrateur avant affichage publique) 2) lancer une recherche par critres dans la base (parmi les citations valides par ladmin) 3) afficher toutes les citations (valides) 4) afficher des statistiques

140/154

Cration de la table des citations (I)


Pour stocker les citations, on cr une table citation dans notre base de donnes MySQL, en voici le schma :
CREATE TABLE citation ( id MEDIUMINT UNSIGNED not null AUTO_INCREMENT, body TEXT not null , author VARCHAR (40) not null , sender VARCHAR (40) , accept ENUM ('yes','no') DEFAULT 'no' not null , PRIMARY KEY (id) )

Les simples quotes autour du nom de la table servent scuriser ce nom. Il est donc cre une table ayant une cl primaire (un entier positif qui sautoincrmente lors des insertions), un champ body (le corps de la citation), un champ author (le nom du prof), un champ sender (nom de llve qui la propose, facultatif) et un champ accept de validation par un administrateur (on ne va pas laisser afficher nimporte quelle obscnit).

141/154

Cration de la table des citations (II)


Bien quil aurait t tout aussi simple de la crer avec une requte mysql_query, cette table a t cre grce loutil phpMyAdmin (qui a t scuris avec les fichiers .htaccess et .htpasswd).

Cet utilitaire rend la gestion dune base de donnes (surtout la cration de tables) trs intuitive et sans effort. Il permet aussi de crer un fichier de sauvegarde, de modifier les valeurs des enregistrements, etc.

142/154

Formulaire de soumission (I)


Il est intressant de permettre aux lves de poster aux mmes des paroles de profs entendues en cours. Pour cela, ils remplissent un formulaire qui contient les champs suivants : 1) Une balise SELECT qui contient la liste de tous les profs de la base 2) Une autre SELECT avec la liste des annes 3) Une autre SELECT avec la liste des semestres 4) Un TEXTAREA pour crire le corps de la citation 5) Un INPUT TEXT pour que linternaute laisse son pseudonyme 6) Un champs HIDDEN qui spcifie laction raliser (ici : proposer)

143/154

Formulaire de soumission (II)


En voici la source HTML :
<form action=$PHP_SELF'' method=''post''> <b>Proposer une citation</b><br /> Prof : <select name=''author''> <option value=''''> </option> <option value=''Aubert ''>Aubert</option> <option value=''Bonneville''>Bonneville</option> </select> // mme chose pour year et semestre <textarea name=''body'' cols=''40'' rows=''5''></textarea><br /> Votre pseudo(*) : <input type=''text'' name='sender'' value='''' /> <input type=''hidden'' name=''action'' value=''proposer /> <input type=''submit'' value=''Valider /><br /> Tous les champs sauf celui avec astrisque sont obligatoires. </form>

144/154

Formulaire de soumission (III)


En voici la source php :
function PrintSubForm() { global $out, $author, $body, $year, $semestre, $proposer; $out .= "<form action=\"$PHP_SELF\" method=\"post\">"; $out .= "<b>Proposer une citation</b><br />"; $out .= " Prof : <select name=\"author\">"; $requet = "SELECT DISTINCT author FROM citation ORDER BY author ASC"; $result = mysql_query($requet); $out .= "<option value=\"\"> "; while($ligne = mysql_fetch_object($result)) { if($author == $ligne->author) { $selected = "selected"; } else { $selected=""; } $out .= "<option value=\"".$ligne->author."\" $selected>".ligne->author. "</option>"; } $out .= "</select><br />"; // mme chose pour year et semestre $out .= "<textarea name=\"body\" cols=\"40\" rows=\"5\">$body</textarea><br />"; $out .= "Votre pseudo(*) : <input type=\"text\" name=\"sender\" value=\"$proposer\" />"; $out .= "<input type=\"hidden\" name=\"action\" value=\"proposer\" />"; $out .= "<input type=\"submit\" value=\"Valider\" /><br />"; $out .= "Tous les champs sauf celui avec astrisque sont obligatoires."; $out .= "</form>"; }

145/154

Contrle des donnes soumisses (I)


Lors du dmarrage du script, la variable $action (qui provient du champ HIDDEN action) est teste :
switch($action) { case "chercher" : PrintSearchResults(); break; case "proposer" : InsertCitation(); break; case "stats" : PrintStats(); break; default : PrintCitations(); }

Si laction rsulte de la validation du formulaire de soumission dune nouvelle citation ($action == proposer), alors on va inserer la nouvelle citation (aprs vrification des donnes) par lappel de la fonction InsertCitation().

146/154

Contrle des donnes soumisses (II)


Le contrle des donnes fournies par le formulaire se fait ainsi : 1) On vrifie que les attributs obligatoires ont bien t saisis. 2) On vrifie que le nom du prof et les valeurs anne et semestre sont bien prsents dans la base, des fois quun petit malin essaierait de pirater notre base en y rajoutant des valeurs incohrentes ou en voulant faire planter notre script ! 3) Et si tout se passe bien jusque l, on insert les donnes par la commande suivante :
$requet = "INSERT INTO citation(author,body,year,semestre,sender) VALUES(\"$author\",\"$body\",\"$year\",\"$semestre\" \"$sender\")"; if(!($result = mysql_query($requet))) { $out .= "Erreur de base de donnes."; }

147/154

Affichage
La requte suivante permet dafficher les citations dans lordre des plus rcentes, et dans lordre alphabtique des nom de prof. SELECT * FROM citation WHERE accept="yes" ORDER BY year DESC, semestre DESC, author ASC, id DESC;

148/154

Statistiques
La requte suivante permet de calculer des statistiques sommaires :
dcompte

SELECT author, COUNT(id) nbr FROM citation condition WHERE accept="yes" partition GROUP BY author ORDER BY nbr DESC, author ASC

tri

Cette requte partitionne la table des citations par prof et compte le nombre de citations par profs en les triant dans lordre dcroissant des profs les plus productifs. Si deux profs arrivent ex quo, alors on les affichent dans lordre alphabtique. On slectionne une citation condition quelle ait t valide par un administrateur.

149/154

PARTIE 4 : Mthodologie

150/154

Mthodologie gnrale
Ce manire gnrale, il faut : 1) Programmer orient objet en crant des objets, comme par exemple un objet citation dont les mthodes sont : ajouter, afficher, proposer, statistiques dont peut hriter un autre objet : citationvalide. 2) Toujours contrler les donnes saisies par un utilisateur afin dviter tout piratage ; ne jamais prsupposer lhonntet de linternaute dans un univers aussi impersonnel que lest Internet. 3) Ne pas rpercuter automatiquement les donnes saisies par un utilisateur auprs des autres internautes sans contrle ; faire valider les donnes par un administrateur. 4) Utiliser des variables de session, puisque celles globales peuvent tres forces par des passages en URL. Le respect de ces quelques conseils devrait vous viter des mauvaises surprises.

151/154

Rcupration et sauvegarde de donnes


Pour rcuprer les donnes dun visiteur, utilisez un formulaire HTML. Ce formulaire pourra envoyer les donnes saisies par mail votre adresse condition que le client soit quip dun logiciel de messagerie et dun compte mail valide (<FORM action=mailto:webmaster@monsite.com method=post enctype=text/plain>). Ou bien envoyez les donnes saisies un script PHP qui saura quoi en faire (<FORM action=monscript.php method=post>). Le script de sauvegarde aura plusieurs mthodes au choix : Mthode 1 : Fichier de sauvegarde (texte ou binaire), pratique pour les compteurs de visites. Mthode 2 : Base de donnes (gnralement MySQL), souvent plus simple, plus rapide et plus adapt pour les donnes volumineuses. Mthode 3 : Variables de session, inconvnient : dure de vie limite au seul temps de visite de linternaute. Mthode 4 : Envoyer des cookies aux clients, qui peut les refuser

152/154

Rafrachissement de la page
Pour rafrachir la page en cours (la recharger ou en changer automatiquement) sans intervention de linternaute, vous disposez dau moins trois solutions. Solution 1 : Utiliser une mta balise dans lentte de votre page HTML : <HEAD><META HTTP-EQUIV="Refrech" CONTENT="n; URL=url"></HEAD> O n est la dure en secondes aprs laquelle faire la redirection et url est ladresse de la page charger.

Solution 2 : Utiliser le JavaScript dans le corps de votre page HTML : <SCRIPT language=JavaScript> document.location = url; </SCRIPT>
Solution 3 : Utiliser la fonction header avec lentte Location : <?php header(Location: url); ?>

153/154