You are on page 1of 137

Cours Programmation

Langage PHP

php.doc

SOMMAIRE
1.GNRALITS----------------------------------------------------------------------------------------------------------------5
1.ORIGINES DE PHP........................................................................................................................................................................5 2.BIBLIOTHQUES INTGRES.............................................................................................................................................................5 3.SGBD SUPPORTS PAR PHP...........................................................................................................................................................5 4.L'INTERPRTATION DU CODE PAR LE SERVEUR.....................................................................................................................................6 5.IMPLANTATION AU SEIN DU CODE HTML.........................................................................................................................................6 6.UN EXEMPLE DE SCRIPT SIMPLE........................................................................................................................................................6 7.L'INTERPRTATION DU CODE............................................................................................................................................................7 8.LES COMMENTAIRES.......................................................................................................................................................................7 9.TYPOLOGIE...................................................................................................................................................................................7

2.LES VARIABLES--------------------------------------------------------------------------------------------------------------8
10.NOMMAGE DES VARIABLES............................................................................................................................................................8 11.LES VARIABLES SCALAIRES............................................................................................................................................................8 12.LA PORTE (VISIBILIT) DES VARIABLES..........................................................................................................................................9 13.LES VARIABLES ISSUES DE FORMULAIRES.......................................................................................................................................10 14.LES CONSTANTES DFINIES..........................................................................................................................................................10

3.LES OPRATEURS---------------------------------------------------------------------------------------------------------11
15.LES OPRATEURS DE CALCUL.......................................................................................................................................................11 16.LES OPRATEURS D'ASSIGNATION..................................................................................................................................................11 17.LES OPRATEURS D'INCRMENTATION............................................................................................................................................12 18.LES OPRATEURS DE COMPARAISON..............................................................................................................................................12 19.LES OPRATEURS LOGIQUES (BOOLENS).......................................................................................................................................12 20.LES OPRATEURS BITWISE...........................................................................................................................................................13 21.AUTRES OPRATEURS.................................................................................................................................................................13 22.LES PRIORITS DES OPRATEURS...................................................................................................................................................14

4.LES STRUCTURES DE CONTRLES---------------------------------------------------------------------------------15


23.LA NOTION DE BLOC...................................................................................................................................................................15 24.LA STRUCTURE CONDITIONNELLE..................................................................................................................................................15 24.1.L'instruction if................................................................................................................................................................15 24.2.L'instruction if ... else....................................................................................................................................................16 24.3.L'instruction if ... elseif ... else.......................................................................................................................................16 24.4.Loprateur ternaire (une faon plus courte de faire un test).......................................................................................16 24.5.L'instruction switch........................................................................................................................................................17 25.LES BOUCLES............................................................................................................................................................................17 25.1.L'instruction while.........................................................................................................................................................17 25.2.L'instruction do..while...................................................................................................................................................18 25.3.Linstruction for.............................................................................................................................................................18 26.SAUT INCONDITIONNEL CONTINUE.................................................................................................................................................19 27.ARRT INCONDITIONNEL BREAK...................................................................................................................................................20 28.ARRT D'EXCUTION DU SCRIPT PAR EXIT......................................................................................................................................20

5.LES TABLEAUX-------------------------------------------------------------------------------------------------------------21
29.LES VARIABLES TABLEAUX..........................................................................................................................................................21 30.LES VARIABLES DES TABLEAUX ASSOCIATIFS..................................................................................................................................21

6.LES FONCTIONS------------------------------------------------------------------------------------------------------------22
31.LA NOTION DE FONCTION............................................................................................................................................................22 32.LA DCLARATION D'UNE FONCTION...............................................................................................................................................22 33.APPEL DE FONCTION...................................................................................................................................................................23 34.LES ARGUMENTS D'UNE FONCTION................................................................................................................................................23 35.TRAVAILLER SUR DES VARIABLES DANS LES FONCTIONS....................................................................................................................23 36.RENVOI D'UNE VALEUR PAR UNE FONCTION....................................................................................................................................23 37.PASSAGE DARGUMENT PAR RFRENCE.........................................................................................................................................24 38.VALEUR PAR DFAUT DES ARGUMENTS..........................................................................................................................................24 39.LA FONCTION INCLUDE...............................................................................................................................................................25 40.LA FONCTION EMPTY..................................................................................................................................................................25 41.LA FONCTION ISSET....................................................................................................................................................................25 42.LA FONCTION UNSET..................................................................................................................................................................25 ESAT/DMSI/PROA/WGR Page 1 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

7.LA GESTION DES TABLEAUX------------------------------------------------------------------------------------------26


43.ARRAY.....................................................................................................................................................................................26 44.IS_ARRAY.................................................................................................................................................................................26 45.EACH.......................................................................................................................................................................................26 46.LIST.........................................................................................................................................................................................27 47.COUNT.....................................................................................................................................................................................28 48.SIZEOF .....................................................................................................................................................................................28 49.CURRENT..................................................................................................................................................................................28 50.POS..........................................................................................................................................................................................28 51.NEXT........................................................................................................................................................................................28 52.PREV........................................................................................................................................................................................28 53.RESET.......................................................................................................................................................................................28 54.END.........................................................................................................................................................................................29 55.KEY.........................................................................................................................................................................................29 56.SORT........................................................................................................................................................................................29 57.ASORT......................................................................................................................................................................................30 58.ARSORT....................................................................................................................................................................................30 59.RSORT......................................................................................................................................................................................31 60.KSORT......................................................................................................................................................................................31 61.USORT, UKSORT ET UASORT..........................................................................................................................................................32 62.EXTRACT..................................................................................................................................................................................33 63.RANGE.....................................................................................................................................................................................33 64.SHUFFLE...................................................................................................................................................................................34 65.COMPACT..................................................................................................................................................................................34 66.AUTRES FONCTIONS SUR LES TABLEAUX SOUS PHP4........................................................................................................................34

8.LES CHANES DE CARACTRES--------------------------------------------------------------------------------------35


67.AFFICHAGE DUNE CHANE DE CARACTRES...................................................................................................................................35 68.INITIALISATION ET CONCATNATION..............................................................................................................................................35 69.TRAITEMENT DES CHANES DE CARACTRES....................................................................................................................................36 69.1.addslashes......................................................................................................................................................................39 69.2.chr..................................................................................................................................................................................39 69.3.crypt...............................................................................................................................................................................39 69.4.ereg................................................................................................................................................................................40 69.5.ereg_replace..................................................................................................................................................................40 69.6.explode...........................................................................................................................................................................40 69.7.implode..........................................................................................................................................................................41 69.8.nl2br...............................................................................................................................................................................41 69.9.ord..................................................................................................................................................................................41 69.10.parse_str......................................................................................................................................................................41 69.11.printf............................................................................................................................................................................42 69.12.rawurldecode...............................................................................................................................................................44 69.13.rawurlencode...............................................................................................................................................................44 69.14.strchr............................................................................................................................................................................44 69.15.strcspn..........................................................................................................................................................................44 69.16.strip_tags.....................................................................................................................................................................45 69.17.strpos...........................................................................................................................................................................45 69.18.strrchr..........................................................................................................................................................................45 69.19.strrpos..........................................................................................................................................................................45 69.20.strspn...........................................................................................................................................................................46 69.21.strstr.............................................................................................................................................................................46 69.22.strtok............................................................................................................................................................................46 69.23.strtr..............................................................................................................................................................................47 69.24.substr...........................................................................................................................................................................47 69.25.substr_replace.............................................................................................................................................................47

9.LA GESTION DES DATES------------------------------------------------------------------------------------------------48


70.CALCULS DE DURES..................................................................................................................................................................48 71.OPRATIONS SUR LES DATES........................................................................................................................................................48 71.1.time................................................................................................................................................................................48 71.2.mktime............................................................................................................................................................................48 71.3.gmmktime.......................................................................................................................................................................48 71.4.checkdate.......................................................................................................................................................................48 72.CONVERSIONS DE DATES.............................................................................................................................................................49 ESAT/DMSI/PROA/WGR Page 2 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

72.1.date................................................................................................................................................................................49 72.2.getdate...........................................................................................................................................................................50 72.3.strftime...........................................................................................................................................................................50 73.DTERMINATION DE LA DATE DE DERNIRE MODIFICATION DUN SCRIPT..............................................................................................50 74.CONVERSION DES DATES AUX FORMATS MYSQL...........................................................................................................................51 75.EXERCICE PRATIQUE...................................................................................................................................................................52

10.LES OBJETS-----------------------------------------------------------------------------------------------------------------55
76.CRATION DUN OBJET...............................................................................................................................................................55 77.LES PROPRITS DUN OBJET........................................................................................................................................................56 78.LES MTHODES DUN OBJET.........................................................................................................................................................57 79.LHRITAGE..............................................................................................................................................................................59 80.EXERCICE PRATIQUE...................................................................................................................................................................61

11.LES FORMULAIRES------------------------------------------------------------------------------------------------------62
81.LES VARIABLES PHP.................................................................................................................................................................62 82.LES LMENTS SELECT MULTIPLES...........................................................................................................................................64 83.LES CHAMPS DUN FORMULAIRE DANS UN TABLEAU ASSOCIATIF........................................................................................................65 84.ECHANGES CLIENT/SERVEUR........................................................................................................................................................67 85.COMBINAISON DE CODES HTML ET PHP....................................................................................................................................67

12.LES FICHIERS--------------------------------------------------------------------------------------------------------------69
86.STRUCTURE DUN FICHIER POUR PHP...........................................................................................................................................69 87.LIRE ET CRIRE DANS UN FICHIER ................................................................................................................................................69 88.OUVERTURE DUN FICHIER .........................................................................................................................................................69 89.FERMETURE DUN FICHIER ..........................................................................................................................................................70 90.ACCS AUX FICHIERS..................................................................................................................................................................70 91.ACCS AUX RPERTOIRES............................................................................................................................................................71 92.LIRE UN FICHIER DFINI PAR UNE URL.........................................................................................................................................73 93.EXEMPLES DE TRAITEMENTS SUR LES FICHIERS................................................................................................................................74 94.LA FONCTION POPEN...................................................................................................................................................................75 95.PROBLMES POSS PAR LUSAGE DE FICHIERS PLATS........................................................................................................................75

13.LES BASES DE DONNES-----------------------------------------------------------------------------------------------76


96.ARCHITECTURE DUNE BASE DE DONNES WEB..............................................................................................................................76 97.STRUCTURE DE LINSTALLATION DE MYSQL................................................................................................................................77 98.LES PRINCIPALES INSTRUCTIONS SQL...........................................................................................................................................77 98.1.SELECT.........................................................................................................................................................................77 98.2.INSERT..........................................................................................................................................................................79 98.3.UPDATE........................................................................................................................................................................79 98.4.DELETE.........................................................................................................................................................................79 98.5.ALTER TABLE...............................................................................................................................................................79 98.6.DROP TABLE................................................................................................................................................................80 98.7.DROP DATABASE........................................................................................................................................................80 99.COMPATIBILIT AVEC LES STANDARDS...........................................................................................................................................81 99.1.Extensions MySQL la norme ANSI SQL 92................................................................................................................81 99.2.Fonctionnalits manquantes..........................................................................................................................................83 100.PROGRAMMATION MYSQL......................................................................................................................................................87 100.1.Syntaxe des chanes et nombres...................................................................................................................................87 100.2.Types des colonnes et espaces mmoire requis...........................................................................................................87 101.CONNEXION ET ACCS LA BASE DE DONNES MYSQL...............................................................................................................89 102.CRER ET SLECTIONNER UNE BASE DE DONNES MYSQL............................................................................................................89 103.FONCTIONS D ACCS MYSQL..............................................................................................................................................90 103.1.mysql_connect.............................................................................................................................................................93 103.2.mysql_close..................................................................................................................................................................93 103.3.mysql_select_db...........................................................................................................................................................94 103.4.mysql_error.................................................................................................................................................................94 103.5.mysql_query.................................................................................................................................................................95 103.6.mysql_fetch_array.......................................................................................................................................................96 104.EXERCICE PRATIQUE.................................................................................................................................................................97 105.MTHODES DACCS MYSQL PAR PROGRAMMATION OBJET......................................................................................................100

14.FONCTIONNALITS INTERNET------------------------------------------------------------------------------------107
106.LE COURRIER LECTRONIQUE...................................................................................................................................................107

ESAT/DMSI/PROA/WGR

Page 3 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

106.1.mail............................................................................................................................................................................107 107.LE FILE UPLOAD ..............................................................................................................................................................108 108.LE TRAITEMENT DES URL......................................................................................................................................................109 108.1.Codage des URL........................................................................................................................................................109 108.2.urlencode...................................................................................................................................................................109 108.3.urldecode...................................................................................................................................................................110 108.4.parse_url....................................................................................................................................................................110 109.LES MTHODES DE GESTION DU CONTEXTE APPLICATIF.................................................................................................................111 109.1.Le contexte applicatif.................................................................................................................................................111 109.2.Les diffrentes mthodes de gestion..........................................................................................................................111
109.2.1.URL longue..........................................................................................................................................................................111 109.2.2.Variables caches..................................................................................................................................................................112 109.2.3.Cookies.................................................................................................................................................................................112 109.2.4.Variables de session..............................................................................................................................................................114 109.2.5.Base de donnes....................................................................................................................................................................117

15.IMPLMENTER UNE AUTHENTIFICATION AVEC PHP ET MYSQL------------------------------------118


110.IMPLMENTER UN CONTRLE DACCS.......................................................................................................................................118 110.1.Enregistrement des mots de passe.............................................................................................................................119 110.2.Exercice pratique.......................................................................................................................................................121 110.3.Protger plusieurs pages...........................................................................................................................................122 110.4.Utiliser lauthentification de base dans PHP............................................................................................................122 110.5.Utiliser lauthentification de base avec les fichiers .htaccess dApache..................................................................124 110.6.Utiliser lauthentification mod_auth_mysql..............................................................................................................126 111.NOTIONS DE TRANSACTIONS SCURISES SSL............................................................................................................................127 111.1.Utilisation de SSL......................................................................................................................................................128 111.2.Processus...................................................................................................................................................................129 111.3.Fonctionnement.........................................................................................................................................................129 111.4.Certificats..................................................................................................................................................................130 111.5.Installation de SSL.....................................................................................................................................................130

16.AUTRES FONCTIONNALITS OFFERTES PAR PHP---------------------------------------------------------131


112.LA SRIALISATION.................................................................................................................................................................131 113.CHARGEMENT DYNAMIQUE DEXTENSIONS SOUS WINDOWS..........................................................................................................132 113.1.Liste des extensions charges....................................................................................................................................134

17.INSTALLATION DAPACHE, PHP ET MYSQL------------------------------------------------------------------135


114.TLCHARGER LES SOURCES....................................................................................................................................................135 115.INSTALLER APACHE ET PHP...................................................................................................................................................135 116.PREMIER LANCEMENT.............................................................................................................................................................136

18.BIBLIOGRAPHIE---------------------------------------------------------------------------------------------------------137

ESAT/DMSI/PROA/WGR

Page 4 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

1. Gnralits
PHP (Personal Home Page) est un langage interprt (un langage de script) excut du ct serveur (comme les scripts CGI, ASP, ...) et non du ct client (un script crit en Javascript ou une applet Java s'excute sur votre ordinateur...). La syntaxe du langage provient de celles du langage C, du Perl et de Java. Ses principaux atouts sont: La gratuit et la disponibilit du code source (PHP3 est distribu sous licence GNU GPL). La simplicit d'criture de scripts. la possibilit d'inclure le script PHP au sein d'une page HTML (contrairement aux scripts CGI, pour lesquels il faut crire des lignes de code pour afficher chaque ligne en langage HTML). La simplicit d'interfaage avec des bases de donnes (de nombreux SGBD sont supports, mais le plus utilis avec ce langage est MySQL, un SGBD gratuit sur les plates-formes Unix et Linux, mais payant sous Windows). L'intgration au sein de nombreux serveurs Web (Apache, Microsoft IIS, ...).

PHP est trs efficace. Les tests de performances publis par Zend Technologies (http://www.zend.com) montrent que PHP dpasse tous ses concurrents.

1. Origines de PHP
Le langage PHP a t mis au point au dbut d'automne 1994 par Rasmus Lerdorf. Ce langage de script lui permettait de conserver la trace des utilisateurs venant consulter son CV sur son site, grce l'accs une base de donnes par l'intermdiaire de requtes SQL. Ainsi, tant donn que de nombreux internautes lui demandrent ce programme, Rasmus Lerdorf mit en ligne en 1995 la premire version de ce programme qu'il baptisa Personal Sommaire Page Tools, puis Personal Home Page v1.0 (traduisez page personnelle version 1.0). Etant donn le succs de PHP 1.0, Rasmus Lerdorf dcida d'amliorer ce langage en y intgrant des structures plus avances telles que des boucles, des structures conditionnelles, et y intgra un package permettant d'interprter les formulaires qu'il avait dvelopp (FI, Form Interpreter) ainsi que le support de mSQL. C'est de cette faon que la version 2 du langage, baptise pour l'occasion PHP/FI version 2, vit le jour durant l't 1995. Il fut rapidement utilis sur de nombreux sites (15000 fin 1996, puis 50000 en milieu d'anne 1997). A partir de 1997, Zeev Suraski et Andi Gurmans rejoignirent Rasmus pour former une quipe de programmeurs afin de mettre au point PHP 3 (Stig Bakken, Shane Caraveo et Jim Winstead les rejoignirent par la suite) nouvelle abrviation signifiant Hypertext Preprocessor . C'est ainsi que la version 3.0 de PHP fut disponible le 6 juin 1998. A la fin de l'anne 1999, une version bta de PHP, baptise PHP4 est apparue...

2. Bibliothques intgres
Comme PHP a t conu pour tre utilis sur le Web, il possde plusieurs fonctions intgres permettant deffectuer la plupart des tches en rapport avec le Web. Vous pouvez ainsi gnrer des images GIF en temps rel, vous connecter dautres services rseaux, envoyer des e-mails, travailler avec les cookies, et gnrer des documents PDF. Le code source de PHP est disponible gratuitement. Contrairement aux produits commerciaux, dont les sources ne sont pas distribues, vous avez tout fait la possibilit de modifier ce langage, ou dy ajouter de nouvelles caractristiques. Des patchs correctifs sont distribus par les concepteurs, il est donc inutile de sinquiter de la perennit du support ou du dveloppement de PHP.

3. SGBD supports par Php


Php permet un interfaage simple avec de nombreux SGBD. La version 3 du langage supporte les SGBD suivants : Adabas D ; Dbase ; MS SQL Server ; FilePro ; Informix ; InterBase ; mSQL ; Openlink ODBC ; iODBC ; MySQL ; Oracle Database ; PostgreSQL ; Solid ; Sybase ; Sybade-DB ; Velocis ; Unix dbm ; IBM DB2 ; Empress. La version 4 supporte en plus : Ingres II ; Oracle-oci7 ; Oracle-oci8 ; unixODBC ; DBMaker ; Berkeley DB3.

ESAT/DMSI/PROA/WGR

Page 5 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

4. L'interprtation du code par le serveur


Un script PHP est un simple fichier texte contenant des instructions crites l'aide de caractres ASCII 7 bits (des caractres non accentus) incluses dans un code HTML l'aide de balises spciales et stock sur le serveur. Ce fichier doit avoir l'extension ".php3" pour pouvoir tre interprt par le serveur! Ainsi, lorsqu'un navigateur (le client) dsire accder une page dynamique ralis en php3: le serveur reconnat qu'il s'agit d'un fichier php3. il lit le fichier php3. Ds que le serveur rencontre une balise indiquant que les lignes suivantes sont du code php3, il "passe" en mode php3, ce qui signifie qu'il ne lit plus les instructions: il les excute! Lorsque le serveur rencontre une instruction, il la transmet l'interprteur. L'interprteur excute l'instruction puis envoie les sorties ventuelles vers le navigateur. A la fin du script, le serveur transmet le rsultat au client (le navigateur).

Un script PHP est interprt par le serveur, les utilisateurs ne peuvent donc pas voir le code source!

Le code php3 stock sur le serveur n'est donc jamais visible directement par le client puisque ds qu'il en demande l'accs, le serveur l'interprte!; de cette faon aucune modification n'est apporter sur les navigateurs...

5. Implantation au sein du code HTML


Pour que le script soit interprt par le serveur deux conditions sont ncessaires: Le fichier contenant le code doit avoir l'extension .php3 et non .html Le code php3 contenu dans le code HTML doit tre dlimit par les balises <?php et ?>

Un script PHP doit: comporter l'extension .php3 tre imbriqu entre les dlimiteurs <?php et ?>

Pour des raisons de conformit avec certaines normes (XML et ASP par exemple), plusieurs balises peuvent tre utilises pour dlimiter un code PHP: 1. <?php et ?> 2. <? et ?> 3. <script language="php"> et </script> 4. <%php et %>

6. Un exemple de script simple


Voici un exemple de script php: <html> <head> <title> Exemple </title> </head> <body> <? echo "Hello world"; ?> </body> </html> On notera bien videmment que linstruction echo permet d'afficher sur le navigateur la chane dlimite par les guillemets...

ESAT/DMSI/PROA/WGR

Page 6 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

7. L'interprtation du code
Un code PHP (celui compris entre les dlimiteurs <?php et ?>) est un ensemble d'instructions se terminant chacune par un point-virgule (comme en langage C). Lorsque le code est interprt, les espaces, retours chariot et tabulations ne sont pas pris en compte par le serveur. Il est tout de mme conseill d'en mettre (ce n'est pas parce qu'ils ne sont pas interprts que l'on ne peut pas les utiliser) afin de rendre le code plus lisible (pour vous, puisque les utilisateurs ne peuvent lire le code source: il est interprt).

8. Les commentaires
Une autre faon de rendre le code plus comprhensible consiste insrer des commentaires, ils seront tout simplement ignors par le serveur lors de l'interprtation. Pour ce faire, il est possible, comme en langage C, d'utiliser des balises qui vont permettre de dlimiter les explications afin que l'interprteur les ignore et passe directement la suite du fichier. Ces dlimiteurs sont /* et */ Un commentaire sera donc not de la faon suivante: /* Voici un commentaire! */ Il est possible aussi d'utiliser un type de commentaire permettant de mettre toute la fin d'une ligne en commentaire en utilisant le double slash (//). Tout ce qui se situe droite de ce symbole sera mis en commentaire. // Voici un autre commentaire! Il y a toutefois quelques rgles respecter : Les commentaires peuvent tre placs n'importe o l'intrieur des dlimiteurs de script PHP Les commentaires ne peuvent contenir le dlimiteur de fin de commentaire (*/) Les commentaires ne peuvent tre imbriqus Les commentaires peuvent tre crits sur plusieurs lignes (sauf avec //) Les commentaires ne peuvent pas couper un mot du code en deux

9. Typologie
La manire d'crire les choses en langage PHP a son importance. Le langage PHP est par exemple sensible la casse (en anglais case sensitive), cela signifie qu'un nom contenant des majuscules est diffrent du mme nom crit en minuscules. Toutefois, cette rgle ne s'applique pas aux fonctions, les spcifications du langage PHP prcisent que la fonction print peut tre appele print(), Print() ou PRINT(). Enfin, toute instruction se termine par un point-virgule.

ESAT/DMSI/PROA/WGR

Page 7 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

2. Les variables
Une variable est un objet repr par son nom, pouvant contenir des donnes, qui pourront tre modifies lors de l'excution du programme. Les variables en langage PHP peuvent tre de trois types: scalaires tableaux tableaux associatifs Quel que soit le type de variable, son nom doit obligatoirement tre prcd du caractre dollar ($). Contrairement de nombreux langages de programmation, comme le langage C, les variables en PHP n'ont pas besoin d'tre dclares, c'est--dire que l'on peut commencer les utiliser sans en avoir averti l'interprteur prcdemment, ainsi si la variable existait prcdemment, son contenu est utilis, sinon l'interprteur lui affectera la valeur en lui assignant 0 par dfaut. De cette faon si vous ajoutez 3 une nouvelle variable (non dfinie plus haut dans le code), sa valeur sera 3...

10. Nommage des variables


Avec PHP, les noms de variables doivent rpondre certains critres: un nom de variable doit commencer par une lettre (majuscule ou minuscule) ou un "_" (pas par un chiffre) un nom de variables peut comporter des lettres, des chiffres et le caractre _ (les espaces ne sont pas autoriss!) Nom de variable correct $Variable $Nom_De_Variable $nom_de_variable $nom_de_variable_123 $nom_de_variable Nom de variable incorrect $Nom de Variable $123Nom_De_Variable $toto@mailcity.com $Nom-de-variable nom_de_variable Raison comporte des espaces commence par un chiffre caractre spcial @ signe - interdit ne commence pas par $

Les noms de variables sont sensibles la casse (le langage PHP fait la diffrence entre un nom en majuscule et un nom en minuscule), il faut donc veiller utiliser des noms comportant la mme casse! Toutefois, les noms de fonctions font exception cette rgle...

11. Les variables scalaires


Le langage PHP propose trois types de variables scalaires: entiers: nombres naturels sans dcimale (sans virgule) rels: nombres dcimaux (on parle gnralement de type double, car il s'agit de nombre dcimaux double prcision) chanes de caractres: ensembles de caractres Il n'est pas ncessaire en PHP de typer les variables, c'est--dire de dfinir leur type, il suffit de leur assigner une valeur pour en dfinir le type: entiers: nombre sans virgule rels: nombres avec une virgule (en ralit un point) chanes de caractres: ensembles de caractres entre guillemets simples ou doubles.

ESAT/DMSI/PROA/WGR

Page 8 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Instruction $Variable = 0; $Variable = 12; $Variable = 0.0; $Variable = 12.0; $Variable = "0.0"; $Variable = "Bonjour tout le monde"; type entier type entier type rel type rel type chane type chane

Type de la variable

Il existe des caractres reprs par un code ASCII spcial permettant d'effectuer des oprations particulires. Ces caractres peuvent tre reprsents plus simplement en langage PHP grce au caractre '\' suivi d'une lettre, qui prcise qu'il s'agit d'un caractre de contrle: Caractre \" \\ \r \n \t Description guillemet barre oblique inverse (antislash) retour chariot retour la ligne tabulation

En effet, certains de ces caractres ne pourraient pas tre reprsents autrement (un retour la ligne ne peut pas tre reprsent l'cran). D'autre part, les caractres \ et " ne peuvent pas faire partie en tant que tel d'une chane de caractres, pour des raisons vidente d'ambigut...

12. La porte (visibilit) des variables


Selon l'endroit o on dclare une variable, celle-ci pourra tre accessible (visible) de partout dans le code ou bien que dans une portion confine de celui-ci ( l'intrieur d'une fonction par exemple), on parle de porte (ou visibilit) d'une variable. Il existe trois niveaux de dfinition de variables : Lorsqu'une variable est dclare l'extrieur de toute fonction ou de tout bloc d'instructions, elle est accessible de partout dans le code (n'importe quelle fonction du programme peut faire appel cette variable). On parle alors de variable globale. Afin dutiliser une variable globale lintrieur dune fonction, il est ncessaire de la rfrencer laide du mot cl global : global $var; Lorsque l'on dclare une variable l'intrieur dune fonction ou d'un bloc d'instructions (entre des accolades), sa porte se confine l'intrieur de la fonction ou du bloc dans lequel elle est dclare. On parle alors de variable locale. Il existe enfin les variables locales une fonction qui persistent pendant le temps dexcution de lintgralit du code de la page PHP. Elles gardent donc leur valeur dun appel lautre de la fonction. On parle alors de variable statique. Elles sont dclares laide du mot cl static : static $var;

D'une manire gnrale il est prfrable de donner des noms diffrents aux variables locales et globales pour des raisons de lisibilit et de comprhension du code...

ESAT/DMSI/PROA/WGR

Page 9 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

13. Les variables issues de formulaires


Ces variables sont issues de formulaires HTML, cest--dire quelles correspondent aux diffrents champs positionns entre les balises <FORM> et </FORM> de ce formulaire. La page PHP qui reoit ces variables est celle qui est pointe par lattribut ACTION de la balise <FORM>. PHP cre automatiquement des variables du mme nom que le contrle du formulaire HTML. Toutefois, en insrant la clause < ? php_track_vars ?>, il est galement possible de rcuprer ces variables dans le tableau $HTTP_POST_VARS si la mthode employe dans le formulaire est POST, ou dans le tableau $HTTP_GET_VARS si la mthode employe dans le formulaire est GET. Exemple : <FORM action = formul1.php3 method = POST> <table> <tr> <td>NOM : </td> <td><input type = text length = 30 name = nom /></td> </tr> <tr> <td>PRENOM : </td> <td><input type = text length = 30 name = prenom /></td> </tr> <tr> <td colspan = 2 align = center>< input type = submit value = Valider /></td> </tr> </table> </FORM> A lissue de la validation du formulaire, les donnes saisies dans les champs de type text nomms nom et prenom seront stockes respectivement dans les variables PHP nommes automatiquement $nom et $prenom. La valeur de ces variables pourra donc tre rcupre dans la page PHP formul1.php3.

14. Les constantes dfinies


Une constante est un objet dont la valeur est inchangeable lors de l'excution d'un programme. Avec PHP, les constantes sont dfinies grce la fonction define(). La syntaxe de la fonction define() est la suivante: define("Nom_de_la_variable", Valeur);

Le nom d'une constante dfinie l'aide de la fonction define() ne doit pas commencer par le caractre $ (de cette faon aucune affection n'est possible).

ESAT/DMSI/PROA/WGR

Page 10 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

3. Les oprateurs
Les oprateurs sont des symboles qui permettent de manipuler des variables, c'est--dire effectuer des oprations, les valuer, ... On distingue plusieurs types d'oprateurs: les oprateurs de calcul les oprateurs d'assignation les oprateurs d'incrmentation les oprateurs de comparaison les oprateurs logiques (boolens) les oprateurs (bit--bit) les oprateurs (de rotation de bit)

15. Les oprateurs de calcul


Les oprateurs de calcul permettent de modifier mathmatiquement la valeur d'une variable Oprateur Dnomination + oprateur d'addition oprateur de soustraction oprateur de * multiplication plus: oprateur de / division oprateur = d'affectation Effet Ajoute deux valeurs Soustrait deux valeurs Multiplie deux valeurs Divise deux valeurs Exemple $x+3 10 $x-3 $x*3 $x/3 4 21 2.3333333 Met la valeur 3 dans la variable $x Rsultat (avec x valant 7)

Affecte une valeur une $x=3 variable

16. Les oprateurs d'assignation


Ces oprateurs permettent de simplifier des oprations telles que ajouter une valeur dans une variable et stocker le rsultat dans la variable. Une telle opration s'crirait habituellement de la faon suivante par exemple: $x=$x+2 Avec les oprateurs d'assignation il est possible d'crire cette opration sous la forme suivante: $x+=2 Ainsi, si la valeur de x tait 7 avant opration, elle sera de 9 aprs... Les autres oprateurs du mme type sont les suivants : Oprateur += -= *= /= %= |= ^= &= .= Effet additionne deux valeurs et stocke le rsultat dans la variable ( gauche) soustrait deux valeurs et stocke le rsultat dans la variable multiplie deux valeurs et stocke le rsultat dans la variable divise deux valeurs et stocke le rsultat dans la variable Modulo, donne le reste de la division des deux valeurs et stocke le rsultat dans la variable Effectue un OU logique entre deux valeurs et stocke le rsultat dans la variable Effectue un OU exclusif entre deux valeurs et stocke le rsultat dans la variable Effectue un Et logique entre deux valeurs et stocke le rsultat dans la variable Concatne deux chanes et stocke le rsultat dans la variable

ESAT/DMSI/PROA/WGR

Page 11 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

17. Les oprateurs d'incrmentation


Ce type d'oprateur permet de facilement augmenter ou diminuer d'une unit une variable. Ces oprateurs sont trs utiles pour des structures telles que des boucles, qui ont besoin d'un compteur (variable qui augmente de un en un). Un oprateur de type $x++ permet de remplacer des notations lourdes telles que $x=$x+1 ou bien $x+=1 Oprateur ++ -Dnomination Post ou pr-incrmentation Post ou pr-dcrmentation Effet Syntaxe Rsultat (avec x valant 7)

Augmente d'une unit la variable $x++ ou ++$x 8 Diminue d'une unit la variable $x-- ou --$x 6

18. Les oprateurs de comparaison


Ce type d'oprateur permet de comparer la valeur dune variable celle dune autre variable ou une simple valeur. Loprateur ternaire (? :) fonctionne comme en langage C. Oprateur Dnomination == A ne pas confondre oprateur d'galit avec le signe d'affectation (=)!! < <= > >= != Effet Exemple Rsultat Retourne 1 si $x est gal 3, sinon 0 Retourne 1 si $x est infrieur 3, sinon 0 Retourne 1 si $x est infrieur 3, sinon 0 Retourne 1 si $x est suprieur 3, sinon 0 Retourne 1 si $x est suprieur ou gal 3, sinon 0 Retourne 1 si $x est diffrent de 3, sinon 0

Compare deux valeurs $x == 3 et vrifie leur galit

Vrifie qu'une variable oprateur d'infriorit est strictement $x < 3 stricte infrieure une valeur Vrifie qu'une variable oprateur d'infriorit est infrieure ou gale $x <= 3 une valeur Vrifie qu'une variable oprateur de est strictement $x > 3 supriorit stricte suprieure une valeur Vrifie qu'une variable oprateur de est suprieure ou gale $x >= 3 supriorit une valeur Vrifie qu'une variable oprateur de est diffrente d'une $x != 3 diffrence valeur

19. Les oprateurs logiques (boolens)


Ce type d'oprateur permet de vrifier si plusieurs conditions sont vraies : Oprateur Dnomination || ou OR OU logique Effet Vrifie qu'au moins une des conditions est ralise Vrifie que toutes les conditions sont ralises Oppos du OU logique (une des deux conditions est ralise mais pas les deux) Inverse l'tat d'une variable boolenne (retourne la valeur 1 si la variable vaut 0, 0 si elle vaut 1) Syntaxe ((condition1)||(condition2)) ((condition1)&&(condition2)) ((condition1)XOR(condition2)) (!condition)

&& ou AND ET logique XOR ! OU exclusif NON logique

ESAT/DMSI/PROA/WGR

Page 12 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

20. Les oprateurs bitwise


Ce type d'oprateur traite ses oprandes comme des donnes binaires, plutt que des donnes dcimales, hexadcimales ou octales. Ces oprateurs traitent ces donnes selon leur reprsentation binaire mais retournent des valeurs numriques standards dans leur format d'origine. Les oprateurs suivants effectuent des oprations bitwise, c'est--dire avec des bits de mme poids. Oprateur Dnomination & | ^ ~ AND bitwise OR bitwise XOR bitwise Complment (NON) Effet Syntaxe Retourne 1 si les deux bits de mme 9 & 12 (1001 & 1100) poids sont 1 Retourne 1 si l'un ou l'autre des deux 9 | 12 (1001 | 1100) bits de mme poids est 1 (ou les deux) Retourne 1 si l'un des deux bits de 9 ^ 12 (1001 ^ 1100) mme poids est 1 (mais pas les deux) Retourne 1 si le bit est 0 (et ~9 (1001) inversement) Rsultat 8 (1000) 13 (1101) 5 (0101) 6 (0110)

Les oprateurs suivants effectuent des rotations sur les bits, c'est--dire qu'ils dcalent chacun des bits d'un nombre de bits vers la gauche ou vers la droite. Le premire oprande dsigne la donne sur laquelle on va faire le dcalage, le second dsigne le nombre de bits duquel il va tre dcal. Oprateur Dnomination << Effet Syntaxe Rsultat Dcale les bits vers la gauche (multiplie par 2 Rotation chaque dcalage). Les zros qui sortent gauche 6 << 1 (110 << 1) 12 (1100) gauche sont perdus, tandis que des zros sont insrs droite Rotation droite Dcale les bits vers la droite (divise par 2 avec chaque dcalage). Les zros qui sortent droite 6 >> 1 (0110 >> 1) 3 (0011) conservation du sont perdus, tandis que le bit non-nul de poids signe plus fort est recopi gauche

>>

21. Autres oprateurs


Les oprateurs ne peuvent pas tre classs dans une catgorie spcifique mais ils ont tout de mme chacun leur importance! Oprateur Dnomination Effet . Concatnation Joint deux chanes bout bout Permet de dfinir une variable Rfrencement $ Permet de crer une variable de variable dynamique (ex : $var = "bon" ;) Proprit d'un Permet d'accder aux donnes -> objet membres d'une classe Syntaxe "Bonjour"." Au revoir" $MaVariable = 2; $$var = "jour" ; $MonObjet->Propriete Rsultat "Bonjour Au revoir" La variable contenant "jour" est $$var ou $bon

ESAT/DMSI/PROA/WGR

Page 13 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

22. Les priorits des oprateurs


Lorsque l'on associe plusieurs oprateurs dans une mme expression, il faut que le navigateur sache dans quel ordre les traiter, voici donc dans l'ordre croissant les priorits de tous les oprateurs: Associativit gauche gauche gauche gauche droite gauche gauche gauche gauche gauche gauche gauche non-associative non-associative gauche gauche gauche droite droite non-associative Oprateurs , or xor and print = += -= *= /= .= %= &= |= ^= ~= ><= >>= ?: || && | ^ & == != === < <= > >= << >> +-. */% ! ~ ++ -- (int) (double) (string) (array) (object) [ new

ESAT/DMSI/PROA/WGR

Page 14 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

4. Les structures de contrles


23. La notion de bloc
Une expression suivie d'un point-virgule est appele instruction. Par exemple $a++; est une instruction. Lorsque l'on veut regrouper plusieurs instructions, on peut crer ce que l'on appelle un bloc, c'est--dire un ensemble d'instructions (suivies respectivement par des points-virgules) et comprises entre les accolades { et }. Les instructions if, while et for peuvent par exemple tre suivies d'un bloc d'instructions excuter...

24. La structure conditionnelle


On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-dire si la valeur de son expression vaut 0 ou 1 (PHP associe les mots cls TRUE 1 et FALSE 0). Ces structures conditionnelles peuvent tre associes des structures qui se rptent suivant la ralisation de la condition, on appelle ces structures des structures de boucle.

24.1. L'instruction if
L'instruction if est la structure de test la plus basique, on la retrouve dans tous les langages (avec une syntaxe diffrente...). Elle permet d'excuter une srie d'instructions si jamais une condition est ralise. La syntaxe de cette expression est la suivante : if (condition) { liste d'instructions // ces instructions seront excutes si la condition est ralise } Remarques: la condition doit tre entre parenthses, il est possible de dfinir plusieurs conditions remplir avec les oprateurs ET et OU (&& et ||) par exemple: if ( (condition1) && (condition2) ) teste si les deux conditions sont vraies if ( (condition1) || (condition2) ) teste si au moins une des deux conditions est vraie s'il n'y a qu'une instruction excuter, les accolades ne sont pas ncessaires.

ESAT/DMSI/PROA/WGR

Page 15 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

24.2. L'instruction if ... else


L'instruction if dans sa forme basique ne permet de tester qu'une condition, or la plupart du temps on aimerait pouvoir choisir les instructions excuter en cas de non-ralisation de la condition... L'expression if ... else permet d'excuter une autre srie d'instructions en cas de non-ralisation de la condition. La syntaxe de cette expression est la suivante : if (condition) { liste d'instructions // ces instructions seront excutes si la condition est ralise } else { autre srie d'instructions // ces instructions seront excutes si la condition nest pas ralise }

24.3. L'instruction if ... elseif ... else


L'instruction if ... else ne permet de tester qu'une condition, or il est parfois ncessaire de tester plusieurs conditions de faon exclusive, c'est--dire que sur toutes les conditions une seule sera ralise ... L'expression if ... elseif ... else permet d'enchaner une srie d'instructions et vite d'avoir imbriquer des instructions if. La syntaxe de cette expression est la suivante : if (condition1) { liste d'instructions // ces instructions seront excutes si la condition 1 est ralise } elseif (condition2) { autre liste d'instructions // ces instructions seront excutes si la condition 1 nest pas ralise // et si la condition 2 est ralise } else { autre liste d'instructions // ces instructions seront excutes si les conditions 1 et 2 ne sont pas ralises }

24.4. Loprateur ternaire (une faon plus courte de faire un test)


Il est possible de faire un test avec une structure beaucoup moins lourde grce la structure suivante, appele oprateur ternaire: (condition) ? instruction si la condition est ralise : instruction si la condition nest pas ralise ; Remarques: la condition doit tre entre parenthses Lorsque la condition est vraie, l'instruction gauche des : est excute Lorsque la condition est fausse, cest l'instruction place droite des : qui est excute

ESAT/DMSI/PROA/WGR

Page 16 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

24.5. L'instruction switch


L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une mme variable. Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable, car cette opration aurait t complique (mais possible) avec des if imbriqus. Sa syntaxe est la suivante : switch (Variable) { case Valeur1 : Liste d'instructions break ; case Valeur2 : Liste d'instructions break ; case Valeurn : Liste d'instructions break ; default: Liste d'instructions break ; } Les parenthses qui suivent linstruction switch indiquent une expression dont la valeur est teste successivement par chacun des case. Lorsque l'expression teste est gale une des valeurs suivant un case, la liste d'instructions qui suit celui-ci est excute. Le mot cl break indique la sortie de la structure conditionnelle. Le mot cl default prcde la liste d'instructions qui sera excute si l'expression n'est jamais gale une des valeurs numres dans les case.

Si linstruction break ; est omise la suite de la liste dinstructions dun case, PHP continuera excuter les instructions du ou des case suivants jusqu la rencontre dun break ; ou la fin de linstruction switch.

25. Les boucles


Les boucles sont des structures qui permettent d'excuter plusieurs fois la mme srie d'instructions jusqu' ce que la condition ne soit plus ralise... On appelle parfois ces structures rptitives ou bien itrations. Les trois instructions qui permettent deffectuer une boucle sont : while, do..while et for.

25.1. L'instruction while


L'instruction while permet d'excuter plusieurs fois une mme srie d'instructions. La syntaxe de cette instruction est la suivante : while (condition) { liste d'instructions } Cette instruction excute la liste d'instructions tant que la condition est ralise. La condition doit obligatoirement contenir un variant compar un invariant. Le variant est une variable dont la valeur varie au cours des diffrents passages dans la boucle. Linvariant est une valeur ou une variable dont la valeur ne varie pas au cours des diffrents passages dans la boucle. Si la condition nest pas ralise lors de sa premire valuation, aucune instruction de la liste nest excute.

ESAT/DMSI/PROA/WGR

Page 17 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

25.2. L'instruction do..while


L'instruction do..while permet galement d'excuter plusieurs fois une mme srie d'instructions. La syntaxe de cette instruction est la suivante : do { liste d'instructions } while (condition) ; Cette instruction excute la liste d'instructions tant que la condition est ralise. La condition doit obligatoirement contenir un variant compar un invariant. Le variant est une variable dont la valeur varie au cours des diffrents passages dans la boucle. Linvariant est une valeur ou une variable dont la valeur ne varie pas au cours des diffrents passages dans la boucle. La principale diffrence par rapport linstruction while est que la premire itration de la boucle est toujours excute car la condition darrt nest teste qu la fin de litration..

25.3. Linstruction for


L'instruction for est linstruction la plus complexe permettant d'excuter plusieurs fois la mme srie d'instructions. La syntaxe de cette expression est la suivante : for (expression1; condition ; expression2) { liste d'instructions } expression1 est constitue daucune, une ou plusieurs instructions spares par une virgule. Cette ou ces instructions sont excutes une seule fois avant la premire valuation de la condition et donc avant la premire itration. En rgle gnrale cette expression contient linitialisation de la variable dite variant. condition est la condition darrt de la boucle. Elle quivaut au tant que du while et est value avant chaque itration, elle doit donc obligatoirement contenir le variant (gnralement initialis dans expression1) compar un invariant. expression2 est constitue daucune, une ou plusieurs instructions spares par une virgule. Elle est excute systmatiquement chaque itration (aprs lexcution de la liste des instructions et avant lvaluation de la condition pour litration suivante). En rgle gnrale cette expression contient lincrmentation (ou la dcrmentation) de la variable dite variant.

Les points-virgules doivent toujours tre prsents, mme si expression1 et/ou expression2 ne contiennent aucune instruction. Si la liste dinstructions est inexistante, linstruction for doit se terminer par un point-virgule, la syntaxe est alors la suivante : for (expression1; condition ; expression2) ; Exemple: for ($i=1 ; $i<6 ; $ i++) { echo $i . ,; } Cette boucle affiche 5 fois la valeur de $i, c'est--dire 1,2,3,4,5, Autre exemple restituant le mme rsultat : for ($i=1 ; $i<6 ; echo $ i++.,) ;

ESAT/DMSI/PROA/WGR

Page 18 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

26. Saut inconditionnel continue


Il peut tre ncessaire de ne pas excuter certaines instructions dans la boucle pour une ou plusieurs valeurs sans pour autant mettre fin celle-ci. La syntaxe de cette expression est : "continue;" (cette instruction se place dans une boucle!), on l'associe gnralement une structure conditionnelle, sinon les lignes situes entre cette instruction et la fin de la boucle seraient obsoltes. Exemple : Imaginons que l'on voudra imprimer, pour $x allant de 1 10, la valeur de 1/($x-7) ... il est vident que pour $x=7 il y aura une erreur. Heureusement, grce l'instruction continue il est possible de traiter cette valeur part puis de continuer la boucle! $x=1 ; while ($x<=10) { if ($x == 7) { echo("Attention division par zro!"); continue; // saut litration suivante } $a = 1/($x-7); echo $a; $x++ ; } Il y a une erreur dans ce programme... peut-tre l'avez-vous vue ! : Lorsque x est gal 7, le compteur ne s'incrmente plus, il reste constamment la valeur 7, il aurait fallu crire: $x=1 ; while ($x<=10) { if ($x == 7) { echo("Attention division par zro!"); $x++ ; // incrmentation de $x continue; // saut litration suivante avec $x=8 } $a = 1/($x-7); echo $a; $x++ ; }

ESAT/DMSI/PROA/WGR

Page 19 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

27. Arrt inconditionnel break


A l'inverse, il peut tre voulu d'arrter prmaturment la boucle, pour une autre condition que celle prcise dans l'en-tte de la boucle. L'instruction break permet d'arrter une boucle. Il s'agit, tout comme continue, de l'associer une structure conditionnelle. Dans l'exemple prcdent, par exemple si l'on ne savait pas quel moment le dnominateur (x-y) s'annule, il serait possible de faire arrter la boucle en cas d'annulation du dnominateur, pour viter une division par zro! .. for ($x=1 ; $x<=10 ; $x++) { $a = $x-$y; // on considre que $y a t initialis ou calcul avant la boucle for if ($a == 0) { echo("Attention division par zro !"); break; // arrt de la boucle et excution de linstructionx situe aprs la boucle } echo 1/$a; } instructionx ;

28. Arrt d'excution du script par exit


PHP autorise l'utilisation de la commande exit; qui permet d'interrompre totalement l'interprtation du script, ce qui signifie que le serveur n'envoie plus d'informations au navigateur : le script est fig dans son tat actuel. cette instruction est particulirement utile lors de l'apparition d'erreur!

ESAT/DMSI/PROA/WGR

Page 20 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

5. Les tableaux
29. Les variables tableaux
Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donne la fois. Or, pour de nombreuses donnes, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes grer. Heureusement, PHP propose des structures de donnes permettant de stocker l'ensemble de ces donnes dans une "variable commune". Ainsi, pour accder ces valeurs il suffit de parcourir la variable de type complexe compose de "variables" de type simple. Les tableaux stockent des donnes sous forme de liste. Les donnes contenues dans la liste sont accessibles grce un index (un numro reprsentant l'lment de la liste). Contrairement des langages tels que le langage C, il est possible de stocker des lments de types diffrents dans un mme tableau. Ainsi, pour dsigner un lment de tableau, il suffit de faire suivre au nom du tableau l'indice de l'lment entre crochets : $Tableau[0] = 12; $Tableau[1] = "CCM"; Avec PHP, il n'est pas ncessaire de prciser la valeur de l'index lorsque l'on veut remplir un tableau, car il assigne la valeur 0 au premier lment (si le tableau est vide) et incrmente les indices suivants. De cette faon, il est facile de remplir un tableau avec des valeurs. Le code prcdent est quivalent : $Tableau[] = 12; $Tableau[] = "CCM";

Tous les types de variables peuvent tre contenus dans un tableau.


Lorsqu'un tableau contient d'autres tableaux, on parle de tableaux multidimensionnels. Il est possible de crer directement des tableaux multidimensionnels en utilisant plusieurs paires de crochets pour les index (autant de paires de crochets que la dimension voulue). Par exemple, un tableau deux dimensions pourra tre dclar comme suit : $Tableau[0][0] = 12; $Tableau[0][1] = "CCM"; $Tableau[1][0] = 1245.652; $Tableau[1][1] = "Au revoir";

Les indices de tableau commencent zro.

30. Les variables des tableaux associatifs


PHP permet l'utilisation de chanes de caractres au lieu de simples entiers pour dfinir les indices d'un tableau, on parle alors de tableaux associatifs. Cette faon de nommer les indices peut parfois tre plus agrable utiliser: $Toto["Age"] = 12; $Toto["Adresse"] = "22 rue des bois fleuris"; $Toto["Nom"] = "AVOUSDETROUVER"; $organisme = "ESAT"; $tab_organismes[$organisme][0] = $organisme; $tab_organismes[$organisme][1] = $nbpers; $tab_organismes[$organisme][2] = $nbabon; // nom de lorganisme // nombre de personnes // nombre d'abonns

ESAT/DMSI/PROA/WGR

Page 21 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

6. Les fonctions
31. La notion de fonction
On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel (de la fonction) dans le corps du programme principal. Les fonctions permettent d'excuter dans plusieurs parties du programme une srie d'instructions sans avoir rcrire cet ensemble dinstructions, cela permet une simplicit du code et donc une taille de programme minimale. D'autre part, une fonction peut faire appel elle-mme, on parle alors de fonction rcursive (il ne faut pas oublier de mettre une condition de sortie au risque sinon de ne pas pouvoir arrter le programme...).

32. La dclaration d'une fonction


PHP recle de nombreuses fonctions intgres permettant d'effectuer des actions courantes. Toutefois, il est possible de dfinir des fonctions, dites fonctions utilisateurs afin de simplifier l'excution de sries d'instructions rptitives. Contrairement de nombreux autres langages, PHP3 ncessite que l'on dfinisse une fonction avant que celle-ci puisse tre utilise, car pour l'appeler dans le corps du programme il faut que l'interprteur la connaisse, c'est--dire qu'il connaisse son nom, ses arguments et les instructions qu'elle contient (PHP4 a supprim cette restriction). La dfinition d'une fonction s'appelle "dclaration" et peut se faire n'importe o dans le code. La dclaration d'une fonction se fait grce au mot cl function, selon la syntaxe suivante : function Nom_De_La_Fonction(type1 argument1, type2 argument2, ...) { liste d'instructions } Remarques: le nom de la fonction suit les mmes rgles que les noms de variables, cest--dire : le nom doit commencer par une lettre un nom de fonction peut comporter des lettres, des chiffres et les caractres _ et & (les espaces ne sont pas autoriss!) le nom de la fonction, comme celui des variables est sensible la casse (diffrenciation entre les minuscules et majuscules) Les arguments sont facultatifs, mais s'il n'y a pas d'argument, les parenthses doivent rester prsentes. Il ne faut pas oublier de refermer les accolades.

Le nombre d'accolades ouvertes (fonction, boucles et autres structures) doit tre gal au nombre d'accolades fermes! La mme chose s'applique pour les parenthses, les crochets ou les guillemets!

Une fois cette tape franchie, votre fonction ne s'excutera pas tant que l'on ne fait pas appel elle quelque part dans le programme!

ESAT/DMSI/PROA/WGR

Page 22 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

33. Appel de fonction


Pour excuter une fonction, il suffit de faire appel elle en crivant son nom (une fois de plus en respectant la casse) suivie d'une parenthse ouverte, des arguments ventuels puis d'une parenthse ferme. Exemples : Nom_De_La_Fonction(); // appel de fonction sans argument Nom_De_La_Fonction(argument1, argument2); // appel de fonction avec 2 arguments Remarques: le point virgule signifie la fin d'une instruction et permet l'interprteur de distinguer les diffrents blocs d'instructions si jamais vous avez dfini des arguments dans la dclaration de la fonction, il faudra veiller les inclure lors de l'appel de la fonction (le mme nombre d'arguments spars par des virgules!) Nom_De_La_Fonction(argument1, argument2);

34. Les arguments d'une fonction


Il est possible de passer des arguments une fonction, c'est--dire lui fournir des valeurs ou le nom de variables afin que la fonction puisse effectuer des oprations sur ces arguments ou bien grce ces arguments. Le passage d'arguments une fonction se fait au moyen d'une liste d'arguments (spars par des virgules) entre parenthses suivant immdiatement le nom de la fonction. Lorsque vous voulez utiliser un argument dans le corps de la fonction en tant que variable, celui-ci doit tre prcd par le signe $.

35. Travailler sur des variables dans les fonctions


Lorsque vous manipulerez des variables dans des fonctions, il vous arrivera de constater que vous avez beau modifier la variable dans la fonction celle-ci retrouve sa valeur d'origine ds que l'on sort de la fonction.. Cela est du la porte des variables, c'est--dire si elles ont t dfinies comme variables globales ou locales. Une variable prcde du mot cl global sera visible dans l'ensemble du code, c'est--dire que sa porte ne sera pas limite la fonction seulement. Ainsi, toutes les fonctions pourront utiliser et modifier cette mme variable dans le cas contraire, la variable ne pourra tre modifie qu' l'intrieur de la fonction et retrouvera, la sortie de celle-ci, la valeur qu'elle avait juste avant l'appel de fonction une autre mthode pour modifier une variable consiste la faire prcder du caractre &, prcisant qu'il s'agit alors d'un passage dargument par rfrence.

36. Renvoi d'une valeur par une fonction


La fonction peut renvoyer une valeur (et donc se terminer) grce au mot cl return. Lorsque l'instruction return est rencontre, la fonction value la valeur qui la suit, puis la renvoie au programme appelant (programme partir duquel la fonction a t appele). Une fonction peut contenir plusieurs instructions return, ce sera toutefois la premire instruction return rencontre qui provoquera la fin de la fonction et le renvoi de la valeur qui la suit. La syntaxe de l'instruction return est simple : return valeur_ou_variable_ou_expression; Exemple : return $x + $y ;

ESAT/DMSI/PROA/WGR

Page 23 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

37. Passage dargument par rfrence


Par dfaut, les arguments sont passs la fonction par valeur : dans ce cas il y a recopie de la valeur de largument prcis lors de lappel la fonction dans largument mentionn dans la description de la fonction et qui est alors une variable locale cette fonction. Si vous voulez que la fonction puisse modifier la valeur de largument pass lors de lappel, vous devez passer cet argument par rfrence. PHP vous permet ce passage par rfrence selon 2 mthodes :
1. Si vous voulez quun argument soit toujours pass par rfrence, vous pouvez ajouter un & devant

largument dans la dclaration de la fonction : Function carre(&$xlocal) { $xlocal = $xlocal * $xlocal ; } $x = 4 ; carre($x) ; echo $x; // affichera 16
2. Si vous voulez passer ponctuellement un argument par rfrence, vous pouvez ajouter un & devant

largument dans lappel de la fonction : Function carre($xlocal) { $xlocal = $xlocal * $xlocal ; } $x = 4 ; carre($x) ; echo $x; // affichera 4 carre(&$x) ; echo $x; // affichera 16

38. Valeur par dfaut des arguments


Vous pouvez dfinir des valeurs par dfaut pour les arguments de type scalaire. Exemple1 : Function connecter($periph = "clavier") { return "connexion du $periph ralise !\n" ; } echo connecter() ; echo connecter("scanner") ; // affichera connexion du clavier ralise ! // affichera connexion du scanner ralise !

Exemple2 : Function connecter($type, $periph = "clavier") { return "connexion du $periph avec fiche $type ralise !\n" ; } echo connecter("USB") ; // affichera connexion du clavier avec fiche USB ralise !

La valeur par dfaut dun argument doit obligatoirement tre une constante !

ESAT/DMSI/PROA/WGR

Page 24 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

39. La fonction include


La fonction include nom_de_fichier; interprte le fichier spcifi en argument chaque fois que la fonction est rencontre. Vous pouvez donc utiliser la fonction include dans une structure de boucle afin dinterprter plusieurs fichiers. Exemple : $tab_files = array(fic1.inc,fic2.inc,fic3.inc,fic4.inc) ; for( $i = 0 ; $i < sizeof($tab_files) ; $i++) { include $tab_files[$i] ; } include diffre de la fonction require nom_de_fichier; dans le sens o la fonction include interprte le fichier spcifi en argument chaque fois que la fonction est rencontre, alors que la fonction require nom_de_fichier; est remplace systmatiquement par le fichier spcifi en argument, que la fonction soit rencontre ou non. require est identique au #include du langage C.

Vous devez inclure la fonction include dans un bloc {} lorsque celle-ci est place dans une structure conditionnelle.

40. La fonction empty


Dtermine si une variable est affecte. Syntaxe : bool empty(mixed var); Elle retourne la valeur FALSE "faux" si la variable var est dfinie et a une valeur diffrente de 0. Elle retourne la valeur TRUE "vrai" si elle nest pas dfinie ou si elle est dfinie et contient la valeur 0.

41. La fonction isset


Dtermine si une variable est affecte. Syntaxe : bool isset(mixed var); Elle retourne la valeur TRUE "vrai" si la variable var est dfinie et contient une valeur ; FALSE "faux" sinon.

42. La fonction unset


Dtruit une variable. Syntaxe : bool unset(mixed var); Dtruit la variable var et renvoie la valeur TRUE "vrai".

ESAT/DMSI/PROA/WGR

Page 25 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

7. La gestion des tableaux


43. array
Array(); retourne un tableau cr partir des arguments fournis. Les arguments peuvent tre sous la forme indice => valeur. Array() nest pas une fonction standard, elle existe simplement pour reprsenter littralement des tableaux. Lexemple suivant montre la construction dun tableau bi-dimensionnel, l'assignation dindices pour les tableaux associatifs, et comment carter certains intervalles d'indices numriques. $tab_fruits = array( "fruits" => array("a"=>"orange", "b"=>"banane", "c"=>"pomme"), "nombres" => array(1, 2, 3, 4, 5, 6), "trous" => array("premier", 5 => "deuxime", "troisime")); echo $tab_fruits["fruits"]["a"]; echo $tab_fruits["nombres"][0]; echo $tab_fruits["trous"][0]; echo $tab_fruits["trous"][6]; // // // // affichera affichera affichera affichera orange 1 premier troisime

44. is_array
Renvoie la valeur TRUE si la variable $var est un tableau, FALSE sinon. La syntaxe est la suivante : is_array($var)

45. each
La fonction each() permet de parcourir tous les lments dun tableau sans se soucier de ses bornes, ce qui en fait un outil extrmement pratique. Son fonctionnement est simple : elle retourne la combinaison indice-valeur courante du tableau pass en argument, puis se positionne sur llment suivant de ce tableau, et cela, du premier au dernier indice. Lorsque la fin du tableau est atteinte, each() retourne la valeur FALSE. Exemple : $var = array() ; $tab = array(val1,val2,val3,val4) ; $var = each($tab) ; // affectation du premier couple indice-valeur du tableau $tab $var while($var) // tant que $var est vrai { echo "$var[0] : $var[1]<br>" ; // affichage de lindice et de la valeur $var = each($tab) ; // affectation du couple indice-valeur suivant du tableau $tab $var } Rsultat : 0 : val1 1 : val2 2 : val3 3 : val4

ESAT/DMSI/PROA/WGR

Page 26 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

46. list
La fonction list() est trs souvent associe la fonction each(). Elle permet daffecter les lments dun tableau des variables distinctes. En reprenant lexemple prcdent, on pourra utiliser list() de la manire suivante : $tab = array(val1,val2,val3,val4) ; while( list($indice, $valeur) = each($tab) ) // tant que la fonction each() renvoie une valeur non nulle (vraie) { echo "$indice : $valeur <br>" ; // affichage de chaque couple indice et valeur } Nous obtenons le mme rsultat que prcdemment. Le tableau $var est remplac par deux variables distinctes.

Les utilisations les plus pertinentes de la fonction interviennent notamment lors de requtes effectues sur des bases de donnes relationnelles qui renvoient les informations sous forme de tableaux. Dans les applications Intranet/Internet, il est courant de devoir construire des pages qui comportent un nombre indtermin de champs de saisie, comme une page de saisie doptions. La solution est dutiliser des champs de type text qui portent le mme nom. PHP va automatiquement crer un tableau dans la page cible, pour lequel les fonctions list() et each() sont particulirement adaptes. Exemple : <FORM action = formul1.php3 method = POST> <table> <tr> <td>Valeur 1 : </td> <td><input type = text length = 10 name = tabval[] /></td> </tr> <tr> <td>Valeur 2 : </td> <td><input type = text length = 10 name = tabval[] /></td> </tr> <tr> <td>Valeur 3 : </td> <td><input type = text length = 10 name = tabval[] /></td> </tr> <tr> <td>Valeur 4 : </td> <td><input type = text length = 10 name = tabval[] /></td> </tr> <tr> <td colspan = 2 align = center>< input type = submit value = Valider></td> </tr> </table>
</FORM>

Dans le formulaire formul1.php3, la srie de valeurs est reue sous forme dun tableau portant le nom du champ texte. Il ne reste plus qu le parcourir de la faon suivante : while( list($indice, $valeur) = each($tabval) ) // tant que la fonction each() renvoie une valeur non nulle { echo "$indice : $valeur <br>" ; // affichage de chaque couple indice et valeur }

ESAT/DMSI/PROA/WGR

Page 27 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

47. count
count($var) retourne le nombre d'lments dans var, qui est gnralement un tableau (et tout le reste n'aura qu'un lment). Retourne 1 si la variable n'est pas un tableau. Retourne 0 si la variable n'est pas cre, mais il peu aussi retourner 0 pour un tableau vide. Utilisez plutt la commande isset() pour savoir si une variable existe ou pas.

48. sizeof
sizeof($tab) retourne galement le nombre d'lments du tableau $tab.

49. current
Chaque tableau entretien un pointeur interne, qui est initialis lorsque le premier lment est insr dans le tableau. La fonction current($tab) ne fait que retourner l'lment courant point par le pointeur interne. current() ne dplace pas le pointeur. Si le pointeur est au-del du dernier lment de la liste, current() retourne faux. Si le tableau contient des lments vides ou des zros (0 ou "", la chane vide) alors cette fonction retournera false pour ces lments. Il est donc impossible de dterminer si vous tes rellement la fin de la liste en utilisant la fonction current(). Pour passer en revue proprement un tableau qui peut contenir des lments vides ou des zros, utilisez la fonction each().

50. pos
pos($tab) retourne l'lment courant du tableau $tab. Cest un alias de current().

51. next
next($tab) retourne l'lment suivant du tableau $tab, ou false sil n'y a plus d'lment. Le pointeur interne du tableau est avanc d'un lment. next() se comporte comme current(), mais avec une diffrence : Il avance le pointeur interne de tableau d'un lment avant de retourner la valeur sur lequel il pointe. Lorsque le pointeur dpasse le dernier lment, next() retourne false. Si le tableau contient des lments vides ou des zros, cette fonction retournera false pour ces lments. Pour passer proprement en revue un tableau, il faut utiliser each().

52. prev
prev($tab) repositionne le pointeur interne du tableau $tab la dernire place qu'il occupait et retourne llment, ou bien retourne faux sil ne reste plus d'lment. Si le tableau contient des lments vides, cette fonction retournera faux pour ces lments aussi. Pour passer en revue tous les lments, utilisez plutt each(). prev() se comporte exactement comme next(), mais il fait reculer le pointeur plutt que de l'avancer.

53. reset
reset($tab) replace le pointeur du tableau $tab au premier lment. reset() retourne la valeur du premier lment.

ESAT/DMSI/PROA/WGR

Page 28 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

54. end
end($tab) dplace le pointeur interne du tableau $tab jusqu'au dernier lment. end() retourne la valeur du dernier lment.

55. key
key($tab) retourne lindice courant du pointeur interne du tableau $tab. Exemple : <? $tab = array('val1','val2','val3','val4'); echo "premier = ".reset($tab)." indice = ".key($tab)."<br>"; echo "dernier = ".end($tab)." indice = ".key($tab)."<br>"; ?> Rsultat : premier = val1 indice = 0 dernier = val4 indice = 3

56. sort
sort($tab) trie les lments du tableau $tab du plus petit au plus grand Exemple : <html> <head> <title>Page d'essai PHP</title> </head> <body> <? echo "<form method='post' action='#'>"; $tab_fruits = array("papaye","orange","banane","ananas"); // tri du tableau en ordre croissant sort($tab_fruits); // affichage du tableau tri for($key = 0; $key < sizeof($tab_fruits); $key++) { echo "tab_fruits[$key] = ".$tab_fruits[$key]."<br>"; } echo "</form>"; ?> </body> </html> Cet exemple va afficher : tab_fruits[0] = ananas tab_fruits[1] = banane tab_fruits[2] = orange tab_fruits[3] = papaye Les fruits ont t classs dans l'ordre alphabtique.

ESAT/DMSI/PROA/WGR

Page 29 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

57. asort
La fonction asort($tab) trie le tableau $tab en ordre croissant et de telle manire que la corrlation entre les indices et les valeurs soit conserve. L'usage principal est lors de tri de tableaux associatifs o l'ordre des lments est important. Exemple : $tab_fruits = array("d"=>"papaye","a"=>"orange","b"=>"banane","c"=>"ananas"); // tri du tableau en ordre croissant asort($tab_fruits); // affichage du tableau tri for($key = 0, reset($tab_fruits); $key < sizeof($tab_fruits); $key++, next($tab_fruits)) { $indice = key($tab_fruits); echo "tab_fruits[$indice] = ".$tab_fruits[$indice]."<br>"; } Cet exemple va afficher : tab_fruits[c] = ananas tab_fruits[b] = banane tab_fruits[a] = orange tab_fruits[d] = papaye Les fruits ont t classs dans l'ordre alphabtique et leur indice respectif a t conserv.

58. arsort
La fonction arsort($tab) trie le tableau $tab en ordre dcroissant et de telle manire que la corrlation entre les indices et les valeurs soit conserve. L'usage principal est lors de tri de tableaux associatifs o l'ordre des lments est important. Exemple : $tab_fruits = array ("a"=>"orange","c"=>"ananas","b"=>"banane","d"=>"papaye" ); // tri du tableau en ordre dcroissant arsort($tab_fruits); // affichage du tableau tri for($key = 0, reset($tab_fruits); $key < sizeof($tab_fruits); $key++, next($tab_fruits)) { $indice = key($tab_fruits); echo "tab_fruits[$indice] = ".$tab_fruits[$indice]."<br>"; } Cet exemple va afficher : tab_fruits[d] = papaye tab_fruits[a] = orange tab_fruits[b] = banane tab_fruits[c] = ananas Les fruits ont t classs dans l'ordre alphabtique inverse et leur indice respectif a t conserv.

ESAT/DMSI/PROA/WGR

Page 30 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

59. rsort
La fonction rsort($tab) trie le tableau $tab en ordre dcroissant mais ne conserve pas la corrlation entre les indices et les valeurs. Laffichage du tableau $tab_fruits de lexemple prcdent et tri laide de la fonction rsort($tab_fruits) donnerait : tab_fruits[0] = papaye tab_fruits[1] = orange tab_fruits[2] = banane tab_fruits[3] = ananas

60. ksort
La fonction ksort($tab) trie le tableau $tab en ordre croissant sur les indices et conserve la corrlation entre les indices et les valeurs. Laffichage du tableau $tab_fruits de lexemple prcdent et tri laide de la fonction ksort($tab_fruits) donnerait: tab_fruits[a] = orange tab_fruits[b] = banane tab_fruits[c] = ananas tab_fruits[d] = papaye

ESAT/DMSI/PROA/WGR

Page 31 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

61. usort, uksort et uasort


Pour trier les lments dun tableau selon plusieurs critres, il faut utiliser des fonctions de comparaison personnalises. En effet, les fonctions intgres de PHP ne ralisent que des tris basiques. Par consquent, si lon dsire utiliser des critres de tri plus fins, il est ncessaire de dvelopper une fonction sur mesure. Cette fonction sera ensuite passe en paramtre aux fonctions uasort, uksort et usort qui ralisent respectivement des tris semblables ceux effectus par les fonctions asort, ksort et sort. Voici un exemple qui classe une srie de nombres en fonction de leur cart avec la valeur 50, de lcart le plus faible au plus important : // fonction de comparaison qui retourne 0 si les 2 nombres compars sont gaux, 1 si le premier est plus loign de 50 du deuxime, et 1 dans le cas contraire. Function cmp($nb1, $nb2) { if( $nb1 == $nb2 ) return 0; if( abs(50 - $nb1) > abs(50 - $nb2) ) return 1; else return -1; } // construction du tableau $tab = array(10,25,5,62,118); // tri du tableau avec la fonction cmp() usort($tab, cmp); // affichage du tableau tri while( list($indice,$valeur) = each($tab) ) echo $indice : $valeur (cart = . abs(50 - $valeur) . )<br>; Rsultat de laffichage du tableau tri : 0 : 62 (cart = 12) 1 : 25 (cart = 25) 2 : 10 (cart = 40) 3 : 5 (cart = 45) 4 : 118 (cart = 68) Le tableau est tri en ordre croissant sur lcart, mais usort na pas conserv la corrlation entre les indices et les valeurs. En utilisant uasort, on obtient un tableau dans lequel la corrlation entre les indices et les valeurs est conserve. Rsultat de laffichage du tableau tri avec uasort($tab, cmp) : 3 : 62 (cart = 12) 1 : 25 (cart = 25) 0 : 10 (cart = 40) 2 : 5 (cart = 45) 4 : 118 (cart = 68)

ESAT/DMSI/PROA/WGR

Page 32 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

62. extract
void extract(array var_array, int extract_type , string prefix ) Cette fonction sert exporter un tableau vers la table des symboles. Elle prend un tableau associatif var_array et cre les variables dont les noms sont les indices de ce tableau, et leur affecte la valeur associe. Pour chaque paire indice/valeur, cette fonction cre une variable, avec les paramtres extract_type et prefix. extract() vrifie l'existence de la variable avant de la crer. La manire de traiter les collisions est dtermine par extract_type. Ce paramtre peut prendre une des valeurs suivantes : EXTR_OVERWRITE : Lors d'une collision, rcrire la variable existante. EXTR_SKIP : Lors d'une collision, ne pas rcrire la variable existante EXTR_PREFIX_SAME : Lors d'une collision, ajouter le prfixe prefix, et crer une nouvelle variable. EXTR_PREFIX_ALL : Ajouter le prfixe prefix, et crer une nouvelle variable. Si extract_type est omis, extract() utilise EXTR_OVERWRITE par dfaut. Notez que prefix n'est ncessaire que pour les valeurs de extract_type suivantes : EXTR_PREFIX_SAME et EXTR_PREFIX_ALL. extract() vrifie que les indices constituent un nom de variable valide, et si c'est le cas, procde son exportation. Exemple : <php? $taille = "grand"; $var_array = array( "couleur" => "bleu", "taille" => "moyen", "forme" => "sphere"); extract($var_array, EXTR_PREFIX_SAME, "wddx"); echo "$couleur, $taille, $forme, $wddx_taille<br>"; ?> L'exemple ci dessus va afficher : bleu, grand, sphere, moyen La variable $taille n'a pas t rcrite, car on avait spcifi le paramtre EXTR_PREFIX_SAME, qui a permis la cration $wddx_taille. Si EXTR_SKIP avait t utilis, alors $wddx_taille n'aurait pas t cr. Avec EXTR_OVERWRITE, $taille aurait pris la valeur "moyen", et avec EXTR_PREFIX_ALL, les variables cres seraient $wddx_couleur, $wddx_taille, et $wddx_forme.

63. range
La fonction range(int low, int high) retourne un tableau contenant tous les entiers depuis low jusqu' high, inclus. Exemple : $tab = array(); $tab = range(0,10); for( $i = 0 ; $i < sizeof($tab) ; $i++) echo "$tab[$i] "; Cet exemple affichera : 0 1 2 3 4 5 6 7 8 9 10

ESAT/DMSI/PROA/WGR

Page 33 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

64. shuffle
La fonction shuffle($tab) mlange les lments du tableau $tab. Exemple : $tab = array(); $tab = range(0,10); shuffle($tab) ; for( $i = 0 ; $i < sizeof($tab) ; $i++) echo "$tab[$i] "; Cet exemple affichera de faon alatoire : 6 1 0 5 9 8 7 3 10 4 2

65. compact
compact() accepte diffrents paramtres. Les paramtres peuvent tre des variables contenant des chanes, ou un tableau de chanes, qui peut contenir d'autres tableaux de noms, que compact() traitera rcursivement. Pour chacun des arguments, compact() recherche une variable avec une variable de mme nom dans la table courante des symboles, et l'ajoute dans le tableau, de manire avoir la relation nom => 'valeur de variable'. En bref, c'est le contraire de la fonction extract(). compact() retourne le tableau ainsi cr. Exemple : $ville = "San Francisco"; $etat = "CA"; $evenement = "SIGGRAPH"; $location_vars = array("ville", "etat"); $result = compact("evenement", $location_vars); for( $i = 0, reset($result) ; $i < sizeof($result) ; $i++, next($result)) { $indice = key($result); echo "$indice => $result[$indice]<br>"; } Aprs cette opration, $result sera le tableau suivant : evenement => SIGGRAPH ville => San Francisco etat => CA

66. Autres fonctions sur les tableaux sous Php4


Array_push Array_pop Array_unshift Array_shift Array_slice Array_splice Array_merge Array_keys Array_values Array_walk In_array Empile un ou plusieurs lments la fin dun tableau Dpile un lment de la fin dun tableau Empile un ou plusieurs lments au dbut dun tableau Dpile un lment au dbut dun tableau Extrait une portion de tableau Efface une portion de tableau et la remplace Rassemble deux ou plusieurs tableaux en un seul Retourne les indices dun tableau Retourne les valeurs dun tableau Excute une fonction sur chacun des membres dun tableau Retourne vrai si une valeur appartient un tableau

ESAT/DMSI/PROA/WGR

Page 34 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

8. Les chanes de caractres


Une chane de caractres peut tre compare un tableau de caractres. PHP propose un ensemble de fonctionnalits qui permettent de raliser diverses oprations sur les chanes de caractres, selon des principes de position analogues aux indices dun tableau. Toutefois, il nest pas possible daccder directement aux diffrents caractres qui composent la chane par leur indice. On devra toujours passer par une fonction du SDK (kit de dveloppement PHP). PHP reprend la plus grande partie des fonctions de traitement de chane de caractres du langage C. Il propose, dautre part, beaucoup dautres fonctions trs utiles, telles que les expressions rgulires, divers encodages et parsers spcifiques au protocole HTTP et au HTML, ainsi que des fonctions de cryptage.

67. Affichage dune chane de caractres


Il existe deux catgories de fonctions daffichage dune chane en PHP : les fonctions daffichage simple et les fonctions daffichage format. Les deux fonctions utilises pour afficher une chane de caractres non formate sont : echo et print. echo est une instruction, elle scrit sans parenthse. Il est possible dintgrer des variables dans laffichage : $var = 10 ; echo "la variable var vaut $var" ; // affichera la variable var vaut 10 La fonction print est similaire mais ncessite des parenthses : print("la variable var vaut $var"); // affichera la variable var vaut 10 Pour afficher une chane de caractres formate, PHP propose deux fonctions identiques celles du langage C : printf et sprintf. Elles possdent toutes deux une syntaxe voisine : printf("format", variables) ; variable_resultat = sprintf("format", variables) ; La diffrence entre ces deux fonctions rside dans le fait que printf produit un affichage immdiat, alors quil faut affecter le rsultat de sprintf une variable, puis si besoin, afficher cette variable laide de echo ou print.

68. Initialisation et concatnation


En PHP, les chanes de caractres sinitialisent grce loprateur daffectation = : $chaine = "bonjour" ; // $chaine est initialise bonjour La concatnation de deux chanes se fait au moyen de loprateur . (point) : $chaine2 = $chaine . " monsieur"; // $chaine2 contient bonjour monsieur $chaine .= " monsieur"; // $chaine contient maintenant bonjour monsieur

ESAT/DMSI/PROA/WGR

Page 35 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69. Traitement des chanes de caractres


Pour toutes les oprations de gestion classique de chanes, PHP propose les fonctions issues du langage C et beaucoup dautres, qui facilitent davantage lexploitation de ces chanes de caractres. Parmi la liste des fonctions numres ci-dessous, nous nous attacherons donner des exemples de fonctions classiques, pour les autres nous vous conseillons de consulter la documentation Nexen.net Manuel PHP traduit en franais par Nexen : string addslashes(string str) : Ajoute un slash devant les caractres spciaux : " \ et NUL contenu dans la chane str. string bin2hex(string) : Convertit une valeur binaire en hexadcimal string chop(string str) : Enlve les caractres blancs de la fin de la chane str et retourne la chane nettoye. Les caractres blancs sont : "\n", "\r", "\t", "\v", "\0", et " " (espace). string chr(int code_ascii): Retourne le caractre correspondant la valeur ASCII code_ascii. string chunk_split(string str, [int chunklen] , [string end] ) : Scinde la chane str en plus petits morceaux. Cette fonction insert une fin de chane end (par dfaut "\r\n"), tous les chunklen (par dfaut 76) caractres. La chane retourne est une nouvelle chane, et loriginal nest pas modifi. string convert_cyr_string(string str, string from, string to) : Convertit la chane str dun alphabet cyrillique vers un autre. Les arguments from et to sont des caractres qui reprsentent la source et la destination. string crypt(string str, [string salt]) : Crypte la chane str avec un DES (Data Encryption Standard). int ereg(string mask, string str, [array regs]) : Recherche dans la chane str les squences de caractres qui correspondent au masque donn mask. int eregi(string mask, string str, [array regs]) : Recherche dans la chane str les squences de caractres qui correspondent au masque donn mask. Cette fonction est identique ereg(), hormis le fait qu'elle ignore la casse des caractres lors de la recherche sur les caractres alphabtiques. string ereg_replace(string needle, string replace, string str) : Remplace toutes les occurrences de needle dans str par la chane replace. string eregi_replace(string needle, string replace, string str) : Remplace toutes les occurrences de needle dans str par la chane replace. Cette fonction est identique ereg_replace(), en dehors du fait qu'elle ne tient pas compte de la casse des caractres alphabtiques. array explode(string separator, string str) : Scinde la chane str en morceaux, grce au dlimiteur separator. void flush(void) : Vide les buffers de sorties que PHP utilisait (CGI, serveur Web, etc.) array get_meta_tags(string filename, [int use_include_path]): Extrait toutes les balises meta du fichier filename, et les retourne sous forme dun tableau. string htmlspecialchars(string str) : Convertit tous les caractres spciaux de la chane str en quivalent HTML. PHP remplace les valeurs suivantes : '&' (et commercial) devient '&amp;' ; '"' (guillemets doubles) devient '&quot;' ; '<' (infrieur ) devient '&lt;' ; '>' (suprieur ) devient '&gt;'. string htmlentities(string str) : Convertit tous les caractres de la chane str qui ont une squence dchappement en quivalent HTML string implode(string glue, array tab) : Regroupe tous les lments du tableau tab dans une chane, avec la chane de jointure glue.

ESAT/DMSI/PROA/WGR

Page 36 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

string join(string glue, array tab): Regroupe tous les lments du tableau tab dans une chane, avec la chane de jointure glue. Join() est un alias de implode(). string ltrim(string str) : Enlve les caractres blancs du dbut de la chane str et retourne la chane nettoye. Les caractres blancs sont : "\n", "\r", "\t", "\v", "\0", et " " (espace). string md5(string str) : Crypte la chane str en utilisant la mthode MD5. string nl2br(string str) : Convertit les retours la ligne \nen balise HTML <BR>. int ord(string str) : Retourne la valeur ASCII du premier caractre de la chane str. void parse_str(string str) : Analyse la chane str comme si ctait une chane passe par URL, et affecte les variables quelle y trouve. int printf(string format, [mixed args]...) : Affiche une chane formate string quoted_printable_decode(string str) : Convertit la chane str contenant des slash en une chane sans slash . string quotemeta(string str) : Ajoute un backslash devant tous les caractres mta suivants . \ + * ? [ ^ ] ( $ ) string rawurldecode(string str) : Dcode la chane URL str. string rawurlencode(string str) : Encode la chane str en chane URL, selon la RFC1738. string setlocale(string category, string locale) : Change les informations locales. int similar_text(string first, string second, [double percent]) : Calcule la similarit des deux chanes first et second. En passant une rfrence comme troisime argument, similar_text() va calculer le pourcentage de similarit. Il retourne le nombre de caractres correspondant lun lautre, dune chane lautre. string soundex(string str) : Calcule la valeur soundex de la chane str. Une valeur Soundex est telle que deux mots prononcs de la mme faon auront des valeurs Soundex identiques, et cela permet deffectuer des recherches dans les bases de donnes, mme si vous connaissez la prononciation, mais pas lorthographe. Cette fonction retourne une chane de 4 caractres, commenant par une lettre. string sprintf(string format, [mixed args]...) : Retourne une chane formate. Sprintf() fonctionne comme printf(), mais la chane formate est retourne au lieu dtre affiche. string strchr(string str, string needle) : Retourne toute la chane str partir de la premire occurrence de needle, jusqu' la fin. Cette fonction est un alias de la fonction strstr(). int strcmp(string str1, string str2) : Comparaison des deux chanes str1 et str2 sensible la casse. Retourne < 0 si str1 est plus petite que str2; > 0 si str1 est plus grande que str2, et 0 si elles sont gales. int strcspn(string str, string mask) : Retourne la longueur du premier segment de la chane str qui ne corresponde aucun des caractres de la chane mask. string strip_tags(string str, [string allowable_tags]) : Enlve les balises HTML et PHP de la chane str. Cela empche les utilisateurs malicieux de planter vos scripts lorsque le navigateur affiche les donnes saisies par les utilisateurs. En cas de balises non fermes, ou de balises mal formes, elle gnre une erreur. Vous pouvez utiliser l'option allowable_tags pour spcifier les balises qui seront ignores. string stripslashes(string str) : Enlve les slash ajouts par la fonction addslashes(), les doubles backslashes sont remplacs par des simples. int strlen(string str) : Retourne la longueur de la chane str.

ESAT/DMSI/PROA/WGR

Page 37 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

int strpos(string str, string needle, [int offset]) : Retourne la position numrique de la premire occurrence de needle dans la chane str. L'option offset vous permet de spcifier le caractre de dbut de recherche dans str. Cette position est toujours relative au dbut de la chane. string strrchr(string str, string needle) : Cette fonction retourne la partie de la chane str qui commence la dernire occurrence de needle et va jusqu' la fin de la chane str. string strrev(string str) : Retourne la chane str inverse. int strrpos(string str, char needle) : Retourne la position numrique de la dernire occurrence du caractre needle dans la chane str. int strspn(string str, string mask) : Retourne la longueur du premier segment de la chane str qui corresponde au masque donn mask. string strstr(string str, string needle) : Retourne la chane str partir de la premire occurrence de needle, jusqu' la fin. string strtok(string str, string delimit) : Morcelle la chane str grce au dlimiteur delimit. Notez que seul le premier appel strtok() ncessite les deux arguments. Tous les appels ultrieurs strtok() ne ncessite que le dlimiteur delimit. Pour initialiser nouveau strtok(), ou pour recommencer, fournissez nouveau le paramtre str. La chane str sera dcoupe ds que l'un des caractres de delimit est trouv. Exemple : <? echo "<pre>"; $chaine = "Ceci est un exemple\ninteressant"; // les sparateurs sont : lespace, la tabulation et le \n echo "$chaine<br>----- la mme chaine, mais morcele ------<br>"; $tok = strtok($chaine," \n "); Rsultat laffichage : while ($tok) { echo "Mot = $tok<br>"; $tok = strtok(" \n "); } echo "</pre>"; ?> string strtolower(string str) : Retourne la chane str avec tous les caractres alphabtiques en minuscule. string strtoupper (string str) : Retourne la chane str avec tous les caractres alphabtiques en majuscule. string str_replace(string needle, string replace, string str) : Remplace toutes les occurrences de needle dans str par la chane replace. Cette fonction est identique la fonction ereg_replace(). string strtr(string str, string from, string to) : Cette fonction travaille sur str, remplaant chaque occurrence de chaque caractre de la chane from correspondant la chane to et retourne le rsultat. string substr(string str, int start, [int length]) : Retourne une portion de la chane str spcifie avec le dbut start et la longueur length facultative. string substr_replace(string str, string replace, int start, [int length]) : Fonctionne exactement comme substr() et permet de remplacer la sous-chane extraite par la sous-chane replace. string trim(string str) : Enlve les caractres blancs de dbut et de fin de la chane str et retourne la chane nettoye. Les caractres blancs sont : "\n", "\r", "\t", "\v", "\0", et " " (espace). string ucfirst(string str) : Met le premier caractre de la chane str en majuscule, si ce caractre est alphabtique. La chane modifie est retourne. string ucwords(string str) : Met le premier caractre de chaque mot de la chane str en majuscule si ce caractre est alphabtique. La chane modifie est retourne.

ESAT/DMSI/PROA/WGR

Page 38 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.1. addslashes
Retourne une chane avec un backslash devant chaque caractre qui en a besoin pour tre insr dans une requte de base de donnes. Ces caractres sont guillemets simples ('), guillemets doubles ("), backslash (\) et NUL (loctet nul). Dans lexemple suivant, la balise HTML input vous permet de saisir le nom dun organisme (ex : Ecole Suprieure et dApplication des Transmissions), celui-ci sera stock dans la variable PHP nomme $organisme : <input type = text size = 50 name = organisme> La variable $organisme contient dans cet exemple un guillemet simple qui marque, comme un guillemet double, le dbut et la fin dune chane de caractres. Lorsque cette chane sera interprte, le guillemet simple sera considr comme marqueur de fin de chane, la partie de la chane qui suit ce marqueur (Application des Transmissions) ne sera donc pas pris en compte. Pour viter cela, il faut utiliser addslashes toutes les variables chanes de caractres qui sont susceptibles de contenir un des caractres mentionns ci-dessus : $organisme = addslashes($organisme) ; // $organisme contient dsormais "Ecole Suprieure et d\Application des Transmissions"

Si vous faites appel 2 fois conscutivement la fonction addslashes sur une mme variable, les caractres ncessitant le masquage par un backslash seront prcds de 2 backslashes.

69.2. chr
Retourne le caractre correspondant au code ASCII pass en argument. Syntaxe : string chr(int code_ascii) ; Exemple : $str .= chr(13); // ajoute un retour chariot la fin de la chane $str

69.3. crypt
crypt() va coder une chane en utilisant la mthode de cryptage du DES standard. Syntaxe : string crypt(string str, [string salt]); Les arguments sont : la chane crypter, et un grain de sel qui servira de base pour le cryptage. Si le grain de sel nest pas fourni, il sera automatiquement gnr par PHP. Certains systmes dexploitation acceptent plus dun type de cryptage. En fait, le DES standard est parfois remplac par un cryptage MD5. Le type de cryptage est alors choisi en fonction du grain de sel. A linstallation, PHP dtermine les possibilits de cryptage et dcidera daccepter dautres grains de sel pour dautres types de cryptage. Si le grain de sel nest pas fourni, PHP gnrera alors un grain de 2 caractres, pour le DES standard, moins que le systme ne dispose de MD5 : dans ce cas, PHP gnrera un grain de sel pour MD5, par dfaut. PHP affecte la variable denvironnement CRYPT_SALT_LENGTH 2 sil utilise le DES standard, et 12 sil utilise le MD5. Le cryptage standard fournit le grain de sel dans les deux premiers octets du rsultat de la fonction crypt(). Sur les systmes qui supportent plusieurs mthodes de cryptage, les variables denvironnement suivantes sont mises 0 ou 1, en fonction de la disponibilit de la mthode : CRYPT_STD_DES : DES standard avec 2 octets de SALT CRYPT_EXT_DES : DES tendu avec 9 octets de SALT CRYPT_MD5 : MD5 avec 12 octets de SALT commenant $1$ CRYPT_BLOWFISH : DES tendu avec 16 octets de SALT commenant $2$

Il ny a pas dalgorithme de dcryptage, tant donn que crypt() est injective.

ESAT/DMSI/PROA/WGR

Page 39 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.4. ereg
Recherche dans la chane str les squences de caractres qui correspondent au masque donn mask. Syntaxe : int ereg(string mask, string str, [array regs]); Si au moins une squence est trouve (ventuellement dans les parenthses de mask), et que la fonction est appele avec un troisime argument regs, les rsultats seront enregistrs dans regs. $regs[0] contient une copie de la chane str. $regs[1] contiendra la capture dsigne par la premire parenthse. $regs[2] contiendra la capture dsigne par la deuxime parenthse, et ainsi de suite. La recherche est sensible la casse. ereg() retourne TRUE si une occurrence a t trouve dans la chane, et FALSE dans le cas contraire, ou si une erreur est survenue. Exemple : $date = "2002-09-18"; // date sous forme 'anne-mois-jour' if ( ereg( "([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs ) ) // [0-9]{4} signifie les chiffres de 0 9 sur une longueur de 4 // [0-9]{1,2} signifie les chiffres de 0 9 sur une longueur de 1 ou 2 { echo "$regs[0]<br>"; echo "$regs[3].$regs[2].$regs[1]"; //affichage de la date sous forme 'jour.mois.anne' } else echo "Format de date invalide : $date"; Rsultat laffichage : 2002-09-18 18.09.2002

69.5. ereg_replace
Remplace toutes les occurrences de needle dans str par la chane replace. Syntaxe : string ereg_replace(string needle, string replace, string str); Si aucune occurrence n'est trouve, la chane str sera retourne intacte. Exemple : $chaine = "ceci est une chane exemple<br>voici ci dmonstration d'un rempcicement"; echo ereg_replace("ci","la",$chaine); Rsultat laffichage : cela est une chane exemple voila la dmonstration d'un remplacement

69.6. explode
Retourne un tableau qui contient les lments de la chane, spars par un sparateur. Syntaxe : array explode(string separator, string chaine); Exemple : $adresse_internet = "prenom.nom@nom_de_domaine"; $tab = explode (@,$adresse_internet) ; echo $tab[0] ; // affichera prenom.nom echo $tab[1] ; // affichera nom_de_domaine

ESAT/DMSI/PROA/WGR

Page 40 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.7. implode
Regroupe tous les lments du tableau tab dans une chane, avec la chane de jointure glue. Syntaxe : string implode(string glue, array tab); Exemple : $tab = array("un","deux","trois","quatre"); $chaine = implode(" ; ",$tab); echo $chaine ; // affichera : un ; deux ; trois ; quatre

69.8. nl2br
Convertit les retours la ligne \nen balise HTML <BR>. Syntaxe : string nl2br(string str) ; Exemple : $chaine = "premire ligne\ndeuxime ligne"; echo $chaine ; // affichera premire ligne deuxime ligne echo nl2br($chaine) ; /* affichera : premire ligne deuxime ligne */

69.9. ord
Retourne la valeur ASCII du premier caractre de la chane str. Syntaxe : int ord(string str); Exemple : $chaine = "0123456" ; echo ord($chaine) ;

// affichera 48

69.10. parse_str
Analyse la chane str comme si ctait une chane passe par URL, et affecte les variables quelle y trouve. Syntaxe : void parse_str(string str); Exemple : $str = "premier=valeur&second[]=Ceci+fonctionne&second[]=aussi"; parse_str($str); echo $premier; // affichera valeur echo $second[0]; // affichera Ceci fonctionne echo $second[1]; // affichera aussi

ESAT/DMSI/PROA/WGR

Page 41 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.11. printf
Affiche les arguments en fonction du format. Syntaxe : printf(string format, [mixed arguments]...); La chane de format est compose de 0 ou plusieurs directives : ce sont gnralement des caractres qui sont recopis tels quel (hormis %), et des spcifications de conversion, chacune delles disposant de son propre argument. Chaque spcification de conversion dbute avec le symbole % et comprend, dans l'ordre: 1.Une option de remplissage, qui indique quel caractre sera utilis pour le remplissage, et la taille finale de la chane. Le caractre de remplissage peut tre un espace ou le caractre zro (0).). La valeur par dfaut est l'espace. Une autre valeur peut tre spcifie en la prfixant par un guillemet simple ('). Voir les exemples plus loin. 2.Un argument optionnel alignment specifier qui indique que le rsultat doit tre justifi droite ou gauche. Par dfaut, il est justifi gauche. Le caractre - signifie : justification droite. 3.Argument optionnel, width specifier indique le nombre minimum de caractres que la conversion devrait retourner. 4.Argument optionnel, precision specifier indique le nombre de chiffres utiliss pour afficher un nombre virgule flottante. Cette option n'a d'effet que sur les nombres virgule, type double. (Une autre fonction pratique pour formater les nombres est : number_format().) 5.type specifier indique le type de donnes passes en argument : Les types possibles sont : % - un signe pourcentage : aucun argument ncessaire. b - l'argument est trait comme un entier, et reprsent comme un nombre binaire. c - l'argument est trait comme un entier, et reprsent comme un nombre ascii. d - l'argument est trait comme un entier, et reprsent comme un nombre dcimal. f - l'argument est trait comme un double, et reprsent comme un nombre virgule flottante. o - l'argument est trait comme un entier, et reprsent comme un nombre octal. s - l'argument est trait tel quel, et reprsent comme une chane. x - l'argument est trait comme un entier, et reprsent comme un nombre hexadcimal (en minuscule). X - l'argument est trait comme un entier, et reprsent comme un nombre hexadcimal (en majuscule). Exemples : Entiers : $i = 12 Format printf("i = %d",$i); printf("i = %-5d",$i); printf("i = %5d",$i); printf("i = %05d",$i); printf("i = %o",$i); printf("i = %u",$i); printf("i = %x",$i); printf("i = %X",$i); (b/ reprsente un espace) Affichage i = 12 i = 12b/b/b/ i = b/b/b/12 i = 00012 i = 14 i = 12 i=c i=C

ESAT/DMSI/PROA/WGR

Page 42 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

$i = -12 Format printf("i = %d",$i); printf("i = %o",$i); printf("i = %u",$i); printf("i = %x",$i); printf("i = %X",$i); Rels : $i = 1.414 Format printf("i = %f",$i); printf("i = %3.2f",$i); printf("i = %3f",$i); printf("i = %.2f",$i); printf("i = %e",$i); printf("i = %E",$i); printf("i = %g",$i); Caractres : $i = 'A' Affichage i=A i = b/b/A i = Ab/b/ i = 41 Affichage i = 1.414000 i = 1.41 i = 1.414000 i = 1.41 i = 1.41400e+00 i = 1.41400E+00 i = 1.414 Affichage i = -12 i = 177764 i = 65524 i = fff4 i = FFF4

Format printf("i = %c",$i); printf("i = %3c",$i); printf("i = %-3c",$i); printf("i = %x",$i);

Divers : printf("carre de a = %d",$a*$a); printf("le rsultat de fonction1 = %d",fonction1(10)); printf("a>b renvoie %d",$a>$b); Pour afficher un backslash '\' ou des guillemets '"', il faut les masquer par un backslash. Exemple: printf("ce caractre '\\' est un \"backslash\"\n"); // affichera : ce caractre '\' est un "backslash" Pour afficher un pourcent '%' dans une chaine format contenant au moins un format il faut le masquer par un pourcent '%'.

ESAT/DMSI/PROA/WGR

Page 43 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.12. rawurldecode
Retourne une chane dont les squences de caractres %xy, avec xy deux valeurs hexadcimales, auront t remplaces par le caractre ascii correspondant. Syntaxe : string rawurldecode(string str); Exemple : $chaine = "adresse%20Internet%20%3A%20nom.prenom%40nom_de_domaine"; echo rawurldecode($chaine) ; // affichera adresse Internet : nom.prenom@nom_de_domaine

69.13. rawurlencode
Retourne une chane dont tous les caractres non-alpha-numriques (hormis et _.) auront t remplacs par des squences %xy, avec xy deux valeurs hexadcimales. Ce codage est conforme la RFC1738 qui vite que les caractres spciaux soient interprts comme des dlimiteurs. Cette fonction est pratique pour transmettre des informations via une URL. C'est aussi un moyen de passer des informations d'une page l'autre. Syntaxe : string rawurlencode(string str); Exemple : $chaine = "adresse Internet : nom.prenom@nom_de_domaine"; echo rawurlencode($chaine) ; // affichera adresse%20Internet%20%3A%20nom.prenom%40nom_de_domaine

69.14. strchr
Retourne toute la chane str partir de la premire occurrence de needle, jusqu' la fin. Cette fonction est un alias de la fonction strstr(). Syntaxe : string strchr(string str, string needle); Exemple : $chaine = "adresse Internet : nom.prenom@nom_de_domaine"; echo "Email ".strchr($chaine,":")."<br>"; // affichera Email : nom.prenom@nom_de_domaine

69.15. strcspn
Retourne la longueur du premier segment de la chane str qui ne corresponde aucun des caractres de la chane masque. Syntaxe : int strcspn(string str, string masque); Exemple : $chaine = "adresse Internet : nom.prenom@nom_de_domaine"; echo strcspn($chaine,":")."<br>"; // affichera 17

ESAT/DMSI/PROA/WGR

Page 44 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.16. strip_tags
Enlve les balises HTML et PHP de la chane str. En cas de balises non fermes, ou de balises mal formes, elle gnre une erreur. Vous pouvez utiliser l'option allowable_tags pour spcifier les balises qui seront ignores. Syntaxe : string strip_tags(string str, [string allowable_tags]); Exemple : $chaine = "adresse Internet : nom.prenom@nom_de_domaine<br>"; echo $chaine; echo strip_tags($chaine); echo "----<br>"; echo strip_tags($chaine,"<br>"); // enlve les balises HTML et PHP sauf la balise <br> echo "----"; Rsultat laffichage : adresse Internet : nom.prenom@nom_de_domaine adresse Internet : nom.prenom@nom_de_domaine---adresse Internet : nom.prenom@nom_de_domaine ----

69.17. strpos
Retourne la position numrique de la premire occurrence du caractre needle dans la chane str. Syntaxe : int strpos(string str, char needle, [int offset]) ; Contrairement la fonction strrpos(), cette fonction peut prendre une chane complte comme paramtre. Si needle n'est pas trouv, elle retourne faux (false). L'option offset vous permet de spcifier le caractre de dbut de recherche dans str . Cette position est toujours relative au dbut de la chane. Exemple : $chaine = "nom.prenom@nom_de_domaine<br>"; echo strpos($chaine,"nom",3); // affichera 7

69.18. strrchr
Cette fonction retourne la partie de la chane str qui commence la dernire occurrence de needle et va jusqu' la fin de la chane str. Syntaxe : string strrchr(string str, char needle); La fonction retourne faux (false) si needle n'est pas trouv. Si needle contient plus d'un caractre, les autres sont ignors. Exemple : $chaine = "nom.prenom@nom_de_domaine<br>"; echo strrchr($chaine,"@"); // affichera @nom_de_domaine

69.19. strrpos
Retourne la position numrique de la dernire occurrence du caractre needle dans la chane str. Syntaxe : int strrpos(string str, char needle) ; Cette fonction ne peut accepter qu'un seul caractre. Si needle n'est pas trouv, elle retourne faux (false). Exemple : $chaine = "nom.prenom@nom_de_domaine<br>"; echo strrpos($chaine,'o'); // affichera 19
ESAT/DMSI/PROA/WGR Page 45 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.20. strspn
Retourne la longueur du premier segment de chane qui corresponde au masque donn. Syntaxe : int strspn(string str, string masque); Exemple : $chaine = "nom.prenom@nom_de_domaine<br>"; echo strspn($chaine,"nom_"); // affichera 3

69.21. strstr
Retourne la chane str partir de la premire occurrence de needle, jusqu' la fin. Syntaxe : string strstr(string str, string needle); Si needle n'est pas trouv, la fonction retourne faux (FALSE). Exemple : $chaine = "nom.prenom@nom_de_domaine<br>"; echo strstr($chaine,"nom_"); // affichera nom_de_domaine

69.22. strtok
Morcelle la chane str grce au dlimiteur delimit. Syntaxe : string strtok(string str, string delimit); Seul le premier appel strtok() utilise l'argument chane str. Aprs, chaque appel strtok() ne requiert que le dlimiteur utiliser. Pour recommencer un morcellement, vous devez appeler strtok() avec un nouvel argument str et un dlimiteur. strtok() accepte des dlimiteurs multiples. La chane sera morcele ds qu'elle rencontrera un des dlimiteurs.

Un dlimiteur gal "0" sera confondu avec FALSE.

Exemple : $chaine = "ceci est une chane exemple"; $tok = strtok($chaine," "); while($tok) { echo "mot = $tok<br>"; $tok = strtok(" "); } Rsultat laffichage : mot = ceci mot = est mot = une mot = chane mot = exemple

ESAT/DMSI/PROA/WGR

Page 46 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

69.23. strtr
Cette fonction travaille sur str, remplaant chaque occurrence de chaque caractre de la chane from correspondant la chane to et retourne le rsultat. Syntaxe : string strtr(string str, string from, string to); Si from et to sont de longueur diffrentes, les caractres en trop sont ignors. Exemple : $chaine = "Loc fte son anniversaire au chteau o rgna fantmeI. " ; echo strtr($chaine, "", "aaaeeeiiou"); Rsultat laffichage : Loic fete son anniversaire au chateau ou regna fantomeI. Depuis PHP4, strtr() peut aussi tre appele avec deux arguments. Dans ce cas, elle se comporte diffremment : from doit tre un tableau associatif contenant des paires de chanes, qui seront remplaces dans la chane source. strtr() recherchera toujours la chane la plus longue, et la remplacera en premier. Elle ne remplacera jamais une portion de chane qu'elle dj remplace.

69.24. substr
Retourne une portion de la chane str spcifie avec le dbut start et la longueur length facultative. Syntaxe : string substr(string str, int start, [int length]); Si start est positif, la chane retourne commencera au caractre start de la chane str. Le dbut de la chane est obtenu avec start = 0. Exemple : $rest = substr("abcdef", 1); // retourne "bcdef" Si start est ngatif, la chane retourne commencera au caractre start de la chane str, en partant de la fin. Exemples : $rest = substr("abcdef", -1); $rest = substr("abcdef", -2); // retourne "f" // retourne "ef"

Si length est donn, et positif, la chane retourne aura la longueur length. Exemples : $rest = substr("abcdef", 1, 3); // retourne "bcd" $rest = substr("abcdef", -3, 1); // retourne "d" Si length est donn, et ngatif, la chane retourne aura la longueur de la chane partir de start et jusqu length caractres de la fin de la chane. Exemple : $rest = substr("abcdef", 1, -1); // retourne "bcde"

69.25. substr_replace
Fonctionne exactement comme substr() et permet de remplacer la sous-chane extraite par la sous-chane replace. Syntaxe : string substr_replace(string str, string replace, int start, [int length]); Exemple : $num_adherent = "0001" ; $chaine = "ESAT0000CSA" ; echo substr_replace($chaine,$num_adherent,4,4) ;

// affichera ESAT0001CSA

ESAT/DMSI/PROA/WGR

Page 47 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

9. La gestion des dates


PHP gre les dates sous la forme dun entier long appel horodatage Unix, qui reprsente le nombre de secondes coules depuis le 1er janvier 1970 minuit. Il sagit de lunique format de date reconnu par PHP. Tous les stockages, les oprations et les conversions qui portent sur les dates doivent donc se conformer ce format.

70. Calculs de dures


Tous les calculs de dures se font partir de ce nombre de secondes coules depuis le 1 er janvier 1970. Cest un entier, et il se manipule comme tel. Ainsi, pour calculer une dure, il suffit de retrancher lentier long qui reprsente la date la plus ancienne de celui qui reprsente la date la plus rcente. PHP est pourvu de tous les outils ncessaires la conversion de ces entiers longs en dates lisibles. En revanche, il nexiste aucune fonction intgre qui permette de convertir un nombre de secondes en une dure dcoupe en annes, mois, jours, heures, minutes et secondes.

71. Oprations sur les dates


Les oprations spcifiques aux dates consistent gnrer un entier long, qui reprsente une date dfinie, ainsi quune fonction de contrle de validit. PHP fournit les fonctions time(), mktime() et gmmktime() pour gnrer lentier long, et la fonction checkdate() pour vrifier la validit des dates.

71.1. time
time() retourne lentier long qui reprsente la date courante. Exemple : echo time() ; // affichera 1032784180 le 23 septembre 2002 14H29 et quelques secondes

71.2. mktime
mktime() retourne lentier long qui correspond une date donne passe en paramtre sous la forme : heures,minutes,secondes,mois,jour,anne[, heure dt (0) dhiver (1) inconnu (-1)]. Si lheure na pas dimportance, vous pouvez passer la valeur 0 pour chacun des trois premiers paramtres. Si vous ne passez aucun paramtre, la fonction renvoie lhorodatage Unix correspondant la date et lheure courantes. Exemple : echo mktime(14,30,0,9,23,2002) ; // affichera 1032784200

71.3. gmmktime
gmmktime() est semblable mktime(), mais retourne lentier qui correspond lheure GMT.

71.4. checkdate
checkdate() retourne un boolen qui indique si la date passe en paramtre sous la forme mois,jour,anne est valide ou non. Les annes bissextiles sont prises en compte. Ainsi on pourra facilement gnrer un calendrier perptuel laide de cette fonction. Exemple : checkdate(2,29,1999) ; // retournera faux car 1999 nest pas bissextile checkdate(2,29,2000) ; // retournera vrai car 2000 est bissextile

ESAT/DMSI/PROA/WGR

Page 48 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

72. Conversions de dates


Les dates sont converties, du format entier long vers un format lisible, principalement par la fonction date().

72.1. date
date() convertit une date du format horodatage Unix (entier long) vers un format lisible. Elle retourne une chane de caractres mise en forme reprsentant une date. Si lhorodatage Unix (entier long) est omis, la date renvoye est la date du jour. Syntaxe : string date(format,[ horodatage Unix]) ; Vous pouvez contrler de faon prcise la chane renvoye par date() laide dun argument chane (le format) que vous devez lui transmettre. La chane format est compose de codes et dautres donnes qui seront recopies dans le rsultat renvoy (ces donnes servent principalement de sparateurs). La liste des codes pouvant tre contenus dans une chane format est la suivante : Code format a A d D F g G h H i I j l L m M n s t T U w y Y z Z Description du rsultat restitu "am" ou "pm" en minuscules "AM" ou "PM" en majuscules jour dans le mois prcd dun zro (01-31) jour de la semaine en trois lettres nom du mois de lanne heure (sur 12 heures non prcde dun zro) heure (sur 24 heures non prcde dun zro) heure (sur 12 heures prcde dun zro) heure (sur 24 heures prcde dun zro) minutesprcdes dun zro (00-59) boolen (1 si lheure dhiver est active, 0 sinon) jour dans le mois non prcd dun zro (1-31) jour de la semaine anne bissextile (1 pour vrai, 0 pour faux) mois de lanne prcd dun zro (01-12) mois de lanne en trois lettres mois de lanne non prcd dun zro (1-12) secondes prcdes dun zro (00-59) nombre de jours dans le mois donn (28-31) fuseau horaire du serveur horodatage Unix (entier long) jour de la semaine (0 pour dimanche 6 pour samedi) anne sur deux chiffres anne sur quatre chiffres jour de lanne (quantime) temps en secondes coul depuis GMT (dcalage horaire 43200 - 43200) Exemple restitu pm PM 09 Mon September 3 15 03 15 05 1 9 Monday 0 09 Sep 9 07 30 Paris, Madrid 1032790097 1 02 2002 251 7200

Lorsque des dates doivent tre communiques de PHP vers MySQL, la fonction date() permet facilement dobtenir le format appropri. Il faut simplement utiliser les formats de jour et de mois sur deux chiffres (prfixs dun zro).

Exemple : echo "nous sommes le ".date("d/m/Y").", et il est ".date("H : i : s"); // affichera : nous sommes le 23/09/2002, et il est 16 : 25 : 56

ESAT/DMSI/PROA/WGR

Page 49 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

72.2. getdate
getdate() convertit galement la date avant de la prsenter lutilisateur. Cette fonction accepte en option un horodatage Unix (entier long) et renvoie un tableau associatif contenant les informations relatives la date. Si vous excutez cette fonction sans argument, elle travaille avec lhorodatage Unix courant, tel quil serait renvoy par time(). Syntaxe : array getdate([long horodatage Unix]) ; Le tableau associatif renvoy par getdate() est le suivant : Cl seconds minutes hours mday wday mon year yday weekday month 0 Description secondes ayant dpasses la minute (0-59) minutes ayant dpasses lheure (0-59) heures de la journe (0-23) jour dans le mois (1-31) jour de la semaine (0 pour dimanche 6 pour samedi) mois de lanne (1-12) anne sur quatre chiffres jour de lanne (quantime : 0-365) nom du jour de la semaine nom du mois de lanne horodatage Unix Exemple 7 5 16 23 1 9 2002 265 Monday September 1032790097

Exemple : $tab_date = array(); $tab_date = getdate(); // aucun argument na t transmis, la date du jour sera donc utilise echo "Nous sommes le : $tab_date[mday]/$tab_date[mon]/$tab_date[year] " ; // affichera : Nous sommes le : 23/9/2002

72.3. strftime
La fonction strftime() fonctionne comme la fonction date(). Les codes de la chane format sont cependant composs du caractre % suivi dune lettre. Les 4 codes qui nous restituent les noms du jour et du mois dans la langue donne par setlocale() sont les suivants : %a - nom abrg du jour de la semaine (local). %A - nom complet du jour de la semaine (local). %b - nom abrg du mois (local). %B - nom complet du mois (local).

73. Dtermination de la date de dernire modification dun script


Il est gnralement trs apprci dajouter une date de dernire modification sur chacune des pages dun site Web. La date de dernire modification dun script peut tre connue laide de la fonction getlastmod(). Syntaxe : int getlastmod(void) ; La fonction getlastmod() renvoie un horodatage Unix, qui peut tre mis en forme au moyen de la fonction date() pour obtenir une date plus comprhensible. Exemple : echo "Date de dernire modification : ".date("g:i a, j M Y",getlastmod());

ESAT/DMSI/PROA/WGR

Page 50 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

74. Conversion des dates aux formats MySQL


Lorsque des dates doivent tre communiques de PHP vers MySQL, la fonction date() vue plus haut permet facilement dobtenir le format appropri. Il faut simplement utiliser les formats de jour et de mois pour lesquels des zros sont placs en prfixe, de manire viter des confusions au niveau de MySQL. Dans MySQL, deux fonctions permettent de formater les dates : DATE_FORMAT() et UNIX_TIMESTAMP(). La fonction DATE_FORMAT() est semblable la fonction date() de PHP, si ce nest quelle utilise des codes de format diffrents. La conversion la plus courante consiste exprimer une date sous le format MM-JJ-AAAA, plutt que sous le format AAAA-MM-JJ en vigueur dans MySQL. Cette conversion seffectue simplement au moyen de la requte suivante : SELECT DATE_FORMAT (date_column, %m %d %Y) FROM tablename ; Le code de format %m correspond une reprsentation du mois sous la forme dun nombre deux chiffres, %d reprsente le jour sous la forme dun nombre deux chiffres, et %Y reprsente lanne sous la forme dun nombre quatre chiffres. Les codes de format MySQL les plus utiles pour ce type de conversion sont les suivants : Code %M %W %D %Y %y %a %d %e %m %c %b %j %H %k %h ou %I %l %i %r %T %S ou %s %p %w Description Mois, plein texte Nom du jour de la semaine, plein texte Jour du mois, numrique, avec un prfixe textuel (par exemple Ist) Anne, numrique, sur 4 chiffres Anne, numrique, sur 2 chiffres Nom du jour de la semaine, sur 3 lettres Jour du mois, numrique, zro en prfixe Jour du mois, numrique, pas de zro en prfixe Mois, numrique, zro en prfixe Mois, numrique, pas de zro en prfixe Mois, texte, sur 3 lettres Jour de lanne, numrique Heure, systme 24 heures, zro en prfixe Heure, systme 24 heures, pas de zro en prfixe Heure, systme 12 heures, zro en prfixe Heure, systme 12 heures, pas de zro en prfixe Minutes, numrique, zro en prfixe Heure, systme 12 heures (hh:mm:ss[AM|PM]) Heure, systme 24 heures (hh:mm:ss) Secondes, numrique, zro en prfixe AM ou PM Jour de la semaine, numrique, de 0 (dimanche) 6 (samedi)

La fonction UNIX_TIMESTAMP() est comparable, si ce nest quelle convertit une colonne en un horodatage Unix. Exemple : SELECT UNIX_TIMESTAMP(date_column) FROM tablename ; Cette requte renvoie la date exprime sous la forme dun horodatage Unix. Vous pouvez ensuite la manipuler votre gr dans un script PHP. En rgle gnrale, lusage dhorodatages UNIX est prfrable dans les calculs de dates, tandis que le format de date standard semploie lorsquil sagit simplement de stocker ou dafficher des dates. Limplmentation des calculs et des comparaisons de dates se rvle plus facile avec les horodatages Unix.

ESAT/DMSI/PROA/WGR

Page 51 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

75. Exercice pratique


Affichez le nom du jour en franais, partir dune date slectionne. Dans un premier formulaire nomm selection_date.php3, vous slectionnerez une date laide de l.istes droulantes pour le jour (1-31), le mois (1-12) et lanne (anne courante 10 - anne courante + 10). La date du jour sera affiche implicitement. Vous crerez trois boutons Valider, Annuler et Quitter. Le bouton Valider fera appel un deuxime formulaire nomm affiche_jour.php3, qui contrlera la validit de la date slectionne, et affichera le nom du jour. Dans ce deuxime formulaire, un bouton Ressaisir renverra lutilisateur au premier formulaire, un bouton Quitter entranera la fermeture de la fentre et du navigateur. Le bouton Annuler annulera la slection et raffichera la date du jour. Le bouton Quitter entranera la fermeture de la fentre et du navigateur.

Formulaire selection_date.php3 : <html> <head> <title>Slection d'une date</title> </head> <body> <? echo "<form method='post' action='affiche_jour.php3'>"; $date = getdate(); $annee_en_cours = $date['year']; $mois_en_cours = $date['mon']; $jour_en_cours = $date['mday']; echo "<br><br>"; echo "<div align='center'>"; echo "<b>Entrez la date</b>"; echo "&nbsp;&nbsp;&nbsp;"; echo "<select name = jour'>"; echo "<option SELECTED>" . $jour_en_cours . "</option>"; for( $jj = 1 ; $jj <= 31 ; $jj++ ) echo "<option>" . $jj . "</option>"; echo "</select>"; echo "&nbsp;"; echo "<select name = 'mois'>"; echo "<option SELECTED>" . $mois_en_cours . "</option>"; for( $mm = 1 ; $mm <= 12 ; $mm++ ) echo "<option>" . $mm . "</option>"; echo "</select>"; echo "&nbsp;"; echo "<select name = 'annee'>"; echo "<option SELECTED>" . $annee_en_cours . "</option>";
ESAT/DMSI/PROA/WGR Page 52 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

for( $aaaa = $annee_en_cours - 10 ; $aaaa <= $annee_en_cours + 10 ; $aaaa++ ) echo "<option>" . $aaaa . "</option>"; echo "</select>"; echo "<br><br>"; echo "<input type='submit' name = 'valider' value='Valider'>"; echo "&nbsp;&nbsp;&nbsp;&nbsp;"; echo "<input type='reset' name = 'annuler' value='Annuler'>"; echo "&nbsp;&nbsp;&nbsp;&nbsp;"; echo "<input type='button' name='quitter' value='Quitter' OnClick='parent.close();'>"; echo "</div>" ; echo "</form>"; ?> </body> </html> Formulaire affiche_jour.php3 : <html> <head> <title>Affichage du jour</title> </head> <body> <? echo "<form method='post' action='#'>"; $jour = $HTTP_POST_VARS["jour"]; $mois = $HTTP_POST_VARS["mois"]; $annee = $HTTP_POST_VARS["annee"]; $tab_jours = array("0"=>"dimanche","1"=>"lundi","2"=>"mardi","3"=>"mercredi", "4"=>"jeudi","5"=>"vendredi","6"=>"samedi"); echo "<br><br>"; echo "<div align='center'>"; if(checkdate($mois,$jour,$annee)) { $horodatage = mktime(0,0,0,$mois,$jour,$annee); $nom_jour = $tab_jours[date("w",$horodatage)]; echo "Le $jour/$mois/$annee est un <font color='blue' size='5'>$nom_jour</font><br><br>"; } else { echo "<font color='red' size ='4'>"; echo "< Date erron&eacute;e >"; echo "</font><br><br>"; } echo "<input type='button' name='ressaisir' value='Ressaisir' OnClick=\"document.location='selection_date.php3'\">"; echo "&nbsp;&nbsp;&nbsp;"; echo "<input type='button' name='quitter' value='Quitter' OnClick='parent.close();'>"; echo "</div>"; echo "</form>"; ?> </body> </html>

ESAT/DMSI/PROA/WGR

Page 53 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Autre possibilit, sans le tableau des jours en franais, mais en utilisant la fonction setlocale() qui change les informations locales. Syntaxe : setlocale(string categorie, string langue_locale); categorie est une chane qui spcifie la catgorie de fonction qui va tre affecte par les informations locales : LC_ALL pour toutes les fonctions ci-dessous LC_COLLATE pour les comparaisons de chanes (en cours dimplmentation) LC_CTYPE pour la classification de caractres et les conversions, par exemple strtoupper() LC_MONETARY pour localeconv() (en cours dimplmentation) LC_NUMERIC pour les sparateurs dcimaux LC_TIME pour le format des dates et heures avec strftime() setlocale(LC_ALL,"FR"); if(checkdate($mois,$jour,$annee)) { $horodatage = mktime(0,0,0,$mois,$jour,$annee); $nom_jour = strftime("%A",$horodatage); echo "Le $jour/$mois/$annee est un <font color='blue' size='5'>$nom_jour</font><br><br>"; }

ESAT/DMSI/PROA/WGR

Page 54 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

10. Les objets


Un objet est un ensemble de variables et de fonctions entre accolades conues depuis un modle spcial nomm classe. Les objets cachent la majorit de leurs rouages internes au code qui les utilise, fournissant des interfaces simples par le biais desquelles vous pouvez leur envoyer des ordres et recevoir des informations de leur part. Ces interfaces sont des fonctions particulires nommes mthodes. Toutes les mthodes dun objet ont accs des variables spciales nommes proprits. En dfinissant une classe, vous fixez un ensemble de caractristiques. En crant des objets de ce type, vous crez des entits qui partagent ces caractristiques, mais qui sont susceptibles de les initialiser sous diffrentes valeurs. Vous pouvez crer une classe automobile, par exemple. Cette classe pourrait possder une caractristique couleur. Tous les objets automobile partageraient la caractristique couleur, mais certains linitialiseraient en tant que bleu, dautres en tant que vert et ainsi de suite. Dfinitions : Une classe est un ensemble de fonctions spciales nommes mthodes et de variables particulires nommes proprits (ou attributs). Vous pouvez dclarer une classe laide du mot cl class. Les classes sont les modles partir desquels sont crs les objets.

Un objet est une instance de classe. Cela signifie quun objet est lincarnation de la fonctionnalit fixe dans une classe. Un objet est instanci en utilisant linstruction new conjointement au nom de la classe de laquelle il est membre. Lorsquun objet est instanci, vous pouvez accder toutes ses proprits ainsi qu toutes ses mthodes.

Le plus grand atout du code orient objet est peut-tre sa possibilit de rutilisation. Les classes employes pour crer des objets tant autonomes, elles peuvent facilement tre retires dun projet pour tre employes dans un autre. De plus, il est possible de crer des classes enfant, qui hritent et prennent la priorit sur les caractristiques de leurs parents. Cette technique ncessite que les classes doivent donc tre dfinies selon le principe des couches successives, par empilage des classes de haut niveau sur les classes de bas niveau, comme pour les fonctions. La programmation objet consiste donc crire des classes et les utiliser. Une bibliothque de composants est un ensemble de fichiers qui contiennent des dfinitions de classes, que lon peut inclure en tte des fichiers qui rutilisent ces classes.

76. Cration dun objet


Pour crer un objet, vous devez auparavant concevoir le modle partir duquel il pourra tre instanci. Ce modle est connu sous le nom de classe, et doit tre dclar avec le mot cl class. Crer un objet (ou dclarer linstance dune classe, ou instancier un objet) se ralise laide du mot cl new. Dans lexemple qui suit, nous allons construire une classe nomme premiere_classe et crer deux objets $obj1 et $obj2 : class premiere_classe { // emplacement des proprits et mthodes } $obj1 = new premiere_classe() ; $obj2 = new premiere_classe() ; // instanciation de lobjet $obj1 // instanciation de lobjet $obj2

Linstanciation dun objet signifie la rcupration dun pointeur sur une zone mmoire disponible, qui est de la taille de lobjet et peut donc tre utilise pour en grer le contenu dynamique. Elle gre donc lallocation de la mmoire ainsi que la mise disposition dune variable PHP qui permet de manipuler une donne du format de la classe.

ESAT/DMSI/PROA/WGR

Page 55 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

77. Les proprits dun objet


Les objets peuvent accder des variables spciales nommes proprits ou attributs et cres laide du mot cl var. Elles peuvent tre dclares tout endroit du corps de la classe, et leur visibilit stend sur lensemble du code qui compose la classe, mais dans un soucis de clart, il est prfrable de les dfinir au dbut. Une proprit peut tre une valeur, un tableau ou mme un autre objet. Exemple : class premiere_classe { var $nom ; } $obj1 = new premiere_classe() ; $obj2 = new premiere_classe() ; La proprit $nom a t dclare laide du mot cl var. Cela est essentiel dans le contexte dune classe. Vous obtiendrez une erreur danalyse si vous loubliez. Vous pouvez accder cette proprit au travers de lobjet. Loprateur -> (les deux caractres - et > forment une flche appele aussi accesseur) permet daccder aux proprits dun objet ou de les modifier. Exemple : $obj1->nom = "DUPONT" ; // initialisation de la proprit $nom

En PHP, le programmeur ne peut dfinir aucun niveau de confidentialit pour les proprits et mthodes (il ny a donc pas de concept dencapsulation). Vous pouvez accder tous les champs dun objet, ce qui cause des problmes si une proprit nest pas destine tre modifie.

ESAT/DMSI/PROA/WGR

Page 56 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

78. Les mthodes dun objet


Une mthode est une fonction dfinie dans une classe. Chaque objet instanci depuis la classe possdera la fonctionnalit de la mthode. Vous pouvez accder la mthode au travers de lobjet grce loprateur -> Lexemple suivant ajoute une mthode la classe premiere_classe et cre un objet $obj1 instanci depuis cette classe : class premiere_classe { var $nom; function aff_hello() { print("Hello !"); } } $obj1 = new premiere_classe() ; $obj1->aff_hello(); // affichera Hello ! Les mthodes possdent un accs aux variables (proprits) membres de classe. Une classe utilise une variable spciale nomme $this pour faire rfrence lobjet en cours dinstanciation. Par le biais de cette variable, un objet peut donc faire rfrence lui-mme. En combinant la variable $this et loprateur ->, vous pouvez accder toute proprit ou mthode dune classe depuis la classe elle-mme. Exemple : class premiere_classe { var $prenom ; function aff_hello() { print("Hello $this->prenom !") ; } } $obj1 = new premiere_classe() ; $obj1->prenom = "Florian"; $obj1->aff_hello(); // affichera Hello Florian ! Vous pouvez galement transmettre des arguments la mthode de la mme faon que vous le feriez avec une fonction. Exemple : class premiere_classe { var $prenom ; var $nom ; function init_nom($name) // largument aurait pu galement tre nomm $nom (variable locale) { $this->nom = $name ; } function aff_hello() { print("Hello $this->prenom $this->nom !") ; } } $obj1 = new premiere_classe() ; $obj1->prenom = "Florian"; $obj1->init_nom("DUPONT") ; $obj1->aff_hello(); // affichera Hello Florian DUPONT !
ESAT/DMSI/PROA/WGR Page 57 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

Si vous crez une mthode dont le nom est identique la classe premiere_classe, elle sera automatiquement appele lors de linstanciation dun nouvel objet. De cette faon, vous pouvez donner vos objets des arguments traiter au moment o vous les instanciez. Les objets peuvent excuter du code pour sinitialiser eux-mmes en fonction darguments ou dautres facteurs. Ces mthodes spciales sont nommes constructeurs. Il sagit dune norme de programmation qui sest impose au fil du temps. Le constructeur doit tre considr non seulement en tant qutape dinitialisation des variables, mais galement en tant que premire phase de contrle et dharmonisation des donnes disponibles aux traitements de la classe. Lexemple suivant ajoute un constructeur la classe premiere_classe : class premiere_classe { var $prenom ; var $nom ; function premiere_classe ($name) { $this->nom = $name ; } function aff_hello() { print("Hello $this->prenom $this->nom !") ; } } $obj1 = new premiere_classe("DUPONT") ; $obj1->prenom = "Florian"; $obj1->aff_hello(); // initialisation de la proprit $nom // affichera Hello Florian DUPONT !

Dans lexemple suivant, nous tablissons un argument par dfaut au constructeur, de sorte que la chane "DUPONT" soit attribue au paramtre si nous nincluons pas dargument lors de la cration de lobjet : class premiere_classe { var $prenom ; var $nom ; function premiere_classe ($name = "DUPONT") { $this->nom = $name ; } function aff_hello() { print("Hello $this->prenom $this->nom !<br>") ; } } $obj1 = new premiere_classe() ; $obj1->prenom = "Florian"; $obj1->aff_hello(); // affichera Hello Florian DUPONT ! $obj2 = new premiere_classe("DURAND") ; $obj2->prenom = "Franois"; $obj2->aff_hello(); // affichera Hello Franois DURAND !

ESAT/DMSI/PROA/WGR

Page 58 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

79. Lhritage
L'hritage est un principe propre la programmation oriente objet, permettant de crer une nouvelle classe partir d'une classe existante. Le nom d'"hritage" (pouvant parfois tre appel drivation de classe) provient du fait que la classe drive (la classe nouvellement cre) contient les proprits et les mthodes de sa super classe (la classe dont elle drive). L'intrt majeur de l'hritage est de pouvoir dfinir de nouvelles proprits et de nouvelles mthodes pour la classe drive, qui viennent s'ajouter celles hrites. Par ce moyen on cre une hirarchie de classes de plus en plus spcialises. Cela a comme avantage majeur de ne pas avoir repartir de zro lorsque l'on veut spcialiser une classe existante. De cette manire il est possible d'acheter dans le commerce des librairies de classes, qui constituent une base, pouvant tre spcialises loisir (on comprend encore un peu mieux l'intrt pour l'entreprise qui vend les classes de protger les donnes membres grce l'encapsulation...). Lhritage ne fonctionne qu sens unique, la sous-classe hrite de la super classe (classe mre), mais pas linverse. Contrairement certains langages orients objet, PHP ne supporte pas lhritage multiple. Chaque classe ne peut hriter que dune seule super classe. Syntaxe de lhritage : class nom_de_la_nouvelle_classe extends nom_de_la_super-classe { // nouvelles proprits et mthodes
}

Exemple : // Cration de la classe de base vehicule : class vehicule { var $marque ; var $modele ; var $puissance ; var $couleur ; var $moteur = "arrt"; // implmentation des mthodes agissant sur tous les types de vhicules function identifier($marque,$modele) { $this->marque = $marque ; $this->modele = $modele ; } function demarrer() { $this->moteur = "en marche" ; } function arreter() { $this->moteur = "arrt" ; } function assigner_puissance($puiss) { $this->puissance = $puiss ; } function peindre($coul) { $this->couleur = $coul ; } function etat() { echo "couleur : $this->couleur<br>" ; echo "moteur : $this->puissance chevaux, $this->moteur<br>" ; } }
ESAT/DMSI/PROA/WGR Page 59 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

// Cration de la classe voiture hrite de la classe vehicule : class voiture extends vehicule { // Ajout dune proprit, dune mthode permettant de grer cette proprit et dune mthode daffichage // propre aux voitures portant le mme nom que la mthode daffichage de la classe mre. var $nb_portes = 5 ; function assigner_portes($portes) { $this->nb_portes = $portes ; } function etat() { echo "voiture : $this->marque $this->modele $this->nb_portes portes<br>" ; echo "couleur : $this->couleur<br>" ; echo "moteur de $this->puissance chevaux $this->moteur<br>" ; } } // Cration de la classe camion hrite de la classe vehicule : class camion extends vehicule { // Ajout dune proprit, dune mthode permettant de grer cette proprit et dune mthode daffichage // propre aux camions portant le mme nom que la mthode daffichage de la classe mre. var $poids; function assigner_poids($poids) { $this->poids = $poids; } function etat() { echo "camion : $this->marque $this->modele de $this->poids tonnes<br>" ; echo "couleur : $this->couleur<br>" ; echo "moteur de $this->puissance chevaux $this->moteur<br>" ; } }

Le polymorphisme est la possibilit dutiliser une fonction en lui passant en paramtre nimporte quel objet (dans lexemple ci-dessus de classe voiture ou de classe camion) implmentant une mthode de mme nom (dans lexemple ci-dessus la mthode etat()). Exemple : function affichage($objet) { $objet->etat() ; }

ESAT/DMSI/PROA/WGR

Page 60 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

80. Exercice pratique


Nous allons illustrer linstanciation et lutilisation des objets de classes voiture et camion dfinies prcdemment : <? // instanciation de la classe voiture et affectation des proprits de cette voiture $v1 = new voiture(); $v1->identifier("Renault","Safrane") ; $v1->assigner_puissance(7); $v1->peindre("rouge") ; $v1->assigner_portes(3) ; // instanciation de la classe camion et affectation des proprits de ce camion $c1 = new camion(); $c1->identifier("Volvo","V530") ; $c1->assigner_puissance(100); $c1->peindre("vert") ; $c1->demarrer() ; $c1->assigner_poids(25) ; // affichage de ltat de chacun des objets voiture et camion par lintermdiaire de la mme fonction affichage() affichage($v1) ; echo "<br><br>" ; affichage($c1) ; ?> Rsultat de laffichage : voiture : Renault Safrane 3 portes couleur : rouge moteur de 7 chevaux arrt camion : Volvo V530 de 25 tonnes couleur : vert moteur de 100 chevaux en marche

Vous pouvez remarquer que la mthode etat() appele via les objets $v1 et $c1 est celle de la classe drive et non celle de la classe mre. En effet, les mthodes et proprits redfinies dans les sousclasses sont prpondrantes et remplacent les dfinitions des classes mres. Contrairement dautres langages orients objet, PHP ne permet pas de redfinir une mthode tout en gardant la possibilit dinvoquer la version dfinie dans la classe mre. Il est recommand daccder aux proprits dun objet laide dune mthode et non directement (ex : $c1->marque = "Volvo" ;). A premire vue, une mthode telle que initialiser() peut sembler de peu dintrt, cependant les mthodes ont une excellente raison dtre : elles permettent deffectuer tous les accs aux proprits via une seule section de code, et doprer une vrification avant dautoriser toute modification.

ESAT/DMSI/PROA/WGR

Page 61 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

11. Les formulaires


Les formulaires HTML reprsentent pour lutilisateur le moyen principal de transmettre des informations au serveur. PHP est conu pour recevoir et exploiter les informations soumises par le biais des formulaires HTML.

81. Les variables PHP


PHP est en mesure de localiser les variables globales dfinies par le programmeur, mais galement les variables globales dcrivant la fois les environnements client et serveur. Celles-ci sont plus connues sous le nom de variables denvironnement. La disponibilit de ces variables variera en fonction de votre systme, de votre serveur et de votre configuration. Elles peuvent nanmoins savrer prcieuses. La fonction phpinfo() vous affiche le tableau des variables denvironnement PHP dont les plus communes sont dcrites ci-dessous. Il est possible dy accder directement ou en tant que partie du tableau $GLOBALS. Par exemple la variable $GLOBALS[PHP_SELF] vous donne le chemin daccs vers le script en cours dexcution. Variable $HTTP_USER_AGENT $REMOTE_ADDR $REQUEST_METHOD $QUERY_STRING $REQUEST_URI $HTTP_REFERER Ce quelle contient Le nom et la version du client Ladresse IP du client Indique si la mthode tait GET ou POST Le nom et la valeur des variables envoyes et accoles lURL (chane de requte) Ladresse complte du script y compris la chane de requte Ladresse de la page partir de laquelle la requte a t effectue

Tableau des variables denvironnement PHP affich lors de lappel la fonction phpinfo() :

PHP Variables
Variable _POST["articles"] _POST["envoyer"] _SERVER["HTTP_ACCEPT"] _SERVER["HTTP_REFERER"] _SERVER["HTTP_ACCEPT_LANGUAGE"] _SERVER["CONTENT_TYPE"] _SERVER["HTTP_ACCEPT_ENCODING"] _SERVER["HTTP_USER_AGENT"] _SERVER["HTTP_HOST"] _SERVER["CONTENT_LENGTH"] _SERVER["HTTP_CONNECTION"] _SERVER["HTTP_CACHE_CONTROL"] _SERVER["PATH"] _SERVER["SystemRoot"] _SERVER["COMSPEC"] _SERVER["PATHEXT"] _SERVER["WINDIR"] _SERVER["SERVER_SIGNATURE"] _SERVER["SERVER_SOFTWARE"] _SERVER["SERVER_NAME"] _SERVER["SERVER_ADDR"] _SERVER["SERVER_PORT"] ESAT/DMSI/PROA/WGR Value Array ( [0] => tournevis ) Envoyer application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, image/gif, image/xxbitmap, image/jpeg, image/pjpeg, */* http://160.xxx.xxx.xxx/formul2.php3 fr application/x-www-form-urlencoded gzip, deflate Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0; H010818) 160.xxx.xxx.xxx 40 Keep-Alive no-cache C:\WINNT\SYSTEM32;C:\WINNT;C:\PROGRAM FILES\BORLAND\CBUILDER3\BIN C:\WINNT C:\WINNT\system32\cmd.exe . COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;. WSH C:\WINNT <address>Apache/2.0.40 Server at 160.xxx.xxx.xxx Port 80</address> Apache/2.0.40 (Win32) PHP/4.3.0-dev 160.xxx.xxx.xxx 160. xxx.xxx.xxx 80 jj/10/OO

Page 62 sur137

Cours Programmation

Langage PHP 160. xxx.xxx.xxx F:/http/developpement philippe.wagnier@esat.terre.def F:/http/developpement/articles.php3 1221 CGI/1.1 HTTP/1.1 POST /articles.php3 /articles.php3 /articles.php3

php.doc

_SERVER["REMOTE_ADDR"] _SERVER["DOCUMENT_ROOT"] _SERVER["SERVER_ADMIN"] _SERVER["SCRIPT_FILENAME"] _SERVER["REMOTE_PORT"] _SERVER["GATEWAY_INTERFACE"] _SERVER["SERVER_PROTOCOL"] _SERVER["REQUEST_METHOD"] _SERVER["QUERY_STRING"] _SERVER["REQUEST_URI"] _SERVER["SCRIPT_NAME"] _SERVER["PHP_SELF"]

ESAT/DMSI/PROA/WGR

Page 63 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

82. Les lments SELECT multiples


Jusqu prsent, les exemples nous permettent de runir des informations depuis des lments HTML qui soumettent une valeur unique par nom dlment. Les lments select permettent lutilisateur de choisir des options multiples. Le nom de ces lments doit se terminer par une paire de crochets vide (notation tableau). Les lments doivent contenir loption multiple. Exemple : <html> <head> <title>Exercice sur les formulaires</title> </head> <body> <? echo "<form method='post' action='articles.php3'>"; echo "<div align='center'>"; echo "Slectionner un ou plusieurs articles<br>"; echo "<select name='articles[]' multiple>"; echo "<option value='tournevis'>tournevis</option>"; echo "<option value='marteau'>marteau</option>"; echo "<option value='pied de biche'>pied de biche</option>"; echo "</select>"; echo "<br><br>"; echo "<input type='submit' name='envoyer' value='Envoyer'>" ; echo "</div>" ; echo "</form>"; ?> </body> </html>

Fichier articles.php3 : <? $articles = $HTTP_POST_VARS["articles"]; $nb_articles = sizeof($articles); echo "<form method='post' action='#'>"; echo "<div align='center'>"; echo "Vous avez slectionn $nb_articles articles :<br>"; for( $art = 0 ; $art < $nb_articles ; $art++ ) echo "$articles[$art]<br>"; echo "</div>" ; echo "</form>"; ?> </body> </html>

Llment cases cocher <input type=checkbox name=xx[]> autorise galement les valeurs multiples dans un mme nom de champ. Le nom doit galement se terminer par une paire de crochets vide.
Page 64 sur137 jj/10/OO

ESAT/DMSI/PROA/WGR

Cours Programmation

Langage PHP

php.doc

83. Les champs dun formulaire dans un tableau associatif


Les techniques tudies jusqu prsent fonctionnent bien aussi longtemps que votre script connat le nombre de champs quil va traiter. Vous pouvez cependant avoir crire du code qui sadapte aux modifications ralises dans un formulaire, ou mme qui desserve plusieurs formulaires, sans se soucier des noms des champs spcifiques du formulaire. Les variables globales fournies par PHP4 permettent de rsoudre le problme. En fonction de lutilisation de la mthode POST ou GET dans le formulaire soumis, vous accderez $HTTP_POST_VARS ou $HTTP_GET_VARS. Il sagit de tableaux associatifs qui contiennent les paires nom/valeur des donnes soumises. Dans lexemple suivant, nous dfinissons un formulaire qui contient un champ texte nomm utilisateur, une zone de texte nomme adresse et un bouton de soumission nomm envoyer qui fera appel au formulaire trait.php3 :

<html> <head> <title>Exercice simple sur les formulaires</title> </head> <body> <? echo "<form method='post' action='trait.php3'>"; echo "<div align=center>" ; echo "Votre nom&nbsp;&nbsp;&nbsp;"; echo "<input type='text' name='utilisateur' /><br><br>"; echo "Votre adresse<br>"; echo "<textarea name='adresse' rows='5' cols='40'></textarea><br><br>" ; echo "<input type=submit name=envoyer value=Envoyer>" ; // bouton de soumission echo "</div>" ; echo "</form>"; ?> </body> </html> Largument action de llment form pointe sur un fichier nomm trait.php3 qui traitera les donnes du formulaire. Comme nous navons spcifi quun nom de fichier largument action, le fichier doit se trouver dans le mme rpertoire du serveur que le document contenant notre code.

ESAT/DMSI/PROA/WGR

Page 65 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Le fichier trait.php3 dcrit ci-dessous est appel lors de la soumission : <html> <head> <title>Exercice sur les formulaires</title> </head> <body> <? $utilisateur = $HTTP_POST_VARS["utilisateur"]; $adresse = $HTTP_POST_VARS["adresse"]; $bouton_soumission = $HTTP_POST_VARS["envoyer"] ; $page = $HTTP_SERVER_VARS["HTTP_REFERER"] ; echo "<form method='post' action='#'>"; echo "<div align='center'>"; echo "<h2>Bienvenue</h2>votre nom est : $utilisateur<br>"; echo "votre adresse est :$adresse"; echo "<br><br>Ce formulaire provient de la page '$page' et a t appel l'aide du bouton '$bouton_soumission'" ; echo "</div>" ; echo "</form>"; ?> </body> </html>

Bienvenue
votre nom est : MARTIN votre adresse est : 1, rue de Paris 35000 RENNES Ce formulaire provient de la page http://160.xxx.xxx.xxx/formul1.php3 et a t appel laide du bouton Envoyer

Le code suivant dresse la liste des noms et valeurs de tous les paramtres (les tableaux font partie dun traitement particulier : la srialisation, qui fera lobjet dun autre chapitre) qui lui sont transmis via une transaction POST : foreach( $HTTP_POST_VARS as $nom=>$valeur ) echo "$nom $valeur<br>"; Rsultat laffichage : utilisateur MARTIN adresse 1, rue de Paris 35000 RENNES envoyer Envoyer La balise <INPUT> permet galement de dfinir un champ de type HIDDEN (cach). Ce champ nest pas visible, il est principalement destin dfinir une donne dont la valeur est fixe, et passer cette donne en mme temps que celles saisies par lutilisateur. Exemple : echo "<form method='post' action='trait.php3'>"; echo "<input type=HIDDEN name=var value= ".$var. ">" ; Il est important de noter que cach ne veut pas dire secret . Rien nempche un utilisateur de consulter la valeur dun champ cach en regardant le code source du document HTML. Il faut pouvoir aider lutilisateur lors de la saisie dun formulaire, et surtout contrler que les valeurs entres respectent certaines rgles (ex : champ saisi obligatoirement, valeurs numriques et positives etc.). Ce genre de contrle peut tre fait par le serveur aprs que lutilisateur a valid sa saisie, mais ce mode de fonctionnement a linconvnient de multiplier les changes sur le rseau. Une solution plus sduisante est deffectuer les contrles par le navigateur, laide dun langage comme JavaScript qui permet de faire de la programmation au niveau du client (la prsentation du langage JavaScript mrite un ouvrage complet).

ESAT/DMSI/PROA/WGR

Page 66 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

84. Echanges client/serveur


Toutes les donnes saisies dans un formulaire doivent tre transmises au serveur web, et inversement ce programme doit produire un document (gnralement un document HTML) et le transmettre au navigateur via le serveur web. Au moment o lutilisateur dclenche la soumission, le navigateur concatne dans une chane de caractres une suite de descriptions de la forme nomchamp=valeurchamp o nomchamp est le nom du champ dans le formulaire et valeurchamp la valeur saisie. Les diffrents champs sont spars par le caractre &. Il existe alors deux manires de transmettre cette chane au serveur, selon que la mthode utilise est GET ou POST. Mthode GET : la chane est place la fin de lURL appele, aprs un caractre ?. Mthode POST : la chane est transmise sparment de lURL. Cette mthode est gnralement prfre car elle vite davoir grer des URL trs longues.

85. Combinaison de codes HTML et PHP


Dans certaines circonstances, vous pourriez dsirer contrler la validit des champs saisis par lutilisateur. Il peut se rvler alors utile de prsenter le mme formulaire lutilisateur tant que les champs ne sont pas valides. Quel que soit le nom que nous attribuons la page contenant le formulaire, le bouton de soumission Envoyer lappellera toujours, car nous avons affect la valeur de $PHP_SELF (nom de la page courante) largument ACTION de llment FORM. Lexemple suivant simule lenvoi de plusieurs messages, le numro du message est affich en haut de la page : <html> <head> <title>Un formulaire qui s'appelle lui-mme</title> </head> <body> <form method='GET' action="<?print($PHP_SELF)?>"> <? echo "<div align='center'>"; // si l'lment nb_messages du tableau $HTTP_GET_VARS existe (vrai partir du 2ime appel) // sa valeur sera incrmente et stocke dans la variable $nb_messages // sinon celle-ci sera initialise 1 $nb_messages = ($HTTP_GET_VARS["nb_messages"]) ? $HTTP_GET_VARS["nb_messages"]+1 : 1; echo "<h2>$nb_messages ".(($nb_messages == 1) ? "ier" : "ime")." message</h2>"; echo "Entrez votre message : <input type='text' name='mess'>"; echo "<br>Entrez le nom du destinataire : <input type='text' name='dest'>"; echo "<input type='HIDDEN' name='nb_messages' value='".$nb_messages."'>"; echo "<br><br><input type='submit' name='envoyer' value='Envoyer'>" ; echo "</div>" ; echo "</form>"; ?> </body> </html> Vous remarquerez la prsence du champ cach nomm nb_messages et contenant la valeur de la variable $nb_messages. La valeur de ce champ est, comme la valeur des autres champs, passe automatiquement la page appele laide du bouton submit.

Le champ cach doit tre plac aprs lobtention de la valeur avec laquelle il sera initialis.

ESAT/DMSI/PROA/WGR

Page 67 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Rsultat lexcution :

ESAT/DMSI/PROA/WGR

Page 68 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

12. Les fichiers


PHP est un langage de script interprt sur un serveur. Il offre de larges possibilits de gestion et dutilisation de son systme de fichiers semblables au langage C. Toutefois, ces possibilits ne sont en aucun cas applicables au systme de fichiers du poste client. Si un accs aux fichiers du poste client se rvle ncessaire, il faut recourir des mcanismes de upload et de download, implments par PHP, qui permettent de transfrer ces fichiers sur le serveur. Ce dernier pourra ainsi y effectuer les traitements requis. Dautres mcanismes daccs aux fichiers clients reposant sur des applets Java ou des composants ActiveX qui sexcutent sur le client sont envisageables, dans certaines conditions, mais sortent du cadre de la programmation PHP, qui se localise exclusivement sur le serveur.

86. Structure dun fichier pour PHP


En effet, PHP reprend toute la base des fonctions de gestion de fichiers du langage C, et y ajoute une srie de fonctions adaptes aux applications fondes sur une architecture Intranet. Pour PHP, tous les fichiers sont ouverts avec la mme structure. Seul le mode douverture change (lecture, criture et modification). Cela implique quaucune diffrence ne sera faite entre louverture dun fichier binaire et louverture dun fichier texte, par exemple. Les mmes mthodes sont applicables, quel que soit le type du fichier ouvert.

87. Lire et crire dans un fichier


Quil sagisse de lire ou dcrire dans un fichier, lopration se droule gnralement en trois phases : Ouverture du fichier dans le mode appropri, Lecture / criture dans le fichier, Fermeture du fichier. Toutefois PHP propose certaines fonctions qui permettent de raliser des oprations simples de lecture de fichier qui vitent les phases douverture et de fermeture. La manire la plus simple de visualiser le contenu dun fichier en PHP est dutiliser la fonction readfile(). Elle permet uniquement le renvoi vers la sortie standard du contenu du fichier pass en paramtre, mais se passe de toute opration douverture et de fermeture de fichier : Readfile("mon_fichier.txt") ; // affiche lcran le contenu du fichier mon_fichier.txt La fonction file() sutilise de la mme manire, mais elle retourne un tableau qui contient les lignes du fichier pass en paramtre, au lieu de lafficher lcran.

88. Ouverture dun fichier


En PHP, louverture dun fichier seffectue au moyen de la fonction fopen(). Lors de louverture dun fichier, vous devez spcifier le nom du fichier et le mode douverture, cest--dire la manire dont vous voulez utiliser le fichier. fopen() retourne un pointeur sur le fichier, qui est utilis en tant quidentifiant dans toutes les fonctions relatives la manipulation du fichier. Si louverture choue (ex : fichier en lecture non trouv), cette fonction retourne faux. Syntaxe : Int ptr_file fopen(string nom_de_fichier, string mode_d_ouverture) ; Si nom_de_fichier commence par "http://" (insensible la casse), une connexion HTTP est ouverte avec le serveur spcifi, et un pointeur sur la rponse fournie est retourn. Si nom_de_fichier commence par "ftp://" (insensible la casse), une connexion est ouverte avec le serveur spcifi, et un pointeur sur la rponse fournie est retourn. Si le serveur ne supporte par le mode ftp passif, cette fonction chouera. Vous pouvez ouvrir des fichiers en lecture seule, ou en criture seule (le full duplex nest pas support).

ESAT/DMSI/PROA/WGR

Page 69 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Il existe 6 modes douverture de fichiers possibles : "r" ouvre le fichier en lecture seule. Le pointeur est positionn en tte du fichier. "r+" ouvre le fichier en lecture / criture et place le pointeur en tte du fichier. "w" ouvre le fichier en criture seule et place le pointeur en tte du fichier. Si le fichier existe dj, son contenu est effac. Si le fichier nexiste pas, il est cr. "w+" ouvre le fichier en lecture / criture et place le pointeur en tte du fichier. Si le fichier existe dj, son contenu est effac. Si le fichier nexiste pas, il est cr. "a" ouvre le fichier en criture seule et place le pointeur la fin du fichier (ajout en fin de fichier). Si le fichier nexiste pas, il est cr. "a+" ouvre le fichier en lecture / criture et place le pointeur la fin du fichier (ajout en fin de fichier). Si le fichier nexiste pas, il est cr.

89. Fermeture dun fichier


La fermeture du fichier est effectue par la fonction fclose(), qui prend en paramtre lidentifiant du fichier. Syntaxe : int fclose(ptr_file) ;

90. Accs aux fichiers


int copy(string source, string dest); Fait une copie du fichier source vers le fichier dest. Renvoie vrai (TRUE ) en cas de succs, faux (FALSE ) sinon. float diskfreespace(string directory); La fonction retourne le nombre doctets disponibles sur le disque Windows ou le systme de fichiers dans lequel se trouve le dossier UNIX . int feof(int fp); Retourne vrai (TRUE ) si le pointeur fp est la fin du fichier, ou si une erreur survient, sinon, retourne faux (FALSE ). Le pointeur de fichier doit tre valide, et avoir t correctement ouvert par fopen(). char fgetc(int fp); Retourne le caractre lu depuis le fichier point par fp qui est avanc dune position. Retourne FALSE la fin du fichier (tout comme feof()). Le pointeur de fichier doit tre valide, et avoir t correctement ouvert par fopen(). string fgets(int fp, int length); Retourne la chane lue jusqu la longueur (length 1) octets, ou bien la fin du fichier, ou encore un retour chariot (le premier des trois que lon rencontre). Si une erreur survient, retourne faux. Erreur courante : Les programmeurs habitus la programmation 'C' noteront que fgets() ne se comporte pas comme son quivalent C lors de la rencontre de la fin du fichier. Le pointeur de fichier doit tre valide, et avoir t correctement ouvert par fopen(). Exemple : $fd = fopen("/tmp/inputfile.txt", "r"); while ($buffer = fgets($fd, 4096)) { echo $buffer; } fclose($fd); int file_exists(string filename); Retourne vrai si le fichier filename existe, et faux sinon. Le rsultat de cette fonction est mis en cache. int filesize(string filename); Retourne la taille du fichier filename, ou faux en cas derreur. Le rsultat de cette fonction est mis en cache.

ESAT/DMSI/PROA/WGR

Page 70 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

bool flock(int fp, int operation); PHP dispose dun systme complet de verrouillage de fichier. Tous les programmes qui accdent au fichier doivent utiliser la mme mthode de verrouillage pour quil soit efficace. flock() agit sur le fichier fp qui doit avoir t ouvert. operation est une des valeurs suivantes : 1 Verrouillage en lecture. Le fichier peut tre partag avec dautres lecteurs. 2 Verrouillage en criture. Ce type de verrouillage est exclusif : le fichier ne peut tre partag. 3 Libration dun verrou existant (partag ou exclusif). +4 Si vous voulez que flock() ne se bloque pas durant le verrouillage, ajoutez 4 operation. flock() permet de raliser un systme de verrous criture / lecture simple, qui peut tre utilis sur nimporte quelle plate-forme (Unix et Windows compris). flock() retourne vrai en cas de succs, et faux sinon. (le verrou na pas pu tre obtenu). int fpassthru(int fp); Lit le contenu dun fichier depuis la position du pointeur jusqu la fin, et dirige le rsultat vers la sortie standard (lcran). Si une erreur survient, fpassthru() retourne faux. Le pointeur de fichier doit tre valide, et doit avoir t correctement ouvert par fopen(). Aprs la lecture, fpassthru() va fermer le fichier (le pointeur sera alors invalide). Si vous voulez simplement afficher le contenu dun fichier, il suffit dutiliser readfile(), ce qui pargnera lappel fopen(). int fputs(int fp, string str, [int length]); La fonction crit la chane str dans le fichier dcrit par fp. fputs() est un alias de fwrite(), et lui est identique en tout point. Notez que length est un paramtre optionnel, et s'il nest pas spcifi, toute la chane est crite. Elle retourne vrai si lopration russit. string fread(int fp, int length); Lecture dun fichier en mode binaire. fread() lit jusqu length octets dans le fichier rfrenc par fp. La lecture sarrte lorsque length octets ont t lus, ou que lon a atteint la fin du fichier, ou quune erreur survient (le premier des trois). int fseek(int fp, int offset); Positionne le pointeur interne de fichier fp offset octets partir du dbut du fichier. Equivalent la fonction C fseek( fp, offset, SEEK_SET ). Retourne vrai en cas de succs, et sinon -1. Notez que positionner le pointeur au-del de la fin du fichier nest pas une erreur. Ne peut pas tre utilis sur les pointeurs retourns par fopen() s'ils sont au format HTTP ou FTP. int ftell(int fp); Retourne la position courante du pointeur fp (nombre doctets par rapport au dbut du fichier). Si une erreur survient, retourne faux. Le pointeur de fichier doit tre valide, et avoir t correctement ouvert par fopen(). int fwrite(int fp, string str, [int length]); La fonction crit le contenu de la chane str dans le fichier point par fp. Si la longueur length est fournie, lcriture sarrtera aprs length octets, ou la fin de la chane (le premier des deux). int rewind(int fp); Replace le pointeur du fichier fp au dbut. Si une erreur survient, la fonction retourne 0. Le pointeur de fichier doit tre valide, et avoir t correctement ouvert par fopen().

91. Accs aux rpertoires


new dir(string directory); dir est un mcanisme orient pseudo-objet qui permet la lecture dun dossier. Largument directory doit tre ouvert. class dir { dir(string directory); string path; resource handle; string read(); void rewind(); void close(); }

ESAT/DMSI/PROA/WGR

Page 71 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Deux proprits sont disponibles une fois le dossier ouvert : le pointeur handle peut tre utilis avec dautres fonctions telles que readdir(), rewinddir() et closedir(). Le chemin du dossier path est le chemin fourni lors de la construction de lobjet. Trois mthodes permettent de lire read(), remettre zro rewind() et fermer le dossier close(). Exemple : affichage du nom de toutes les entres dun rpertoire en programmation objet :

<? $rep = dir("C:\Program Files"); echo "chemin : $rep->path<br>"; while($entry = $rep->read()) echo "$entry<br>"; $rep->close(); ?>
string getcwd (void); Retourne le nom du dossier courant. int chdir(string directory); Permet de se positionner dans le dossier directory. Retourne faux (FALSE ) si lopration choue, et vrai (TRUE ) sinon. void closedir(int ptr_dir); Ferme le pointeur de dossier ptr_dir. Le dossier doit avoir t ouvert avec opendir(). int mkdir(string pathname, int permissions); Tente de crer un dossier dans le chemin pathname. Notez que vous aurez prciser les permissions en base octale (codes comme sous UNIX), ce qui signifie que vous aurez probablement un 0 comme premier chiffre, exemple : mkdir("/path/to/my/dir", 0700); La fonction retourne vrai en cas de succs, et faux en cas dchec. int opendir(string path); Retourne un pointeur sur le dossier spcifi par le chemin path, pour tre utilis avec les fonctions closedir(), readdir(),et rewinddir(). string readdir(int ptr_dir); Retourne le nom du fichier suivant dans le dossier identifi par ptr_dir. Les noms sont retourns dans nimporte quel ordre. int rename(string oldname, string newname); Tente de renommer le fichier oldname en newname. Retourne vrai en cas de succs et faux sinon. void rewinddir(int ptr_dir); Retourne la premire entre du dossier point par ptr_dir : le prochain fichier lu sera le premier. int rmdir(string dirname); Tente deffacer le dossier dont le chemin est dirname. Le dossier doit tre vide, et le script doit avoir les autorisations adquates. Si une erreur survient, la fonction retourne 0. int unlink(string filename); Tente deffacer le fichier filename. Identique la fonction Unix C unlink(). La fonction retourne 0 ou FALSE en cas dchec. Exemple : affichage du nom de tous les fichiers dun rpertoire : <? echo "<form method='POST' action='#'>"; echo "<div align='center'>"; $path = "F:\\http\\developpement"; $dp = opendir($path); echo "Liste des noms de fichiers du rpertoire : $path<br><br>"; while($fic = readdir($dp)) echo "$fic<br>"; closedir($dp); echo "</div>" ; echo "</form>"; ?>

ESAT/DMSI/PROA/WGR

Page 72 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

92. Lire un fichier dfini par une URL


PHP a t cr spcialement pour dvelopper des applications Internet/Intranet, et cette fonctionnalit en est une illustration typique. De la mme manire quon a lu un fichier local, on va pouvoir lire un fichier distant, en passant par HTTP ou FTP. Pour cela, il suffit de passer une URL en paramtre fopen() au lieu dun nom de fichier. Exemple : $fp = fopen("http://www.php.net","r") ; Cette facilit permet danalyser le code source dune URL au fur et mesure de son arrive, avant son interprtation par le navigateur client. On peut ainsi filtrer le contenu des pages, neutraliser des liens ou encore aspirer un site complet avec un minimum de code. Il est noter que seul le mode lecture fonctionne avec HTTP. La mme opration est possible en utilisant le protocole FTP. Dans ce cas les lectures / critures sont possibles mais dpendent troitement des liberts accordes par le serveur rfrenc.

ESAT/DMSI/PROA/WGR

Page 73 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

93. Exemples de traitements sur les fichiers


Exemple1 : Le script suivant va dupliquer un fichier texte en le mettant au format HTML, avec mise en gras de la premire lettre de chaque ligne et augmentation de la taille de sa police. Un retour la ligne HTML sera insr entre chaque ligne : <html> <head> <title>Un formulaire qui duplique un fichier texte en fichier HTML</title> </head> <body> <? echo "<form method='POST' action='#'>"; echo "<div align='center'>"; $nom_fic_w = "fic_w.html"; $nom_fic_r = "fic_r.txt"; // ouverture des fichiers $fpw = fopen($nom_fic_w,"w"); $fpr = fopen($nom_fic_r,"r"); // parcours du fichier dupliquer while($ligne_r = fgets($fpr,4096)) { $ligne_w = "<font size=+1><b>"; $ligne_w .= substr($ligne_r,0,1); $ligne_w .= "</b></font>"; $ligne_w .= substr($ligne_r,1); $ligne_w .= "<br>"; fwrite($fpw,$ligne_w); } // fermeture des deux fichiers fclose($fpr); fclose($fpw); // affichage d'un message de fin de traitement echo "L'criture du fichier $nom_fic_w est termine !"; echo "</div>" ; echo "</form>"; ?> </body> </html> Exemple2 : Pacours dun fichier "/etc/passwd" et affichage des utilisateurs dun serveur : $data = file("/etc/passwd") ; foreach ( $data as $ligne ) { $user = strtok($ligne,":") ; $passwd = strtok(":") ; $uid = strtok(":") ; $gid = strtok(":") ; $gecos = strtok(":") ; $homedir = strtok(":") ; $shell = strtok(":") ; echo "$user (uid=$uid) => $gecos<br>" ;
}

// augmentation de la taille et mise en gras // retourne le premier caractre // retour la taille standard et fin de mise en gras // retourne la ligne complte partir du 2ime caractre // ajout de la balise 'nouvelle ligne' // ecriture dans le fichier html

ESAT/DMSI/PROA/WGR

Page 74 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

94. La fonction popen


Laccs au systme de fichiers de la machine peut se faire par lintermdiaire de lexcution de commandes systme, dont on rcupre le rsultat, comme sil sagissait dun fichier ordinaire. La fonction popen() permet dexcuter ces commandes. Le code suivant permet dafficher le contenu du rpertoire qui contient la page PHP interprte : <html> <head> <title>Obtention d'une liste de fichiers l'aide de popen</title> </head> <body> <? echo "<form method='POST' action='#'>"; echo "<div align='center'>"; $commande = "dir /B"; // sous UNIX la commande sera ls // excution de la commande et stockage du rsultat dans un fichier point par $fpr $fpr = popen($commande,"r"); // parcours du fichier contenant le rsultat de la commande // lecture de chaque ligne et suppression des espaces blancs de dbut et fin de ligne while($ligne_r = trim(fgets($fpr,4096))) echo $ligne_r."<br>"; echo "</div>" ; echo "</form>"; ?> </body> </html>

95. Problmes poss par lusage de fichiers plats


Lutilisation de fichiers pose divers problmes : Ds lors quun fichier devient volumineux, sa manipulation peut se rvler trs lente. La recherche dun enregistrement ou dun ensemble denregistrements dans un fichier plat est difficile. La gestion des accs concurrents est problmatique : si le trafic sur le site prend de lampleur, il peut arriver que de nombreux utilisateurs aient attendre le dverrouillage du fichier pour valider leur commande. Les longues attentes sont pnalisantes pour lutilisateur. Dans toutes les manipulations de fichiers dcrites jusquici, les traitements taient mis en uvre de faon squentielle, cest--dire en partant du dbut du fichier, et en parcourant le contenu du fichier jusqu la fin de celui-ci. Sil apparat ncessaire dinsrer ou de supprimer des enregistrements partir du milieu du fichier (accs alatoire), le mode de traitement squentiel peut poser un problme : il implique de lire et de placer en mmoire lintgralit du fichier, dapporter les modifications, et de rcrire nouveau le fichier. La charge de traitement peut alors devenir trs lourde avec des fichiers de donnes volumineux. Au-del de la limite offerte par le dispositif de permissions sur les fichiers, il nexiste pas de moyen simple dimplmenter des niveaux diffrents daccs aux donnes.

Vous pouvez consulter la section du manuel en ligne PHP (http://no.php.net/manual/fr/) consacre au systme de fichiers.

ESAT/DMSI/PROA/WGR

Page 75 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

13. Les bases de donnes


Les systmes de gestion de base de donnes relationnelle (SGBD) apportent des solutions tous les problmes voqus au chapitre prcdent. Les SGBD : Permettent des accs plus rapides aux donnes. MySQL est apparu comme le SGBD le plus rapide du march. Vous pouvez consulter les statistiques de ses performances sur le site http://web.mysql.com/benchmark.html Peuvent tre facilement consults et explors, pour extraire les ensembles de donnes qui rpondent des critres spcifiques. Comprennent des mcanismes prdfinis pour le traitement des accs concurrents. Fournissent un accs alatoire aux donnes. Comprennent des systmes de privilges intgrs. MySQL est particulirement performant sur ce point. Par rapport ses concurrents, MySQL possde plusieurs avantages majeurs, comme ses performances leves, son cot rduit (disponible gratuitement sous licence Open Source, ou pour un prix trs raisonnable pour les licences commerciales), sa simplicit de configuration et dapprentissage, sa portabilit et son code source disponible gratuitement, au mme titre que celui de PHP. MySQL peut tre utilis sur un grand nombre de systmes UNIX, ainsi quavec Windows.

96. Architecture dune base de donnes Web


Le fonctionnement fondamental dun serveur Web est articul autour dun systme compos de deux objets : un navigateur Web et un serveur Web. Le navigateur Web effectue des requtes auprs du serveur, et le serveur renvoie des rponses. Cette architecture est parfaitement adapte un serveur qui fournit des pages statiques. Larchitecture qui permet de servir des sites Web faisant intervenir des bases de donnes est un peu plus complexe. Larchitecture fondamentale ncessaire pour les accs aux bases de donnes Web est compose dun navigateur Web, dun serveur Web, dun moteur de scripts (PHP) et dun serveur de bases de donnes (MySQL). Navigateur 1 6 Serveur Web 2 5 Moteur PHP 3 4 Serveur MySQL

Base de donnes

Une transaction de base de donnes Web typique est compose des tapes suivantes : 1. Le navigateur Web dun utilisateur envoie une requte HTTP pour une page Web particulire. La requte peut se prsenter sous la forme dun formulaire HTML. Le serveur Web reoit la requte, rcupre le formulaire et le passe au moteur PHP afin quil soit trait. 2. Le moteur PHP commence analyser le script. A lintrieur de ce script se trouve une commande permettant de se connecter la base de donnes et dexcuter une requte. PHP ouvre une connexion vers le serveur MySQL, et transmet la requte approprie. 3. Le serveur MySQL reoit la requte et la traite, puis envoie les rsultats au moteur PHP. 4. Le moteur PHP termine lexcution du script, ce qui consiste gnralement en un formatage des rsultats de la requte en HTML. 5. Le moteur PHP envoie ensuite le fichier HTML obtenu au serveur Web. 6. Le serveur Web transmet la page HTML au navigateur, pour que lutilisateur puisse visualiser les rsulats. Le plus souvent, le serveur Web, le moteur PHP et le serveur de bases de donnes sont tous excuts sur le mme ordinateur. Cependant, il arrive que le serveur de bases de donnes soit excut sur un autre ordinateur. Cette dernire approche rpond des problmes de scurit, daugmentation des capacits, et de rpartition de la charge. PHP ct serveur : quand un fichier avec une extension .php ou .php3 est demand au serveur Web, ce dernier le charge en mmoire et y cherche toutes les instructions PHP quil transmet linterprteur. linterprteur excute les instructions, ce qui a pour effet de produire du code HTML qui vient remplacer les instructions PHP dans le document finalement fourni au navigateur. Ce dernier reoit donc du HTML pur et ne voit jamais la moindre instruction PHP.

ESAT/DMSI/PROA/WGR

Page 76 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

97. Structure de linstallation de MySQL


Rpertoires de \mysql\ bin data include lib scripts Contenu des rpertoires Programmes client et serveur mysqld (Compiled with full
debugging and automatic memory allocation checking )

Fichiers log et bases de donnes Fichiers header Librairies Fichiers lis la configuration du serveur MySQL dont mysql_install_db (Vous pouvez utiliser ce script comme
base, pour ajouter de nouveaux utilisateurs, modifier les privilges)

share docs bench

Fichiers contenant les tables de caractres des pays Manuels de documentation Benchmarks

98. Les principales instructions SQL


98.1. SELECT
Cette instruction est utilise pour lire des donnes dans une base de donnes, en slectionnant les lignes qui correspondent certains critres. Sa forme principale est la suivante : SELECT colonnes FROM tables [WHERE condition] [GROUP BY group_type] [HAVING dfinition] [ORDER BY ordre] [LIMIT limite] ; Vous pouvez spcifier autant de colonnes que vous le souhaitez, en les mentionnant aprs le mot cl SELECT. Le caractre * symbolise toutes les colonnes de la table spcifie. La clause WHERE spcifie les critres utiliss pour slectionner les lignes. En plus du test dgalit, MySQL supporte plusieurs oprateurs et expressions rgulires : Oprateur = > < >= <= != ou <> IS NOT NULL IS NULL BETWEEN IN NOT IN LIKE NOT LIKE REGEXP

Nom Egalit Suprieur Infrieur Suprieur ou gal Infrieur ou gal Diffrent de Prsence Prsence Intervalle

Exemple Index = 5 Total > 100 Total < 100 Total >= 100 Total <= 100 Total != 100 Total IS NOT NULL Total IS NULL Total BETWEEN 100 and 200 Existence Ville IN ("Paris","Lyon") Existence Ville NOT IN ("Paris","Lyon") Comparaison de Nom LIKE ("Fred %") motif Comparaison de Nom NOT LIKE motif ("Fred %") Comparaison de Nom REGEXP motif

Description Teste si les deux oprandes sont gaux Teste si un oprande est suprieur un autre Teste si un oprande est infrieur un autre Teste si un oprande est suprieur ou gal un autre Teste si un oprande est infrieur ou gal un autre Teste si les deux oprandes sont diffrents Teste si le champ contient une valeur Teste si le champ ne contient aucune valeur Teste si la valeur est comprise dans lintervalle spcifi Teste si la valeur se trouve dans un ensemble spcifi Teste si la valeur ne se trouve pas dans un ensemble spcifi Teste si la valeur correspond un motif spcifi Teste si la valeur ne correspond pas un motif spcifi Teste si la valeur correspond une expression rgulire (squence de caractres)

Les motifs peuvent contenir du texte classique, plus les caractres % et _. % remplace nimporte quelle chane de caractres, et _ remplace nimporte quel caractre. Dans MySQL les motifs ne respectent pas la casse. Il est possible de slectionner des lignes en associant plusieurs critres avec AND et OR ou && et ||.
Page 77 sur137 jj/10/OO

ESAT/DMSI/PROA/WGR

Cours Programmation

Langage PHP

php.doc

Pour rassembler des informations qui se trouvent dans diffrentes tables, vous devez effectuer une opration appele fusion. Cela revient simplement runir plusieurs tables en fonction des relations qui existent entre leurs donnes. Exemple : SELECT clients.nom FROM clients, emprunts, livres WHERE clients.num_client = emprunts.num_client AND emprunts.nombre_emprunts >= 4 AND livres.titre LIKE %PHP%; Il est souvent pratique de pouvoir faire rfrence aux tables avec dautres noms que lon appelle des alias. Vous pouvez les crer au dbut dune requte laide du mot cl AS, et les utiliser tout au long de la requte. Exemple : SELECT c.nom FROM clients as c, emprunts as e, livres as l WHERE c.num_client = e.num_client AND e.nombre_emprunts >= 4 AND l.titre LIKE %PHP%; Il faut passer par les alias pour fusionner une table avec elle-mme. Cette approche peut tre utile si nous voulons trouver dans une table les lignes qui possdent des valeurs en commun. Exemple, trouver les clients qui habitent dans la mme ville : SELECT c1.nom, c2.nom, c1.ville FROM clients as c1, clients as c2 WHERE c1.ville = c2.ville AND c1.nom ! = c2.nom ;

La clause ORDER BY est utilise pour trier les lignes en fonction de plusieurs colonnes, listes dans la clause SELECT. Par dfaut, lordre de tri est croissant. Vous pouvez le spcifier explicitement laide du mot cl ASC. Il est possible de trier par ordre dcroissant, en spcifiant le mot cl DESC. Exemple : SELECT nom, ville FROM clients ORDER BY nom, ville ASC ; MySQL possde plusieurs fonctions dagrgation pour rpondre certains types de requtes. Ces fonctions peuvent tre appliques une table prise comme un ensemble, ou un groupe de donnes dans une table : Nom AVG(colonne) COUNT(colonne) Description Moyenne des valeurs dans la colonne spcifie. Nombre de valeurs non NULL dans la colonne. Si vous ajoutez le mot DISTINCT devant le nom de la colonne, vous obtiendrez le nombre de valeurs distinctes dans cette colonne. sI vous spcifiez COUNT (*), vous obtiendrez un compte global, indpendamment des valeurs NULL. Minimum des valeurs dans la colonne spcifie. Maximum des valeurs dans la colonne spcifie. Ecart type des valeurs dans la colonne spcifie. Idem STD(colonne) Somme des valeurs dans la colonne spcifie.

MIN(colonne) MAX(colonne) STD(colonne) STDDEV(colonne) SUM(colonne)

La clause GROUP BY permet dobtenir des informations plus dtailles. Par exemple cela nous permet dafficher la moyenne des commandes pour diffrents groupes (ex : en fonction du numro de socit). Grce ce mcanisme, nous pouvons connatre la socit qui a dpens le plus dargent : SELECT num_societe, avg(montant) FROM factures GROUP BY num_societe ; La clause HAVING permet de tester le rsultat dune agrgation. Elle doit tre spcifie aussitt aprs la clause GROUP BY, et elle fonctionne comme une clause WHERE qui ne sappliquerait quaux goupes et aux agrgats. Exemple : SELECT num_societe, avg(montant) FROM factures GROUP BY num_societe HAVING avg(montant) > 1000; La clause LIMIT est utilise pour spcifier les lignes du rsultat qui doivent tre renvoyes. Elle accepte deux paramtres : le numro de ligne de dpart et le nombre de lignes renvoyer (les lignes sont numrotes partir de 0). Cela est trs utile pour les applications Web, par exemple pour permettre aux clients qui parcourent le catalogue des produits, dafficher uniquement 10 articles par page. Exemple : SELECT * FROM produits LIMIT 0, 9 ; Au lieu dafficher le rsultat dun ordre SELECT lcran, on peut le placer dans un fichier. Exemple : SELECT * INTO OUTFILE svfilm.txt FROM films ;

ESAT/DMSI/PROA/WGR

Page 78 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Il faut avoir le privilge file (voir auprs de ladministrateur du serveur MySQL) pour utiliser INTO OUTFILE. On obtient alors tous les droits daccs du serveur mysql. Par dfaut, le fichier est cr dans le rpertoire contenant les bases de donnes. On peut indiquer explicitement le chemin daccs, condition que mysql ait le droit dcriture. Les lignes de la table sont crites en sparant chaque valeur par une tabulation, ce qui permet de recharger le fichier par la suite avec la commande LOAD DATA. On peut indiquer, aprs le nom du fichier, les options de sparation des lignes et des attributs, avec une syntaxe identique celle utilise pour LOAD DATA.

98.2. INSERT
Cette instruction permet dajouter des lignes dans la base de donnes. Sa forme principale est la suivante : INSERT [INTO] nom_de_la_table [(colonne1, colonne2, )] VALUES (valeur1, valeur2, ) ; Les valeurs spcifies sont utilises pour remplir la table, dand lordre o elles sont fournies. Cependant, si vous souhaitez remplir uniquement certaines colonnes, ou si vous voulez spcifier les valeurs dans un ordre diffrent, vous pouvez prciser le nom des colonnes dans linstruction. Exemples : INSERT INTO clients VALUES (NULL, DUPOND, Jules, 10, rue de Brest, RENNES) ; INSERT INTO clients (nom, prenom, adresse, ville) VALUES (DURANT,Pierre,4, rue de Paris,RENNES) ; Voici une autre syntaxe similaire : INSERT INTO clients SET nom=DURANT, prenom=Pierre, adresse=4, rue de Paris, ville=RENNES ;

Les chanes de caractres doivent toujours tre mises entre simples ou doubles guillemets. Les nombres et les dates nont pas besoin de guillemets. Nous avons spcifi la valeur NULL lorsque nous avons ajout Jules DUPOND, car la premire colonne (num_client) a t dclare comme tant la cl primaire de la table clients, avec lattribut AUTO_INCREMENT. Cela signifie que si nous insrons une ligne avec la valeur NULL (ou aucune valeur) dans ce champ, MySQL gnre le prochain numro dans la squence dauto-incrmentation, et insre automatiquement la prochaine valeur. Il est galement possible dinsrer plusieurs lignes dans une table en une seule instruction. Chaque ligne doit tre mise entre parenthses, et les ensembles de parenthses doivent tre spars par des virgules. Exemple : INSERT INTO clients VALUES (NULL, DUPOND, Jules, 10, rue de Brest, RENNES) , (NULL, DURANT, Pierre, 4, rue de Paris, RENNES) , (NULL, MARTIN, Alain, 32, rue de Nantes, RENNES) ;

98.3. UPDATE
Cette instruction met jour une table, en modifiant toutes les colonnes spcifies en fonction des expressions fournies. Vous pouvez restreindre une instruction UPDATE certaines lignes avec la clause WHERE, et limiter le nombre total de lignes affectes avec la clause LIMIT. Sa forme principale est la suivante : UPDATE nom_de_la_table SET colonne1=expression1, colonne2=expression2, [WHERE condition] [LIMIT nombre] ; Exemple : UPDATE produits SET prixHT = prixHT*1.15 WHERE categorie=tabac ; // un peu dhumour ! ;-)

98.4. DELETE
Cette instruction permet de supprimer des enregistrements dans la base de donnes. Sa syntaxe est la suivante : DELETE FROM nom_de_la_table [WHERE condition] [LIMIT nombre] ; Si vous ne spcifiez aucune clause, toutes les lignes de la tables seront supprimes. La clause WHERE permet de spcifier les lignes supprimer. La clause LIMIT peut tre utilise pour limiter le nombre maximal de lignes supprimer. Exemple : DELETE FROM clients WHERE num_client = 6 ;

98.5. ALTER TABLE


Cette instruction permet de modifier la structure dune table.
ESAT/DMSI/PROA/WGR Page 79 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

Sa forme principale est la suivante : ALTER TABLE nom_de_la_table modification1 [, modification2 ] ; En SQL ANSI, il nest possible dapporter quune seule modification par instruction ALTER TABLE, avec MySQL vous pouvez en faire autant que vous le souhaitez. Chaque clause de modification peut tre utilise pour modifier diffrents aspects de la table. Les modifications possibles sont les suivantes : Syntaxe Description ADD [COLUMN] description [FIRST | Ajoute une nouvelle colonne lemplacement spcifi (sil nest pas AFTER colonne] spcifi, la colonne est ajoute la fin de la table). Notez que description ncessite un nom et un type, tout comme une instruction CREATE. ADD [COLUMN] (description1, Ajoute une ou plusieurs colonnes la fin de la table. description2, ) ADD INDEX [index] (colonne1, ) Ajoute un index dans la table, sur les colonnes spcifies. ADD PRIMARY KEY (colonne1, ) Transforme les colonnes spcifies en cl primaire de la table. ADD UNIQUE [index] (colonne1, ) Ajoute un index unique dans la table, sur les colonnes spcifies. ALTER [COLUMN] colonne {SET Ajoute ou supprime une valeur par dfaut pour une colonne particulire. DEFAULT valeur | DROP DEFAULT} CHANGE [COLUMN] colonne Modifie la colonne spcifie en lui affectant la nouvelle description. nouvelle_description Vous pouvez vous en servir pour modifier le nom dune colonne, puisque la description dune colonne contient son nom. MODIFY [COLUMN] description Modifie le type dune colonne mais pas son nom. DROP [COLUMN] colonne Supprime la colonne spcifie. DROP PRIMARY KEY Supprime lindex principal, mais pas la colonne. DROP INDEX index Supprime lindex spcifi. RENAME [AS] nouvelle_table Renomme une table. Exemples : Modification de la taille dune colonne : ALTER TABLE clients MODIFY nom VARCHAR(60) NOT NULL ; Ajout dune colonne : ALTER TABLE clients ADD code_postal CHAR(5) AFTER adresse ; Supression dune colonne : ALTER TABLE clients DROP age ;

98.6. DROP TABLE


Cette instruction permet de supprimer une table de la base de donnes. Sa syntaxe est la suivante : DROP TABLE nom_de_la_table ; Linstruction DROP TABLE supprime toutes les lignes de la table et la table elle-mme.

98.7. DROP DATABASE


Cette instruction permet de supprimer lintgralit dune base de donnes. Sa syntaxe est la suivante : DROP DATABASE nom_de_la_base_de_donnees ; Linstruction DROP DATABASE supprime toutes les lignes, toutes les tables, tous les index et la base de donnes elle-mme.

ESAT/DMSI/PROA/WGR

Page 80 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

99. Compatibilit avec les standards


99.1. Extensions MySQL la norme ANSI SQL 92
Vous ne trouverez probablement ces extensions dans aucune autre base de donnes. Soyez conscient que si vous utilisez ces extensions, votre code ne sera pas portable sur une autre base SQL. Dans certains cas, vous pouvez crire du code qui utilise ces extensions MySQL, mais qui est portable, en utilisant les commentaires de la forme /*! ... */. Dans ce cas, MySQL va analyser puis excuter le code de ce commentaire comme n'importe quelle commande MySQL, mais les autres serveur SQL les ignoreront. Par exemple : SELECT /*! STRAIGHT_JOIN */ nom_colonne FROM table1,table2 WHERE ... Voici la liste des extensions MySQL: Les types de colonnes MEDIUMINT, SET, ENUM et tous les types BLOB et TEXT. Les attributs de champs AUTO_INCREMENT, BINARY, UNSIGNED et ZEROFILL. Toutes les comparaisons de chanes sont insensibles la casse par dfaut, et le classement des chanes est bas sur la table de caractres courante (par dfaut, ISO-8859-1 Latin1). Si vous souhaitez que ces oprations soient sensibles la casse, ajoutez l'attribut BINARY aux colonnes concernes, ou bien utilisez l'oprateur de transptypage BINARY lors des comparaisons pour qu'elles prennent en compte l'ordre ASCII en cours sur l'hte MySQL. MySQL fait correspondre chaque base de donnes un dossier, et les tables de cette base seront reprsentes par des fichiers. Cela a deux consquences : 1. Les noms de bases de donnes et de tables sont dpendants du systme d'exploitation sur lequel MySQL tourne, notamment concertant la casse des noms. Si vous avez des difficults vous souvenir des noms de tables, utilisez une convention cohrente, comme par exemple celle de mettre tous les noms en minuscules. 2. Les noms de bases, de tables, d'index, de colonnes ou d'alias peuvent commencer par un chiffre (mais ne doivent pas tre consistitus seulement de chiffres). Remarque : Vous pouvez utiliser les commandes du systme pour sauvegarder, renommer, dplacer, effacer et copier des tables. Par exemple, vous pouvez copier le .ISD, .ISM et .frm pour crer une nouvelle table. En SQL pur, vous pouvez accder une table d'une autre base de donnes avec la syntaxe : nom_base_de_donnees.nom_table. Certains serveurs SQL proposent la mme fonctionnalit, mais l'appelle User space. MySQL n'accepte pas les espaces dans les noms de tables. LIKE est utilisable avec les colonnes de type numrique Possibilit d'utilisation de INTO OUTFILE et STRAIGHT_JOIN dans les commandes SELECT. L'option SQL_SMALL_RESULT dans une commande SELECT. EXPLAIN SELECT permet de voir de quelle manire les tables ont t regroupes. L'utilisation des index de noms, ou des index sur le prfixe d'un champ et l'utilisation de INDEX ou KEY dans une commande CREATE TABLE. Attribut TEMPORARY et IF NOT EXISTS dans la commande CREATE TABLE. Utilisation de COUNT(DISTINCT liste) lorsque 'liste' contient plus d'un lment. Utilisation de CHANGE nom_colonne, DROP nom_colonne ou DROP INDEX dans les commandes ALTER TABLE.. Utilisation de IGNORE dans les commandes ALTER TABLE. Utilisation de multiples ADD, ALTER, DROP ou CHANGE dans les commandes ALTER TABLE. Utilisation de DROP TABLE avec les mots cls IF EXISTS. Vous pouvez supprimer plusieurs tables avec une seule commande DROP TABLE. Clause LIMIT dans les commandes DELETE. L'option DELAYED dans les commandes INSERT et REPLACE. L'option LOW_PRIORITY dans les commandes INSERT, REPLACE, DELETE et UPDATE. Utilisation de LOAD DATA INFILE. Dans certains cas, cette syntaxe est compatible avec la fonction LOAD DATA INFILE d'Oracle. Elle vite dans beaucoup de cas davoir crire un programme spcifique pour charger des fichiers dans une base. Cette commande est capable de lire de nombreux formats diffrents. Voici comment on utilise la commande LOAD DATA INFILE pour insrer en une seule fois le contenu du fichier films.txt dans la table films : LOAD DATA LOCAL INFILE films.txt INTO TABLE films FIELDS TERMINATED BY ; ;
ESAT/DMSI/PROA/WGR Page 81 sur137 jj/10/OO

Cours Programmation -

Langage PHP

php.doc

Loption LOCAL indique au serveur que le fichier se trouve sur la machine du client mysql. Par dfaut, le serveur cherche le fichier sur sa propre machine, dans le rpertoire contenant la base de donnes. - Si le client mysql na pas t lanc dans le rpertoire o se trouve le fichier films.txt, il faut indiquer le chemin complet du fichier. - Enfin il existe de nombreuses options pour indiquer le format du fichier. Ici on indique quune ligne dans le fichier correspond une ligne dans la table, et que les valeurs des attributs dans le fichier sont spares par des points-virgules. La commande OPTIMIZE TABLE.. La commande SHOW. Les chanes de caractres peuvent tre dfinies avec " ou ', et pas seulement avec '. Utilisation du caractre d'chappement \. La commande SET OPTION. Vous n'avez pas nommer expressment toutes les colonnes dans une clause GROUP BY. Mais cela peut permettre d'acclrer quelques requtes trs spcifiques Pour aider les utilisateurs d'autres environnements SQL, MySQL dispose d'aliases pour de nombreuses fonctions. Par exemple, toutes les fonctions sur les chanes de caractres supportent la syntaxe ANSI SQL et ODBC. MySQL accepte les oprateurs logiques || et && (OR et AND, comme en langage C). Sous MySQL, || et OR sont synonymes, tout comme le sont && et AND. A cause de ce double emploi, MySQL n'accepte pas les oprateurs ANSI SQL || comme additionneur de chanes; (utilisez la place CONCAT() ).. Etant donn que CONCAT() prend un nombre arbitraire d'arguments, il est facile de remplacer ||. CREATE DATABASE ou DROP DATABASE. L'oprateur % est synonyme de MOD(). C'est dire que, N%M est quivalent MOD(N,M). % est hrit du langage C, et permet la compatibilit avec PostgreSQL. Les oprateurs =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE peuvent tre utiliss dans les comparaisons de colonnes avec la clause FROM dans les commandes SELECT. Par exemple : SELECT col1=1 AND col2=2 FROM nom_table La fonction MYSQL_INSERT_ID(). Les oprateurs d'expressions rgulires REGEXP et NOT REGEXP. CONCAT() ou CHAR() avec plus d'un argument. (Avec MySQL, ces fonctions peuvent prendre un nombre arbitraire d'arguments). Les fonctions supplmentaires BIT_COUNT(), ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), ou WEEKDAY(). Utilisation de TRIM() pour supprimer les espaces de dbut et fin de chane. ANSI SQL ne supporte que la suppression de caractres uniques. Les fonctions de GROUP BY : STD(), BIT_OR() et BIT_AND(). Utilisation de REPLACE la place de DELETE + INSERT.. La commande FLUSH flush_option.

ESAT/DMSI/PROA/WGR

Page 82 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

99.2. Fonctionnalits manquantes


Sous slection :
La requte suivante ne fonctionne par encore sous MySQL: SELECT * FROM table1 WHERE id IN (SELECT id FROM table2) SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2) Cependant, il est souvent possible de se passer d'une sous slection en utilisant les jointures : SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL Pour les sous requtes compliques, vous pouvez toujours crer une table temporaire, et y appliquer votre requte. SELECT INTO TABLE : MySQL ne supporte pas encore cette extension du SQL Oracle.: SELECT ... INTO TABLE .... A la place, MySQL supporte la syntaxe de la norme ANSI SQL INSERT INTO ... SELECT ..., ce qui est pratiquement la mme chose. Alternativement, vous pouvez utiliser SELECT INTO OUTFILE... ou CREATE TABLE ... SELECT pour rsoudre votre problme.

Transactions :
Les transactions ne sont pas encore supportes par MySQL. Le serveur va bientt accepter des oprations atomiques, ce qui permettra des transactions, mais sans le rollback. Avec les oprations atomiques, vous pourrez excuter des groupes de commandes INSERT/SELECT/ avec n'importe quelle commande, et tre sur qu'il n'y aura aucune interfrence avec un autre thread. Dans ce contexte, vous n'aurez alors pas besoin de rollback. Actuellement, vous pouvez empcher les autres threads d'interfrer en utilisant les fonctions LOCK TABLES et UNLOCK TABLES. Pour viter d'utiliser le ROLLBACK, vous pouvez suivre la stratgie suivante : 1. Utilisez LOCK TABLES <nom des tables> pour verrouiller les tables auxquelles vous accdez 2. Testez les conditions d'utilisation. 3. Modifiez si tout est OK. 4. Utilisez UNLOCK TABLES pour librer la table. Gnralement, cette mthode est beaucoup plus rapide que les transactions, et le ROLLBACK est souvent possible, mais pas toujours. Le seul point critique est que si le thread est tu au milieu de la modification, les verrous seront librs, mais une partie des modifications ne sera pas faite. Vous pouvez aussi utiliser les fonctions qui modifient un seul enregistrement la fois. Vous pouvez crer des applications trs efficaces avec la technique suivante : Modifier un champ par rapport sa valeur actuelle Modifier seulement les champs qui ont changs Par exemple, lorsque vous modifiez les informations concernant un client, ne modifiez que les informations qui ont changes, et non pas celles qui sont restes constantes. La recherche des valeurs est faite avec la clause WHERE de la commande UPDATE. Si l'enregistrement a chang, on peut retourner au client un message du type : "Les informations n'ont pas t modifies, car un autre utilisateur est en train de modifier les valeurs ". Alors, on affiche l'ancienne valeur et la nouvelle, ce qui permet l'utilisateur de dcider quelle version utiliser. Cela fournit un mcanisme du genre verrouillage de colonne' mais c'est en fait un peut mieux, car seules les colonnes qui en ont besoin sont utilises. Une commande UPDATE ressemblera alors ceci : UPDATE tablename SET pay_back=pay_back+'diffrence de valeur' WHERE Comme vous pouvez le voir, c'est une mthode trs efficace, et qui fonctionne mme si un autre client a chang la valeur entre temps. Dans certains cas, l'utilisateur a demand le ROLLBACK et/ou LOCK TABLES dans le but de grer des identifiants uniques dans des tables. Il vaut mieux utiliser le type de colonne AUTO_INCREMENT et la fonction SQL LAST_INSERT_ID().

ESAT/DMSI/PROA/WGR

Page 83 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Fonctions enregistres et triggers :


Une fonction enregistre est un ensemble de commandes SQL qui peut tre compil et enregistr sur le serveur. Une fois fait, les clients peuvent se rfrer cette fonction pour excuter l'ensemble des commandes. Cela acclre le traitement des requtes, car elles n'ont pas tre analyses, et moins d'informations circulent entre le client et le serveur. Il est aussi possible d'lever le niveau de conception, en btissant des bibliothques. Un trigger est une fonction enregistre qui est invoque chaque fois qu'un vnement particulier survient. Par exemple, vous pourriez installer une fonction qui sera lance chaque fois qu'un enregistrement sera effac dans une table de transaction, pour effacer automatiquement les informations correspondantes dans les tables de clients. Lors de modifications ultrieures, MySQL sera capable de grer les fonctions enregistres, mais pas les triggers. En gnral, les triggers ralentissent le serveur, mme pour des requtes pour lesquelles ils ne sont pas appels.

Cls trangres :
Remarque : les cls externes en SQL ne sont pas utilises pour effectuer des regroupements de table, mais pour assurer l'intgrit rfrentielle. Si vous voulez lire des informations depuis plusieurs tables avec une commande SELECT, c'est un regroupement ! . Exemple : SELECT * from table1,table2 where table1.id = table2.id Il n'y a pas besoin de cl trangre pour joindre deux tables : La seule chose que MySQL ne fait pas est de vrifier (CHECK) que les cls que vous utilisez existent vraiment dans la table que vous rfrencez, et qu'il n'efface pas de lignes dans une table avec une dfinition de cl trangre. Si vous utilisez vos cls de manire habituelle, cela fonctionnera parfaitement. Exemples : CREATE TABLE persons ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) ) CREATE TABLE shirts ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM('t-shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES persons, PRIMARY KEY (id) ) INSERT INTO persons VALUES (NULL, 'Antonio Paz') INSERT (NULL, (NULL, (NULL, INTO shirts VALUES 'polo', 'blue', LAST_INSERT_ID()), 'dress', 'white', LAST_INSERT_ID()), 't-shirt', 'blue', LAST_INSERT_ID())

INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska') INSERT (NULL, (NULL, (NULL, (NULL, INTO shirts VALUES 'dress', 'orange', LAST_INSERT_ID()), 'polo', 'red', LAST_INSERT_ID()), 'dress', 'blue', LAST_INSERT_ID()), 't-shirt', 'white', LAST_INSERT_ID())

SELECT * FROM persons +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+

ESAT/DMSI/PROA/WGR

Page 84 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

SELECT * FROM shirts +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+ SELECT WHERE AND AND s.* FROM persons p, shirts s p.name LIKE 'Lilliana%' s.owner = p.id s.color <> 'white'

+----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+ La syntaxe FOREIGN KEY de MySQL n'existe que pour la compatibilit avec les commandes CREATE TABLE des autres bases SQL : elle n'a aucun effet. La syntaxe FOREIGN KEY sans la partie ON DELETE ... n'est utilise que pour des raisons de documentation. Certaines applications ODBC l'utilise pour gnrer des clauses WHERE automatiques, mais il est gnralement simple remplacer. FOREIGN KEY est parfois utilis comme contrainte, mais ce genre de vrification n'est pas ncessaire si les lignes ont t insres dans l'ordre. MySQL ne supporte que ces clauses, car certaines applications en ont besoin (qu'elles fonctionnent ou pas). Avec MySQL, vous pouvez contourner le problme sans la clause ON DELETE ... en ajoutant une commande DELETE adquate lors de l'effacement d'un enregsitrement d'une table qui a une cl externe. En pratique, c'est aussi rapide (voire plus), et beaucoup plus portable que les cls externes. Dans un futur proche, nous allons implmenter FOREIGN KEY de manire sauver les informations dans la table de spcifications, pour qu'elles soient accessibles par mysqldump et ODBC. Vues : MySQL ne supporte pas les vues, mais c'est sur la liste des fonctionnalits futures. Oprations ensemblistes : La norme SQL ANSI comprend des oprations qui considrent les tables comme des ensembles, et effectuent des intersections, des unions ou des diffrences avec les mots cls INTERSECT, UNION ou EXCEPT. Chaque oprateur sapplique deux tables de schma identique (mme nombre dattributs, mmes noms, mmes types). Exemples : Slectionner toutes les annes des films et des artistes : SELECT annee FROM films UNION SELECT annee_naissance AS annee FROM artistes ; Slectionner les noms de rles qui sont aussi des titres de films : SELECT nom_role AS nom FROM roles INTERSECT SELECT titre AS nom FROM films ; Slectionner les noms de rles qui ne sont pas des titres de films : SELECT nom_role AS nom FROM roles EXCEPT SELECT titre AS nom FROM films ; MySQL ignore ces trois oprateurs. Ce nest pas grave pour INTERSECT qui peut tre exprim avec une jointure. Il ny a pas dquivalent UNION mais cette opration est rarement utile. En revanche EXCEPT permet dexprimer des ngations, savoir toutes les requtes o on effectue une recherche en prenant des lignes qui nont pas telle ou telle proprit. Il sagit de la vritable limite de MySQL car il ny a pas dquivalent.

ESAT/DMSI/PROA/WGR

Page 85 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Dbut de commentaire : Sur d'autres bases SQL les commentaires commencent par (2 signes moins). MySQL utilise # pour dbuter un commentaire, mme si MySQL supprime aussi les lignes qui commencent par . Vous pouvez aussi utiliser le style de commentaires du langage C : /* Ceci est un commentaire */ avec MySQL.. MySQL n'accepte pas les commentaires commenant par car ce style de commentaire obsolte a dj caus de nombreux problmes avec les requtes gnres automatiquement, lorsque la base utilise un code comme celui ci : la valeur de paiement va tre place la place de !paiement!: UPDATE nom_table SET credit=credit-!paiement! Mais que se passe-t-il si la valeur de paiement est ngative?

ESAT/DMSI/PROA/WGR

Page 86 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

100. Programmation MySQL


100.1. Syntaxe des chanes et nombres
Une chane est une squence de caractres, entoure par des guillemets simples () ou doubles(""). Exemple : 'une chane' "une autre chane" A l'intrieur d'une chane, on trouve des squences spciales. Celles-ci commencent avec le caractre backslash (\), dit aussi caractre d'chappement. MySQL reconnat les squences suivantes : \0 ASCII 0 (NUL) le caractre nul. \n Une nouvelle ligne. \t Une tabulation. \r Un retour chariot. \b Un effacement. \' Un guillemet simple ('). \" Un guillemet double ("). \\ Un backslash (\). \% Un pourcentage `%'. Cela permet de rechercher le caractre `%' dans un contexte ou il pourrait tre considr comme un caractre spcial. \_ Un soulign `_' Cela permet de rechercher le caractre `_' dans un contexte ou il pourrait tre considr comme un caractre spcial.' Nombres : Les entiers sont reprsents comme une squence de chiffres. Les nombres rels utilisent le point (``.') comme sparateur dcimal. Les entiers et les rels peuvent tre prcds par le signe moins (`-'), pour indiquer un nombre ngatif. Lorsqu'un nombre entier est utilis avec un nombre rel, il est considr lui aussi, comme un nombre rel. Valeurs hexadcimales : MySQL supporte les valeurs hexadcimales. Dans un contexte numrique, elles se comportent comme des entiers (prcision 64bits). Dans un contexte de chanes, elles se comportent comme des chanes binaires dont chaque paire de digits sera convertie en caractre. SELECT 0xa+0 # donnera 10 SELECT 0x5061756c # donnera Paul Les chanes hexadcimales sont souvent utilises avec ODBC pour donner des valeurs aux colonnes BLOB. La valeur NULL signifie : `aucune information'. Cette valeur est diffrente de 0 ou de la chane vide. NULL est parfois reprsent par \N quand on utilise un fichier d'import ou d'export (LOAD DATA INFILE, SELECT ... INTO OUTFILE).

100.2. Types des colonnes et espaces mmoire requis


Types numriques : type TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT FLOAT(4) FLOAT(8) FLOAT DOUBLE DOUBLE PRECISION REAL DECIMAL(M,D) espace mmoire requis 1 octet 2 octets 3 octets 4 octets 4 octets 8 octets 4 octets 8 octets 4 octets 8 octets 8 octets 8 octets M octets (D+2, si M < D)

ESAT/DMSI/PROA/WGR

Page 87 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Types date et heure : type DATETIME DATE TIMESTAMP TIME YEAR Types chane : type CHAR(M) VARCHAR(M) TINYBLOB, TINYTEXT BLOB, TEXT MEDIUMBLOB, MEDIUMTEXT LONGBLOB, LONGTEXT ENUM('value1','value2',...) SET('value1','value2',...)

espace mmoire requis 8 octets 3 octets 4 octets 3 octets 1 octet espace mmoire requis M octets, 1 <= M <= 255 L+1 bytes, avec L <= M et 1 <= M <= 255 L+1 octets, avec L < 2^8 L+2 octets, avec L < 2^16 L+3 octets, avec L < 2^24 L+4 octets, avec L < 2^32 1 ou 2 octets, suivant le nombre de valeurs dans l'numeration (65535 au maximum) 1, 2, 3, 4 ou 8 octets, suivant le nombre de membres de l'ensemble (64 membres au maximum)

Les types VARCHAR, BLOB et TEXT sont des types longueur variable, dont la taille de stockage dpend plus de la valeur qui leur est assigne que de leur taille maximale. Par exemple, une colonne de type VARCHAR(10) peut contenir une chane de 10 caractres aux maximum. La taille relle ncessaire est la longueur de la chane, plus 1 octet, qui stockera la taille relle de la chane. Par exemple, la chane 'abcd' occupe 5 octets. Les types BLOB et TEXT ont besoin de 1, 2, 3 ou 4 octets pour stocker la taille de la colonne, en fonction du type. Si une table possde au moins une colonne de longueur variable, l'enregistrement sera aussi de longueur variable. Il faut noter que lorsqu'une table est cre, MySQL peut, sous certaines conditions, changer le type d'une colonne de longueur variable en un type de colonne de longueur fixe, et vice-versa.. La taille d'un objet ENUM est dtermin par le nombre d'numrations diffrentes. 1 octet est suffisant pour dcrire une numration qui a jusqu' 255 valeurs diffrentes; 2 octets sont ncessaires pour dcrire une numration qui aurait jusqu' 65535 valeurs diffrentes. La taille d'un objet SET est dtermine par le nombre d'lments distincts qu'il contient. Si la taille d'un SET est N, le SET occupera (N+7)/8 octets, arrondie aux entiers 1,2,3,4, ou 8 octets. Un ensemble peut contenir jusqu' 64 lments. MySQL tente d'interprter un grand nombre de format de date, l'anne devra toujours tre place gauche. Les dates doivent tre donnes dans l'ordre anne-mois-jour (ex : '98-09-04'), plutt que dans l'ordre mois-jouranne ou l'ordre jour-mois-anne utiliss habituellement. (ex : '09-04-98', '04-09-98'). MySQL convertit automatiquement une date ou une heure en un nombre, si cette valeur est utilise dans un contexte numrique, et vice-versa. Quand MySQL rencontre une valeur pour une date ou une heure qui n'est pas valide, il la convertit en valeur `zro'. Les problmes de dpassement de capacits sont rgls comme pour les types numriques, en ramenant la valeur au maximum ou au minimum de l'intervalle autoris.

ESAT/DMSI/PROA/WGR

Page 88 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

101. Connexion et accs la base de donnes MySQL


Pour que vous puissiez crer votre propre base de donnes, votre administrateur doit configurer un utilisateur et une base de donnes, et vous fournir le nom dutilisateur, le mot de passe, et le nom de la base de donnes quil a choisis. Quand vous avez recours aux services dun fournisseur daccs distance, ce dernier propose gnralement dentrer des commandes par lintermdiaire dune interface Web dadministration de bases de donnes MySQL : phpMyAdmin. Cet outil est trs populaire, et fournit un environnement de travail graphique trs convivial. Dans ce support, nous nous consacrerons uniquement linterprteur de commandes mysql.

On peut utiliser indiffremment les majuscules et les minuscules pour les mots cls de SQL. De mme les sauts de ligne, les tabulations et les espaces successifs dans un ordre SQL quivalent un seul espace pour linterprteur et peuvent donc tre utiliss librement pour clarifier la commande.

102. Crer et slectionner une base de donnes MySQL


Si l'administrateur vous a cr une base de donnes pour vous, alors vous pouvez directement commencer l'utiliser. Sinon, il vous faut la crer vous mme. Exemple : CREATE DATABASE menagerie Sous Unix, les noms de base de donnes sont sensibles la casse (contrairement aux mots cls SQL), donc il faudra faire rfrence votre base de donnes sous le nom menagerie, et non pas Menagerie, MENAGERIE ou tout autre variante. Sous Windows, cette restriction ne s'applique pas, mme si vous devez faire rfrence vos bases et tables de la mme manire tout au long d'une mme commande. Crer une base de donnes ne la slectionne pas automatiquement. Il faut le faire explicitement. Pour faire de menagerie votre base courante, il faut utiliser la commande: USE menagerie La base n'a besoin d'tre cre qu'une seule fois, mais il faudra la slectionner chaque fois que vous commencerez une session MySQL.

ESAT/DMSI/PROA/WGR

Page 89 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

103. Fonctions d accs MySQL


Ces fonctions vont vous permettre d'accder aux bases de donnes MySQL : int mysql_affected_rows([int link_identifier]); Retourne le nombre de lignes modifies lors de la dernire requte INSERT, UPDATE ou DELETE sur le serveur associ l'identifiant de connexion (de lien) link_identifier. Si cet identifiant n'est pas prcis, cette fonction utilise la dernire connexion ouverte. int mysql_close([int link_identifier]); Ferme la connexion au serveur MySQL associe l'identifiant de lien link_identifier . Si cet identifiant n'est pas spcifi, cette commande s'applique la dernire connexion ouverte. int mysql_connect([string hostname [:port] [:/path/to/socket] ] , [string username] , [string password]); Etablit une connexion un serveur MySQL. Tous les arguments sont optionnels, et si ils manquent les valeurs par dfaut sont utilises ('localhost', nom du propritaire du process, mot de passe vide). int mysql_create_db(string database_name, [int link_identifier]); Tente de crer une nouvelle base de donnes database_name sur le serveur associ l'identifiant de lien link_identifier, ou la dernire connexion ouverte. int mysql_data_seek(int result_identifier, int row_number); Dplace le pointeur interne de rsultat, dans le rsultat associ l'identifiant de rsultat result_identifier. Il le fait pointer la ligne row_number. Le prochain appel mysql_fetch_row() retournera cette ligne. int mysql_db_query(string database_name, string query, [int link_identifier]); Slectionne la base de donnes database_name et envoie la requte query un serveur MySQL. Si lidentifiant de lien link_identifier nest pas prcis, la fonction prendra par dfaut la dernire base de donnes ouverte sur le serveur, et, si elle nen trouve pas, elle tentera de se connecter, en utilisant la fonction mysql_connect() sans argument. Elle retourne un identifiant de rsultat si la requte aboutit, et faux (FALSE) sinon. int mysql_drop_db(string database_name, [int link_identifier]); Essaie d'effacer la base de donnes MySQL database_name entire sur le serveur associ l'identifiant de lien link_identifier. Elle retourne vrai (TRUE) en cas de succs, et faux (FALSE) sinon. int mysql_errno([int link_identifier]); Retourne le numro d'erreur de la dernire requte. int mysql_error([int link_identifier]); Retourne le texte associe avec l'erreur gnre lors de la dernire requte. array mysql_fetch_array(int result, [int result_type]); Retourne une ligne de rsultat sous la forme d'un tableau associatif en utilisant les noms des champs comme indices. L'option result_type est une constante qui peut prendre les valeurs suivantes : MYSQL_ASSOC, MYSQL_NUM, et MYSQL_BOTH. object mysql_fetch_field(int result, [int field_offset]); Retourne les informations concernant les colonnes d'un rsultat sous la forme d'un objet. Elle sert obtenir des informations propos des champs, dans certaines requtes. Si l'offset du champ field_offset n'est pas spcifi, le champ suivant est retourn. array mysql_fetch_lengths(int result); Retourne la taille de chaque colonne d'un rsultat. Elle stocke la taille de chaque colonne de la dernire ligne retourne par mysql_fetch_row() dans un tableau, en commencant la position0. object mysql_fetch_object(int result, [int result_type]); Retourne une ligne de rsultat sous la forme d'un objet. Elle est identique mysql_fetch_array(), la diffrence quelle retourne un objet la place dun tableau. Vous pourrez ainsi accder aux valeurs des champs par leur nom, et non plus par leur offset (les nombres ne sont pas des noms MySQL). Largument optionnel result_type est une constante qui peut prendre les valeurs suivantes : MYSQL_ASSOC, MYSQL_NUM, et MYSQL_BOTH. Concernant la vitesse, cette fonction est aussi rapide que mysql_fetch_array(), et presque aussi rapide que mysql_fetch_row() (la diffrence est insignifiante).

ESAT/DMSI/PROA/WGR

Page 90 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

array mysql_fetch_row(int result); Retourne une ligne de rsultat sous la forme d'un tableau. Elle va rechercher une ligne dans le rsultat associ lidentifiant de rsultat result. La ligne est retourne sous la forme dun tableau.. Chaque colonne est enregistre sous la forme dun tableau commenant la position 0. Lappel suivant mysql_fetch_row() retournera la ligne suivante dans le rsultat, ou faux (FALSE) sil ny a plus de ligne disponible. string mysql_field_name(int result, int field_index); Retourne le nom dun champ partir de son index. Les arguments de la fonction sont lidentifiant de rsultat result, et lindex de champ field_index numrot partir de 0. Ex : mysql_field_name($result,2); retournera le nom du troisime champ dans le rsultat associ $result. Pour des raisons de compatibilit ascendante, mysql_fieldname() peut encore tre utilise. int mysql_field_seek(int result, int field_ index); Place le pointeur de rsultat lindex de champ field_index. string mysql_field_table(int result, int field_index); Retourne le nom de la table o se trouve une colonne. Pour des raisons de compatibilit mysql_fieldtable() peut encore tre utilise. string mysql_field_type(int result, int field_index); Retourne le type de la colonne spcifie dans le rsultat courant result. Il vaudra "int", "real", "string", "blob", ou dautres, comme dtaill dans la documentation MySQL. Pour des raisons de compatibilit ascendante, mysql_fieldtype() peut encore tre utilise. string mysql_field_flags(int result, int field_index); Retourne le smaphore associ la colonne spcifie dans le rsultat courant. Les smaphores sont retourns comme des mots, spars par des espaces, ce qui les rend facile sparer, avec la commande explode(). Les valeurs suivantes (pour une version suffisamment rcente de MySQL) sont disponibles : "not_null", "primary_key", "unique_key", "multiple_key", "blob", "unsigned", "zerofill", "binary", "enum", "auto_increment", "timestamp". Pour des raisons de compatibilit ascendante, mysql_fieldflags() peut encore tre utilise. int mysql_field_len(int result, int field_index); Retourne la taille du champ spcifi par field_index. Pour des raisons de compatibilit ascendante, mysql_fieldlen() peut encore tre utilise. int mysql_free_result(int result); Libre toute la mmoire associe lidentifiant de rsultat result. mysql_free_result() ne doit tre appele que si vous avez utilis trop de mmoire durant lexcution de votre script. Pour des raisons de compatibilit ascendante, mysql_freeresult() peut encore tre utilise. int mysql_insert_id([int link_identifier]); Retourne l'identifiant AUTO_INCREMENTED lors de la dernire requte INSERT . gnr par un champ de type

int mysql_list_fields(string database_name, string table_name, [int link_identifier]); Liste les champs du rsultat MySQL . Elle recherche les informations propos de la table table_name. Les arguments sont la base de donnes database_name, et le nom de la table table_name. Un pointeur de rsultat est retourn, et pourra tre pass mysql_field_flags(), mysql_field_len(), mysql_field_name(), ou mysql_field_type(). Un identifiant de rsultat est un entier positif. La fonction retourne -1 si une erreur survient. Une chane dcrivant lerreur rencontre sera place dans la variable $phperrmsg, et, moins que la fonction n'ait t appele sous la forme @mysql(), cette erreur sera aussi affiche. Pour des raisons de compatibilit ascendante, mysql_listfields() est encore disponible. int mysql_list_dbs([int link_identifier]); Retourne un identifiant de rsultat, qui contiendra le nom des bases de donnes disponsibles sur le serveur MySQL.. Pour des raisons de compatibilit ascendante, mysql_listdbs() est encore disponible. int mysql_list_tables(string database_name, [int link_identifier]); Prend le nom d'une base de donnes comme argument, et retourne un identifiant de rsultat, qui contiendra la liste des tables. La fonction mysql_tablename() est le meilleur moyen d'extraire le nom des tables depuis l'identifiant de rsultat. Pour des raisons de compatibilit ascendante, mysql_listtables() est encore disponible. int mysql_num_fields(int result); Retourne le nombre de champs d'un rsultat. Pour des raisons de compatibilit ascendante mysql_numfields() est encore disponible.

ESAT/DMSI/PROA/WGR

Page 91 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

int mysql_num_rows(int result); Retourne le nombre de lignes d'un rsultat. Pour des raisons de compatibilit ascendante mysql_numrows() est encore disponible. int mysql_pconnect([string hostname [:port] [:/path/to/socket] ] , [string username] , [string password]); Ouvre une connexion persistante un serveur MySQL. Elle retourne un lien persistant positif en cas de succs, et sinon faux (FALSE) en cas d'erreur. Tous les arguments sont optionnels, et des valeurs par dfaut sont utilises en cas d'omission ('localhost', nom d'utilisateur propritaire du processus, mot de passe vide). Le nom de l'hte peut aussi inclure le numro de port, c'est dire "hostname:port" ou un chemin jusqu' la socket ":/path/to/socket" pour l'hte local. mysql_pconnect() se comporte exactement comme mysql_connect(), mais avec deux diffrences majeures : Premirement, lors de la connexion, la fonction essaie de trouver une connexion permanente dj ouverte sur cet hte, avec les mmes noms d'utilisateur et de mot de passe. Si une telle connexion est trouve, son identifiant est retourn, sans ouvrir de nouvelle connexion. Deuximement, la connexion au serveur MySQL ne sera pas termine avec la fin du script. Au lieu de cela, le lien sera conserv pour un prochain accs (mysql_close() ne terminera pas une connexion persistante tablie par mysql_pconnect()). C'est pourquoi ce type de connexion est dite 'persistant'. int mysql_query(string query, [int link_identifier]); Envoie une requte SQL la base de donnes actuellement active sur le serveur MysQL. Si link_identifier n'est pas prcis, la dernire connexion est utilise. Si aucune connexion n'a t ouverte, la fonction tentera d'en ouvrir une, avec la fonction mysql_connect() mais sans aucun paramtre (c'est dire avec les valeurs par dfaut). La chane de requte ne devrait pas se terminer par un point virgule. mysql_query() retourne un identifiant de rsultat que vous pouvez passer mysql_result(). mysql_query() retourne vrai (TRUE, ou non-zro) ou faux (FALSE), pour indiquer le succs ou l'chec de la requte. En cas de retour TRUE, la requte tait valide et a pu tre excute sur le serveur. Cela n'indique pas le nombre de lignes affectes, ou retournes. Il est parfaitement possible qu'une requte valide n'affecte aucune ligne ou ne retourne aucune ligne. mysql_query() chouera aussi et retournera aussi FALSE si les droits d'accs ne sont pas suffisants. int mysql_result(int result, int row, [mixed field]); Retourne le contenu d'un champ dans un rsultat MySQL. L'argument de champ peut tre un index de champ, ou le nom du champ, ou le nom de la table + point + le nom du champ (table.champ). Si la colonne a t aliase, utilisez de prfrence l'alias. Lorsque vous travaillez sur des rsultats de grande taille, vous devriez utiliser une des fonctions qui vont rechercher une ligne entire dans un tableau. Ces fonctions sont NETTEMENT plus rapide. De plus, l'utilisation d'un index numrique est aussi beaucoup plus rapide que de spcifier un nom litral. Les appels mysql_result() ne devraient pas tre mlangs avec d'autres fonctions qui travaillent aussi sur le rsultat. Les fonctions suivantes haut rendement sont RECOMMANDEES : mysql_fetch_row(), mysql_fetch_array(), et mysql_fetch_object(). int mysql_select_db(string database_name, [int link_identifier]); Selectionne une base de donnes MySQL. Elle retourne vrai (TRUE) en cas de succs, faux (FALSE) sinon. mysql_select_db() change la base de donnes active sur la connexion reprsente par l'identifiant de connexion link_identifier. Si aucun identifiant n'est spcifi, la dernire connexion est utilise. Sil n'y a pas de dernire connexion, la fonction tentera de se connecter seule, avec mysql_connect() et les paramtres par dfaut. Toutes les requtes suivantes avec mysql_query() seront faites avec la base de donnes active. Pour des raisons de compatibilit ascendante mysql_selectdb() est encore disponible. string mysql_tablename(int result, int link_identifier); Retourne le nom de la table que contient le champ spcifi par link_identifier. Elle prend le pointeur de rsultat result obtenu avec mysql_list_tables() ou bien un index entier, et retourne le nom de la table. La fonction mysql_num_rows() peut tre utilise pour dterminer le nombre de tables dans le pointeur de rsultat result. Exemple : mysql_pconnect("localhost:3306"); $result = mysql_list_tables("france"); for ($i=0 ; $i < mysql_num_rows($result) ; $i++) { $tb_names[$i] = mysql_tablename($result, $i); echo $tb_names[$i] . "<BR>"; }

ESAT/DMSI/PROA/WGR

Page 92 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

103.1. mysql_connect
Avant de penser travailler avec votre base de donnes, vous devez dans un premier temps vous connecter au serveur. Pour ce faire, PHP fournit la fonction mysql_connect(). Cette fonction ne ncessite aucun argument, mais accepte jusqu trois chanes : le nom dhte (hostname), un nom dutilisateur (username), et un mot de passe (password). Si vous omettez lun de ces arguments, la fonction suppose que localhost est le nom dhte et quaucun mot de passe ou nom dutilisateur na t dfini dans la table mysql user, moins que des valeurs naient t dfinies dans le fichier php.ini. Les valeurs par dfaut utilises sont : 'localhost', nom du propritaire du process, mot de passe vide. mysql_connect() renvoie un identifieur de lien si la connexion est russie, sinon faux (FALSE). Vous pouvez stocker cette valeur de retour dans une variable de faon tre en mesure de continuer travailler avec le serveur de base de donnes. Si un second appel mysql_connect() est fait avec les mmes arguments, PHP ne va pas ouvrir une nouvelle connexion, mais va retourner l'identifieur de la connexion dj ouverte. Le lien sera ferm automatiquement ds que l'excution du script sera termine, moins d'tre ferm explicitement avec mysql_close(). Syntaxe : Int identifieur = mysql_connect([string hostname [:port] [:/path/jusqu_a/socket]], [string username], [string password]) ; Exemple : $lien = mysql_connect("localhost","utilisateur1","mdp1") ; if( !$lien ) die("Connexion au serveur MySQL impossible ! ") ; la fonction mysql_pconnect() est similaire mysql_connect() et peut tre utilise lorsque vous utilisez PHP conjointement Apache. La diffrence est que la connexion ne prend pas fin lors de lachvement de lexcution de votre script ou lors de lappel de mysql_close() qui met fin une connexion standard au serveur MySQL. La connexion reste active, attendant un nouvel appel de mysql_pconnect().

103.2. mysql_close
mysql_close() ferme la connexion au serveur MySQL associe l'identifieur. Si cet identifieur n'est pas spcifi, cette commande s'applique la dernire connexion ouverte. Notez que cette commande n'est pas ncessaire, car toutes les connexions non persistantes seront automatiquement fermes la fin du script. mysql_close() ne ferme pas les connexions persistantes gnres par mysql_pconnect(). La fonction retourne vrai (TRUE) en cas de succs, et faux (FALSE) sinon. Syntaxe : int mysql_close([int identifieur] );

ESAT/DMSI/PROA/WGR

Page 93 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

103.3. mysql_select_db
Aprs avoir tabli une connexion avec MySQL, vous devez choisir la base de donnes avec laquelle vous dsirez travailler. La fonction mysql_select_db() permet de raliser cette opration. Cette fonction ncessite un nom de base de donnes et accepte en option un identifieur de lien. Si vous omettez celui-ci, lidentifieur suppos sera celui renvoy lors de la dernire connexion au serveur. Sil n'y a pas de dernire connexion, la fonction tentera de se connecter seule, avec les paramtres par dfaut. mysql_select_db() renvoie vrai (TRUE) si la base de donnes existe et si vous tes en mesure dy accder, sinon faux (FALSE). Pour des raisons de compatibilit ascendante mysql_selectdb() est encore disponible. Syntaxe : int mysql_select_db(string database_name, [int identifieur] ); Exemple : $database_name = "films" ; mysql_select_db($database_name) or die("Ouverture de la base de donnes $database_name impossible !") ;

103.4. mysql_error
Jusqu prsent, nous avons test les valeurs de retour des fonctions MySQL et appel die() pour mettre fin lexcution du script si un problme se produit. Vous pouvez cependant drirer afficher des messages dinformation plus nombreux dans le navigateur pour aider corriger les erreurs. MySQL dfinit une chane et un numro derreur lorsquune opration choue. Vous pouvez accder au numro derreur avec la fonction mysql_errno(), et la chane avec mysql_error(). mysql_error() retourne le texte associ l'erreur gnre lors de la dernire requte Syntaxe : string mysql_error([int identifieur] ); Exemple : <html> <head> <title>Ouverture dune connexion et slection dune base de donnes</title> </head> <body> <? echo "<form method='POST' action='#'>"; $utilisateur = "utilisateur1" ; $mdp = "mdp1" ; $bdd = "films" ; $lien = mysql_pconnect("localhost",$utilisateur,$mdp) ; if( !lien ) die("Connexion au serveur MySQL impossible ! : ". mysql_error() ) ; echo "<h2>Connexion au serveur russie !</h2>" ; mysql_select_db($bdd) or die("Ouverture de la base de donnes $bdd impossible ! : ". mysql_error() ) ; echo "<h2>Slection de la base de donnes $bdd russie !</h2>" ; echo "</form>"; ?> </body> </html>

ESAT/DMSI/PROA/WGR

Page 94 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

103.5. mysql_query
Pour effectuer rellement une requte SQL (select, create, delete, update , insert, ) vous pouvez utiliser la fonction mysql_query(). mysql_query() envoie la requte SQL la base de donnes actuellement active sur le serveur MySQL. Si lidentifieur n'est pas prcis, la dernire connexion est utilise. Si aucune connexion n'a t ouverte, la fonction tentera d'en ouvrir une, avec la fonction mysql_connect() mais sans aucun paramtre (c'est dire avec les valeurs par dfaut). La chane de requte ne doit pas se terminer par un point virgule. mysql_query() retourne un identicateur de rsultat (qui permet de rcuprer les rsultats des requtes) vrai (TRUE) ou faux (FALSE), pour indiquer le succs ou l'chec de la requte. En cas de retour TRUE, la requte tait valide et a pu tre excute sur le serveur. Cela n'indique pas le nombre de lignes affectes, ou retournes. Il est parfaitement possible qu'une requte valide n'affecte aucune ligne ou ne retourne aucune ligne. mysql_query() chouera aussi et retournera aussi FALSE si les droits d'accs ne sont pas suffisants. Pour connatre le nombre de lignes affectes par les commandes DELETE, INSERT, REPLACE, ou UPDATE vous pouvez appeler la fonction mysql_affected_rows(). Cette commande n'est pas possible aprs un SELECT, car elle ne fonctionne qu'aprs des commandes qui modifient les enregistrements. Pour connatre le nombre de lignes retournes par un SELECT, utilisez mysql_num_rows(). Pour les commandes SELECT , mysql_query() retourne un identificateur de rsultat que vous pouvez passer mysql_result(). Lorsque vous avez termin avec le rsultat, librez la mmoire avec mysql_free_result(). Syntaxe : int mysql_query(string requete, [int identifieur] ); Exemple : $requete = "select distinct num_titre from films.titres" ; //slection de tous les titres de la table titres de la base de //donnes films $result = mysql_query($requete) ; echo "la base de donnes $bdd contient ".mysql_num_rows($result)." titres de films diffrents<br>"; Lexemple suivant dcrit la cration dune table grades : echo "Dbut de la cration de la table grades..."; echo "<br>"; $ requete = "CREATE TABLE grades "; $ requete.= "("; $ requete.= "CodeGrade INTEGER(11) UNSIGNED NOT NULL DEFAULT 0 PRIMARY KEY AUTO_INCREMENT,"; $ requete.= "TriGramme VARCHAR(7) BINARY NULL DEFAULT NULL,"; $ requete.= "ClairGrade VARCHAR(50) BINARY NULL DEFAULT NULL"; $ requete.= ")"; $result = mysql_query($requete) ; // cette requte peut tre valide et retourner zro if(mysql_errno()) echo "Une erreur sest produite lors de la cration de la table grades : ".mysql_error() ; else echo "Fin de la cration de la table grades.<br> " ;

ESAT/DMSI/PROA/WGR

Page 95 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

103.6. mysql_fetch_array
Retourne un tableau qui contient la ligne demande, ou faux si il ne reste plus de ligne. mysql_fetch_array() est une version tendue de mysql_fetch_row(). En plus d'enregistrer les donnes sous forme d'un tableau d'indices numriques, il peut aussi les enregistrer dans un tableau associatif, en utilisant les noms des champs comme indices. Syntaxe : array mysql_fetch_array(int result, [int result_type] ); Si plusieurs colonnes ont le mme nom, la dernire colonne aura la priorit. Pour accder aux autres colonnes du mme nom, vous devez utiliser l'index numrique, ou faire un alias (as) pour chaque colonne. select t1.f1 as foo t2.f1 as bar from t1, t2 Il est important de souligner que cette fonction N'est PAS plus lente que mysql_fetch_row(), tandis qu'elle ajoute un confort d'utilisation. L'option result_type de mysql_fetch_array() est une constante qui peut prendre les valeurs suivantes : MYSQL_ASSOC, MYSQL_NUM, et MYSQL_BOTH. Exemple : <? mysql_pconnect($host,$user,$password); $id_result = mysql_db_query("base_RH","select nom, prenom from table_personnes"); while($row = mysql_fetch_array($id_result)) { echo "Nom : $row[nom], prnom : $row[prenom]<br>"; } mysql_free_result($result); mysql_close() ; ?>

ESAT/DMSI/PROA/WGR

Page 96 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

104. Exercice pratique


Nous allons nous connecter au serveur MySQL, crer une base de donnes resa_salles, afficher le nombre et le nom des bases de donnes existantes sur le serveur, puis tenter de slectionner la base de donnes resa_salles : <html> <head> <title>Cration et connexion une base de donne MySQL</title> </head> <body> <? echo "<form method='POST' action='#'>"; echo "<div align='center'>"; $lien = mysql_pconnect("localhost","","") ; if( !$lien ) { echo "Connexion au serveur MySQL impossible ! ".mysql_stat(); } else { echo "Connexion au serveur MySQL russie ! ".mysql_get_server_info() ; $bdd = "resa_salles"; echo "<br>Cration de la base de donnes : $bdd"; mysql_create_db($bdd); $id_result = mysql_list_dbs(); echo "<br>Nombre de bases de donnes : ".mysql_num_rows($id_result)."<br>"; $result = mysql_fetch_array($id_result); while ($result) { echo "Base de donnes : ".$result[0]."<br>"; $result = mysql_fetch_array($id_result); } mysql_select_db($bdd) or die("Slection de la base de donnes $bdd impossible ! : ". mysql_error() ) ; echo "<h2>Slection de la base de donnes '$bdd' russie !</h2>" ; } mysql_close() ; echo "</div>" ; echo "</form>"; ?> </body> </html> Rsultat laffichage :

ESAT/DMSI/PROA/WGR

Page 97 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Vous pouvez complter cet exercice avec : 1. La cration de la table grades 2. Laffichage des tables de la base de donnes "resa_salles" 3. Laffichage des champs de la table grades <? echo "<form method='POST' action='#'>"; echo "<div align='center'>"; $lien = mysql_pconnect("localhost","","") ; if( !$lien ) { echo "Connexion au serveur MySQL impossible ! ".mysql_stat(); } else { echo "Connexion au serveur MySQL russie ! ".mysql_get_server_info() ; $bdd = "resa_salles"; echo "<br>Cration de la base de donnes : $bdd"; mysql_create_db($bdd); $id_result = mysql_list_dbs(); echo "<br>Nombre de bases de donnes : ".mysql_num_rows($id_result)."<br>"; $result = mysql_fetch_array($id_result); while ($result) { echo "Base de donnes : ".$result[0]."<br>"; $result = mysql_fetch_array($id_result); } mysql_select_db($bdd) or die("Slection de la base de donnes $bdd impossible ! : ". mysql_error() ) ; echo "<h2>Slection de la base de donnes '$bdd' russie !</h2>" ; echo "Dbut de la cration de la table grades..."; echo "<br>"; $requete = "CREATE TABLE grades "; $requete.= "("; $requete.= "CodeGrade INTEGER(11) UNSIGNED NOT NULL DEFAULT 0 PRIMARY KEY AUTO_INCREMENT,"; $requete.= "TriGramme VARCHAR(7) BINARY NULL DEFAULT NULL,"; $requete.= "ClairGrade VARCHAR(50) BINARY NULL DEFAULT NULL"; $requete.= ")"; $result = mysql_query($requete) ; // cette requte peut tre valide et retourner zro if(mysql_errno()) echo "Une erreur s'est produite lors de la cration de la table grades : ".mysql_error() ; else echo "Fin de la cration de la table grades.<br><br>" ; $id_tables = mysql_list_tables($bdd); $result_tables = mysql_fetch_array($id_tables); while ($result_tables) { echo "Table : ".$result_tables[0]."<br>"; $req = "select * from ".$result_tables[0]; $result_champs = mysql_query($req); $nb_champs = mysql_num_fields($result_champs); for($index_champ = 0 ; $index_champ < $nb_champs ; $index_champ++) { echo "Champ : ". mysql_field_name($result_champs, $index_champ) ."<br>";

ESAT/DMSI/PROA/WGR

Page 98 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

echo "type : ". mysql_field_type($result_champs, $index_champ) ."<br>"; echo "longueur : ". mysql_field_len($result_champs, $index_champ) ."<br><br>"; } $result_tables = mysql_fetch_array($id_tables); } } mysql_close(); echo "</div>" ; echo "</form>"; ?> Rsultat laffichage :

ESAT/DMSI/PROA/WGR

Page 99 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

105. Mthodes daccs MySQL par programmation objet


La classe Database dcrite ci-dessous contient les proprits et les mthodes qui permettront de se connecter une base de donnes MySQL et daccder aux donnes de la base. Le constructeur initialise les proprits de lobjet laide des quatres paramtres suivants : nom de lhte qui hberge le serveur, nom de la base de donnes, nom et mot de passe de lutilisateur permettant de se logger. Cette classe sera incluse dans les exemples suivants laide de la fonction : include "base.php3" ; Script base.php3 : <html> <head> <title> classe Database </title> </head> <body> <? class Database { var $_host; var $_database_name; var $_login; var $_password; var $_result_mysql; var $_result_database; var $_result_query; Function Database($host, $database_name, $login, $password) { $this->_host = $host; $this->_database_name = $database_name; $this->_login = $login; $this->_password = $password; } Function connect_database() { $this->_result_mysql = mysql_pconnect($this->_host, $this->_login, $this->_password); if (!$this->_result_mysql) { mysql_error(); } $this->_result_database = mysql_select_db($this->_database_name); if (!$this->_result_database) { mysql_error(); } } Function query_database($query) { $this->_result_query = mysql_query($query, $this->_result_mysql); if (! $this->_result_query) { mysql_error(); } }

ESAT/DMSI/PROA/WGR

Page 100 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Function fetch_row() { return (mysql_fetch_row($this->_result_query)); } Function free() { return (mysql_free_result($this->_result_query)); } Function fetch_array() { return (mysql_fetch_array($this->_result_query)); } Function fetch_field() { return (mysql_fetch_field($this->_result_query)); } Function num_rows() { return (mysql_num_rows($this->_result_query)); } Function num_fields() { return (mysql_num_fields($this->_result_query)); } } ?> </body> </html>

Le script config.php3 dfinit les variables globales qui permettront la connexion la base de donnes : <? /*ce fichier de configuration permet de dfinir la base de donnes *(variables $host_resa, $base_resa, $user_resa, $password_resa). */ $host_resa = "localhost"; $base_resa = "resa_salles"; $user_resa = ""; $password_resa = ""; ?>

ESAT/DMSI/PROA/WGR

Page 101 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

La classe grade dcrite ci-dessous contient les proprits et les mthodes qui permettront dinstancier un objet partir duquel nous soumettrons les requtes au serveur MySQL. Le constructeur cre un pointeur ($this->_new_database) sur un objet de la classe Database. Cest laide de ce pointeur que nous ferons appel aux fonctions lmentaires daccs MySQL. Cette classe sera incluse dans les exemples suivants laide de la fonction : include "grade.php3" ; Script grade.php3 : <html> <head> <title> classe grade </title> </head> <body> <? require "config.php3"; class grade { var $_search_result; var $_new_database; Function grade() { global $host_resa, $base_resa, $user_resa, $password_resa; $this->_new_database = new Database($host_resa, $base_resa, $user_resa, $password_resa); $this->_new_database->connect_database(); } Function ask_query($query) { $this->_new_database->query_database($query); } Function access_result() { return ($this->_search_result); } Function read_results() { $this->_search_result = $this->_new_database->fetch_array(); } Function num_results() { return ($this->_new_database->num_rows()); } } ?> </body> </html>

ESAT/DMSI/PROA/WGR

Page 102 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Ce script remplit la table grades partir des donnes (spares par un ;) stockes dans le fichier "grades.csv" dont le contenu est affich la page suivante : <html> <head> <title> Remplissage de la table grades </title> </head> <body> <b> Dbut du remplissage de la table grades... </b> <br> <br> <? include "base.php3"; include "grade.php3"; $file = "grades.csv"; $new_grade = new grade(); echo "Dbut du vidage de l'ancienne table grades..."; echo "<br>"; $query = "DELETE FROM resa_salles.grades"; $new_grade->ask_query($query); echo "Fin du vidage de l'ancienne table grades."; echo "<br>"; echo "<br>"; echo "Dbut du remplissage de la nouvelle table grades..."; echo "<br>"; $result = file($file); for ($compteur = 1; $compteur <= 51; $compteur++) { $array = explode(";", $result[$compteur]); $query = "INSERT INTO resa_salles.grades (TriGramme,ClairGrade) VALUES "; $query .= "('"; $query .= $array[1] . "','"; $query .= addslashes($array[2]) . "')"; $new_grade->ask_query($query); } echo "Fin du remplissage de la nouvelle table grades."; ?> <br> <br> <b> Fin du remplissage de la table grades. </b> </body> </html>

ESAT/DMSI/PROA/WGR

Page 103 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Contenu du fichier grades.csv : CodeGrade;TriGramme;ClairGrade; 1;TRS;Transmetteur; 2;1TRS;1er Transmetteur; 3;SCI;Scientifique du contingent; 4;CAL;Caporal; 5;CCH;Caporal-chef; 6;BRI;Brigadier; 7;BCH;Brigadier-chef; 8;SGT;Sergent; 9;SCH;Sergent-chef; 10;MDL;Marchal des logis; 11;MCH;Marchal des logis-chef; 12;ADJ;Adjudant; 13;ADC;Adjudant-chef; 14;MAJ;Major; 15;EOR;Elve officier de rserve; 16;ASP;Aspirant; 17;SLT;Sous-lieutenant; 18;LTN;Lieutenant; 19;CNE;Capitaine; 20;CDT;Commandant; 21;CBA;Chef de bataillon; 22;CEN;Chef d'escadron; 23;CES;Chef d'escadron; 24;LCL;Lieutenant-colonel; 25;COL;Colonel; 26;GDI;Gnral de division; 27;GBA;Gnral de brigade; 28;GCA;Gnral de corps d'arme; 29;GAR;Gnral d'arme; 30;AGT/C;Agent sur contrat; 31;OGR;Ouvrier de groupe; 32;ATE;Agent technique de l'lectronique; 33;ATPE;Agent technique principal de l'lectronique; 34;AA;Adjoint administratif; 35;AAP;Adjoint administratif principal; 36;TSEF;Technicien suprieur d'tudes et fabrication; 37;CCN;Controleur de classe normale; 38;CCS;Controleur de classe suprieure; 39;CCE;Controleur de classe exceptionnelle; 40;SACN;Secrtaire administratif de classe normale; 41;SACS;Secrtaire administratif de classe suprieure; 42;SACE;Secrtaire administratif de classe exeptionnelle; 43;IEF;Ingnieur d'tudes et fabrication; 44;INSP;Inspecteur des services; 45;IP;Inspecteur principal des transmissions; 46;ASA;Attach de service administratif; 47;CSA;Chef de service administratif; 48;AAC;Attach d'administration centrale; 49;M.;Monsieur; 50;MME;Madame; 51;MLLE;Mademoiselle;

ESAT/DMSI/PROA/WGR

Page 104 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Ce script affiche le contenu de la table grades : <html> <head> <title> Affichage de la table grades </title> </head> <body> <? include "base.php3"; include "grade.php3"; $new_grade = new grade(); echo "Affichage du contenu de la table grades...<br><br>"; $query = "SELECT * FROM resa_salles.grades"; $new_grade->ask_query($query); $new_grade->read_results(); $result = $new_grade->access_result(); $cpt=0; echo "<table border='1'>"; while($result) { $cpt++; if( ($cpt%2) == 1 ) echo "<tr>"; // $cpt impair

echo "<td><font size='2'>"; print $result['TriGramme']; echo "</font></td> <td><font size='2'>"; print $result['ClairGrade']; echo "</font></td>"; if( ($cpt%2) == 0) // $cpt pair echo "</tr>"; $new_grade->read_results(); $result = $new_grade->access_result(); } echo "</table>"; ?> </body> </html>

ESAT/DMSI/PROA/WGR

Page 105 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Rsultat laffichage :

ESAT/DMSI/PROA/WGR

Page 106 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

14. Fonctionnalits Internet


106. Le courrier lectronique
106.1. mail
Mail() est la principale fonction denvoi de courrier lectronique utilise en PHP. Elle ncessite : - Une configuration pralable de la machine sur laquelle tourne lapplication PHP, afin de servir ellemme de serveur e-mail (par exemple avec Sendmail sous Linux, ou le serveur SMTP de IIS sous Windows), ou pour communiquer avec un serveur e-mail donn ; - Une configuration du fichier php.ini , dans la section [mail function]. Les paramtres SMTP et Sendmail_from (Windows) ou Sendmail_path (Unix) doivent tre renseigns. La fonction mail() contient quatres paramtres de type chane de caractres, et retourne une valeur boolenne. Sa syntaxe est la suivante : boolean mail(string adresse, string sujet, string message, [string en_tetes]) ; adresse : sujet : message : en_tetes : adresse des destinataires du message, spares par des virgules. objet du message. corps du message. lignes supplmentaires facultatives faire figurer dans len-tte du message, spares par des retours.

Les attributs particuliers du message (pice jointe, copie, etc.) doivent tre construits respectivement dans le corps et dans len-tte du message. Exemple simple : $adresse = "destinataire@fai1.com"; $sujet = "Envoi de message" ; $message = "Bonjour, voici mon premier message envoy avec PHP" ; $en_tetes = "From : expediteur@fai2.com\r\nReply-To : expediteur@fai2.com " ; // envoi du message if( mail($adresse, $sujet, $message, $en_tetes) ) echo "Votre message a t envoy avec succs : $adresse<br>" ; else echo "Lenvoi de votre message : $adresse a chou<br>" ; le script suivant permet denvoyer un message avec une pice jointe : $piece_jointe = $path_data."piece.txt"; $nom_fichier_pj = "piece.txt"; $contenu_mail = "Vous trouverez la rponse votre demande dans la pice jointe \"$ nom_fichier_pj \" "; $from = "Mon application PHP"; $objet_mail = "Envoi d\un message avec piece jointe"; $limite = "_parties_".md5(uniqid (rand())); $mail_mime = "Date: ".date("l j F Y, G:i")."\n"; $mail_mime .= "MIME-Version: 1.0\n"; $mail_mime .= "Content-Type: multipart/alternative;\n"; $mail_mime .= " boundary=\"----=$limite\"\n\n"; // Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML $texte = "Ceci est un message au format MIME.\n"; $texte .= "------=$limite\n"; $texte .= "Content-Type: text/html; charset=\"US-ASCII\"\n"; $texte .= "Content-Transfer-Encoding: 7bit\n\n"; $texte .= $contenu_mail; $texte .= "\n\n"; // Attachement de la pice jointe $attachement = "------=$limite\n";
ESAT/DMSI/PROA/WGR Page 107 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

$attachement .= "Content-Type: application/octet-stream; name=\"$nom_fichier_pj\"\n"; $attachement .= "Content-Transfer-Encoding:base64\n\n"; $attachement .= chunk_split(base64_encode(implode("", file($piece_jointe)))); mail($adresse, $objet_mail, $texte.$attachement, "From: $from\n".$mail_mime);

107. Le file upload


Le file upload est laction de transfrer un fichier depuis le poste client vers le serveur (par opposition au download , qui transfre un fichier depuis le serveur vers le client). Avec PHP, cette fonctionnalit cl des applications Internet est nativement incluse dans le moteur, et il ny a rien programmer ! En effet, aucune fonction particulire ni aucune bibliothque ne sont ncessaires. Il suffit de rfrencer une page PHP dans le formulaire qui contient le champ de transfert de fichier. Le fichier est transfr automatiquement dans le rpertoire dupload spcifi dans le fichier php.ini (paramtre upload_tmp_dir), et ses caractristiques sont intgres des variables globales de la page rfrence. Exemple : <FORM ENCTYPE = "multipart/form-data" ACTION = "upload.php4" METHOD = POST> <INPUT TYPE = "hidden" NAME = "MAX_FILE_SIZE" VALUE = "1000"> Fichier transfrer : <INPUT NAME = "nom_de_fichier" TYPE = "file"> <INPUT TYPE = "submit" VALUE = "Transfrer"> </FORM> Dans cette page, il est impratif que le champ cach MAX_FILE_SIZE prcde le champ de type file .

Quelle que soit la taille spcifie dans cette variable cache, la taille du fichier transfr ne pourra pas dpasser la taille maximale spcifie dans le fichier php.ini (paramtre upload_max_filesize).

Si lupload sest droul correctement, ce stade, le fichier est dj prsent sur le serveur, et des variables globales ont intgr toutes les valeurs utiles la gestion de ce fichier. Elles sont au nombre de quatre : $nom_de_fichier : nom temporaire sous lequel le fichier a t enregistr sur le serveur. $nom_de_fichier_name : nom original du fichier sur la machine de lexpditeur. $nom_de_fichier_size : taille du fichier transfr, en octets. $nom_de_fichier_type : type MIME du fichier transfr, si le navigateur du client envoie cette information.

Le prfixe de ces quatre variables, savoir "nom_de_fichier", est le nom donn au champ de type file . Il peut bien entendu prendre nimporte quel nom.

On peut donc afficher ces renseignements, en guise de confirmation de transfert : <? echo "Le fichier $nom_de_fichier_name ($nom_de_fichier_size octets) de type $nom_de_fichier_type" ; echo " a t sauvegard sous le nom $nom_de_fichier" ; ?>

ESAT/DMSI/PROA/WGR

Page 108 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

108. Le traitement des URL


108.1. Codage des URL
Les URL peuvent contenir, outre ladresse de la page, des variables et leurs valeurs. Cependant un certain nombre de caractres spciaux (tous les caractres non alphanumriques, lexception de - et de _) ne peuvent pas tre insrs tels quels dans lURL, et doivent tre cods afin de ne pas tre interprts comme des dlimiteurs. Le format de codage est constitu du symbole %, suivi dun code hexadcimal, lexception de lespace, qui est cod par un +. Voici le tableau de codage des principaux caractres : Caractre Espace & " ~ # @ ) ] Code + %26 %E9 %22 %7E %23 %E0 %40 %29 %5D Caractre | ` \ ^ $ U Code %7C %E8 %60 %5C %E7 %5E %24 %A3 %A4 %F9 Caractre + = } ! ? , ; Code %B0 %2B %3D %7D %A8 %21 %B5 %3F %2C %3B Caractre % * / : $ { ( [ Code %25 %2A %2F %3A %A7 %27 %7B %28 %5B

PHP propose deux fonctions pour grer ce codage : Urlencode() permet de coder une chane qui contient des caractres spciaux. Urldecode() est sa rciproque, cest--dire quelle remplace les codes hexadcimaux par leur caractre quivalent.

108.2. urlencode
Syntaxe : string urlencode(string str); Cette fonction retourne une chane dont les caractres non alphanumrique (hormis - et _) sont remplacs par des squences commenant par un caractre pourcentage (%) suivi de deux chiffres hexadcimaux. Les espaces sont remplacs par des signes plus (+). Cette fonction est pratique pour transmettre des informations via une URL. Cest aussi un moyen de passer des informations dune page lautre. Exemple : <? echo urlencode("http://www.url.org/page.php3? var1=valeur1& var2=valeur2") ; ?> Rsultat laffichage : http%3A%2F%2Fwww.url.org%2Fpage.php3%3F var1%3Dvaleur1%26 var2%3Dvaleur2

ESAT/DMSI/PROA/WGR

Page 109 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

108.3. urldecode
Syntaxe : string urldecode(string str); Cette fonction dcode toutes les squences commenant par un % et les remplace par leur valeur. La chane ainsi dcode est retourne. Exemple : <? echo urldecode("http%3A%2F%2Fwww.url.org%2Fpage.php3%3F var1%3Dvaleur1%26 var2%3Dvaleur2") ; ?> Rsultat laffichage : http://www.url.org/page.php3? var1=valeur1& var2=valeur2

108.4. parse_url
Syntaxe : array parse_url(string url); Cette fonction retourne un tableau associatif contenant les diffrents lments de lURL. Les lments recherchs sont : "scheme", "host", "port", "user", "pass", "path", "query", et "fragment". Ils constituent chacun une des cls du tableau retourn. Seuls les lments qui possdent une valeur affecte sont retourns dans le tableau. Exemple : <? $tab = parse_url("http://www.url.org/page.php3?var1=valeur1&var2=valeur2") ; foreach($tab as $cle => $val) echo "$cle : $val<br>" ; ?> Rsultat laffichage :

ESAT/DMSI/PROA/WGR

Page 110 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

109. Les mthodes de gestion du contexte applicatif


109.1. Le contexte applicatif
Une des principales particularits dune application fonde sur une architecture Internet est quelle ne procde qu des connexions ponctuelles avec la base de donnes. En effet, les connexions sont ouvertes, puis fermes, pour chaque page PHP. La consquence immdiate de cette particularit est que les informations, relatives notamment lutilisateur courant, doivent tre renvoyes la base lors de chaque connexion, afin que celui-ci puisse tre identifi et retrouver ses droits sur les donnes. La plupart du temps, ces informations ne sont pas suffisantes. Il est ncessaire par exemple, de connatre les actions et les choix effectus antrieurement (sur dautres pages) par lutilisateur, afin de gnrer un contenu de page cohrent. Toutes ces informations doivent donc pouvoir tre prises en compte tout moment, sur nimporte quelle page. Cet ensemble de donnes est appel le contexte applicatif. Il va permettre de replacer lutilisateur dans son contexe, lors de chaque connexion la base. La gestion du contexe est donc la capacit de passer des paramtres dune page une autre. Pour cela, il existe cinq grandes mthodes.

109.2. Les diffrentes mthodes de gestion


Mthode URL longue Avantages - Simplicit dutilisation - Lisibilit Inconvnients Quantit dinformations limite 2 ou 4 Ko - Informations visibles - Encodage des donnes Donnes caches (mthode POST) - Ncessit de passer par des formulaires HTML Pas de limitation de longueur des donnes transmises - Importance du code HTML gnr si la quantit de donnes est volumineuse Disponibilit de linformation - Dpendants de la configuration du navigateur tout moment, sans ncessit de du poste client passage de page en page Idem cookies - Disponibles uniquement partir de PHP4 Idem cookies - Traitements importants supplmentaires dus aux changes entre PHP et le SGBD Adapte aux gros volumes de donnes

Variables caches

Cookies Session Base de donnes

109.2.1. URL longue


Cette mthode se base sur lURL de la page. En effet, il est possible de passer des variables au sein mme de lURL. pour cela, il suffit de complter lURL de base de la page avec le nom des variables passer, suivi de leur valeur. LURL se forme sur le modle suivant : http://nom_du_serveur/nom_de_la_page.php3 ?variable1=valeur1&variable2=valeur2

Le ? marque la sparation entre lURL de base, qui dsigne la page, et lextension de lURL, qui contient les variables. Le & marque la sparation entre chaque couple variable-valeur . Dans la page PHP rfrence, ces variables seront accessibles simplement par leur nom. Cette mthode permet donc trs facilement de transmettre des informations de page en page. Cependant, plusieurs facteurs sont prendre en compte : La taille dune URL est le plus souvent limite 2 ou 4 Ko (en fonction de lOS utilis), ce qui limite la quantit de variables et la longueur de leur valeur. Les URL saccommodent trs mal des caractres spciaux. Il faut donc penser encoder lURL au moment de sa construction, laide de la fonction urlencode(), afin de ne pas provoquer derreurs. Lappel la page seffectue ncessairement laide dun hyperlien ou dune fonction JavaScript. Le contenu des variables est visible dans la zone daffichage dURL du navigateur, ou dans la fentre dinformation quil propose, ce qui peut tre gnant pour des raisons de scurit ou de robustesse.
Page 111 sur137 jj/10/OO

ESAT/DMSI/PROA/WGR

Cours Programmation

Langage PHP

php.doc

109.2.2. Variables caches


Cette mthode consiste utiliser un formulaire, afin de faire passer les donnes sous forme de variables caches, selon la syntaxe suivante : <INPUT TYPE = HIDDEN NAME = "nom_de_la_variable" VALUE = "valeur">

Si le formulaire est envoy au moyen de la mthode GET, on se retrouve dans un contexte trs proche des URL longues, ce qui implique la mme limitation de longueur et la mme visibilit des valeurs transmises.

On considrera donc que le formulaire est envoy au moyen de la mthode POST. Pour transmettre les mmes valeurs que celles utilises dans lexemple prcdent, on aura le code HTML suivant : <FORM ACTION = "nom_de_la_page.php3" METHOD = POST NAME = "form1"> <INPUT TYPE = HIDDEN NAME = "variable1" VALUE = "valeur1"> <INPUT TYPE = HIDDEN NAME = "variable2" VALUE = "valeur2"> </FORM> Pour valider ce formulaire, et ainsi transmettre les variables la page "nom_de_la_page.php3", plusieurs solutions sont possibles : 1. Passer par un bouton classique de type submit , inclus dans le formulaire <INPUT TYPE = SUBMIT > 2. Passer par une image cliquable, incluse dans le formulaire <INPUT TYPE = IMAGE > 3. Passer par une fonction JavaScript, qui valide le formulaire ( document.form1.submit(); ) dclench par un clic sur un hyperlien ou sur un simple bouton <INPUT TYPE = BUTTON > (cette fonction fait appel la mthode POST du formulaire). Exemple : <INPUT TYPE = BUTTON VALUE = "Envoyer" NAME = "envoyer" OnClick=" document.form1.submit();"> Lexemple suivant est identique mais il ne fait pas appel la balise <FORM .>, ce qui oblige crire les couples variable-valeur, qui doivent tre passs, aprs le nom de la page appele : <INPUT TYPE = BUTTON VALUE = "Envoyer" NAME = "envoyer" OnClick=" document.location = "nom_de_la_page.php3?variable1=\"valeur1\"&variable2=\"valeur2\""> Seule la troisime mthode possde une restriction. En effet, toute action fonde sur du langage JavaScript est soumise au paramtrage du navigateur de lutilisateur, qui peut refuser son excution. Aucune autre contrainte ne vient trancher entre ces trois mthodes. Le choix doit donc tre effectu en fonction de lergonomie et du design des pages concernes.

109.2.3. Cookies
Un cookie est une information stocke sur le poste client, cest--dire sur celui o sexcute le navigateur. Comme pour les fonctions JavaScript, lutilisation des cookies est dpendante de la configuration du navigateur du client, ce qui peut constituer un handicap. En pratique, chaque cookie peut stocker une ou plusieurs informations. Le principal avantage de cette technique est quune information stocke dans un cookie peut tre consulte depuis nimporte quelle page ; il nest pas ncessaire de la faire passer de page en page tout au long de lapplication. En PHP, lutilisation des cookies est extrmement simple, et ne ncessite quune seule fonction : setcookie() La syntaxe de la fonction setcookie() est la suivante : int setcookie(string nom [,string valeur] [,int expiration] [,string chemin] [, string domaine] [, int secure]) ;

Le champ expiration spcifie la date au-del de laquelle le cookie ne sera plus valide (lorsque ce paramtre nest pas spcifi, le cookie devient permanent, moins dtre supprim manuellement). Les paramtres chemin et domaine peuvent tre utiliss en conjonction pour spcifier les URL auxquelles doit tre associ le cookie. Le mot cl secure vient indiquer que le cookie ne peut tre envoy que via une connexion HTTPS scurise. Si vous souhaitez affecter plusieurs valeurs un seul cookie, ajoutez [] au nom du cookie. Si le formulaire est envoy au moyen de la mthode GET, on se retrouve dans un contexte trs proche des URL longues, ce qui implique la mme limitation de longueur et la mme visibilit des valeurs transmises.
Page 112 sur137 jj/10/OO

ESAT/DMSI/PROA/WGR

Cours Programmation

Langage PHP

php.doc

Les Cookies font parties de l'entte HTTP, ce qui impose que la fonction setcookie() soit appele avant tout affichage sur le client. Elle doit donc tre appele avant la premire balise HTML, et avant nimporte quel envoi de commande PHP. Cest une erreur trs courante que de lire du code avec la fonction include() ou avec auto_prepend et davoir des espaces ou des lignes vides dans ce code qui produisent un dbut de sortie avant que setcookie() nai t appele. Exemple1 : <? // Ecriture des cookies ayant pour nom "variable1" et "variable2" sur le poste client setcookie("variable1", "valeur1") ; setcookie("variable2", "valeur2") ; // Pour accder ces cookies, il suffit dutiliser la variable globale du mme nom cre // automatiquement par PHP echo $variable1 ; // affiche la valeur du cookie "variable1" ?> Vous pouvez galement accder la valeur de la variable $variable1 via $HTTP_COOKIE_VARS["variable1"] Exemple2 : // $login et $password ont t pralablement saisis par lutilisateur // la classe utilisateur a t pralablement dfinie $new_utilisateur = new utilisateur(); $req = "select index_utilisateur, nom, password from utilisateurs"; // le contenu du champ password est crypt $new_utilisateur->ask_query($req); $new_utilisateur->read_results(); $result = $new_utilisateur->access_result(); $password_code = crypt($password,"xx"); $login = strtolower($login); $nom = strtolower($result['nom']); if( ($login == $nom) && ($password_code == $result['password']) ) { $index_util = $result['index_utilisateur']; setcookie("cook1",$index_util); setcookie("cook2",$login); setcookie("cook3",$password_code); header("Location: menu.php3"); // redirige le navigateur sur la page menu.php3 } else { echo "<script language=\"JavaScript\">"; echo "alert('Erreur ! Vous n\'avez pas t enregistr); echo "</script>"; }

ESAT/DMSI/PROA/WGR

Page 113 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

A la fin de lapplication il ne faut pas oublier de rinitialiser les cookies, car leur existence sur le poste client est persistante. Exemple : // contenu de la page quitter.php3 <? setcookie("cook1",""); setcookie("cook2",""); setcookie("cook3",""); ?> <html> <head> <title></title> </head> <body onload="parent.close();" bgproperties="fixed"> </body> </html>

// fermeture de la fentre active

109.2.4. Variables de session


Ce type de variables nest implment qu partir de PHP4. Dans PHP3, plusieurs bibliothques de composants les simulent, laide dune base de donnes, mais elles nen offrent pas les avantages. Une variable de session est une variable stocke sur le serveur. Elle est propre un utilisateur donn, et est accessible tout moment, depuis nimporte quelle page appele par cet utilisateur. Elle offre donc les mmes avantages quun cookie. Toutefois, lidentifiant de lutilisateur doit tre pass dans toutes les pages. Pour cela, il est ncessaire demployer une des mthodes vues prcdemment.

Gestion des sessions :


session_start() : Initialise les donnes de session. session_destroy() : Supprime lidentifiant de la session courante. session_name([string nom]) : Affecte et/ou retourne le nom de la session courante. Si nom est fourni, le nom de la session changera, et prendra la valeur fournie. session_module_name([string module]) : Affecte et/ou retourne le module de la session courante. Si module est fourni, ce module sera utilis la place du courant. session_save_path([string path]) : Affecte et/ou retourne le chemin du dossier utilis pour enregistrer les donnes de sessions. Si path est fourni, le chemin prendra alors la valeur fournie. session_id([string id]) : Affecte et/ou retourne lidentifiant de la session courante. Si id est fourni, il remplacera lidentifiant courant de la session. session_register(string name1 [, string name2] {, ]) : Enregistre une ou des variables avec les noms name1, name2, dans la session courante. Cette fonction retourne TRUE lorsque la ou les variables ont t correctement enregistres. Ex : session_register("name1","name2") ; session_unregister(string name) : Supprime la variable nomme name dans la session courante. Cette fonction retourne TRUE lorsque la variable a t correctement supprime de la session. Ex : session_unregister("name") ; session_unset() : Supprime toutes les variables de la session courante. session_is_registered(string name) : Retourne TRUE si il y a une variable du nom de name enregistre dans la session courante. Lexistence dune variable en tant que variable de session peut galement tre vrifie laide du tableau $HTTP_SESSION_VARS. Ex : $HTTP_SESSION_VARS["name"];

ESAT/DMSI/PROA/WGR

Page 114 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

session_decode(string data) : Dcode les donnes de session partir de la chane data, et affecte les valeurs des variables de session. session_encode() : Encode les donnes de session dans la chane retourne.

Mise en uvre :
La premire opration consiste, lors de laccs au site, crer une session, puis transmettre son identifiant au navigateur. On fait alors appel la fonction session_start(), sans lui passer aucun paramtre. Cette fonction doit tre place en tout dbut de script. En effet, tant donn quelle gnre un cookie, elle doit tre place avant lenvoi des headers HTTP, sinon une erreur se produit. A ce moment, la session est cre. Elle charge les variables de session enregistres, afin que vous puissiez les utiliser. Lidentifiant est alors stock dans la constante SID, et dans la suite du script, lappel la fonction session_id() retourne la valeur de cet identifiant unique. Pour transmettre la valeur dune variable dune page une autre, il faut spcifier que lon souhaite faire enregistrer cette variable en tant que variable de session. Pour cela on utilise la fonction session_register(), laquelle on passe en paramtre le nom de la variable, dbarass de son prfixe $.

ESAT/DMSI/PROA/WGR

Page 115 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Exemple1 : <? // test dexistence de session, sinon cration dune nouvelle session if ( $PHPSESSID ) session_start($PHPSESSID) ; else session_start() ; ?> <!-- Dbut du HTML, envoi des enttes par le serveur HTTP <html> <head> <title> PHP4 Session Start</title> </head> <body> <h1>PAGE 1 : PHP4 Session Start </h1> <hr><br> <!-- Affichage de lidentifiant de session, enregistrement dune variable au contexte de la session <? $id = session_id() ; $sname = session_name() ; echo "Votre identifiant de session est : $id<br>" ; echo "Le nom de cette session est : $sname<br>" ; // ajout de la variable $venant_depuis au contexte de la session $venant_depuis = $HTTP_REFERER ; // adresse de la page de rfrence session_register("venant_depuis ") ; ?> <!-Pour passer la cl de session la page suivante, il est conseill de la placer dans lURL de la page de destination. PHP4 propose un raccourci, afin de rendre cette criture plus concise et plus facile interprter. Le lien vers la page de destination scrira : <?=SID?>

<br> <hr> <center> <!--Ecriture courte <a href = "page_de_destination.php?<?=SID?>">Cliquer ici (criture courte)</a> <br><br> <!--Ecriture longue <a href = "page_de_destination.php?session_name()=session_id()">Cliquer ici (criture longue)</a> </center> </body> </html> Par la suite, toute autre page utilise dans la session devra rpercuter la cl de session sur les pages suivantes. Il faudra donc commencer chaque page par lcriture du test dexistence de session ( les 7 premires lignes de lexemple1). Exemple2 : Compter le nombre de visites dun utilisateur. <? session_start() ; session_register("compteur"); $compteur++; ?> Bonjour visiteur, vous avez vu cette page <? echo $compteur; ?> fois.<p> <!-- le <?=SID?> est ncessaire pour transmettre lidentifiant de session Pour continuer, <A HREF="nextpage.php?<?=SID?>">cliquez ici </A> Notez que la valeur de la variable $compteur est ajuste aprs que la variable a t enregistre. La procdure inverse aurait galement t correcte : ajuster la valeur puis enregistrer la variable. La valeur finale de la variable dans la page est celle qui sera disponible dans les pages subsquentes.

ESAT/DMSI/PROA/WGR

Page 116 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

A la fin du script, la variable de session est gele jusqu son rechargement (automatique) par un autre appel de la fonction session_start(). Le prochain script doit par consquent lui aussi dbuter par un appel de la fonction session_start().

Configuration du contrle de session :


Diverses options peuvent tre ajustes dans le fichier php.ini, pour configurer le contrle de session PHP. Le tableau ci-dessous dcrit les options de configuration les plus utiles : Nom de loption session.auto_start session.cache_expire session.cookie_domain session.cookie_lifetime session.cookie_path session.name session.save_handler Valeur par dfaut 0 (dsactive) 180 Aucune 0 / PHPSESSID Files Effet Ouverture automatique des sessions. Spcifie la dure de vie, en minutes, des pages de session mises en mmoire cache. Spcifie le domaine utiliser avec le cookie de session. Fixe la dure de vie maximale du cookie de session sur la machine de lutilisateur. La valeur 0, qui est la valeur par dfaut, spcifie que le cookie doit expirer la fermeture du navigateur. Spcifie le chemin daccs utiliser avec le cookie de session. Spcifie le nom de la session qui est utilis comme nom de cookie dans le systme de lutilisateur. Dfinit lemplacement de stockage des donnes de session. Par dfaut, les sessions sont enregistres dans des fichiers. Elles peuvent tre enregistres dans une base de donnes, mais il faut alors crire ses propres fonctions de sauvegarde. Spcifie le chemin daccs de lemplacement de stockage des donnes de session. Plus gnralement, cest largument qui est pass la fonction de sauvegarde, et dfini par session.save_handler. Configure les sessions de sorte que des cookies soient utiliss ct client.

session.save_path

/tmp

session.use_cookies

1 (activ)

109.2.5. Base de donnes


Le principe dutilisation dune base de donnes dans le but de grer les contextes applicatifs est le mme que pour les sessions. En effet, ici aussi, il faut transmettre un identifiant utilisateur, mais la mthode de rcupration des donnes est diffrente. Avec les sessions, les variables peuvent tre stockes dans un fichier local au serveur, et galement dans une base de donnes. Dans ce dernier cas, la programmation des pages est strictement identique. Il existe une bibliothque de composants trs utilise, qui simule les sessions par lutilisation dune base de donnes. Il sagit de la phplib, disponible ladresse : http://phplib.shonline.de

ESAT/DMSI/PROA/WGR

Page 117 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

15. Implmenter une authentification avec PHP et MySQL


Le Web est un support relativement anonyme, mais il est souvent intressant de savoir qui visite votre site. Heureusement pour la confidentialit des utilisateurs, il nest possible dobtenir que peu dinformations personnelles sans leur accord explicite. Avec peu de travail, les serveurs peuvent dterminer plusieurs informations sur les ordinateurs et les rseaux qui tentent de sy connecter. Les navigateurs Web ont lhabitude de sidentifier en fournissant aux serveurs leur nom, leur numro de version et le nom de votre systme dexploitation. Vous pouvez galement dterminer la rsolution et le nombre de couleurs de lcran de vos visiteurs, ainsi que la largeur de leur cran de navigateur. Chaque ordinateur connect Internet possde une adresse IP qui lui est propre. A partir de ladresse IP dun visiteur, vous pouvez dcouvrir certaines informations le concernant. Certaines adresses sont plus utiles que dautres. Gnralement, les personnes disposant dune connexion permanente Internet possdent une adresse IP permanente. En revanche, les personnes qui doivent se connecter par modem leur fournisseur daccs Internet pour ouvrir chaque session se voient affecter temporairement lune des adresses IP de leur fournisseur. Heureusement pour les utilisateurs du Web, aucune des informations fournies par leur navigateur ne permet de les identifier personnellement. Aprs avoir demand et reu les informations concernant lun de vos visiteurs, vous avez besoin dun moyen dassocier ces informations au mme utilisateur la prochaine fois quil viendra sur votre site. Si vous partez de lhypothse quune seule personne visite votre site avec un compte donn, et que chaque visiteur ne se sert que dun seul ordinateur, vous pouvez enregistrer un cookie sur lordinateur de cette personne pour lidentifier. Ces suppositions ne sont certainement pas vraies pour tout le monde, puisquil arrive souvent que plusieurs personnes partagent un mme ordinateur et quune mme personne se serve de plusieurs ordinateurs. Il arrivera donc que vous ayez besoin de demander vos utilisateurs de sidentifier nouveau. Vous devrez en plus leur demander de prouver leur identit. La mthode dauthentification la plus courante sur le Web consiste demander aux utilisateurs de fournir un nom dutilisateur et un mot de passe valides. Lauthentification est galement utilise pour autoriser ou interdire laccs certaines pages ou certaines ressources.

110. Implmenter un contrle daccs


Le script suivant (secret.php3) fournit un mcanisme dauthentification simple, permettant aux utilisateurs autoriss de voir le contenu dune page : <? echo "<div align = center>" ; if( !isset($HTTP_POST_VARS["nom"]) && !isset($HTTP_POST_VARS["mdp"]) ) { // les variables ne sont pas dfinies, le visiteur doit donc saisir un nom et un mot de passe ?> <h1>Veuillez vous identifier</h1> <form method = POST action = secret.php3> Nom&nbsp;:&nbsp; <input type = text name = nom /> <br><br> Mot de passe&nbsp;:&nbsp; <input type = password name = mdp /> <br><br> <input type = submit value = Envoyer /> </form> <? } else if( ($HTTP_POST_VARS["nom"] == "util1") && ($HTTP_POST_VARS["mdp"] == "passwd1") ) { // le nom et le mot de passe du visiteur sont corrects echo "<h1>Bienvenue sur notre site !</h1>" ; }

ESAT/DMSI/PROA/WGR

Page 118 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

else {

// le nom et le mot de passe du visiteur ne sont pas corrects echo "<h1>Vous ntes pas autoris visiter notre site !</h1>" ;

} echo "</div>"; ?> Ce script pose nanmoins plusieurs problmes : Il possde un nom dutilisateur et un mot de passe inscrits directement dans son code source. Il enregistre et transmet le mot de passe en clair. Il ne protge quune seule page. Ces problmes peuvent tre rsolus de diffrentes manires.

110.1. Enregistrement des mots de passe


Il vaut mieux viter denregistrer les noms dutilisateur et les mots de passe dans un script. A lintrieur dun script, ces donnes sont difficiles modifier. Lenregistrement de ces informations dans un autre fichier de votre serveur vous permet dcrire plus facilement un programme pour ajouter ou pour supprimer des utilisateurs, et de modifier leur mot de passe. Si vous avez lintention denregistrer un grand nombre dlments (plus de 100) dans un fichier pour pouvoir les parcourir ultrieurement, il vaut mieux utiliser une base de donnes. Lutilisation dune base de donnes pour enregistrer les noms dutilisateur et les mots de passe ne rend pas le script beaucoup plus complexe, et cela vous permet dauthentifier trs rapidement plusieurs utilisateurs diffrents. Cela vous permet aussi dcrire facilement un script pour ajouter de nouveaux utilisateurs, pour supprimer des utilisateurs, et pour permettre aux utilisateurs de modifier leur mot de passe. Le script suivant (secretdb.php3) permet dauthentifier les visiteurs dune page grce une base de donnes : <html> <head> <title>Authentification des visiteurs avec base de donnes</title> </head> <body> <? echo "<div align = center>" ; if( !isset($HTTP_POST_VARS["nom"]) && !isset($HTTP_POST_VARS["mdp"]) ) { // les variables ne sont pas dfinies, le visiteur doit donc saisir un nom et un mot de passe ?> <h1>Veuillez vous identifier</h1> <form method = POST action = secretdb.php3> Nom&nbsp;:&nbsp; <input type = text name = nom /> <br><br> Mot de passe&nbsp;:&nbsp; <input type = password name = mdp /> <br><br> <input type = submit value = Envoyer /> </form> <? } else { $nom = $HTTP_POST_VARS["nom"]; $mdp_code = crypt($HTTP_POST_VARS["mdp"],"xx"); // connexion MySQL mysql_pconnect("localhost","","") or die("Connexion au serveur MySQL impossible ! : ".mysql_stat());

ESAT/DMSI/PROA/WGR

Page 119 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

// slection de la base de donnes 'resa_salles' mysql_select_db('resa_salles') or die("Slection de la base de donnes 'resa_salles' impossible ! : ". mysql_error()); // interrogation de la table 'util' pour chercher un enregistrement qui correspond $req = "select * from util where nom_util = '".$nom."' and mdp_util = '".$mdp_code."'"; $id_result = mysql_query($req); if(!$id_result) echo "Requte non valide !"; else { $nb = mysql_num_rows($id_result); if( $nb > 0 ) { // le nom et le mot de passe du visiteur sont corrects $row = mysql_fetch_array($id_result); echo "<h1>".$row['nom_util'].", Bienvenue sur notre site !</h1>"; } else { // le nom et le mot de passe du visiteur ne sont pas corrects echo "<h1>Vous n'tes pas autoris visiter notre site !</h1>"; } } } echo "</div>"; ?> </body> </html>

ESAT/DMSI/PROA/WGR

Page 120 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

110.2. Exercice pratique


Ecrire le script (create_table_util.php3) qui ralisera les oprations suivantes :

ESAT/DMSI/PROA/WGR

Page 121 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

110.3. Protger plusieurs pages


Le moyen le plus simple de protger plusieurs pages consiste utiliser les mcanismes de contrle daccs fournis par votre serveur Web. Vous pouvez ajouter les informations que les utilisateurs ont saisies dans chaque lien hypertexte de la page. Comme les noms dutilisateurs peuvent contenir des espaces, ou dautres caractres interdits dans les URL, vous devez vous servir de la fonction urlencode() pour coder correctement ces caractres. Cependant, cette approche possde quelques problmes. En effet, comme les donnes dauthentification sont incluses dans les pages Web envoyes lutilisateur, elles sont visibles dans lhistorique du navigateur. De plus, comme ces donnes sont changes entre le navigateur et le serveur pour chaque page demande, elles sont transmises beaucoup plus souvent quil nest ncessaire. Il existe deux mthodes intressantes pour rsoudre ces problmes : les sessions et lauthentification de base du protocole HTTP. Lauthentification de base permet de rsoudre le problme de lhistorique, mais le navigateur envoie toujours le mot de passe au serveur lors de chaque requte. Le mcanisme de contrle de session, vu prcdemment, permet de rsoudre ces deux problmes, mais il est implment qu partir de PHP4.

110.4. Utiliser lauthentification de base dans PHP


Heureusement, lauthentification des utilisateurs est une tche trs courante, cest pourquoi le protocole HTTP intgre cette fonction. Les scripts et les serveurs Web peuvent demander une authentification un navigateur Web. Ce dernier soccupe alors dafficher une bote de dialogue ou une fentre comparable pour demander les informations ncessaires lutilisateur. Bien que le serveur Web redemande les dtails dauthentification pour chaque requte dutilisateur, le navigateur Web na pas besoin de demander ces informations lutilisateur pour chaque page. Gnralement, le navigateur conserve ces informations tant quune fentre de navigation reste ouverte, et les renvoie automatiquement au serveur Web, sans les demander lutilisateur. Cette caractristique du protocole HTTP est appele lauthentification de base, et vous pouvez lactiver avec PHP. Lauthentification de base transmet le nom de lutilisateur et son mot de passe en texte brut, cest pourquoi elle nest pas trs scurise. Le protocole HTTP 1.1 dfinit une mthode plus scurise que lon appelle une authentification de rsum, qui se sert dun algorithme de hachage (gnralement MD5) pour cacher les dtails de cette transaction. Lauthentification de rsum est supporte par plusieurs serveurs Web, mais nest pas supporte par la majorit des navigateurs Web. Lauthentification de rsum est dsormais supporte depuis la version 5.0 dInternet Explorer, et elle pourrait tre incluse dans la version 6.0 de Netscape Navigator. Lauthentification de base fournit donc un niveau de scurit assez faible, comparable celui qui est utilis traditionnellement pour se connecter des ordinateurs via Telnet ou FTP, en transmettant les mots de passe en texte brut. Lauthentification de rsum est un peu plus scurise, puisquelle crypte les mots de passe avant de les transmettre, mais aucune de ces deux mthodes ne fournit lutilisateur lassurance quil communique avec lordinateur auquel il avait lintention daccder. Grce lutilisation de SSL et des certificats numriques, toutes les parties dune transaction Web peuvent tre protges dune manire fiable. Cependant, dans la plupart des cas, une mthode relativement rapide et peu scurise, comme lauthentification de base, est suffisante. Lauthentification de base permet de protger un domaine de scurit en demandant aux utilisateurs de fournir un nom dutilisateur et un mot de passe valides. Ces domaines de scurit possdent chacun un nom, pour quil puisse en exister plusieurs sur un mme serveur. Diffrents fichiers ou dossiers dun mme serveur peuvent appartenir diffrents domaines de scurit, chacun tant protg par un nom dutilisateur et un mot de passe diffrents. Les domaines de scurit permettent galement de regrouper plusieurs dossiers sur un mme hte, pour les protger avec un seul mot de passe.

ESAT/DMSI/PROA/WGR

Page 122 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Les scripts PHP sont en gnral compatibles entre diffrentes plates-formes, mais lutilisation de lauthentification de base se fonde sur des variables denvironnement dfinies par le serveur. Pour quun script dauthentification HTTP puisse tre excut sur Apache avec PHP, sous la forme dun module Apache, ou sur IIS laide de PHP, sous la forme dun module ISAPI, le script doit dtecter le type du serveur et se comporter en consquence. Dans le script suivant (auth_base.php3), nous allons voir que si lutilisateur na pas encore fourni dinformations dauthentification, elles lui seront demandes. Si des informations errones ont t fournies, lutilisateur obtient un message derreur. Si lutilisateur saisit un nom dutilisateur et un mot de passe valides, il peut accder au contenu de la page. <? //si nous utilisons IIS, nous devons dfinir $PHP_AUTH_USER et $PHP_AUTH_PW if( (substr($_SERVER["SERVER_SOFTWARE"],0,9) == "Microsoft") && ! isset($_SERVER["PHP_AUTH_USER"]) && !isset($_SERVER["PHP_AUTH_PW"]) && (substr($_SERVER["HTTP_AUTHORIZATION"],0,6) == "Basic ") ) { list($_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"]) = explode(":",base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"],6))); } if (!isset($_SERVER["PHP_AUTH_USER"])) { // utilisation de l'authentification de base, realm est le nom de domaine de scurit header("WWW-Authenticate: Basic realm=\"Mon application\""); } // l'instruction suivante peut tre remplace par une requte de base de donnes if (($_SERVER["PHP_AUTH_USER"] != "util1") || ($_SERVER["PHP_AUTH_PW"] != "passwd1")) { if(substr($_SERVER["SERVER_SOFTWARE"],0,9) == "Microsoft") header("Status: 401 Unauthorized"); // Microsoft IIS else header("HTTP/1.0 401 Unauthorized"); // Apache echo "<div align='center'>"; echo "<h1> Impossible ! Vous n'tes pas autoris !</h1>"; echo "</div>"; } else { // l'utilisateur est identifi echo "<div align='center'>"; echo "<h1>".$_SERVER["PHP_AUTH_USER"].", Bienvenue sur notre site !</h1>"; echo "</div>"; ?> <html> <head> <title>Utilisation d'une authentification de base dans PHP</title> </head> <body> <? phpinfo(); ?> </body> </html> <?

} ?> Lauthentification de base doit tre place au dbut du script, car elle doit tre la premire requte den-tte envoye par le navigateur.
Page 123 sur137 jj/10/OO

ESAT/DMSI/PROA/WGR

Cours Programmation

Langage PHP

php.doc

Excution du script auth_base.php3 : La bote de dialogue est affiche par le navigateur de lutilisateur :

Les informations saisies par lutilisateur sont valides :

Comme le mcanisme dauthentification est assist par des caractristiques intgres dans le navigateur, celui-ci peut grer sa faon les checs dauthentification. Par exemple, Internet Explorer permet aux utilisateurs deffectuer trois tentatives dauthentification avant dafficher une page derreur. Netscape Navigator permet aux utilisateurs deffectuer autant de tentatives quils le veulent, en affichant une bote de dialogue de confirmation aprs un chec. Netscape naffiche la page derreur que si lutilisateur clique sur le bouton Annuler de cette bote de dialogue.

110.5. Utiliser lauthentification de base avec les fichiers .htaccess dApache


Vous pouvez obtenir des rsultats analogues ceux du script prcdent sans crire de code PHP. Le serveur Web Apache contient plusieurs modules dauthentification diffrents qui peuvent tre utiliss pour vrifier la validit des informations saisies par lutilisateur. Le plus simple est mod_auth, qui compare une paire nom_dutilisateur/mot_de_passe aux lignes dun fichier texte qui se trouve sur le serveur. Pour obtenir le mme rsultat que celui du script prcdent, vous devez crer deux fichiers HTML diffrents, un pour le contenu afficher, et un autre pour la page derreur. Le fichier content.html contient la page protge que les utilisateurs autoriss ont le droit dafficher. Le fichier rejet.html contient la page derreur. Il est facultatif de proposer une page derreur, mais il sagit dune petite amlioration que vous pouvez utiliser pour fournir certaines informations vos utilisateurs. Etant donn que cette page sera affiche lorsquun utilisateur ne sest pas authentifi correctement, il peut tre intressant de lui expliquer comment senregistrer pour obtenir un mot de passe, ou comment se faire envoyer son mot de passe sil la oubli. Script content.html (exemple de page protge) : <html> <body> <div align=center><h1>Bienvenue sur notre site !</h1></div> </body> </html>
ESAT/DMSI/PROA/WGR Page 124 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

Script rejet.html (exemple de page derreur) : <html> <body> <div align=center><h1>Vous ntes pas autoris visiter notre site !</h1></div> </body> </html> Le fichier .htaccess permet dactiver lauthentification de base dans un dossier et aux sous-dossiers de son propre dossier. Plusieurs paramtres peuvent tre dfinis dans un fichier .htaccess, mais les six lignes de lexemple cidessous sont toutes en rapport avec lauthentification. Exemple de fichier .htaccess : ErrorDocument 401 /rejet.html AuthUserFile /home/book/ .htpass AuthGroupFile /dev/null AuthName "nom_du_domaine_scuris" AuthType Basic Require valid-user La premire ligne : ErrorDocument 401 /rejet.html indique Apache le document afficher pour les visiteurs qui nont pas russi sauthentifier. Vous pouvez utiliser dautres directives ErrorDocument pour proposer vos propres pages derreur, la place des erreurs HTTP standard. En voici la syntaxe : ErrorDocument numero_d_erreur URL Pour une page qui gre lerreur 401, il est important que son URL soit disponible pour tout le monde. En effet, il nest pas trs intressant de fournir une page derreur personnalise indiquant aux utilisateurs que leur authentification a chou, si cette page se trouve dans un dossier ncessitant une authentification. La ligne : AuthUserFile /home/book/ .htpass indique Apache lendroit o il peut trouver le fichier contenant les mots de passe des utilisateurs autoriss. Ce fichier sappelle souvent .htpass, mais vous pouvez lui donner nimporte quel nom. Le nom de ce fichier na aucune importance, contrairement son emplacement. Il ne doit pas se trouver dans larborescence Web (/Apache Group/), ou dans nimporte quel dossier accessible depuis le serveur Web. Un exemple de fichier htpass est prsent un peu plus loin. La ligne : AuthGroupFile /dev/null permet dindiquer que seuls les utilisateurs autoriss et qui appartiennent certains groupes peuvent accder aux ressources . Ici AuthGroupFile pointe vers le fichier /dev/null, cela signifie que ce mcanisme ne nous intresse pas. En effet, le fichier /dev/null est un fichier spcial des systmes Unix qui ne contient rien du tout. La ligne : AuthName "nom_du_domaine_scuris" fournit un nom de domaine de scurit pour se servir de lauthentification HTTP. Ce nom apparatra vos visiteurs. La ligne : AuthType Basic spcifie la mthode dauthentification utilise. La dernire ligne : Require valid-user spcifie que nimporte quel utilisateur authentifi a le droit daccder aux pages. Vous pouvez galement dsigner des utilisateurs ou des groupes particuliers.

ESAT/DMSI/PROA/WGR

Page 125 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Exemple de fichier .htpass : util1 : 0bL5eKkd7beL4 util2 : hd4Kkj2gFR22s util3 : zK5kjGF25fhLK util4 : 2JgiK4Fk1jfFD Chaque ligne du fichier .htpass contient un nom dutilisateur, le caractre deux-points :, et le mot de passe crypt de cet utilisateur. Pour crer ce fichier, vous pouvez vous servir dun petit programme appel htpasswd, fourni avec la distribution dApache. Le programme htpasswd peut tre utilis de lune des manires suivantes : htpasswd [cmdps] nom_du_fichier_des_mots_de_passe nom_d_utilisateur Ou : htpasswd b[cmdps] nom_du_fichier_des_mots_de_passe nom_d_utilisateur mot_de_passe_utilisateur La seule option que vous devrez utiliser est c. cette option demande htpasswd de crer le fichier. Vous devez utiliser cette syntaxe pour le premier utilisateur que vous ajoutez. Faites attention de ne pas lutiliser pour les autres utilisateurs, puisque si le fichier existe dj, htpasswd le supprime et en cre un nouveau. Les options m, d, p et s peuvent tre utilises si vous souhaitez spcifier lalgorithme de cryptage utiliser (ou bien aucun dentre eux). Loption b demande au programme de prendre le mot de passe en paramtre, au lieu de le demander. Cette approche est intressante si vous souhaitez appeler htpasswd dune manire non interactive, dans un processus de traitement par lots, mais elle ne doit pas tre utilise si vous invoquez htpasswd partir de la ligne de commande. Les commandes suivantes ont t utilises pour crer le fichier prsent ci-dessus : htpasswd bc /home/book/.htpass util1 passwd1 htpasswd b /home/book/.htpass util2 passwd2 htpasswd b /home/book/.htpass util3 passwd3 htpasswd b /home/book/.htpass util4 passwd4 Utilisation : Les noms dutilisateurs et les mots de passe sont enregistrs dans un fichier texte. Chaque fois quun navigateur demande un fichier qui est protg par le fichier .htaccess, le serveur doit analyser le fichier .htaccess, puis analyser le fichier des mots de passe, et tenter de trouver un nom dutilisateur et un mot de passe qui correspondent. Au lieu dutiliser un fichier .htaccess, vous pouvez spcifier les mmes lments dans le fichier httpd.conf, fichier de configuration principal du serveur Web (/Apache Group/). Un fichier .htaccess est analys chaque fois quun fichier est demand. En revanche, le fichier httpd.conf nest analys quune seule fois, au dmarrage du serveur. Cette approche est donc plus rapide, mais elle signifie que si vous souhaitez apporter des modifications, il faut interrompre et redmarrer le serveur. Le fichier des mots de passe quant lui, devra tre analys pour chaque requte. Cela signifie que, comme pour les autres techniques, cette approche nest pas approprie pour authentifier des centaines voire des milliers dutilisateurs.

110.6. Utiliser lauthentification mod_auth_mysql


Comme vous lavez dj vu, lutilisation de mod_auth avec Apache est la fois simple configurer et relativement efficace. Comme cette mthode enregistre les utilisateurs dans un fichier texte, elle nest pas tout fait adapte aux sites importants possdant un grand nombre dutilisateurs. Heureusement, vous pouvez bnficier de la simplicit de mod_auth et de la vitesse des bases de donnes en utilisant mod_auth_mysql. Ce module fonctionne de la mme manire que mod_auth, mais comme il se sert dune base de donnes MySQL la place dun fichier texte, il peut parcourir beaucoup plus rapidement de grandes listes dutilisateurs. Pour pouvoir lutiliser, vous devez compiler et installer le module correspondant sur votre systme, ou demander votre administrateur systme de linstaller. Vous devrez donc configurer Apache et MySQL en suivant les instructions que vous trouverez dans les fichiers README et USAGE qui font partie de la distribution. Vous pourrez obtenir la dernire version de la distribution sur le site http://www.zend.com ou sur http://www.mysql.com/down-loads/contrib.html.
ESAT/DMSI/PROA/WGR Page 126 sur137 jj/10/OO

Cours Programmation

Langage PHP

php.doc

111. Notions de transactions scurises SSL


Pour fournir des transactions scurises sur Internet, il faut examiner le flux dinformations de votre systme, et vous assurer quen chaque point vos informations sont scurises. Dans le contexte de la scurit rseau, il nexiste aucune mthode absolue. Aucun systme nest jamais parfaitement impntrable. Une transaction scurise est donc une transaction qui demande beaucoup defforts pour tre pirate, par rapport aux informations quelle transporte. Si vous devez rellement tudier la scurit de votre systme, il faut donc examiner le flux des informations qui passent au travers de chacune des parties de ce systme. Le flux des informations dun utilisateur dans une application typique, crite laide de PHP et de MySQL est le suivant :

Internet

Serveur Web

Moteur PHP

Moteur MySQL

Scripts et Pages enregistrs

Fichiers de donnes

Donnes MySQL

Les dtails de chaque transaction sur votre systme peuvent varier lgrement, en fonction de larchitecture de votre systme, et des donnes ou des actions des utilisateurs qui ont entran la transaction, mais le principe reste le mme. Chaque transaction entre une application Web et un utilisateur commence par un envoi au niveau du navigateur de lutilisateur dune requte vers le serveur Web, passant par Internet. Si la page est un script PHP, le serveur Web dlgue le traitement de la page au moteur PHP. Le script PHP peut lire ou crire des informations sur le disque. Il peut galement faire appel dautres fichiers PHP ou HTML, avec include() ou require(). Il peut galement envoyer des requtes SQL au dmon MySQL, et recevoir les rponses correspondantes. Le moteur MySQL soccupe de lire et dcrire ses propres donnes sur le disque. Ce systme est compos de trois parties : 1. Lordinateur de lutilisateur : celui-ci fait tourner un navigateur Web. Vous ne pouvez pas contrler les autres facteurs de ce systme, par exemple sa scurit. Il faut se rappeler que cet ordinateur peut tre trs peu scuris, ou quil peut mme sagir dun terminal partag. Il faut galement savoir que certaines personnes dsactivent plusieurs caractristiques quils considrent comme peu scurises, par exemple Java, les cookies ou JavaScript. Les fonctionnalits fournies par PHP peuvent tre compatibles avec nimporte quel navigateur, puisque le rsultat final est essentiellement une page HTML. A partir du moment o lon traite avec des scripts JavaScript ( part peut-tre les plus simples), il faut prendre en compte les capacits et la configuration de chaque navigateur. Du point de vue de la scurit, il vaut mieux avoir recours des scripts PHP au niveau du serveur pour la validation des donnes, puisque de cette manire votre code source nest pas accessible aux utilisateurs. Si vous validez des donnes avec JavaScript, les utilisateurs pourront rcuprer la source du script, et ventuellement la modifier. Les donnes qui doivent tre conserves peuvent tre enregistres sur le serveur Web, dans votre base de donnes, ou sur lordinateur de lutilisateur sous la forme de cookies. Nanmoins, si les informations sont stockes en dehors de votre systme, vous ne pouvez pas contrler leur niveau de scurit, vous ne pouvez pas vous assurer que lutilisateur ne les effacera pas, et vous ne pouvez pas empcher lutilisateur de les modifier.

ESAT/DMSI/PROA/WGR

Page 127 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

2. Internet : celui-ci possde plusieurs caractristiques trs intressantes, mais il sagit par essence dun rseau peu scuris. Lorsque vous envoyez des informations dun point un autre, il ne faut pas oublier que dautres personnes peuvent intercepter ou modifier les informations transmises. Vous pouvez donc choisir de crypter les informations avant de les transmettre, pour garantir leur confidentialit ou pour les protger contre dventuelles tentatives de modification. Il existe au moins deux moyens de scuriser les informations que vous transmettez sur Internet/Intranet : - SSL (Secure Sockets Layer) - S-HTTP (Secure Hyper Text Transfer Protocol) Ces deux technologies permettent de transmettre des messages la fois confidentiels et robustes, mais SSL est dj largement utilis et disponible, alors que S-HTTP nen est qu ses dbuts. 3. Votre systme : Il convient denvisager le cas dune transmission de donnes entre plusieurs composants de votre systme, en passant par un rseau. A titre dexemple, on peut citer une base de donnes MySQL qui se trouverait sur un autre ordinateur que votre serveur Web. Dans ce cas, PHP se connecte votre serveur MySQL via TCP/IP, et cette connexion nest pas crypte. Si les deux ordinateurs participants cette communication appartiennent un rseau local priv, vous devez vous assurer que ce rseau est scuris. Si les ordinateurs communiquent via Internet, votre systme sera probablement ralenti, et vous devrez traiter cette connexion de la mme manire que toute autre connexion passant par Internet. PHP ne possde aucun moyen intgr dtablir ses connexions via SSL. Linstruction fopen() supporte HTTP, mais pas HTTPS. Cependant, vous pouvez utiliser SSL grce la bibliothque cURL. Il est important que vos visiteurs, partir du moment o ils pensent traiter avec vous, soient rellement en connexion avec votre site. Vous pouvez vous procurer un certificat numrique pour les protger dun autre site qui se ferait passer pour le votre, mais aussi pour vous permettre dutiliser SSL sans afficher de message davertissement chez vos utilisateurs.

111.1. Utilisation de SSL


Le SSL a t cr par Netscape ; il est intgr dans tous les navigateurs du march. Il assure lauthentification, la confidentialit et lintgrit des donnes changes, au moyen dun systme de cryptographie, qui utilise le rsultat doprations effectues sur des nombres premiers : lalgorithme cl publique RSA (dont le nom est form des initiales de ses concepteurs : Rivest, Shamir et Adleman). Les versions 2 et 3 de SSL sont trs largement supportes. La plupart des serveurs Web ont t conus pour intgrer ce protocole, ou pour accepter des modules correspondants. Internet Explorer et Netscape Navigator supportent ce protocole depuis la version 3. Dans un futur proche, SSL 3.0 sera remplac par TSL 1.0 (Transport Layer Security). TSL devrait tre un standard rellement ouvert et utilisable par le reste du monde, et non un standard dfini par une organisation particulire. Il est fond directement sur SSL 3.0, mais il contient des amliorations destines combler certaines faiblesses de SSL.

ESAT/DMSI/PROA/WGR

Page 128 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

Les protocoles rseau et les logiciels qui les implmentent sont gnralement organiss en couches, que lon appelle aussi des niveaux. Chaque niveau peut transmettre des donnes (ou demander des services) au niveau suprieur ou au niveau infrieur. Lorsque vous vous servez du protocole HTTP pour transfrer des informations, celui-ci fait appel au protocole TCP (Transmission Control Protocol), qui son tour sappuie sur le protocole dInternet (IP). Ce protocole a lui-mme besoin dun protocole appropri pour le priphrique rseau qui soccupe de transmettre les paquets de donnes vers leur destination, en passant par un support lectrique. Lorsque des donnes sont envoyes, elles traversent ces couches de lapplication jusquau rseau physique. Lorsque des donnes sont reues, elles traversent ces couches dans lautre sens, du rseau physique jusqu lapplication. Lutilisation de SSL ajoute un niveau supplmentaire, ainsi que des protocoles dans le niveau dapplication. Le niveau SSL se situe entre le niveau de transport et le niveau dapplication. Le niveau SSL modifie les donnes de votre application HTTP avant de les envoyer au niveau de transport, qui les enverra vers leur destination.
HTTP Protocole daccord SSL Changement de Cryptage SSL Protocole dalerte SSL

Niveau dapplication Niveau SSL Niveau de transport Niveau rseau Niveau hte vers rseau

Protocole denregistrement SSL TCP IP Hte vers rseau

111.2. Processus
Le navigateur de lutilisateur entre en communication avec le serveur. Ce dernier possde dj sa paire de cls publique/prive. Cest cette paire de cls quil utilise dans ses communications avec tous les logiciels clients. Le processus est le suivant : 1. Une fois reconnu par le logiciel serveur, le logiciel client gnre une paire de cls publique/prive. 2. Le logiciel client demande au logiciel serveur de lui fournir sa cl publique (celle du serveur). 3. La cl publique du client est aussitt crypte avec la cl publique du serveur, puis transmise au serveur. 4. Le serveur dcode le message laide de sa cl prive, puis authentifie la cl publique de lutilisateur. 5. Le serveur envoie ensuite au logiciel client une confirmation crypte, du bon droulement de lopration. Toutes les informations futures, changes entre lutilisateur et le serveur, seront dsormais cryptes. De plus, seul ce serveur est en mesure de communiquer avec cet utilisateur, car il est le seul connatre la cl publique de cet utilisateur. Lutilisateur et le serveur peuvent maintenant changer toutes les donnes voulues, de faon sre. Lensemble de ce processus est compltement transparent pour lutilisateur. Avec ce protocole, une nouvelle paire de cls est gnre chaque tablissement de la communication entre le logiciel client de lutilisateur et le logiciel serveur. La communication est donc entirement sre, mais en aucun cas le serveur ne peut sassurer de lidentit de lutilisateur lautre extrmit. Une faon de rsoudre ce problme est de joindre ce processus un systme de validation, par exemple un numro didentification personnel, qui sobtient par une inscription pralable.

111.3. Fonctionnement
Le systme repose sur lalgorithme RSA, un standard utilis pour le cryptage des donnes et la signature de messages lectroniques. Cet algorithme est trs utilis pour lauthentification et le cryptage des donnes dans le domaine informatique. Deux paires de cls (une pour le verrouillage, lautre pour le dverrouillage) 40 bits sont utilises. Chaque paire est compose dune cl publique et dune cl prive. La cl publique est distribue, alors que la cl prive ne lest jamais ; cette dernire est toujours garde secrte. Les donnes cryptes avec la cl publique peuvent uniquement tre dcryptes avec la cl prive, et inversement.

ESAT/DMSI/PROA/WGR

Page 129 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

111.4. Certificats
Un certificat est un document lectronique qui atteste quune cl publique est bien lie une organisation ou un individu. Il permet la vrification de la proprit dune cl publique, afin de prvenir la contrefaon de cls publiques. Un certificat contient gnralement une cl publique, un nom, ainsi que dautres champs qui identifient le propritaire, une date dexpiration, un numro de srie, le nom de lorganisation qui contresigne le certificat, et la signature elle-mme. Le format des certificats est dfini par la norme X509. Le certificat donne donc lassurance que les informations quil contient sont exactes. Pour cela, le certificat doit tre gnr par un tiers de confiance, cest--dire un organisme indpendant, qui contrle la vracit de ces informations. Le CA (Certifying Autority, lorganisme certificateur) donne la crdibilit au certificat. Il existe deux types de certificats utiliss avec SSL : pour le serveur et pour le client. Techniquement, ils utilisent le mme format, mais diffrent par linformation quils contiennent. Ainsi, un certificat ct client sert identifier un utilisateur ; il contiendra donc des informations sur cet utilisateur. Ct serveur, le certificat a pour mission dauthentifier le serveur, ainsi que lorganisme qui lexploite. cest ce type de certificat dont vous avez besoin dans la mise en place dun serveur scuris HTTPS.

111.5. Installation de SSL


Pour pouvoir utiliser le protocole SSL avec le serveur HTTP Apache, il faut installer des modules spcifiques. Les modules ncessaires sont disponibles gratuitement sur Internet : OpenSSL 0.9.2b, disponible ladresse http://www.openssl.org/ Mod_ssl 2.2.8-1.3.6, disponible ladresse http://www.modssl.org/ Une fois ces modules installs, vous pouvez crer des certificats de test, que vous signerez en tant quautorit de certification. Ces certificats permettent de tester le bon fonctionnement du protocole SSL. Les navigateurs prviennent lutilisateur que le serveur utilise des certificats qui nont pas t signs par une CA reconnue, mais cela permet malgr tout de tester le bon fonctionnement de linstallation. Cependant, avant cela, il faut configurer le serveur Apache, afin de lui indiquer quil doit se mettre lcoute du port 443 (port classiquement utilis par HTTPS), et galement activer la protection par SSL sur les rpertoires qui doivent tre protgs.

ESAT/DMSI/PROA/WGR

Page 130 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

16. Autres fonctionnalits offertes par PHP


112. La srialisation
La srialisation est le processus qui consiste convertir un lment qui peut tre stock dans une variable, un tableau ou un objet PHP en un flux doctets ddi tre stock dans une base de donnes ou pass de pages en pages via une URL. Sans srialisation, il se rvle difficile de stocker ou de passer lintgralit du contenu dun tableau ou dun objet. La srialisation a toutefois perdu de son utilit avec lintroduction du contrle de session. La srialisation des donnes tait gnralement utilise pour des oprations pour lesquelles le contrle de session est aujourdhui mis en uvre. En effet, les fonctions de contrle srialisent les variables de session. Le programmeur PHP doit nanmoins encore rgulirement stocker des tableaux ou des objets PHP dans des fichiers et des bases de donnes. Deux fonctions se rvlent alors prcieuses : serialize() et unserialize(). Leur syntaxe est la suivante : String serialize(mixed objet) ; Exemple : $serial_tab = serialize($tab) ; Mixed unserialize(string serial_objet) ; Exemple : $tab = unserialize($serial_tab); Nous allons examiner le rsultat renvoy par la srialisation d un tableau dentiers : $tab = array(); for($i=0 ; $i < 11 ; $tab[$i] = $i*2, $i++); $serial_tab = serialize($tab); echo $serial_tab; Rsultat laffichage :

a:11:{i:0;i:0;i:1;i:2;i:2;i:4;i:3;i:6;i:4;i:8;i:5;i:10;i:6;i:12;i:7;i:14;i:8;i:16;i:9;i:18;i:10;i:20;}
Le premier caractre indique le type de lobjet srialis : a : array o : objet s : string Le nombre suivant correspond la taille de lobjet (nombre dlments). Entre les accolades nous trouvons le contenu de lobjet : - pour un tableau nous avons le type et la valeur de chaque indice suivi du type et de la valeur de chaque lment, - pour un objet nous avons le type, la longueur (pour les string), le nom suivi du type de la valeur, de la longueur de la valeur et de la valeur de chaque proprit. Voici, en exemple, la srialisation de lobjet $v1 dfini et initialis prcdemment : $serial_v1 = serialize($v1); echo $serial_v1; Rsultat laffichage :

O:7:"voiture":6: {s:6:"marque";s:7:"Renault";s:6:"modele";s:7:"Safrane";s:9:"puissance";i:7;s:7:"couleur";s:5:"rouge" ;s:6:"moteur";s:6:"arrt";s:9:"nb_portes";i:3;}

Ne pas oublier dutiliser la fonction addslashes() avant dcrire des donnes de type chane de caractres dans une base de donnes. Pour replacer les donnes dans leur format dorigine, il suffit dinvoquer la fonction unserialize(). Bien entendu, si la fonction addslashes() a t invoque avant le stockage de lobjet dans la base de donnes, la fonction stripslashes() doit tre appele avant de d srialiser la chane.

ESAT/DMSI/PROA/WGR

Page 131 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

113. Chargement dynamique dextensions sous Windows


Vous pouvez choisir quelles extensions vous voulez charger en dcommentant la ligne 'extension=php_*.dll' dans le fichier php.ini . Des extensions (bibliothques) peuvent tre galement charges en cours dexcution, si elles ne sont pas dj compiles avec PHP, au moyen de la fonction dl(). Syntaxe : dl(string nom_du_fichier_contenant_l_extension) ; La fonction dl() prend comme argument le nom du fichier contenant la bibliothque. Sous Unix, les bibliothques logicielles sont stockes dans des fichiers portant lextension .so, tandis que sous Windows, elles sont stockes dans des fichiers dont le nom se termine par .dll. La ligne de code, dans lexemple suivant, provoque le chargement dynamique de lextension FTP sur une machine Windows : dl("php_ftp.dll") ; Ne spcifiez pas le dossier de stockage des extensions, mais spcifiez-le par contre dans le fichier de configuration php.ini. Le paramtre appel extension_dir spcifie en effet le dossier de stockage dans lequel PHP doit rechercher les bibliothques charger dynamiquement.

Si vous rencontrez des difficults lors du chargement dynamique dune extension, vrifiez lajustement du paramtre de configuration enable_dl dans le fichier php.ini (voir la copie dcran ci-dessus). Ce paramtre doit tre activ (On) pour que linterprteur PHP puisse charger dynamiquement des extensions. Il peut toutefois tre dsactiv pour des raisons de scurit, notamment si vous travaillez sur un ordinateur qui ne vous appartient pas. Par ailleurs, la fonction dl() nest pas utilisable si PHP est excut en mode scuris. Les fichiers DLLs des extensions PHP sont prfixs par 'php_' en PHP 4, et 'php3_' en PHP 3. Cela vite la confusion des extensions PHP et de leurs librairies.

ESAT/DMSI/PROA/WGR

Page 132 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

En PHP 4.0.4pl1, les extensions BCMath, BCMath, Calendar, COM, FTP, MySQL, ODBC, PCRE, Sessions, WDDX et XML sont actives par dfaut . Vous n'avez rien faire pour qu'elles soient incluses. Lisez le fichier README.txt ou install.txt dans votre distribution pour connatre la liste des modules par dfaut. Certaines de ces extensions requirent des librairies DLL supplmentaires pour fonctionner correctement. Certaines d'entre elles sont disponibles dans la distribution. dans le dossier dlls mais certaines (comme Oracle (php_oci8.dll)), demandent des dlls qui ne sont pas dans la distribution. Copiez les dlls fournies depuis le dossier dlls dans votre PATH Windows. Les bons emplacements sont typiquement c:\windows\system pour Windows 9x/Me c:\winnt\system32 pour Windows NT/2000 Si elles sont dj installes sur votre systme, ne les crasez que si PHP ne fonctionne pas correctement (et de toutes manires, faites une sauvegarde de ces DLL, en cas de problme). Extensions PHP : Extension
php_bz2.dll php_calendar.dll php_cpdf.dll php_crypt.dll php_ctype.dll php_curl.dll php_cybercash.dll php_db.dll php_dba.dll php_dbase.dll php3_dbm.dll php_domxml.dll php_dotnet.dll php_exif.dll php_fbsql.dll php_fdf.dll php_filepro.dll php_ftp.dll php_gd.dll php_gettext.dll php_hyperwave.dll php_iconv.dll php_ifx.dll php_iisfunc.dll php_imap.dll php_ingres.dll php_interbase.dll php_java.dll php_ldap.dll php_mhash.dll php_ming.dll php_msql.dll php3_msql1.dll php3_msql2.dll php_mssql.dll php3_mysql.dll php_nsmail.dll php3_oci73.dll

Description
Fonctions de compression Bzip2 Fonctions de conversions calendaires (Depuis PHP 4.03, elles sont actives par dfaut) Fonctions ClibPDF Fonctions de cryptage Fonctions ctype Fonctions CURL Fonctions de paiement Cybercash Fonctions DBM Fonctions dbm-style Fonctions DBase Librairie d'mulation GDBM via Berkely DB2 Fonctions DOM XML Fonctions .NET Enttes EXIF des images JPEG Fonctions FrontBase Fonction FDF (Forms Data Format) Lecture des bases filepro Fonctions FTP Bibliothque GD (pour les manipulations d'images) Fonctions GNU Gettext Fonctions HyperWave Fonctions de conversions ICONV Fonctions Informix Fonctions IIS Fonctions IMAP 4(en PHP 3:@: php3_imap4r1.dll) Fonctions Ingres II Fonctions InterBase Extension Java Fonctions LDAP Fonctions Mhash Fonctions Ming pour Flash Fonctions mSQL Fonctions mSQL 1 Fonctions mSQL 2 Fonctions MSSQL (anciennement php_mssql70.dll, requiert MSSQL DB-Libraries) Fonctions MySQL (Actives par dfaut en PHP 4) Fonctions Netscape mail Fonctions Oracle Aucune

Notes
Active automatiquement depuis PHP 4.0.3 Aucune Aucune Requiert :@: libeay32.dll, ssleay32.dll (fournies) Aucune Obsolte. Utilisez DBA la place (php_dba.dll) Aucune Aucune Aucune Requiert :@: libxml2.dll (fournie) Aucune Aucune Aucune Requiert:@: fdftk.dll (fournie) Accs en lecture seule Active par dfaut depuis PHP 4.0.3 Aucune Requiert :@: gnu_gettext.dll (fournie) Aucune Requiert :@: iconv-1.3.dll (fournie) Requiert:@: librairies Informix Aucune PHP 3:@: php3_imap4r1.dll Requiert:@: librairies Ingres II Requiert:@: gds32.dll (fournie) Requiert:@: jvm.dll (fournie) Requiert:@: libsasl.dll (fournie) Aucune Aucune Requiert:@: msql.dll (fournie) Aucune Aucune Requiert:@: ntwdblib.dll (fournie) Aucune Aucune Aucune

ESAT/DMSI/PROA/WGR

Page 133 sur137

jj/10/OO

Cours Programmation php_oci8.dll php_openssl.dll php_oracle.dll php_pdf.dll php_pgsql.dll php_printer.dll php_sablot.dll php_snmp.dll php_sybase_ct.dll php_yaz.dll php_zlib.dll Fonctions Oracle 8 Fonctions OpenSSL Fonctions Oracle Fonctions PDF Fonctions PostgreSQL Fonctions d'impression Focntions XSLT Fonctions SNMP get et walk Fonctions Sybase Fonctions YAZ Fonctions ZLib

Langage PHP

php.doc Requiert:@: librairies clientes Oracle 8 Requiert:@: libeay32.dll (fournie) Requiert:@: librairies clientes Oracle 7 Aucune Aucune Aucune Requiert:@: sablot.dll (fournie) NT uniquement! Requiert:@: librairies clientes Sybase Aucune Aucune

113.1. Liste des extensions charges


Vous pouvez facilement connatre les jeux de fonctions qui sont disponibles, et les fonctions disponibles au sein de chacun de ces jeux, via les fonctions get_loaded_extensions() et get_extension_funcs(). Syntaxes : Array get_loaded_extensions(void) ; Array get_extension_funcs(string extension) ; La fonction get_loaded_extensions() renvoie un tableau de tous les jeux de fonctions actuellement disponibles dans linstallation PHP. Cette fonction ne prend aucun paramtre. La fonction get_extension_funcs() renvoie un tableau contenant toutes les fonctions disponibles dans le jeu de fonctions ou lextension qui lui est pass comme argument. Linformation ainsi obtenue peut se rvler prcieuse pour dterminer si linstallation dune extension sest droule avec succs. Le script affiche_extensions.php3 suivant liste toutes les extensions disponibles dans linstallation PHP courante et donne, pour chaque extension, la liste des fonctions disponibles : <html> <head> <title>affichage des extensions disponibles</title> </head> <body> <? echo "<div align='center'>"; echo "<h2>Liste des fonctions supportes dans votre installation PHP</h2>"; echo "</div>"; $extensions = get_loaded_extensions(); foreach($extensions as $each_extension) { echo "$each_extension<br>"; echo "<ul>"; $ext_fonctions = get_extension_funcs($each_extension); foreach($ext_fonctions as $fonction) echo "<li>$fonction"; echo "</ul>"; } ?> </body> </html>

ESAT/DMSI/PROA/WGR

Page 134 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

17. Installation dApache, PHP et MySQL


Un serveur web est un logiciel permettant de rendre accessibles de nombreux ordinateurs (les clients) des pages web stockes sur le disque. Cette fiche pratique explique comment installer le serveur web Apache sur un systme de type UNIX (typiquement une distribution de Linux telle que RedHat, Mandrake ou n'importe quelle autre). Pour cela quelques connaissances sur Linux ou bien Unix sont ncessaires. Le but de cette fiche va tre d'tre capable de rcuprer les sources des diffrents lments ncessaires et de les compiler (un compilateur C est donc ncessaire, il est gnralement install par dfaut sur la plupart des distributions Linux) afin d'avoir un systme oprationnel. L'installation suivante comprend l'installation de l'interprteur PHP, un langage de programmation permettant de crer des pages dynamiquement, ainsi que le SGBD MySQL, un systme de gestion de bases de donnes relationnelles puissant fonctionnant sous Linux (et gratuit!).

114. Tlcharger les sources


Les sources de PHP peuvent tre tlcharges sur le site http://www.php.net Les sources de Apache peuvent tre tlcharges sur le site http://www.apache.org Les sources de MySQL peuvent tre tlcharges sur le site http://www.mysql.org

115. Installer Apache et PHP


1. Dcompresser les archives: tar zxvf apache_1.3.x.tar.gz tar zxvf php-3.0.x.tar (ou php-4.0.x.tar pour php4) 2. Configurer Apache cd apache_1.3.x ./configure --prefix=/www 3. Configurer PHP cd ../php-3.0.x (ou php-4.0.x pour php4) ./configure --with-mysql --with-apache=../apache_1.3.x --enable-trackvars Si vous prfrez installer PHP dans un autre rpertoire, il faut utiliser l'option de configuration --withconfig-file-path=/path 4. Compiler PHP make make install 5. Installer Apache cd ../apache_1.3.x ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a ( OU pour php4 : ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a) make make install 6. Modifier le fichier de configuration de PHP cd ../php-3.0.x (ou php-4.0.x pour php4) cp php3.ini-dist /usr/local/lib/php3.ini (ou php.ini pour php4) (Vous pouvez dsormais diter le fichier de configuration /usr/local/lib/php3.ini.) 7. Editez le fichier de configuration du serveur apache (gnralement httpd.conf ou srm.conf) et ajoutez la ligne suivante:
AddType application/x-httpd-php3 .php3

(Il s'agit de choisir l'extension associe aux scripts PHP. Par souci d'homognit, il est courant de choisir l'extension .php3 pour php3.0 ou .php pour php4) 8. Dmarrez le serveur Apache. (Il est essentiel d'arrter et redmarrer le serveur, et non uniquement de le relancer). Il suffit gnralement de taper apachectl stop, puis apachectl start.

ESAT/DMSI/PROA/WGR

Page 135 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

116. Premier lancement


Pour vrifier si l'installation a bien fonctionne, il vous suffit de crer un petit fichier dans la racine des documents du serveur web (appele DocumentRoot dans le fichier de configuration httpd.conf). Nommez ce fichier toto.php3, et mettez le code suivant dans ce fichier: <html> <head><title>Exemple</title></head> <body> <?php echo "PHP fonctionne!"; ?> </body> </html> Lancez un navigateur sur cette machine et entrez l'URL suivante: http://localhost/toto.php3 localhost dsigne la machine sur laquelle vous vous trouvez... Vous devriez logiquement voir apparatre la phrase "PHP fonctionne!" sur votre cran.

ESAT/DMSI/PROA/WGR

Page 136 sur137

jj/10/OO

Cours Programmation

Langage PHP

php.doc

18. Bibliographie
Les ouvrages qui ont servi llaboration de ce support :
PHP & MySQL de Luke Welling et Laura Thomson aux ditions Campus Press Programmation Web avec PHP de L. Lacroix, N. Leprince, C. Boggero, et C. Lauer aux ditions Eyrolles Pratique de MySQL et PHP de Philippe Rigaux aux ditions OREILLY Lintro PHP4 de Matt Zandstra aux ditions Campus Press www.commentcamarche.fr fr2.php.net/manual/fr www.yellis.net/docs

Les sites Internet qui ont servi llaboration de ce support :


-

Avec les remerciements dOlivier SAINT MARTIN et de Yannick GAILLABAUD.

ESAT/DMSI/PROA/WGR

Page 137 sur137

jj/10/OO

You might also like