Vous êtes sur la page 1sur 46

Philippe ROOSE / IUT de Bayonne / UPPA

Partiellement sur IUT en Ligne (www.iutenligne.net)


2005-2011

-1-

Langage de programmation PHP

Introduction............................................................................................................... 5
1.1

Origine de ce langage.................................................................................................... 5

1.2

Atouts ............................................................................................................................. 5

1.3

PHP dans une page Web .............................................................................................. 5

Variables, oprateurs et expressions ........................................................................ 6


2.1

Identifiants..................................................................................................................... 6

2.2

Types de donnes .......................................................................................................... 6

2.3

Porte des variables ...................................................................................................... 8

2.4

Assignation de valeurs aux variables .......................................................................... 8

2.5

Constantes ..................................................................................................................... 9

2.6

Oprateurs logiques, binaires, autres ......................................................................... 9

Instructions de contrle .......................................................................................... 10


3.1

If, then, else.................................................................................................................. 10

3.2

Switch ........................................................................................................................... 10

3.3

Boucles for, dowhile, for ......................................................................................... 12

3.4

Instructions break et exit ........................................................................................... 12

Tableaux .................................................................................................................. 12
4.1

Tableaux une dimension.......................................................................................... 12

4.2

Initialisation................................................................................................................. 13

4.3

Tri de tableaux ............................................................................................................ 14

4.4

Tableaux dimensions multiples............................................................................... 14

Entres/Sorties ........................................................................................................ 15
5.1

Envoi vers le navigateur ............................................................................................. 15

5.2

Rcupration des donnes dun formulaire.............................................................. 15

5.3

Rcupration des variables denvironnement .......................................................... 16

Rutilisation de code ............................................................................................... 17


6.1

Fonctions include/require .......................................................................................... 17

6.2

Dclaration et utilisation de fonctions ....................................................................... 17

6.2.1

Dclarations ............................................................................................................. 17

-2-

6.2.2

Arguments................................................................................................................ 18

6.2.3

Retour de paramtres ............................................................................................. 18

Lecture/criture de fichiers..................................................................................... 18
7.1

Transfert de fichiers (upload) .................................................................................... 20

Fonctions diverses ................................................................................................... 21


8.1

Fonctions de traitement sur des donnes .................................................................. 21

8.2

Fonctions mathmatiques .......................................................................................... 22

8.3

Gestion de date, heure, temps .................................................................................... 22

8.4

Fonctions orientes serveur ....................................................................................... 23

10

Srialisation..................................................................................................................... 23

Fonctions orientes rseau .................................................................................. 24

10.1

Mail........................................................................................................................... 24

10.2

FTP ........................................................................................................................... 24

11

Base de donnes ................................................................................................... 25

11.1

Ouverture dune base ............................................................................................. 25

11.2

Requtes SQL .......................................................................................................... 25

11.3

Rcupration de donnes ........................................................................................ 26

11.4

Autres fonctions....................................................................................................... 26

11.5

Utilisation dODBC ................................................................................................. 26

12

Manipulations dimages ...................................................................................... 27

12.1

Squence de gnration dune image..................................................................... 27

12.2

Cration dune image.............................................................................................. 27

12.3

Gestion des couleurs................................................................................................ 28

12.4

Gestion des formes .................................................................................................. 28

12.5

Gestion des caractres/chanes de caractres ....................................................... 29

12.6

Gestion des couleurs................................................................................................ 29

12.7

Manipulation dimages ........................................................................................... 29

12.8

Rcupration des images ........................................................................................ 31

13
13.1

Programmation objet : PHP et les classes (PHP 4/PHP 5) ............................... 31


Syntaxe de la programmation objet ...................................................................... 31

14

Gestion des Exceptions (PHP 5) ......................................................................... 33

15

Contrle de sessions............................................................................................. 34
-3-

15.1

Cration de cookies ................................................................................................. 34

15.2

Cration de variables de sessions ........................................................................... 35

16

PHP-Ajax ............................................................................................................. 36

17

Webservices & SOAP........................................................................................... 41

18

PHP en chiffre ..................................................................................................... 45

19

Conclusion ........................................................................................................... 46

-4-

1
1.1

Introduction
Origine de ce langage

PHP, crit en C, est n en 1994 avec le site de Rasmus Lerdof. Il dsirait mettre son CV en ligne et garder
une trace des utilisateurs. Ds le dpart, il supportait les requtes SQL, et devant le nombre de personnes
intresses, il a dcid de mettre en ligne la version 1.0 de PHP (Personal Home Page). Cette version
permettait de plus de contrler les saisies des utilisateurs et de remplacer certaines commandes.
Devant le succs et le nombre de requtes des programmeurs, en utilisant Bison/Yacc est mis en uvre
PHP 2.0. Cette version ajoutera des structures conditionnelles, des boucles et encore bien dautres
amliorations. Elle permettait galement au programmeur dintgrer des instructions de programmation
puissantes lintrieur de leur code HTML.
A l'origine, PHP signifiait Personnal Home Page mais ce nom a chang pour tre mis la mode GNU
(Gnu is not Unix), cest dure un acronyme rcursif. Il signifie maintenant PHP : Hypertext
Preprocessor.
Le script PHP est maintenant directement compil dans le serveur Web (Apache par exemple), les
instructions sont donc excutes sur le serveur lui mme.
Ce pauvre Rasmus devenant un peu dbord, il a fait appel dautres programmeurs de renom et le 6 juin
1998 est n PHP 3.0, point de dpart de linvasion PHP !

1.2

Atouts

On peut se demander pourquoi utiliser du PHP alors quil existe bien dautres technologies et en
particulier le Perl. Microsoft propose les ASP (Active Server Pages) avec son serveur Web IIS (Internet
Information Server) et Sun propose les JSP (Java Server Pages) Il existe dautres solutions plus ou moins
propritaires, la fois gratuites et payantes (comme Coldfusion).
Le choix de PHP se ralise vite : cest le meilleur ! Il intgre tous les avantages des autres solutions. Son
code est rapide produire et excuter. Il tourne sur diffrents serveurs (Apache, IIS, WebTen, ) et
diffrents systmes dexploitation (UNIX, Windows et Macintosh, etc.). Il permet non seulement des
performances leves mais galement possde des interfaces vers la plupart des SGBD du march, il
intgre de nombreuses bibliothques pour faciliter le dveloppement de tches Web et enfin il possde un
autre avantage, qui, sil nest pas son principal, en est un de plus : il est gratuit.

1.3

PHP dans une page Web

De manire classique, voici lternel Hello World dans sa version PHP. La commande print (ou echo)
permet dafficher le texte entre parenthses et/ou guillemets.
<HTML><BODY>
<?php
print "Hello World<P>";
?>
</BODY></HTML>

affichera :Hello World

Le code PHP est plac directement dans le code source HTML, il est encadr par deux balises spciales
qui sont destines tre reconnues par l'interprteur PHP. On aurait tout aussi bien pu utiliser les balises

-5-

<SCRIPT LANGUAGE="php"> et </SCRIPT> comme on le fait pour du JavaScript.

Attention,
Il ne faut pas confondre PHP et JavaScript. Il s'agit de deux choses diffrentes PHP est un langage de
script destin tre excut par le serveur, alors que le JavaScript est charg et excut dans le
navigateur, donc cot client . PHP est donc comparable aux ASP de Microsoft ou aux CGI
standards dans le sens o ils sexcutent tous les deux ct serveur .
Enfin, il est galement possible dutiliser les tags sous leur forme courte (<? et ?>), mais cette possibilit
n'est pas active par dfaut. Il faudra donc modifier le paramtrage de PHP sur la machine serveur.
Quand on affiche dans le navigateur le source HTML d'une page gnre par PHP, on ne voit que le code
HTML rsultant. Si vous regardez le source de la page prcdente dans votre navigateur, vous obtiendrez
a :
<HTML><BODY>
Hello World<P>
</BODY></HTML>

2
2.1

Variables, oprateurs et expressions


Identifiants

PHP propose trois types de donnes : les entiers, les dcimaux, et les chanes de caractres. PHP respecte
la casse lors de lidentification des variables. Ainsi, maVariable est diffrent que MaVariable. Une
variable est toujours prcde du signe $ que les amateurs de Shell connaissent bien.

2.2

Types de donnes

En fait, quand on utilise du PHP, on ne soccupe pas de distinguer le types des variables. Elles prennent le
type des donnes qui leur sont affectes. Nanmoins, il est possible de contourner ceci si ncessaire en
utilisant la fonction settype qui attribue un type spcifique une variable. Il existe une autre solution par
lutilisation des fonctions intval, doubleval et strval permettant de raliser des conversions de chanes en
entiers par exemple pour intval.
Il existe nanmoins un certain nombre de types de donnes :
Entier: pour les nombres entiers,
Float(ou Double) : nombres rels,
Chanes: pour les chanes de caractres,
Boolen: pour des valeurs de type vrai ou faux,
Tableau: pour stocker des donnes du mme type,
Objet: pour stocker des instances de classes,
Deux types particuliers sont galement proposs :
NULL: pour des valeurs de type non dfinies,
ressource: retournes frquemment par des fonctions accdant des ressources externes (fichiers, BD,
etc.). elles sont rarement manipules.

-6-

Exemple
<?
$temperature = 30 ;
settype($temperature, double ) ;
print Double : $temperature <BR> ;
settype($temperature, integer) ;
print Integer : $temperature <BR> ;
settype($temperature, string) ;
print String : $temperature <BR>;

$temperature = 30 ;
print <BR>String <BR>;
print strval($temperature);
print <BR>Double <BR>;
print doubleval($temperature);
print <BR>Integer <BR>;
print intval($temperature);

$foo = "0"; // $foo est une chaine


$foo++;

// $foo est une chaine

$foo += 1; // $foo est maintenant un entier


$foo = $foo + 1.3; // foo est maintenant un double
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs";

// $foo is integer (15)

?>

Il est galement possible de raliser ceci de manire implicite en utilisant la coercition vue en C. Ainsi,
intval($temperature) et (integer) $temperature sont identiques.
Afin de connatre le type des variables, un certain nombre de fonctions sont disponibles et retournent true
ou false :
is_array(),
is_double(), is_float(), is_real() - c'est la mme fonction,
is_long(), is_int(), is_integer()- c'est la mme fonction,
is_string(),
is_object(),
is_ressource(),
is_null(),
is_scalar() - si la variable est scalaire, c'est dire si c'est un entier, une chane, ou un double.
is_numeric() - si la variable est un nombre ou une chane numrique,
is_callable()- le la variable est un nom de fonction valide.
Trois fonctions permettent galement de connatre l'tat de variables :

-7-

isset () : retourne true ou false selon que la variable passe en paramtre existe ou pas,
unset () : supprime la variable passe en paramtre,
empty() : retourne un boolen selon que la variable est non vide te non nulle.

Enfin, trois fonctions aident la ralisation du transtypage de variables :


int intval(variable),
float floatval(variable),
string strval(variable).
Chacune de ces fonctions retourne la valeur transtype de l'argument pass en paramtre.

2.3

Porte des variables

A linverse dautres langages comme le C, il est inutile en PHP de dclarer les variables avant de les
utiliser. Cest lune des caractristiques des langages interprts.
Il est noter que comme dans la plupart des langages, la porte des variables gale celle du bloc o elle a
t utilise pour la premire fois (ce qui quivaut une dclaration). Dans les cas o une variable dclare
dans une fonction est ncessaire au niveau global, il est possible de lui tendre sa porte de manire ce
quelle continue dexister une fois la fonction termine. On pourra pour cela la dclarer comme globale :
Exemple
function maFonction( ) {
global maVar ;

Une autre manire plus lgante est dutiliser le mot cl static qui dans la plupart des cas permet de
saffranchir de lutilisation peu lgante de global.
Exemple
static mavar ; // static a le mme comportement quen C

2.4

Assignation de valeurs aux variables

Lorsque lon assigne une valeur une variable (=), son type change pour correspondre au type de donnes
qui lui est affect. Ce fonctionnement est linverse du C qui lui essaie de convertir la donne au type de la
variable.
Exemple
$machaine1 = Grard ;
$machaine2 = Dupont ;
integer var1 ; // dclaration de variable avec typage
$var1 = 12 ;
$var1 = -45 ;
double var1 ;
$var1 = -3.14

-8-

le signe \ permet dviter laffichage du caractre suivant :


\

Guillemets doubles

\\

Caractre antislash

\n

Nouvelle ligne

\r

Retour chariot

\t

Tabulation

\x00 - \xFF

Caractres hexadcimaux

Il est noter quil est tout fait possible dinclure une variable dans une chane de caractres :
Exemple
print Je suis : $machaine1 <BR> ; // Affichera Je suis Grard

2.5

Constantes

Il existe un certain nombre de constantes cres automatiquement par PHP (nous en verrons quelques unes
plus loin). Il est galement possible de dfinir ses propres constantes avec define(nomconstante, valeur
constante). En ralit, une constante est une variable dont le contenu ne peut tre paramtr quune seule
fois. Comme les variables, les constantes sont par dfaut sensibles la casse. Associ la fonction define,
une autre fonction defined(nom constante) peut tre utilise afin de tester lexistence dune constante
(elle retournera true ou false selon le cas).
Exemple
define(MACONSTANTE, Hello World) ;
if (defined(MACONSTANTE)) {
print La valeur de ma constante est : .MACONSTANTE //Attention, on accde au contenu sans le $.
}

2.6

Oprateurs logiques, binaires, autres

Nous nallons pas dcrire lutilisation de chacun des oprateurs, ils sont quasi-identiques au C.
Oprateurs arithmtiques :
+
*
/
%
++
-Oprateurs logiques
<
>
<=
>=
==
!=
AND &&

Addition
Soustraction
Multiplication
Division
Modulo
Incrmentation
Dcrmentation
Infrieur
Suprieur
Infrieur ou gal
Suprieur ou gal
gal
Diffrent
Et

-9-

OR ||
XOR
!

Ou
Ou exclusif
Sauf

Autres oprateurs
Le . permet de faire une concatnation (print $var1.$var2 affichera le contenu de var1 concatn var2).

Instructions de contrle

Pas de surprises en PHP pour lutilisation des instructions de contrle. Elles sont identiques celles dj
vues en C.

3.1

If, then, else

if (expression) {
Bloc si expression vraie
}
else {
Bloc si expression fausse
}

ou bien
if (expression 1) [
Bloc si expression vraie
}
else if (expressio2) {
Bloc si expression2 vraie
}
else {
Bloc si expression2 est fausse
}

3.2

Switch

switch (expression) {
case exprt1:
default :
}

Exemple d'utilisation de switch


<?php

$note=11;
$extension="fr";

- 10 -

switch($note) {
case $note>10:
echo ("Bac obtenu");
break;

case $note>=12:
echo ("Bac obtenu avec mention AB");
break;

case $note>=14:
echo ("Bac obtenu avec mention B");
break;

case $note>=16:
echo ("Bac obtenu avec mention B");
break;

default :
echo ("Bac non obtenu");
break;
}

print "<br><br>";

switch($extension) {
case "fr" : $pays="France";
break;
case "es" : $pays="Espagne";
break;
case "Be" : $pays="Belgique";
break;
default

: $pays="Inconnu";
break;

}
print "Pays visit : $pays";

php?>

Il nest pas ncessaire de mettre des accolades pour chacun des cas.

- 11 -

3.3

Boucles for, dowhile, for

for (initialisation; expression; incrmentation) {

while (expression) {

do {

} while (expression);

3.4

Instructions break et exit


Les instructions break et exit ont le mme comportement quen C.

Tableaux

Pas de surprises avec lutilisation des travaux, lutilisation est tout fait classique.

4.1

Tableaux une dimension

<?
$bab[0] = Biarritz;
$bab[1] = Anglet;
$bab[2] = Bayonne;

print Je vis $bab[1]. <BR> ;


?>

Dans les cas o lon ne dsire pas se proccuper de mentionner les index, PHP le fera votre place :
$bab [ ] = Biarritz;
$bab [ ] = Anglet;
$bab [ ] = Bayonne;

Si lon dsire savoir combien de valeurs ont t entres dans un tableau, on utilisera la fonction
count(tableau) :
$limiteIndex = count ($bab) ;

et pour les afficher :


for ($index = 0 ; $index < $limiteIndex ; $index++) {

- 12 -

print ($bab[$index] <BR>);


}

Il est galement possible d'indexer les tableaux autrement qu'avec des entiers :
print "Exemples de tableaux : <br>";
$capitale[fr]="Paris";
$capitale["es"]="Madrid";

print "La capitale de l'Espagne est : $capitale[es]";

A noter que les guillemets ne sont pas ncessaires l'initialisation, mais ils ne doivent pas tre mis
l'utilisationautant dire qu'il est inutile de les mettre !

4.2

Initialisation

Il est galement possible de dclarer un tableau avec ses initialisations. Ce type de tableau est appel
associatif :
<?
$mois=array(2=> Janvier, Fvrier, Mars,
Avril, Mai, Juin, Juillet, Aot, Septembre, Octobre, Novembre, Dcembre) ;
?>

print Mois de $mois[5] ; affichera Mois de Avril .

Loprateur => permet ici de faire dmarrer le tableau lindex 2 et non pas 0 comme cest le cas par
dfaut.
Enfin, il n'est pas ncessaire d'avoir des tableaux avec des indices numriques successifs.
$tabbizarre[12] = "pas bien grand";
$tabbizarre[1025] = "plutot grand";
$tabbizarre[15215] = "trs grand";

Afin d'accder aux lments, un ensemble de fonctions sont dfinies :


print "Key : ".key($tabbizarre)." <br>";
print "Current : ".current($tabbizarre)." <br>";
print "Next : ".next($tabbizarre)." <br>";
print "Prev : ".prev($tabbizarre)." <br>";

> Key : 12
> Current : pas bien grand
> Next : plutot grand

- 13 -

> Prev : pas bien grand

Afin de raliser un parcours efficace de ce genre de tableaux, deux fonctions sont bien utiles. La fonction
each permet de renvoyer uniquement les lments du tableau contenant les donnes. La fonction list
($indice, $valeur) rcupre l'indice et la valeur de l'lment.
while (list($indice,$contenu) = each ($tabbizarre))
print "$contenu <br>";

4.3

Tri de tableaux

La fonction sort() permet de trier dans l'ordre alphabtique le contenu d'un tableau. Sa cousine ksort() fait
de mme mais dans l'ordre inverse. Les deux autres asort() et arsort()font la mme chose mais pour des
tableaux avec indice entiers.
$tabatrier[] = "albert";
$tabatrier[] = "george";
$tabatrier[] = "bacus";

sort($tabatrier);
while (list($indice,$contenu) = each ($tabatrier))
print "$contenu <br>";

print "<br>";

rsort($tabatrier);
while (list($indice,$contenu) = each ($tabatrier))
print "$contenu <br>";

> albert
> bacus
> george

> george
> bacus
> albert

4.4

Tableaux dimensions multiples

Lutilisation de tableaux dimensions multiples est l encore semblable aux autres langages. Ainsi si un
tableau reprsente un chiquier, nous accderons aux valeurs en faisant par exemple :
$echiquier[5][4] ;

- 14 -

Entres/Sorties

PHP tant un langage de script, il doit pouvoir tre capable de communiquer avec son environnement. Les
scripts PHP tant excute dans le contexte dun navigateur Web, il est important de se rappeler que toute
sortie vers le navigateur sera interprte comme du texte HTML.

5.1

Envoi vers le navigateur

Trois fonctions permettent denvoyer du texte vers le navigateur : echo, print et printf. Lintrt principal
de cette dernire fonction est, nous le verrons plus tard, la possibilit de spcifier un format de sortie afin
dviter denvoyer la valeur telle quelle.

5.2

Rcupration des donnes dun formulaire

Si lenvoi de donnes vers le navigateur est simple en utilisant les trois fonctions dcrites prcdemment,
la rcupration dinformations en provenance du navigateur lest un peu moins.
Le langage HTML permet la rcupration de donnes dun formulaire : champs/zones de texte, listes
droulantes, cases cocher,
PHP transforme tous les champs dun formulaire en variables ce qui permettra de modifier
ventuellement leur contenu.
Soit le formulaire suivant :
<FORM ACTION="/php/myprogramme.php"

METHOD="POST">

Saisissez votre nom :


<INPUT TYPE="TEXT" NAME="NOM" SIZE="20"> MAXSIZE="50" ><BR>
<INPUT TYPE="SUBMIT" VALUE="Envoyer la requte">
</FORM>

Dans le fichier myprogramme.php, il sera possible de rcuprer la valeur saisie dans le champ NOM de la
manire suivante :
$nom = $_POST[NOM] ;

Attention, vous trouverez dans de nombreux scripts une rcupration de variable de formulaire
directement (print $NOM ) ou via des tableaux noms longs comme $HTTP_GET_VARS. Cette
technique employe jusqu peu montre ses limites avec les dernires versions de PHP (et quel que soit le
mode de passage des paramtres : POST, GET, cookie, session, ). La diffrence est que depuis la
version 4.2.0, loption register_globals du php.ini qui tait positionne par dfaut ON est OFF. Donc,
autant prendre de bonnes habitudes et utiliser la nouvelle technique . Pour vrifier la version de PHP,
utilisez la fonction phpinfo() qui retourne une multitude dinformations. Ca vaut le coup dil.
Voici un rcapitulatif des variables et des changement selon les versions :
Avant la version 4.10 (deprecated)
$HTTP_GET_VARS
$HTTP_POST_VARS
$HTTP_POST_FILES
$HTTP_COOKIE_VARS
$HTTP_SESSION_VARS
$HTTP_ENV_VARS
$HTTP_SERVER_VARS

Aprs la version 4.10


$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_ENV
$_SERVER

- 15 -

Pour rcuprer facilement les variables, vous pouvez utiliser la fonction PHP extract. Elle va exporter
votre tableau associatif et crer une variable pour chaque cl du tableau.
extract($_POST,EXTR_OVERWRITE);
Cette fonction va crer une variable pour chaque cl du tableau associatif $_POST. Si l'on a :
$_POST['nom']
$_POST['prenom']
$_POST['age']
La fonction extract() va crer les variables suivantes :
$nom
$prenom
$age
Type
EXTR_OVERWRITE
EXTR_SKIP
EXTR_PREFIX_SAME

EXTR_PREFIX_ALL
EXTR_PREFIX_INVALID

5.3

signification
crase les variables existantes
N'crase pas les variables existantes
Si une variable existe dj, une nouvelle variable
est cre avec un prfix donn en 3me argument
la fonction
Cre de nouvelles variables avec le prfix pass en
3me argument pour toutes les cls du tableau
Cre de nouvelles variables avec le prfix pass en
3me argument pour les noms de variable invalides
(par exemple $1)

Rcupration des variables denvironnement

Tableau $_SERVER
PHP_SELF : Le nom du fichier du script en cour d'excution, par rapport au document root.
SERVER_NAME : Le nom du serveur hte qui excute le script suivant. Si le script est excut
sur un hte virtuel, ce sera la valeur dfinie pour cet hte virtuel.
DOCUMENT_ROOT : La racine sous laquelle le script courant est excut, comme dfini dans
la configuration du serveur.
REMOTE_ADDR : L'adresse IP du client qui demande la page courante.
REMOTE_PORT : Le port utilis par la machine cliente pour communiquer avec le serveur
web.
SCRIPT_FILENAME : Le chemin absolu jusqu'au script courant.
SERVER_PORT : Le port de la machine serveur utilis pour les communications. Par dfaut,
c'est '80'. En utilisant SSL, par exemple, il sera remplac par le numro de port HTTP scuris.
REQUEST_URI : L'URI qui a t fourni pour accder cette page. Par exemple : '/index.html'.
Tableau $_FILE
[NOM OBJET FILE][name] : permet de rcuprer le nom du fichier slectionn dans un
objet file du navigateur (exemple, fichier tlcharger).
[NOM OBJET FILE][tmp_name] : retourne le nom du fichier temporaire stock sur le
serveur, en attente de transfert la destination dsire.
[NOM OBJET FILE][size] : retourne la taille en octet du fichier.

- 16 -

[NOM OBJET FILE][type] : donne le type MIME du fichier.

Rutilisation de code
6.1

Fonctions include/require

Tout comme il est possible de raliser des inclusion de fichiers en C avec la directive de compilation
#include il est galement possible de le faire en PHP avec la fonction include(nom de fichier) ou
require(nom de fichier). Ces fonctions trs utiles permettent une rutilisation maximale de fonctions dj
crites. Il est noter que mme si l'extension n'a aucune importance, la norme d'utilisation des inclusions
est .inc.
Il n'y a pas de diffrence fondamentale entre require et include. La diffrence est que si un problme
survient, require produira une erreur fatale alors que include ne produira qu'un avertissement.
La syntaxe des fichiers inclure a son importance. Dans le cas o le texte inclus ne possde pas de balises
<? et ?> , le texte sera inclus tel quel , sans interprtation, ce qui peut tre intressant pour par
exemple ajouter systmatiquement des entte/pieds de pages des pages HTML. Par contre si des balises
sont trouves, le code correspondant sera excut et insr l'endroit o la fonction est appele :
Codeareutiliser.php
<?
print Je suis du code rutiliser <br> ;
?>

codequireutilise.php
print Debut du code <br> ;
require (''codeareutiliser.php'');
print Fin du code <br>'';

Donnera :
Debut du code
Je suis du code rutiliser
Fin du code

6.2

Dclaration et utilisation de fonctions

Comme dans la plupart des langages de programmation, il est galement possible dcrire ses propres
fonctions en PHP.

6.2.1 Dclarations
La syntaxe est proche de ce qui est ralis par exemple en C :
function nomFonction (paramtres) {
Corps de la fonction
}

- 17 -

6.2.2 Arguments
Voici par exemple une fonction qui permet dafficher en gras une chane de caractres :
function bold ( $machaine ) {
print <B> . $machaine . </B> ;
}

Comme cela est possible en C++, nous pouvons dfinir des paramtres par dfaut :
function afficher($maChaine, $couleur = black) {
print <FONT COLOR=\ $Color\ > $maChaine </FONT> ;
}

Si le deuxime paramtre nest pas prcis lors de lappel, la fonction choisira le noir.
Par dfaut, les passages de paramtres sont raliss par recopie. Il est possible de raliser un passage de
paramtres par rfrence (l'original donc !) en prcdent le nom du paramtre par & dans la dclaration de
la fonction, l'instar de ce qui se fait en C.

6.2.3 Retour de paramtres


Il est galement possible de faire retourner une valeur la fonction :
function retourneBold ( $machaine ) {
$chaineTmp = <B> ;
$chaineTmp .= $machaine ; // Le point permet de concatner
$chaineTmp .= </B> ;

return ($chaineTmp) ;
}

7 Lecture/criture de fichiers
Comme dans la plupart des langages, afin de travailler avec un fichier, il est ncessaire douvrir laccs au
fichier, dy accder, puis de le fermer.
Il est possible en PHP douvrir un fichier local (fonction fopen) ou distant et le dsignant par une URL et
un protocole (http ou ftp).
Les diffrents modes d'ouvertures sont les suivants :
r: ouverture en lecture seule partir du dbut,
r+: ouverture en lecture/criture partir du dbut,
w: ouverture en criture seule. Si le fichier existe dj, il est cras, sinon, il est cre (si possible),
w+: ouverture en lecture/criture. Si le fichier existe dj, il est cras, sinon, il est cre (si possible),
a: ouverture en ajout uniquement. Les donnes sont crites la fin du fichier, s'il n'existe pas, il est
cre (si possible),
a+: ouverture en lecture et ajout. Les donnes sont crites la fin du fichier, s'il n'existe pas, il est
cre (si possible).
Afin de revenir au dbut du fichier, il est ncessaire d'utiliser la fonction fseek. Le premier paramtre est
l'identifiant du fichier retourn par fopen, le second paramtre est l'offset (dcalage en nombre d'octets,
partir du dbut du fichier - exprim par un entier).

- 18 -

Nous nallons pas le dcrire ici, mais il est galement possible daccder des fichiers en ouvrant un
canal ou pipe avec la fonction popen ou en ouvrant une connexion par socket avec fsockopen.
Voici un exemple douverture fichier :
<?
$monFichier = fopen(monfichier.txt, w) ; // ouverture en criture
if ( !($monfichier)) {
print( Impossible de crer le fichier \n) ;
exit ;
}

fputs($monfichier, ligne 1) ; // on crit deux lignes


fputs($monfichier, ligne 2) ;

fclose($monfichier) ; // on ferme le fichier, on libre les ressources

$monfichier = fopen(monfichier.txt, r) ; // ouverture en lecture


if ( !($monfichier)) {
print( Impossible douvrir le fichier ) ;
exit ;
}
while ( !feof($monfichier) ) {
$ligne = fgets($monfichier,255); // 255 caractres max. ou bien fin de ligne.
print $ligne <BR> ;
}

fclose ($monfichier) ;

?>

On peut galement accder des fichiers distants en passant par une URL :
$url = http://wwwbay.univ-pau.fr/~roose/index.shtml ;
fopen($url) ;

Il est parfois ncessaire de lire un fichier pour lafficher par la suite dans le navigateur. La fonction
readfile permet ceci en renvoyant le contenu du fichier vers le navigateur. La valeur retourne est le
nombre doctets lus. Si le nom du fichier commence par http:// ou ftp://, laccs ce dernier sera fait via
lun de ces protocoles. Dans le cas o aucun protocole nest spcifi, laccs se fait sur le systme local,
celui sur lequel est hberge la page PHP correspondante.
Il existe toute une srie de fonctions associes aux fichiers, comme :

- 19 -

fgetcsv (descripteur, longeur max, sparateur) : permet de lire une chane de caractre en ne prenant
pas le marqueur de fin de ligne comme fin, mais le sparateur prcis. Trs pratique pour lire des
contenus exports au format csv.
file_exists(descripteur de fichier) : teste lexistence dun fichier (ne fonctionne pas avec des accs
HTTP ou FTP).
filesize( nom fichier) qui retourne la taille en octets du fichier.
fseek (descripteur fichier, offset) : permet de se positionner loctet offset dans le fichier. Cette
fonction retourne 0 si tout cest bien pass, -1 sinon.
rewind (descripteur): place le pointeur au dbut du fichier.
chmod(fichier, droits unix) : change les droits du fichier ( condition que le serveur PHP ai galement
les droits dessus).
unlink(nom du fichier) : supprime ce fichier.
is_dir( nom fichier) ; is_executable(nom fichier), is_link( nom fichier), is_readable( nom
fichier), is_writeable( nom fichier) permettant de savoir si un fichier est un rpertoire,
excutable, un lien, si les droits en lecture ou criture sont valides. Lorsque les valuations sont
vrifies, 1 est retourn, 0 sinon.
opendir( nom rpertoire) retourne un tat de rpertoire exploitable par la suite avec readdir et
closedir.
readdir(descripteur de rpertoire), retourne le nom du fichier suivant partir du descripteur de
rpertoire obtenu avec opendir. On fermera le rpertoire avec closedir comme on le fait lorsque lon
ouvre un fichier.
fgetcsv(descripteur, nb max de car lire, dlimiteur). Lorsque lon a faire une ficher encod au
format CSV (chaque champs spar par un dlimiteur), il est possible dutiliser la fonction : fgetcsv
qui sutilise un peu comme la fonction explode. Elle retourne un tableau dont chaque case est un
champ de la ligne lue au format CSV. Sur le mme format, il existe la commande fputcsv.

7.1

Transfert de fichiers (upload)

Il est frquent de dsirer transfrer un fichier d'un ordinateur vers le serveur PHP. Afin de raliser ceci, il
est ncessaire d'implmenter la fonction d'upload.
Pour ce faire, il faut utiliser la fonction move_upload_file(source, destination). Il est noter que la source
est un fichier dj prsent sur le serveur mais gnralement dans un rpertoire temporaire. Ce fichier aura
t mis dans ce rpertoire l'aide par exemple du code HTML suivant :
<form ENCTYPE="multipart/form-data" action="upload.php" METHOD="POST">
<input type="file" name="nomfichier"> <br>
<input type="submit" value="Tlcharger">

On se rfrera au tableau $_FILE pour plus d'informations. Bien videmment, on prendra soin de grer
les droits en criture du rpertoire destinataire.
Une fois le transfert ralis (appui sur le bouton submit) la premire chose faire est de vrifier que
l'opration s'est bien passe en vrifiant la prsence du fichier dans le dossier temporaire; pour cela, nous
avons notre disposition la fonction is_uploaded_file($_FILES['fichier']['tmp_name']). Une fois la
vrification ralise, on copie le fichier sur notre espace web l'aide de la fonction
move_uploaded_file(string $filename , string $destination) qui est plus sre que la fonction copy(), car
elle vrifie que le fichier copier vient bien du dossier temporaire (et donc, provient d'un formulaire
d'upload).

- 20 -

Fonctions diverses

8.1

Fonctions de traitement sur des donnes

Il est frquent davoir des fichiers contenant diffrents champs spars par un dlimiteur quelconque. Une
fonction trs utile dans ces cas l est la fonction explode. Sa syntaxe est la suivante
explode ( caractre dlimiteur , chane de donne)

Prenons un exemple avec lextrait de fichier suivant :


Roose | Philippe | Iut Informatique | Bayonne | Informatique
Goudin | David | LaBri | Bordeaux | Calcul Parallle

Ce fichier dcrit des enseignants avec leur nom, prnom, lieu de poste, matire principale. Si lon
souhaite afficher ce fichier dune manire plus jolie , il est ncessaire de rcuprer champs aprs
champs et dafficher chacun deux comme dsir. Sans la mthode explode, il serait ncessaire de
rcuprer caractre par caractre, tester si le sparateur est atteint, si oui,
explode ralise ce travail pour nous en retournant dans un tableau lensemble des champs. Il ne reste plus
qu boucler sur ce tableau pour rcuprer les valeurs et les traiter.
Il est noter quil existe sa rciproque, la fonction implode qui retourne une chane et qui accepte en
paramtre un tableau et un dlimiteur (qui peut tre lui mme une chane).
Il existe une variante explode appele strok() (ok pour token) qui contrairement explode qui ralise le
dcoupage en une fois, le ralise ici chaque itration :
$token = strok($mavariable,'' | '');
while ($token != ' ') {
print $token. ''<br>'';
$token = strok($mavariable,'' | '');
}

Lensemble des fonctions classiques rencontres en C sur les chanes se retrouvent galement en PHP.
On y retrouve ainsi : strlen, strcmp, strcasecmp(idem strcmp, mais respecte la casse), mais aussi :
strpos (chane, sous chane) : retourne la position de la sous chane dans la chane. Dans le cas o la
chane existe en plusieurs exemplaires, cest la position de la premire occurrence qui est retourne.
strrpos retourne quand elle la position de la dernire occurrence.
strstr (chane, sous chane) retourne la portion de la chane partir de la premire occurrence de la
sous chane.
str_replace (chane remplacer, nouvelle chane, chane complte) : Permet de remplacer une sous
chane par une autre dans une chane de caractres. Il est noter que la chane remplacer peut
galement tre un tableau de chane afin de contenir par exemple une liste de termes remplacer par
un seul unique autre.
foreach (nom tableau) : A chaque appel, cette fonction retourne la valeur suivante du tableau.
strlen (chane) : retourne la taille de la chane.
strtolower|strtoupper (chane) : retourne la chane passe en paramtres an minuscules (resp.
majuscules).

- 21 -

ucfirst (chane) : permet de mettre en majuscule la premire lettre de la chane.


ucwords(chane) : met en majuscule la premire lettre de chaque mot.
str_replace (car dorigine, car de destination, chane) : remplace le caractre dorigine par le
caractre de destination dans la chane.
trim(chane) : supprime les caractres invisibles (espaces,\n, ) au dbut et la fin de la chane. Il
existe ltrim et rtrim qui ralisent la mme chose mais uniquement pour les blancs gauche ou
droite.
nl2br (chaine) : remplace chaque caractre de nouvelle ligne par son code HTML. Sur la versions
antrieurs PHP 4.05, c'est <BR> qui est mis, sinon, c'est le code en XHTML <BR /> qui est alors
ajout.
ereg(chane chercher, chane) : retourne vrai si la chane chercher (sous forme de chane ou sous
forme dexpression rgulire) est contenue dans chane. Le format des expressions rgulires peut
tre au format POSIX et Perl (POSIX et celui par dfaut).
addslashes (chane)/stripslashes(chane) : ces deux fonctions retournent la chane passe en
paramtre en ajoutant/retirant des caractres d'chappement devant chaque caractre spcial. Il est
possible que la version de PHP le fasse automatiquement si la directive de compilation
magic_quote_gpc est active (elle l'est sur les versions rcentes). Il est possible de le vrifier avec la
fonction magic_quote_gpc().
Il est frquent d'avoir retourner des guillemets vers le navigateur, le problme est qu'il faut ajouter un
caractre d'chappement devant chaque :
print ''ceci sont des ''guillemets'' ''; // syntaxe invalide
print ''ceci sont des \''guillemets\'' ''; // syntaxe valide mais lourde
print ''ceci sont des 'guillemets' ''; // syntaxe valide
print 'ceci sont des ''guillemets'' '; // syntaxe valide

8.2

Fonctions mathmatiques

On retrouve en PHP lensemble des fonctions mathmatiques que lon retrouve en C, savoir :
abs, cos, sin, tan, acos, , exp, sqrt, Ces fonctions acceptent un nombre en paramtre et retournent, la
valeur absolue, le cosinus, le sinus, la tangente, larc cosinus, , le carr, la racine carre,
Il existe galement une fonction pi( ) retournant une valeur approche de PI.

8.3

Gestion de date, heure, temps

Dans ce domaine galement, PHP fournit un ensemble de fonctions particulirement apprciables


comme date(format).
Les codes des formats de date sont les suivants :
Code
Description
a
am ou pm
A
AM ou PM
d
Jour du mois avec suppression des 0
D
Jour de la semaine, abrg en trois lettres
F
Nom du mois
h
Heure, de 1 12
H
Heure, de 0 24
i
Minutes
j
Jour du mois, avec conservation des 0
l
Jour de la semaine

- 22 -

m
M
S
U
y
Y
z

Chiffre du mois
Abrviation du nom du mois
Suffixe ordinal pour le jour du mois
Nombre de secondes depuis le 1/1/1970
Anne, sur 2 units
Anne, sur 4 units
Jour de lanne

Exemple dutilisation :
<?
$ladate=date( l j F Y);
$lheure=date(h : i - a) ;
print Nous sommes le $ladate <BR> ;
print Il est : $lheure <BR> ;
?>
Affichera :
Nous sommes le Thursday 16 November 2000
Il est : 08:56 - am

Il est une autre fonction qui peut avoir son utilit, cest la fonction sleep(nombre de secondes) qui ralise
une pause dans lexcution du script. La fonction usleep fait de mme, mais lunit est la miliseconde.

8.4

Fonctions orientes serveur

Il est possible d'excuter des commandes systme directement sur le serveur :

passthru(commande)/system(commande) : permet d'excuter une commande sur le serveur et de


visualiser le rsultat sur la sortie standard (exemple : passthru("ls -l"); donnera l'cran la liste
des fichiers du rpertoire contenant le script o est situe cette instruction). passthru retourne les
rsultats la fin de l'excution de la commande alors que system essaie de les envoyer au fur et
mesure qu'ils sont retourns.

exec (commande[, resultat]) : ralise la mme chose que prcdemment mais sans cho sur la
sortie standard. Si le second paramtre est donn, il contiendra un tableau de chanes avec
chaque ligne du rsultat.

Srialisation

Il est parfois ncessaire de sauvegarder un objet ou le contenu d'un tableau dans son tat. Un mcanisme
de srialisation est aussi mis disposition. Il transforme dans un format de type chane de caractres le
contenu d'un tableau ou un objet quel qu'il soit.
Pour ce faire, deux fonctions de srialisation (encodage) et dsrialisation (dcodage) sont ncessaires :
$monobjetserialise = serialize($monobjet); // srialisation
$monnouvelobjet = unserialize ($monobjetserialise); // dsrialisation

Attention, au moment de la dsrialisation d'un objet, il est ncessaire de connatre la structure de classe
(d'o l'intrt de l'utilisation des fonctions include/require !)

- 23 -

L'intrt est qu'au del de l'encodage, il est ainsi possible d'envoyer via le rseau des objets/tableaux en
PHP, mais galement de sauvegarder des objets/tableau aisment dans des fichiers/BD pour les retrouver
tels quels plus tard.

10 Fonctions orientes rseau


10.1 Mail
Il existe une mthode PHP permettant denvoyer un mail directement, sans appeler un quelconque
gestionnaire de courrier.
La fonction mail (ou email parfois) permet de raliser cela. Elle ncessite au moins trois paramtres :
Le destinataire,
Lobjet du message,
Le corps du message.
<?
mail(dupont@mondomaine.fr, Test de la commande mail, Voici le corps du mail) ;
?>

Enverra un mail dupont@mondomaine.fr avec comme sujet de mail Test de la commande mail , et
comme corps du mail : Voici le corps du mail .

10.2 FTP
La connexion un serveur FTP requiert la mme chose qu'une authentification un SGBD : une URL, un
identifiant de connexion, un mot de passe.
ftp_connect(URL) : retourne un identifiant de connexions l'URL spcifie
ftp_login (''roose'',''mp'') : retourne un code d'erreur dans le cas d'une authentification errone,
ftp_quit(identifiant) : termine la connexion,
ftp_fget(identifiant connexion, identifiant fichier local, nom fichier distant, mode[FTP_BINARY |
FTP_ASCII]). Avant de rcuprer un fichier, il est ncessaire d'ouvrir un fichier sur le serveur en
mode cration (w). Celui-ci contiendra le fichier rcupr.
ftp_get(identifiant connexion, fichier local, fichier distant, mode) : identique au prcdent, mais
ne demande pas l'ouverture pralable du fichier local.
ftp_fput (identifiant connexion, nom fichier distant, identifiant fichier local, mode) : permet de
transfrer un fichier pralablement ouvert en lecture vers le serveur FTP sur lequel on est
identifi.
ftp_put (identifiant connexion, nom fichier distant, nom fichier local, mode) : idem mais sans
ouverture du fichier pralable.
set_time_limit (nb secondes) : permet de limiter le temps d'excution du script (du script, et pas
du transfert) en cas de problme. Par dfaut, si cette fonction n'est pas utilise, le temps est de 30
secondes.
ftp_size (identifiant, nom du fichier distant) : retourne la taille du fichier distant, -1 en cas
d'erreur. Cette fonction permet entre autre de calculer le temps ncessaire au transfert.
ftp_nlist (identifiant, dirname(nom rpertoire)) : permet d'obtenir la liste des fichiers dans un
rpertoire donn. Cette commande est utilise par exemple afin dcrire l'quivalent de la
commande mget.

- 24 -

$liste_fichiers = ftp_nlist($odentifiant, dirname($chemin));


foreach ($liste_fichiers as $fichier)
print ''$fichier <br>'';

11 Base de donnes
PHP offre un nombre de fonctions impressionnantes permettant aux scripts de rcuprer des donnes
partir de quantit de SGBD diffrents. En natif, PHP gre les drivers pour accder aux SGBD
PostgreSQL, dBase, mSQL, mySQL, Oracle, FilePro, Informix, Sybase, InterBase ainsi que tous les
SGBD supportant les accs via ODBC (Open DataBase Connectivity).
Nous nallons pas dcrire lensemble de ces fonctions, mais uniquement celles qui sont ncessaires pour
une utilisation classique .
Nous allons nous baser ici sur une connexion un SGBD distant de type mySQL avec une interrogation
de la base en SQL.

11.1 Ouverture dune base


Il existe essentiellement deux fonctions permettant laccs une base. La premire, mysql_connect
permet de se connecter au SGBD, la seconde mysql_select permet de slectionner une base.
Exemple
<?
$bdd= "mabase"; // Base de donnes
$host= "sql.iutbayonne.univ-pau.fr";
$user= "roose"; // Utilisateur
$pass= "12345";

mysql_connect($host,$user,$pass) or die ("Impossible de se connecter la base de donnes");


mysql_select_db($bdd);
?>

Lexemple prcdent va permettre de se connecter sur le SGBD mySQL situ ladresse


sql.iutbayonne.univ-pau.fr, avec une identification personnelle.
Bien videmment, comme laccoutum, lorsquon ouvre quelque chose en informatique, on le referme.
On noubliera pas donc de fermer laccs la BD lorsque lon en aura termin avec elle, avec
msql_close( ).

11.2 Requtes SQL


Une fois la base de donnes ouverte, il est possible de linterroger en langage SQL classique. Pour cela, il
est ncessaire de lui transmettre la requte laide de la fonction : msql_query dont voici un exemple
dutilisation :
$query = "SELECT num, pays, date, circuit FROM $nomtable "; //$nomtable contient le nom de la table.
$result= mysql_query($query);

- 25 -

Bien quici la requte est mise dans une variable, il est tout fait possible de linclure directement dans la
commande mysql_query.
Gnralement aprs chaque requte, on teste si tout cest bien pass. Pour cela, on appelle la fonction
mysql_error qui rcupre le dernier message derreur retourn par une fonction mySQL.
if (mysql_error()){ // Erreur base de donnes, srement la table qu'il faut crer
print

"Erreur dans la base de donnes : ".mysql_error(); // On concatne et on affiche lerreur

produite.
exit();
}

11.3 Rcupration de donnes


La fonction mysql_fetch_row( ) retourne un tableau qui reprsente tous les champs dune range de
rsultat (un tuple). Chaque appel produit le tuple jusqu ce quil ny en ait plus.
Il existe dautres fonctions pour raliser cela, mais celle-ci est la plus rapide pour obtenir des rsultats
partir dune requte.
while ($row=mysql_fetch_row($result)) // $result a t obtenu par le msql_query prcdent.
{
// rcupration des informations
$num = $row[0];
$pays = $row[1];
$date = $row[2];
$circuit = $row[3];

;
}

A noter qu'au lieu d'utiliser les indices 0, 1, ... il est possible de donner le nom du champ ($row['pays'])
la condition d'utiliser mysql_fetch_array() en lieu et place de mysql_fetch_row().

11.4 Autres fonctions


mysql_list_db ( ) retourne un tableau contenant les noms des bases disponibles. C'est le pendant de
SHOW DATABASES en SQL.
mysql_list_tables( ) ralise la mme chose que prcdemment, mais pour les tables. C'est le pendant de
SHOW TABLES en SQL.
mysql_num_rows( ) retourne le nombre de lignes d'un rsultat obtenu par une requte.

11.5 Utilisation dODBC


Afin de communiquer avec divers SGBD, un logiciel client utilise une API (Application Programming
Interface) appele ODBC. Ces API sont gnralement crites par les diteurs de SGBD eux mmes. Il est
ainsi possible partir dun mme programme daccder diffrents SGBD partir du moment o lon
possde les drivers de son API.
ODBC utilise le langage SQL support par la quasi totalit des SGBD, et particulirement, les SGBD
relationnels.

- 26 -

Nous nallons pas dcrire lutilisation des fonctions ODBC puisquelles sutilisent de manire identique
celles dcrites prcdemment pour mySQL.

12 Manipulations dimages
Grce la librairie GD intgre PHP, il existe toute une srie de fonctions permettant de manipuler,
entre autres, des images au format JPEG (Joine Photographic Experts Group), PNG (Portable Network
Graphics) et WBMP (Wireless BMP). Elles permettent par exemple de retourner directement une image
cre au cours du script PHP.
Le choix du format se fait en fonction des images gnrer. Le format JPEG est plutt utilis pour des
images riches en couleurs et/ou en dgrads (comme les photos). C'est un codage avec compression et
avec pertes. Le PNG est en train de remplacer le GIF (intgre le codage Lempel Ziv Welch protg par un
brevet via la socit UNISYS c'est donc un format propritaire ET payant). Ce format permet une
compression sans perte et s'utilise particulirement pour des images contenant du texte, des tracs et des
couleurs unies (boutons de sites web, bannires, etc.). Ce format permet la transparence et l'entrelacement
que ne permet pas le JPEG. Les adeptes du GIF anim seront dus, le PNG ne le permet pas. Un format
appel MNG qui le permettra est en cours de dveloppement.
Enfin, le WBMP est spcifique aux priphriques sans fils. Il n'est pas encore gnralis.
Nous nallons pas dcrire ici toutes les (trs) nombreuses fonctions qui nous demanderaient plus de temps
que nous nen navons mais nous allons dcrire les principales qui nous servirons dillustration afin de
comprendre les mcanismes.

12.1 Squence de gnration dune image


La gnration d'une image se ralise en 4 tapes incontournables :
1. Cration/Lecture de l'image (dimensions) qui servira de fond,
2. Ajout de dessins, formes, textes, actions sur ses paramtres (taille, correction gamma, etc.)
3. Gnration de l'image retour vers le navigateur (ou un fichier),
4. Suppression de l'image sur le serveur
Afin que votre navigateur sache que ce sont des images quil va recevoir, il est ncessaire que la premire
information qui lui est communique soit le type de limage.
<?
header( Content-type: image/jpeg ) ; // ATTENTION, respecter scrupuleusement la syntaxe

?>

12.2 Cration dune image


Une fois que le type de limage retourner au navigateur est dfini, il faut indiquer la taille de limage en
pixel par la fonction :

ImageCreate(largeur, hauteur). Celle-ci retourne lidentifiant dune image. Cet identifiant sera
utilis par la plupart des fonctions graphiques. On pensera imprativement librer lespace

- 27 -

mmoire une fois que limage cre est termine (ImageDestroy(identifiant image) ). La
destruction dune image nimplique pas sa disparition lcran puisqu'elle aura au pralable t
retourne au navigateur.
ImageCreateTrueColor(largeur, hauteur) : idem prcdent, mais en vrai couleurs et pas sur une
palette
ImageCreateFrom[PNG|JPEG|GIF]( nom de l'image ) : permet de crer une image partir
d'une autre dj existante (la cration partir GIF est autorise l'image retourne au navigateur
ne sera pas un GIF).

12.3 Gestion des couleurs


Maintenant que nous connaissons la fois le format et la taille de notre image, on peut choisir une
couleur :
ImageColorAllocate(image, rouge, vert, bleu).
Cette fonction alloue une couleur limage spcifie. Chaque composant de couleur peut prendre une
valeur entre 0 et 255. Lidentifiant retourn servira dans dautres fonctions pour faire rfrence cette
couleur.
Imagegammacorrect(image, gamma_in, gamma_out);
Cette fonction permet de jouer sur la luminosit dune image. Le taux se calcule par un ration entre la
gamma_in et le gamma_out. Ainsi, si gamma_in = 1 et gamma_out = 2, limage sera 2 fois plus claire.
Un gamma_in infrieur gamma_out lassombrira.

12.4 Gestion des formes

ImageFill (image, x dbut, y dbut, couleur) permet de remplir un espace vide par une couleur.
Utilise ds le dpart, elle permet de donner un fond une image. Attention, les coordonnes
(0,0) correspondent au coin suprieur gauche.
Image[Dashed]Line(image, x dbut, y dbut, x fin, y fin, couleur) trace une ligne (en pointill
pour ImageDashedLine)en partant des coordonnes (x dbut, y dbut) jusqu (x fin, y fin).
Image[Filled]Polygon(image, tableau de points, nombre de points, couleur) autorise le dessin de
polygone plein (ImageFilledPolygon) ou juste le contour (ImagePolygon). Les coordonnes sont
contenues dans un tableau de points (2 2), le paramtre nombre de points indique combien de
points sont rcuprer dans le tableau.

<?
imagefilledpolygon($image, array(100,10,50,60,150,60), 3 $color) ; // trace un rectangle
?>

Image[Filled]Rectangle($image, x haut gauche, y haut gauche, x bas droite, y bas droite,


couleur) trace un rectangle plein (ImageFilledRectangle) ou son contour (ImageRectangle),

Exemple : imagefill ($monimage, 0, 0, $macouleur) ;

Plus simple, mais peut tre plus utile (trac de courbes par exemple), la fonction
imagesetpixel(image, x, y, couleur) permet de placer un pixel dans la zone image.

- 28 -

12.5 Gestion des caractres/chanes de caractres


Pour dessiner un caractre/chane de caractres dans une image :
ImageChar($image, police de car., x, y, car , couleur). Le paramtre police correspond au
numro (de 1 5) dune des 5 polices de caractres disponibles en standard dans PHP. Les
coordonnes (x,y) rfrent au coin suprieur gauche de la lettre.
ImageCharUp fait de mme mais avec des caractres orients vers le haut.

ImageString et ImageStringUp sont identiques la prcdente mais permettent le dessin de


chanes de caractres.

ImageLoadFont(nom de la police de caractre) permet de charger de nouvelles polices de


caractres. Ces polices peuvent ensuite tre utilises par exemple avec la fonction ImageString
dj vue prcdemment.

<?
$mapolice=imageloadfont( helvetica ) ;
imagestring($image, $mapolice, 10,10, Coucou , $couleur ) ;
?>

12.6 Gestion des couleurs

ImageColorAt(image, x, y) retourne lindex de la couleur spcifie aux coordonnes x,y.


ImageColorsTotal($image) retourne le nombre de couleurs dans limage spcifie.
ImageColorTransparent(entier image, entier couleur) rend transparente la couleur spcifie (ne
fonctionne qu'avec le PNG).

<?
imagefillrectangle($monimage, 30, 30, 70, 70, $macouleur) ; // dessine un rectangle dans une certaine
couleur
imagecolortransparent($monimage, $macouleur) ; // rend cette couleur transparente.
?>

GetImageSize (nom de fichier) : cette fonction est disponible avec toutes les versions de php (ce
qui nest pas les cas avec les fonctions qui suivront). Le nom de fichier doit correspondre lun
des formats suivants : GIF, JPEG, PNG. Elle retourne un tableau de 4 lments : [0] : largeur en
pixels, [1] : hauteur en pixels, [2] : type dimage (GIF = 1, JPEG = 2, PNG = 3), [3] : chane au
format HTML du type HEIGHT=### WIDTH=### utilisable dans une balise IMG.
Les fonctions imageSX(image) et imageSY(image) permettent se connatre la largeur et la
hauteur dune image (souvent ncessaire pour connatre la taille dune image charge
dynamiquement, par exemple avec ImageCreateFromPng).

12.7 Manipulation dimages


Pour aller plus loin avec la gestion des images, il faut savoir quil existe toute une panoplie de fonctions
trs utiles comme ImageCopyResampled qui permet de redimensionner des images (utilise pour gnrer

- 29 -

des vignettes par exemple) ou imagecopy qui permet de copier une zone dune image dans une autre. La
liste exhaustive est sur http://fr2.php.net/manual/fr/ref.image.php.

imagecopy($image_dest, $image_src, $dest_x, $dest_y, $src_x, $src_y, $src_largeur,


$src_hauteur);
Copie une zone dimage_src dans image_dest. La zone dmarre en src_x et src_y, sur src_largeur
et src_hauteur pixels dans image_dest partie de dest_x, dest_x.

imagecopymerge($image_dest, $image_src, $dest_x, $dest_y, $src_x, $src_y, $src_largeur,


$src_hauteur, $opacite);
Ralise la fusion (merge) de deux images tout en permettant une gestion de lopacit entier entre
0 et 100. Pour le reste, le fonctionnement est identique la fonction imagecopy.

imagecopyresampled ($image_dest, $image_src, $dest_x, $dest_y, $src_x, $src_y,


$dest_largeur, $dest_hauteur, $src_largeur, $src_hauteur);
Permet de redimensionner tout ou partie rectangulaire dimage_src dans image_dest. Ca dmarre en
src_x, src_y vers dest_x, dext_y sur src_largeur, src_hauteur vers dest_largeur, dest_hauteur. Si lon
souhaite redimentionner une image entire dest_x = dest_y = src_x = src_y = 0. Si lon ne veut pas tirer
image, il faut que le ratio dest_x/src_x = dest_y/src_y. Il vaut mieux privilgier cette fonction
ImageCopyResized qui sutilise de faon analogue mais donne des rsultats moins joli et des effets
descalier.
function redimage($img_src,$img_dest,$dst_w,$dst_h) {
// Lit les dimensions de l'image
$size = GetImageSize("$img_src");
$src_w = $size[0]; $src_h = $size[1];

// Teste les dimensions tenant dans la zone


$test_h = round(($dst_w / $src_w) * $src_h);
$test_w = round(($dst_h / $src_h) * $src_w);

// Cre une image vierge aux bonnes dimensions


//

$dst_im = ImageCreate($dst_w,$dst_h);

$dst_im = ImageCreateTrueColor($dst_w,$dst_h);
// Copie dedans l'image initiale redimensionne
$src_im = ImageCreateFromJpeg("$img_src");
//ImageCopyResized($dst_im,$src_im,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);
ImageCopyResampled($dst_im,$src_im,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);

// Sauve la nouvelle image


ImageJpeg($dst_im,"$img_dest");

// Dtruis les tampons


ImageDestroy($dst_im);
ImageDestroy($src_im);

- 30 -

12.8 Rcupration des images


Enfin, une fois les dessins raliss, il est ncessaire de retourner au navigateur l'image ainsi gnre dans
le format dfini :
image[jpg||png|bmp](id image) : retourne limage vers le navigateur.
Il est galement possible denregistrer limage dans un fichier (utile par exemple pour la gnration de
vignettes)
<?
$fichier = 'images/vignettes/image.png';
imagepng($image, $fichier);
?>

Une fois l'image retourne vers la navigateur, celle-ci est devenue inutile sur le serveur. Aussi, afin de
librer ce dernier (n'oublions pas que nous sommes dans un environnement distribu et partag et
donc...nous ne sommes pas seuls !), on appliquera la fonction :
imageDestroy(identifiant image) : supprime l'image du serveur...et pas dans le navigateur !

13 Programmation objet : PHP et les classes (PHP 4/PHP 5)


Avec PHP, on programme comme on veutet mme en objet si on le dsire. Attention, PHP ntant pas
la base un langage de programmation objet, il ne supporte pas tous les concepts inhrents ce
style/philosophie de programmation. Nanmoins, lutilisation de classes bien dfinies permettra aux
utilisateurs dexploiter au mieux les fonctionnalits dj dveloppes.

13.1 Syntaxe de la programmation objet


La syntaxe est fortement inspire du C++.
13.1.1 Allocation dun objet
Tout se passe comme une allocation classique en C++, la seule diffrence est que lon retrouve lternel $
propre au PHP et langage de scripts en gnral.
$monObjet = new maClasse(paramtres ventuels du constructeur) ;

13.1.2

Accs aux mthodes et attributs

$monObjet->nomMethode() ;
$monObjet->nomAttribut = ou $mavar = $monObjet->nomAttribut

On fera attention mettre le $ sur le nom de lobjet et pas sur le nom de la mthode/attribut. Lorsquon
dsirera affecter un attribut relatif soi-mme (le this), on procdera de la mme manire : $this->
PHP nayant pas de dclaration pralable des variables ncessaires, loublie de $this-> ne provoquera pas
derreur, une nouvelle variable sera ainsi dfinie et utilise, mais ce ne sera pas lattribut de la classe.
13.1.3

Dfinition dune mthode

function maMethode([$param1, $param2) {

- 31 -

return $ // permet la mthode de faire un retour de ce que lon veut


}

13.1.4

Dclaration dune classe

class MaClasse {
$attribut1 ;
$attribut2 ;

function maMethode1( ) {

}
function maMethode2($param1, $param2= je suis une chane ) { // paramtre par dfaut

}
} // fin de la dclaration de la classe.

Par dfaut, tout accs un membre (attribut/mthode) est public. Nanmoins, il est tout fait possible d'y
prciser un accs de type private ou protected en plaant le mot cl devant la dclaration de l'attribut et/ou
de la mthode.
Communment, les fichier de dclaration comporteront lextension .inc (pour include). Afin de ne pas
surcharger le code, et dans un but de rutilisation maximum, nous inclurons le code via la commande
include( maclasse.inc ) dans le fichier PHP exploitant cette dernire. On procdera ainsi :
< ?php
include ( maClasse.inc ) ;
?>

<HTML> <HEAD> </HEAD> <BODY>


< ?php
$monObjet = new maClasse() ;
?>
</BODY></HTML>

13.1.5 Autres concepts


L'hritage et oui, et cest souhaitable, il est galement possible de profiter des avantages de lhritage,
mais contrairement au C++ ou SmallTalk, PHP utilise la philosophie chre Java en n'autorisant que
l'hritage simple (pas d'hritage multiple) :
class maClasseHrite extends maClasse {

parent::methode1() // permet d'appeler la mthode ''originale'' de la classe mre


}

- 32 -

La surdfinition d'attributs et de mthodes est galement possible la condition que le membre concern
n'ai pas t dclar final ( final mamethode (...) ),
Afin de palier en partie aux problmes lis l'inexistence d'hritage multiple, PHP permet de dfinier des
interfaces. Une Interface permet de spcifier le squelette d'une classe qui sera implmente dans les
classes implmentant l'interface :
interface AffichezMoi {
function afficher();
}

class maClasseAMoi implements AffichezMoi {


function afficher() {
//implmentation de la mthode de l'interface
}
...// Attention, il ne faut pas implmenter uniquement les mthodes de l'interaface.
}

Nous avons ici une classe qui implmente (ce qui n'est pas exclusif avec l'hritage) une classe dont elle
contiendra le code. Ceci permet de crer des modles de classes en dlocalisant l'implmentation la
classe qui la ncessite afin que l'implmentation colle au mieux aux besoins.
Lors de l'utilisation de classes, il est noter une fonction bien pratique (galement prsente en Java par
exemple) qui permet de connatre la classe d'un objet et donc de raliser des traitement particuliers :
if ($o1 instanceof ClasseA)
...
else
...

galement prsent la possibilit de crer une copie d'un objet l'aide du mot cl clone :
$copie = clone $objet;

Enfin, il est galement possible d'utiliser la rflexivit sur les classes afin d'interroger les classes et objets
pour en connatre leur structure et contenu. Cette API complte ne sera pas dcrite, on pourra consulter la
bibliographie pour plus d'informations.

14 Gestion des Exceptions (PHP 5)


Les programmeurs Java sont familiers avec ce concept. L'ide est d'encapsuler du code problme
dans une section. Si ce code se droule mal, une exception est leve et la procdure associe sera excute
:
try {
// code problme
}

- 33 -

catch (identifiant de l'exception) {


// procdure associe
}

Il est possible d'associer plusieurs procdures (plusieurs catch) un try dans le cas o le code critique
peut lever plusieurs exceptions diffrentes.
Chaque exception tant un objet, un certain nombre de mthodes ont t mise dans la dfinition de la
classe afin de pister l'exception :
getMessage() : retourne la chane de caractre dfinie dansle constructeur,
getCode() : donne le code de l'exception pass au constructeur,
getFile() : donne le nom (avec chemin complet) du fichier dans lequel s'est produite l'exception,
getLine() : retourne le numro de la ligne o s'est produite l'exception,
getTrace()/getTraceAsString() : permet d'avoir une trace complte, une sorte d'historique de ce
qui s'est pass. GetTrace retourne un tableau, getTraceAsString, idem mais sous forme de
chanes de caractres.
try {
...
throw new Exception ('Ae, y a un problme', 1);
}
catch (Exception $e) {
print <br>Exception n: .$e->getCode();
print <br>Message : .$e->getMessage();
print <br>Dans le fichier : .$e->getFile();
print <br>A la ligne : .$e->getLine();
}

Afin de dfinir ses propres exceptions, il est tout fait possible de se crer une classe hrite d'Exception
que l'on lvera par la suite l'aide de throw et qu'on rcupre l'aide de catch.

15 Contrle de sessions
HTTP n'est pas un protocole maintenant un tat entre de transactions. Ceci signifie entre autre qu'il n'est
pas possible de savoir que deux requtes qui se suivent ont t ralises par le mme utilisateur.
Afin de palier ce problme, un certain nombre de mcanismes ont t mis en oeuvre afin de suivre un
utilisateur tout au long de sa session. Mais qu'est ce qu'une session ? C'est une instance d'un navigateur.
Tant que la fentre du navigateur n'a pas t ferme (et que nous sommes dans un dlai imparti), nous
sommes dans la mme session.
Lors d'une cration d'une session, un identifiant alatoire est gnr automatiquement : c'est l'identifiant
de session. Il peut tre stock dans un cookie (petit fichier texte stock sur le poste client ), envoy
dans l'URL (GET) ou par l'environnement (POST).

15.1 Cration de cookies

setcookie (nom, valeur, expiration, chemin, domaine, securite) permet de crer un cookie sur le
poste client. Le premier champ nom est obligatoire et dfini son nom. Si l'on souhaite lui
associer une valeur on renseignera le second champ. Le troisime permet de spcifier une date

- 34 -

d'expiration dans le cas o rien n'est prcis, le cookie devient permanent. Les champs chemin et
domaine permettent de prciser les URL et domaines auxquels sont associs le cookie. Enfin le
dernier, scurit permet de n'envoyer le cookie que si la connexion est ralise via le protocole
scuris HTTPS (TRUE).
Une fois le cookie cr, il est possible de le rcuprer dans les pages suivantes via le tableau
$_COOKIE['nom cookie'].

setcookie("TestCookie", $value, time()+3600); // expire dans une heure

La suppression d'un cookie se fait en le recrant...mais avec une date d'expiration passe !

setcookie ("TestCookie", "", time() - 3600); // a expir y'a une heure

Les cookies ne sont malheureusement pas supports par l'ensemble des navigateurs pour des raisons de
confidentialit. Aussi, il est ncessaire de mettre en uvre d'autres mcanismes afin de grer les sessions.

15.2 Cration de variables de sessions


La gestion par variables de sessions vite de passer par des variables partages et/ou des cookies. Les
variables de session sont stockes dans un SGBD et/ou dans un fichier ASCII, mais contrairement aux
cookies, elles sont stockes sur le serveur. Seul l'identifiant de la connexion est stock sur le poste du
client. Les fonctions associes sont les suivantes :
bool session_start( ). Dans le cas ou true est retourne, cette fonction permet soit de crer une
session (si pas encore dfinie) soit dutiliser les variables de la session en cours.
string Session_ID ([string id]) permet daccder lidentifiant unique dune session. Dans le cas
o un paramtre est prcis, l'identifiant de session changera et prendra la valeur fournie
string Session_Name([string name]) retourne le nom de la session en cours ou le change avec la
valeur du paramtre prcis.

L'affectation du tableau $_SESSION permet de crer des variables de session (il faut que
session_start() soit en entte de page).
$_SESSION['mavariable'] = valeur ;

Par la suite, l'accs la variable de session se fera galement via ce tableau.


if

(!isset($_SESSION['mavariable']))
$_SESSION['mavariable'] = valeur ;

else
print $_SESSION['mavariable'];

A la fin de la session, il est utile de dsenregistrer la variable en utilisant


unset ($_SESSION['mavariable']);
Si l'on souhaite dsenregistrer l'ensemble des variables de session, il faut utiliser :
$_SESSION=array();
Enfin, la fonction session_destroy() supprime l'identifiant de la session.

- 35 -

16 PHP-Ajax
Jusqu prsent, les scripts que nous avons raliss retournent lintgralit dune page web. Impossible de
ne retourner quune partie (cest que lon appelle le Web 1.0). Ainsi, lors dinteractions soutenues avec un
utilisateur, des lenteurs peuvent apparatre du fait de la lourdeur des changes, ce qui nuit rend pnible
lusage de certaines pages. La technologie AJAX (qui nest pas nouvelle) a pour objectif de permettre un
rafraichissement partiel de donnes dune page web, et uniquement de certaines donnes (cest que lon
appelle le Web 1.0). AJAX est lacronyme de Asynchronous JavaScript and XML , bien quil ne soit
en rien li au XML. AJAX est bas sur l'objet XMLHttpRequest qui permet de faire une requte via
Javascript un serveur http (jusque l rien de nouveau !) et dattendre le retour en ne rafraichissant que
certaines donnes contenues dans le code HTML retourn initialement
Mme si dans lacronyme dAJAX il est mentionn le mot asynchrone, il nest pas ncessaire que ce le
soit (rappel : un appel synchrone => on attend la rponse du serveur pour continuer/terminer ;
asynchrone, => on nattend pas !). Le choix entre synchrone et asynchrone se fait lors de linstanciation
de lobjet XMLHttpRequest avec dans le dernier paramtre true pour asynchrone, false pour synchrone.
La contrepartie lutilisation de la mthode asynchrone est quil nest pas possible de prdire le moment
o le serveur va rpondre. Lorsque lobjet XMLHttpRequest change dtat, il lve un vnement
(onreadystatechange) que lon va associer une fonction. Cet vnement est lev ds que lobjet
readyState est modifi. Il peut prendre les valeurs : 0 non initialise, 1 en chargement, 2 charge, 3 en
cours de traitement, 4 termine.
Comme prcdemment dit, le mode asynchrone permet de ne pas bloquer le navigateur client pendant le
chargement de la page. Lexemple qui suit permet dafficher un message dattente durant un traitement
quelconque, puis laffichage du rsultat de ce traitement. Cela va se faire en deux temps : d'une part
afficher un message lors de l'appel initial, puis le retirer lorsque notre onreadystatechange passe 4
(termin).
On va utiliser la balise HTML DIV qui permet de diviser le document en section. Cest justement une de
ces sections que va mettre jour notre script.
Page PHP qui ralise une requte
<?php
header('Content-Type: text/xml');

//on connect
$dbhost="iparla.iutbayonne.univ-pau.fr";
$dbuser="roose";
$dbpass="drop64";
$ddb="roose";

$dblink=mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($ddb);

//on lance la requete


$query = "SELECT * FROM bourse";
$result = mysql_query($query,$dblink) or die (mysql_error($dblink));

sleep(2);

- 36 -

//On boucle sur le resultat


echo "<?xml version=\"1.0\"?>\n";
echo "<exemple>\n";

while ($row = mysql_fetch_array($result))


{
echo "<donnee> $row[0] </donnee>\n";
}
echo "</exemple>\n";

?>

Code Ajax
<!DOCTYPE

html

PUBLIC

"-//W3C//DTD

XHTML

1.0

Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Exemple d'attente</title>
<script type="text/javascript">

function ajax()
{
var xhr=null;

if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//on dfinit l'appel de la fonction au retour serveur
xhr.onreadystatechange = function() { alert_ajax(xhr); };

//on affiche le message d'accueil


//document.getElementById("message").className="msg";
document.getElementById('zonetraitement').innerHTML = "Recherche des villes";
//on appelle le fichier php
xhr.open("GET", "http://iparla.iutbayonne.univ-pau.fr/~roose/ajax/attente.php", true);

- 37 -

xhr.send(null);
}

function alert_ajax(xhr)
{
if (xhr.readyState==4)
{
var docXML= xhr.responseXML;
var items = docXML.getElementsByTagName("donnee")

//une boucle sur chaque element "donnee" trouv


var Table = '<table border="1">';
for (i=0;i<items.length;i++) {
Table += '<tr>';
Table += '<td>' + items.item(i).firstChild.data + '</td>';
}
Table += '</tr>';
Table += '</table>';

document.getElementById("zonetraitement").innerHTML=Table;

}
}
</script>
</head>
<body>
<p>
<a href="javascript:ajax();">Go...</a>
</p>

<div id="zonetraitement">Veuillez patienter...</div>


<p>
...suite de la page HTML...
</p>
</body>
</html>

Ce qui donne :

- 38 -

Puis une fois un clic sur go et lattente de la requte

Si dans le cas prsent, la communication (asynchrone) se dclenche sur le clic sur Go , il est
galement possible raliser des interactions plus intressantes comme une aide la saisie par exemple :
BDAjax.php
<?php
$hote = 'localhost';
$base = 'roose';
$user = 'roose';
$pass = 'drop64';
$cnx = mysql_connect ($hote, $user, $pass) or die (mysql_error ());
$ret = mysql_select_db ($base) or die (mysql_error ());

/* Vrification */
$qer = mysql_query("select ville from bourse where ville='".$_GET["ville"]."'");
if(mysql_num_rows($qer)>=1)
echo "occupe";
else
echo "libre";
?>

Formulaire.html

- 39 -

<html> <head>
<title>EssayeAjax</title>

<script type="text/javascript">

function writediv(texte)
{
document.getElementById('zonetraitement').innerHTML = texte;
}

function verificationville(ville)
{
if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();

fichier = "http://iparla.iutbayonne.univ-pau.fr/~roose/ajax/BDAjax.php?ville="+ville;

xhr_object.open("GET", fichier, false);


xhr_object.send(null);

if(xhr_object.readyState == 4) {
texte = xhr_object.responseText;
}

if(texte != '')
{
if(texte == "occupe"){
writediv(ville+' : est un Nom de ville est occup&eacute; !');
}
else if(texte == "libre") {
writediv(ville+' : est un nom de ville libre vous pouvez l\'ajouter a la BD');
}
}
else
writediv(texte);

- 40 -

</script>
</head>
<body>
<form name="formville" action="" methode="GET">
<input name="ville" type="text" onKeyUp="verificationville(this.value)" >
<!-- onKeyUp : c est un evenement lance la fonction js 'verificationville'
this.value : ce qui est tap ds la zone de texte, ici alias de ville (nom d'onglet)
-->
<div id="zonetraitement"></div>
</form>

</body>
</html>

17 Webservices & SOAP


Un service web, ou webservice en anglais a fait plus chic - voire mme SOA (Service Oriented
Architecture a fait plus pro) permet des applications de conceptions et de ralisations diffrentes de
communiquer entre elles, et qui plus est, sans avoir se soucier de limplmentation. Ce couplage entre
applications, appel faible, permet ainsi de raliser de nouvelles applications par assemblages et/ou
appels de services fournis par dautres.
Il existe plusieurs mthodes de communication, nous retiendrons ici uniquement le protocole SOAP, issu
du RPC (Remote Procedure Call) puis du XML-RPC (le mme mais avec des appels en XML pour
masquer encore plus lhtrognit des implmentations). Le protocole SOAP (Simple Object Access
Protocol) permet des objets den appeler dautres distants (comme avec Java/RMI par exemple) mais en
utilisant le protocole HTTP comme protocole de communication (il est possible de faire entre autre
galement du SMTP) sans se soucier de leur implmentation, et avec une uniformit de reprsentation
des donnes. Il autorise ainsi la communication et lchange de messages/donnes entre objets distants.
Le mcanisme est le suivant :

- 41 -

Figure 1:http://vivien-brissat.developpez.com/tutoriels/php/soap/#LI
Lors d'un change SOAP, le message transmis se dcompose en 2 parties :
1.

L'enveloppe, qui contient toutes les informations relatives au contenu du message ;

2.

Le contenu lui-mme qui est form de donnes structures (mthodes formates, interrogation
structure d'aprs les besoins du serveur, etc.).

Afin de savoir comment utiliser un service web, ce dernier est dcrit selon dans un langage de description
de service web bas sur XML : le WSDL (Web Services Description Language). Il donne une dfinition
abstraite des services, le dtail des types de donnes changes, les oprations possibles, le protocole

- 42 -

utiliser ainsi que l'adresse (URL) du service. Le fichier WSDL de chaque webservice peut tre publi
dans un annuaire. Le fichier WSDL associ un webservice reprsente en quelque sorte sa notice
dutilisation.
Dans sa version 5, le PHP intgre en natif une gestion du protocole SOAP.

Fichier wsdl
<?xml version='1.0' encoding='UTF-8'?>
<!-- WSDL file generated by Zend Studio. -->
<definitions

name="exemple"

targetNamespace="urn:exemple"

xmlns:typens="urn:exemple"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/"

xmlns:typens0="http://iparla.iutbayonne.univ-

pau.fr/~roose/wsdl/moteur.php">
<message name="retourDate"/>
<message name="retourDateResponse">
<part name="retourDateReturn"/>
</message>
<portType name="essai_instancePortType">
<operation name="retourDate">
<input message="typens:retourDate"/>
<output message="typens:retourDateResponse"/>
</operation>
</portType>
<binding name="essai_instanceBinding" type="typens:essai_instancePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="retourDate">
<soap:operation soapAction="urn:essai_instanceAction"/>
<input>
<soap:body

namespace="urn:exemple"

use="encoded"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body

namespace="urn:exemple"

encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="exempleService">

- 43 -

use="encoded"

<port name="essai_instancePort" binding="typens:essai_instanceBinding">


<soap:address

location="http://iparla.iutbayonne.univ-

pau.fr/~roose/wsdl/moteur.php"/>
</port>
</service>
</definitions>

Moteur.php (serveur)
<?php
class DateServer{

//On dclare notre mthode qui renverra la date et la signature du serveur dans un tableau associatif...
function retourDate(){
$tab = array(
'serveur' => $_SERVER['SERVER_SIGNATURE'],
'date' => date("d/m/Y"),
'auteur' => "service web appele" //attention, unaccent => erreur
);
return $tab;
}
}

//Cette option du fichier php.ini permet de ne pas stocker en cache le fichier WSDL, afin de pouvoir faire
nos tests
//Car le cache se renouvelle toutes les 24 heures, ce qui n'est pas idal pour le dveloppement
ini_set('soap.wsdl_cache_enabled', 0);

//Instanciation du SoapServer
$serversoap=new SoapServer("http://iparla.iutbayonne.univ-pau.fr/~roose/wsdl/exemple.wsdl");

// on peut aussi dclarer plus simplement des fonctions


//par l'instruction addFunction() : $serversoap->addFunction("retourDate"); ce moment-l nous ne
faisons pas de classe.

//Noter le style employ pour la dclaration : le nom de la classe est pass en argument de type String,
et non pas de variable...
$serversoap->setClass("DateServer");

//Ici, on dit trs simplement que maintenant c'est PHP de prendre la main pour servir le Service WEB :
il s'occupera de l'encodage XML, des

- 44 -

//Enveloppes SOAP, de grer les demandes clientes, etc. Bref, on en a fini avec le serveur SOAP !!!!
$serversoap->handle();
?>

Client.php
<?php
//Cette option permet d'viter la mise en cache du WSDL, qui se renouvelle toutes les 24 heures... Pour
le dveloppement, ce n'est pas gnial !!!
ini_set('soap.wsdl_cache_enabled', 0);

//On doit passer le fichier WSDL du Service en paramtre de l'objet SoapClient


$service=new SoapClient("http://iparla.iutbayonne.univ-pau.fr/~roose/wsdl/exemple.wsdl");

//On accde la mthode de notre classe DateServeur, dclar dans notre SoapServer
$taballservices=$service->retourDate();

//On renvoie le rsutat de notre mthode, pour voir...


print_r($taballservices); // affiche les lments d'un tableau
?>

18 PHP en chiffre
PHP nest pas uniquement ce qui a t dcrit prcdemment. Cest galement un poids conomique
important. PHP, cest plus de 5 millions de dveloppeurs estims travers le monde, cest un march de
4,8 milliards d.
Selon (http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html), PHP est le 4me (5me selon les
priodes au coude coude avec C#) langage le plus utilis, derrire le Java, C, C++.
Le langage (en fait la plate-forme) est utilis par plus de 1/3 des sites web dans le monde (46 % en
France), ce qui reprsente 17 millions de domaines. Parmi les entreprises du CAC40, 78% en 2003 et
87% en 2004 utilisent le PHP. Parmi les vingt premires socits les plus bnficiaires en France, 95%
recourent PHP pour leur site web.
A quoi est d cet engouement. Au del de la simplicit et de la souplesse du langage, PHP souvre sur une
facette mconnue de linteroprabilit. Aussi, PHP peut instancier des objets COM, .NET mais galement
Java. PHP peut se connecter lensemble des tnors des SGBD, mais aussi aux annuaires (LDAP),
Lotus Notes, SAP, permet lutilisation des services web (SOAP/WSDL), gre le XML, sinterface avec
les systmes de paiement en ligne (VeriSign, Cybercash, Crdit Mutuel, etc.), gnre du Flash (extension
Ming), du PDF (classe FPDF). Un autre atout ne pas ngliger, est la robustesse
(performances/fiabilits), ce qui en fait le langage privilgi de 90% des sites web les plus frquents
dans lhexagone avec des sites dpassant les 500 000 connexions/jour. Une des plus fortes plates-formes
au monde supportant PHP permet 150 000 utilisateurs simultanment (avec 220 serveurs en cluster).
Source : Livre Blanc "PHP en entreprise" - http://www.afup.org/docs/livre-blanc-php-en-entreprisev4.pdf

- 45 -

19 Conclusion
PHP (PHP : Hypertext Preprocessor) est un langage de programmation (comme Java ou C#) possdant
deux syntaxes. La premire, mi-chemin entre C et Perl, sadresse aux dveloppeurs la recherche dun
langage de script simple manipuler. Elle est adapte la couche prsentation. La seconde, trs proche
de Java, permet de dvelopper dans un paradigme orient objet. Elle est adapte au dveloppement de
logique mtier ou de traitements complexes. PHP permet de dvelopper les types dapplications
suivantes :
des applications Web dynamiques (site web, intranet, etc.)
des clients riches (PHP-XUL)
des applications client/serveur (PHP-GTK et PHP4Delphi)
des services web (SOAP, XML-RPC, REST)
des scripts en ligne de commande (CLI)
des services sexcutant en tche de fond (gestion de quota disque, serveur HTTP, etc.)
Dvelopp par prs de 1 000 ingnieurs regroups au sein de la fondation Apache, PHP runit autour de
lui une communaut qui compte environ 4 500 000 utilisateurs. PHP est un logiciel libre distribu sous
une licence Open Source dite non virale qui protge les entreprises utilisatrices en ne les obligeant pas
publier leurs dveloppements. PHP est disponible pour lensemble des systmes dexploitation courants :
Windows toutes versions, Linux et Unix toutes versions, IBM iSeries (AS/400), SGI IRIX 6.5.x, RISC OS,
Novell Netware, Mac OS X, AmigaOS, etc.

- 46 -

Vous aimerez peut-être aussi