You are on page 1of 129

Dpartement

ducation
et Technologie

Les formulaires en HTML


JavaScript et CSS
PHP
MySQL

Dmarche de conception
Dvelopper une application avec PHP et MySQL
tienne Vandeput

5.87
Juin 2005

Centre pour la Formation l'Informatique dans le


Secondaire

Publier sur le Web - Perfectionnement

Toutes vos remarques pour amliorer ces notes sont les bienvenues. Vous pouvez les envoyer :
etienne.vandeput@fundp.ac.be

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement

Table des matires


1.

LES FORMULAIRES EN HTML .......................................................................... 6

1.1

INTRODUCTION ................................................................................................................................................6

1.2

LE FORMULAIRE (ELEMENT FORM)..............................................................................................................6


1.2.1

Attributs importants.....................................................................................................................................................7

1.2.2

Contenu du formulaire ................................................................................................................................................8

1.3

L'ELEMENT TEXTAREA.................................................................................................................................8
1.3.1

1.4

Les attributs les plus importants..................................................................................................................................8

L'ELEMENT SELECT ......................................................................................................................................9


1.4.1

Les attributs les plus importants..................................................................................................................................9

1.4.2

Les attributs les plus importants de l'lment option.............................................................................................10

1.5

L'ELEMENT INPUT ......................................................................................................................................11


1.5.1

Le champ texte <input type="text"> .........................................................................................................................11

1.5.2

Le champ texte spcial mot de passe <input type="password">...............................................................................11

1.5.3

Le champ texte spcial rfrence de fichier <input type="file"> ..............................................................................12

1.5.4

Le bouton simple <input type="button">..................................................................................................................12

1.5.5

Le bouton radio <input type="radio"> ......................................................................................................................12

1.5.6

Le bouton d'envoi <input type="submit"> ................................................................................................................13

1.5.7

Le bouton d'envoi image <input type="image">.......................................................................................................14

1.5.8

Le bouton de rinitialisation <input type="reset"> ...................................................................................................14

1.5.9

La case cocher <input type="checkbox"> ..............................................................................................................15

1.5.10

Le champ cach <input type="hidden"> ..............................................................................................................16

1.6

ATTRIBUTS VS METHODES .............................................................................................................................16

1.7

LA GESTION DES EVENEMENTS ......................................................................................................................17


1.7.1

lment form et transmission des donnes..........................................................................................................17

1.7.2

lment textarea ..................................................................................................................................................19

1.7.3

lment select .....................................................................................................................................................20

1.7.4

lment input ......................................................................................................................................................20

1.8

AUTRES EVENEMENTS, AUTRES ELEMENTS ...................................................................................................20

1.9

EXERCICES .....................................................................................................................................................20
1.9.1

Rendre un champ texte inaccessible..........................................................................................................................21

1.9.2

Donner le focus un lment prcis .........................................................................................................................21

1.9.3

Permettre lexcution dune action en fonction du choix dun bouton radio ............................................................21

1.10

LES STYLES CSS ............................................................................................................................................22

1.10.1

Feuille de styles ....................................................................................................................................................22

1.10.2

Rgle.....................................................................................................................................................................23

1.10.3

Slecteur ...............................................................................................................................................................23

1.10.4

Exemples ..............................................................................................................................................................24

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement


1.10.5

La cascade ............................................................................................................................................................24

1.10.6

Exercice ................................................................................................................................................................25

1.10.7

Localisation des feuilles de styles ........................................................................................................................26

1.11

LES FORMULAIRES ET JAVASCRIPT ...............................................................................................................27

1.11.1

Scripts gnraux ...................................................................................................................................................27

1.11.2

Scripts lis aux formulaires ..................................................................................................................................30

1.12

EXERCICE .......................................................................................................................................................35

2.

LE LANGAGE PHP ............................................................................................... 36

2.1

EN QUOI CONSISTE PHP ? ..............................................................................................................................36

2.2

QUOFFRE PHP? ............................................................................................................................................37

2.3

LES BASES DU LANGAGE ................................................................................................................................38


2.3.1

lments de syntaxe ..................................................................................................................................................38

2.3.2

Variables ...................................................................................................................................................................39

2.3.3

Les constantes ...........................................................................................................................................................44

2.3.4

Types.........................................................................................................................................................................44

2.3.5

Oprateurs .................................................................................................................................................................47

2.3.6

Fonctions ...................................................................................................................................................................48

2.3.7

Expressions ...............................................................................................................................................................49

2.3.8

Instructions de contrle .............................................................................................................................................49

2.4

EXERCICE .......................................................................................................................................................51

2.5

LES TABLEAUX EN PHP .................................................................................................................................54


2.5.1

Crer un tableau ........................................................................................................................................................54

2.5.2

Fonctions lies aux tableaux......................................................................................................................................54

2.6

LES SESSIONS .................................................................................................................................................55


2.6.1

Cration dun nouvel utilisateur ................................................................................................................................55

2.6.2

Authentification dun utilisateur ...............................................................................................................................55

2.6.3

Identificateur de session ............................................................................................................................................55

2.7

LES INCLUSIONS DE FICHIERS ........................................................................................................................56

2.8

EXERCICE .......................................................................................................................................................58

3.

MYSQL .................................................................................................................... 59

3.1

L'ASSOCIATION ENTRE MYSQL ET PHP........................................................................................................59

3.2

LA CONCEPTION D'UNE BASE DE DONNEES ....................................................................................................60

3.3

3.2.1

Schmas ERA............................................................................................................................................................60

3.2.2

Entits, associations, attributs, rles et cardinalits...................................................................................................60

3.2.3

Transformation en tables...........................................................................................................................................61

3.2.4

Associations ternaires................................................................................................................................................62

3.2.5

Cls trangres ..........................................................................................................................................................62

LES TABLES ET LEURS CONTENUS..................................................................................................................63

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement


3.3.1

Structure d'une table..................................................................................................................................................63

3.3.2

Types d'informations.................................................................................................................................................63

3.4

LES PRIMITIVES DE GESTION D'UNE BASE DE DONNEES .................................................................................65


3.4.1

Accs une BD et ses tables ..................................................................................................................................65

3.4.2

Cration et gestion du contenu d'une BD ..................................................................................................................66

3.4.3

Gestion d'une BD avec PHPMyAdmin .....................................................................................................................74

3.4.4

Slection d'informations dans une BD ......................................................................................................................75

3.4.5

Slections multi-tables ..............................................................................................................................................79

3.5

GERER UNE BD AVEC PHP ............................................................................................................................85


3.5.1

Le principe de communication ..................................................................................................................................85

3.5.2

Les fonctions PHP.....................................................................................................................................................85

3.6

BILAN.............................................................................................................................................................90

3.7

EXERCICE .......................................................................................................................................................90

4.

APPLICATION....................................................................................................... 91

4.1

INTRODUCTION ..............................................................................................................................................91

4.2

UN ENONCE A RAFFINER ................................................................................................................................91

4.3

UN BON SCHEMA CONCEPTUEL ......................................................................................................................92


4.3.1

Premire bauche ......................................................................................................................................................92

4.3.2

Amliorations du schma ..........................................................................................................................................93

4.4

LE SCHEMA LOGIQUE .....................................................................................................................................94

4.5

LA CONSTRUCTION D'UNE INTERFACE ...........................................................................................................95


4.5.1

Utilit ........................................................................................................................................................................95

4.5.2

Utilisabilit................................................................................................................................................................96

4.5.3

Cration de modles ..................................................................................................................................................96

4.5.4

La connexion...........................................................................................................................................................105

4.5.5

Les scripts................................................................................................................................................................109

4.6

4.7

LA BASE DE DONNEES ..................................................................................................................................126


4.6.1

La table eleve ..........................................................................................................................................................126

4.6.2

La table maitre.........................................................................................................................................................127

4.6.3

La table lieu.............................................................................................................................................................127

4.6.4

La table stage...........................................................................................................................................................128

STRUCTURE DU SITE ....................................................................................................................................128

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement

1. Les formulaires en HTML


1.1 Introduction
Depuis ses premiers dveloppements, HTML inclut des lments1 qui permettent la communication entre
un client Web et un serveur capable de recevoir des informations de ce client, de les stocker et/ou
d'effectuer des traitements en dpendant. La ralisation de sites Web interactifs et la cration de pages
Web dynamiques demandent que cette communication soit possible. Ds lors, la connaissance de ces
lments est dterminante car ils constituent, en quelque sorte, l'interface de communication entre
l'internaute et les applications qui sont dveloppes sur des serveurs.
Dans ce chapitre, nous nous intresserons chacun de ces lments, leurs attributs possibles, mais aussi
aux informations qui vont tre vhicules vers un serveur ainsi qu' leur forme.
Les applications ct serveur sont dveloppes dans un langage qualifi de langage de script. PHP est le
langage de script que nous avons choisi2 pour illustrer le mcanisme de construction dynamique des pages
Web. Le langage est capable de communiquer et d'exploiter des donnes gres par de nombreux
SGBD3. Nous nous intresserons des applications exploitant des bases de donnes gres par le SGBD
MySQL parce que la combinaison de ces deux outils (langage de script et SGBD) semble aujourd'hui la
plus frquente parmi les nombreuses combinaisons possibles. C'est aussi celle qui apparat comme la
mieux adapte aux applications exploitant Internet et ses technologies. Les bases de donnes gres via
des sites Web sont gnralement particulires et comprennent peu d'enregistrements par rapports
certains autres types d'application. MySQL est adapt ce type de bases de donnes en ce sens qu'il offre
juste les services qu'il faut, avec l'efficacit souhaite.
Une observation importante : le fait de confier l'excution de scripts des serveurs n'exclut pas la
possibilit, pour le client, d'excuter des scripts localement. C'est le cas, par exemple, lorsqu'on souhaite
faire valider les donnes avant de les envoyer. Les traitements seront donc parfois rpartis entre le client
et le serveur mme si l'objet de cet ouvrage est de s'intresser aux scripts ct serveur.

1.2 Le formulaire (lment form)


Le formulaire est un lment qui rend possible la
fourniture d'un certain nombre de donnes et
l'excution d'une action par un serveur. Un simple
exemple, pour avoir accs certains services sur le
Web (commande en ligne, cours en ligne,
homebanking,) vous devez gnralement fournir un
identificateur (login) et un mot de passe (password).
La fourniture de ces informations se fait au travers
d'un formulaire (zones complter).
En fonction des donnes reues, l'application
construit dynamiquement une page Web dpendant
des donnes reues. Dans ce cas, il sagit dune page personnalise (voir ci-aprs).
1

p, h1, a, form sont des lments au sens de HTML.

En ce qui concerne les langages de script, le dveloppeur a le choix. Ce sont cependant les langages utilisables
gratuitement et pouvant tre distribus qui connaissent le plus grand succs. Parmi eux, PHP, Python et dans une moindre
mesure Perl semblent les mieux placs dans le hit parade des dveloppeurs.

Systme de Gestion de Bases de Donnes

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement

En HTML, le formulaire correspond l'lment form. Cet lment contient gnralement plusieurs
lments interactifs que nous allons dcrire par la suite (champs de texte, boutons, cases cocher,).
Ces lments interactifs permettent d'encoder ou de slectionner les donnes transmettre au serveur.
Comme nous le verrons, il peut galement contenir des lments cachs qui sont aussi des donnes
transmettre au serveur.
Un document HTML peut contenir plusieurs formulaires4 mais ceux-ci ne peuvent pas tre imbriqus.

1.2.1 Attributs importants


1.2.1.1 action
Cet attribut est obligatoire. Sa valeur est une URL5 (adresse absolue ou relative) qui prcise le script qui
doit recevoir les donnes et tre excut sur le serveur. En gnral, le script a pour but de crer une page
HTML qui sera renvoye au client Web.
1.2.1.2 method
Il n'y a que deux valeurs possibles: get ou post. La mthode get concatne les donnes la fin de l'URL
du script alors que la mthode post envoie les donnes dans le corps de requte.
La mthode post est prfrable pour tout une srie de raisons et notamment, la confidentialit.
1.2.1.3 name
Cet attribut permet de nommer le formulaire. Il n'est d'aucune utilit pour le serveur mais peut servir un
script local.

Encore faut-il trouver une illustration intressante de cette possibilit

Beaucoup de serveurs sont sensibles la casse des noms de fichiers et de dossiers. Il convient donc d'tre prudent
dans l'criture de l'URL. Nous verrons galement qu'une URL vide a du sens dans certaines circonstances.
tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement

Dans l'illustration qui prcde, on voit le code engendr par Macromedia Dreamweaver MX lors de
l'insertion d'un formulaire dans un document HTML. Un nom par dfaut est donn et l'action par dfaut
est vide. La mthode choisie est post.

1.2.2 Contenu du formulaire


Tous ces attributs n'ont aucun sens si le formulaire n'a pas de contenu. L'lment form est donc un
lment qui va en contenir d'autres porteurs d'informations ou d'instructions.
On trouve trois types d'lments dans un formulaire:

textarea: pour dfinir une zone de texte

select: pour slectionner une information dans une liste

input: pour tous les autres types d'entres

Ce sont ces lments que nous allons dcrire maintenant.

1.3 L'lment textarea


On emploie cet lment lorsqu'il y a plusieurs lignes de texte entrer. Ainsi, lorsqu'on souhaite raliser
une application de Webmail, il est clair que la zone de rdaction du message doit s'tendre sur plusieurs
lignes. Les valeurs par dfaut sont 4 lignes de 40 caractres. Les attributs qui suivent permettent
nanmoins de modifier ces valeurs.
Cet lment ncessite une balise initiale et une balise finale. Un texte par dfaut peut se trouver entre ces
deux balises. Il est noter que le texte n'est pas limit dans sa taille, ce qui peut se rvler assez gnant
dans une perspective de stockage dans une base de donnes, par exemple. Un contrle peut toutefois tre
effectu, soit par un script local, soit par un script PHP au niveau du serveur.

1.3.1 Les attributs les plus importants


1.3.1.1 name
La zone de texte doit porter un nom si on veut l'exploiter en PHP. Ce nom correspondra au nom d'une
variable en PHP. C'est le moment de se souvenir que le langage est sensible la casse.
Si certains objets interactifs portent le mme nom, PHP ne prend en compte que le dernier. Les noms
doivent commencer par une lettre ou le caractre _ suivi de lettres, chiffres ou caractres _.
1.3.1.2 rows
Cet attribut prcise la hauteur de la zone de texte, ce qui n'en limite pas la taille.

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement

1.3.1.3 cols
Cet attribut spcifie le nombre de colonnes visibles mais ne correspond que fort approximativement au
nombre de caractres.
Voici un exemple de code et de son interprtation dans un navigateur.
<form name="form1" method="post" action="">
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Objectifs
du cours</strong></font></p>
<textarea name="textarea" cols="60" rows="10"></textarea>
</form>

1.4 L'lment select


Cet lment dfini un menu droulant dans lequel l'utilisateur
va pouvoir slectionner une ou plusieurs informations. Ces
informations seront dfinies grce des lments option qui
seront inclus entre les deux balises de l'lment select.
Notez que chacun des lments dcrits jusqu'ici peut tre vu
comme un bloc contenant ventuellement d'autres blocs.
L'lment form contient des lments textarea, select,
L'lment (bloc) select contient des lments option.
Un formulaire peut videmment contenir plusieurs lments
select. PHP cre une variable ou un tableau (en cas de
slection multiple) pour chaque lment select. La variable
ou le tableau porte le mme nom que l'lment.

option

select
textarea
form

1.4.1 Les attributs les plus importants


1.4.1.1 name
Pour les raisons qui prcdent, cet attribut est videmment indispensable. Attention, en cas de slection
multiple possible, ce nom doit se terminer par des crochets ([]).
1.4.1.2 multiple
Cet attribut autorise les slections multiples dans la liste.

tienne Vandeput CeFIS 2005

Publier sur le Web - Perfectionnement

1.4.1.3 size
Cet attribut spcifie le nombre d'items visibles de la liste. En son absence, un seul item est visible.

1.4.2 Les attributs les plus importants de l'lment option


Cet lment n'est pas directement un objet de formulaire mais une composante de l'lment select. Il
ncessite une balise initiale et une balise finale.
1.4.2.1 value
L'attribut prcise la valeur qui est envoye au script et donc pas ncessairement celle qui est affiche dans
la liste. Il est en effet plus simple, parfois, d'envoyer des valeurs techniques plus simples manipuler tout
en affichant des choix comprhensibles.
1.4.2.2 selected
Les options qui ont cet attribut correspondent des valeurs prslectionnes. Il n'est pas ncessaire qu'il y
en ait. Dans le cas d'une slection simple, s'il y en a plusieurs, seule la dernire est prise en compte.
Lorsque la liste est droulante, c'est la premire option ou, le cas chant, l'option prslectionne qui
apparat. Voici deux exemples incluant les types d'lments concerns.
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Type
de cours</strong></font></p>
<select name="typeCours" size="4">
<option value="0" selected>inconnu</option>
<option value="1">pr&eacute;senciel</option>
<option value="2">&agrave; distance</option>
<option value="3">semi-pr&eacute;senciel</option>
</select>

<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Type


de cours</strong></font></p>
<select name="typeCours">
<option value="0" selected>inconnu</option>
<option value="1">pr&eacute;senciel</option>
<option value="2">&agrave; distance</option>
<option value="3">semi-pr&eacute;senciel</option>
</select>

tienne Vandeput CeFIS 2005

10

Publier sur le Web - Perfectionnement

1.5 L'lment input


Cet lment correspond une panoplie d'objets de formulaire. C'est l'attribut type de cet lment input
qui les distingue. Nous allons donc examiner ces diffrents objets, les uns aprs les autres. Un
formulaire peut videment contenir plusieurs lments input. L'lment input n'a qu'une seule balise.

1.5.1 Le champ texte <input type="text">


Cet attribut dfinit un champ texte d'une seule ligne. PHP cre une variable portant le nom du champ
dont la valeur est l'information que ce dernier contient. Les attributs courants sont:
1.5.1.1 name
voir ci-dessus
1.5.1.2 value
la valeur par dfaut du champ texte
1.5.1.3 size
la taille (approximative) d'affichage du champ texte
1.5.1.4 maxlength
le nombre de caractres admis
1.5.1.5 accesskey
cre un raccourci-clavier pour accder directement au champ
Voici un petit exemple.
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<strong><u>D</u>&eacute;nomination</strong></font></p>
<p>
<input name="denomination" type="text" size="50" maxlength="80" accesskey="D">
</p>

Le raccourci-clavier alt-D premettra d'accder directement au champ texte. L'attribut accesskey existe
aussi pour les lments textarea et select.

1.5.2 Le champ texte spcial mot de passe <input type="password">


L'attribut dfinit un champ texte particulier car l'information introduite dans ce champ n'est pas lisible
l'cran. Il faut toutefois savoir que le mot de passe est transmis en clair au serveur. Il est possible de
demander PHP un encryptage par la suite.
Comme pour un champ texte ordinaire, PHP cre une variable portant le nom du champ. Les attributs
courants sont les mmes que ceux du champ texte normal.

tienne Vandeput CeFIS 2005

11

Publier sur le Web - Perfectionnement

1.5.3 Le champ texte spcial rfrence de fichier <input type="file">


Dans ce champ texte particulier, l'information est la rfrence absolue et locale d'un fichier que l'on veut
transfrer au serveur. L'usage de cette fonctionnalit ncessite que la mthode d'envoi du formulaire soit
post et que l'attribut enctype, dont nous navons pas parl, soit prsent avec comme valeur
multipart/form-data. Le champ est accompagn d'un bouton Parcourir qui ouvre une fentre de
l'explorateur.
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<strong>T&eacute;l&eacute;verser</strong></font></p>
<p>
<input type="file" name="telechargement">
</p>

Les attributs courants sont sensiblement les mmes, si ce n'est que l'attribut value n'est pas utilis.

1.5.4 Le bouton simple <input type="button">


L'attribut dfinit un bouton simple. L'intrt de ce type de bouton rside dans l'excution de scripts
locaux. Aucune donne n'est envoye au serveur lorsqu'un tel bouton est activ. On mentionnera les
attributs:
1.5.4.1 name
le nom du bouton
1.5.4.2 value
son tiquette
1.5.4.3 disabled
son tat (dsactiv)
1.5.4.4 accesskey
cre un raccourci-clavier pour accder directement au bouton
<input name="validation" type="button" id="validation" value="Validation des
donn&eacute;es" disabled>

1.5.5 Le bouton radio <input type="radio">


Les boutons radio sont utiliss en groupe. Un seul d'entre eux peut tre actif la fois. Le groupe de
boutons porte un nom qui sera celui de la variable PHP contenant la valeur du bouton slectionn. Citons
comme attributs:
1.5.5.1 name
le nom du groupe de boutons
tienne Vandeput CeFIS 2005

12

Publier sur le Web - Perfectionnement

1.5.5.2 value
la valeur du bouton (information transmise)
1.5.5.3 checked
la slection du bouton
1.5.5.4 accesskey
le raccourci-clavier
Un exemple:
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Type
d'enseignement</strong></font></p>
<p>
<input type="radio" name="type" value="1">
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Gnral</font>
<br>
<input type="radio" name="type" value="2">
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Technique</font>
<br>
<input type="radio" name="type" value="3">
<font size="2" face="Verdana, Arial, Helvetica, sans-serif">Professionnel</font>
</label>
</p>

1.5.6 Le bouton d'envoi <input type="submit">


Grce cet attribut, le bouton est le dclencheur de l'envoi des donnes au script dcrit dans l'attribut
action de l'lment form. Un formulaire peut contenir plusieurs boutons d'envoi. Dans ce cas, c'est au
script de choisir le traitement effectuer en fonction de la valeur du bouton. Comme d'habitude, PHP
crera une variable portant le nom de ce bouton. Les attributs importants sont:
1.5.6.1 name
le nom du bouton ncessaire pour la cration de la variable
1.5.6.2 value
la valeur du bouton ncessaire pour un ventuel choix de script
1.5.6.3 accesskey
un caractre pour un raccourci-clavier d'accs rapide au bouton
<input name="envoi" type="submit" id="envoi" value="Envoyer">

tienne Vandeput CeFIS 2005

13

Publier sur le Web - Perfectionnement

1.5.7 Le bouton d'envoi image <input type="image">


Le bouton d'envoi image joue le mme rle que le bouton d'envoi classique. La diffrence rside dans le
fait que la source de l'image doit tre fournie. De plus, les coordonnes prcises de l'endroit o l'on a
cliqu sont galement envoyes. Les noms des deux variables sont constitus du nom du bouton suivi
respectivement des symboles _x et _y. Les attributs retenir sont:
1.5.7.1 name
le nom du bouton image
1.5.7.2 src
la localisation de l'image
1.5.7.3 alt
le texte alternatif (si l'image ne peut tre affiche)
1.5.7.4 accesskey
le caractre pour un raccourci-clavier ventuel d'accs au bouton
<input name="cathedrale" type="image" id="cathedrale"
src="/images/cathedrale.jpg" alt="Saint-Aubain" width="100" height="80" border="0">

1.5.8 Le bouton de rinitialisation <input type="reset">


Le bouton de rinitialisation permet chaque objet du formulaire de reprendre sa valeur initiale. Il n'y a
donc aucune information envoye au serveur lorsque celui-ci est activ. Les attributs essentiels sont:
1.5.8.1 name
le nom du bouton
1.5.8.2 value
son tiquette
1.5.8.3 accesskey
le caractre pour un raccourci-clavier
<input name="initialisation" type="reset" id="initialisation"
value="R&eacute;tablir">

tienne Vandeput CeFIS 2005

14

Publier sur le Web - Perfectionnement

1.5.9 La case cocher <input type="checkbox">


L'attribut fait de cet objet une case cocher. Il est possible mais pas ncessaire de grouper les cases
cocher. PHP cre une variable pour chaque case cocher ou un tableau pour un groupe de cases cocher.
La case ou au moins une des cases dans le cas d'un groupe doit tre coche pour que la variable ou le
tableau soit cr. La programmation devra veiller s'assurer qu'une telle variable ou un tel tableau existe.
Les attributs importants sont:
1.5.9.1 name
le nom de la case sera celui de la variable; dans le cas d'un groupement, il faut donner le mme nom
chaque case et faire suivre ce nom de crochets ([]).
1.5.9.2 value
la valeur transmise au script qui ne correspond pas l'affichage
1.5.9.3 checked
pour signaler si la case et coche
1.5.9.4 accesskey
un caractre pour le raccourci-clavier
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Cours
choisis</strong></font></p>
<p> <strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<input type="checkbox" name="cours" value="1">
</font></strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
Math </font></p>
<p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<input type="checkbox" name="cours" value="2">
Fran&ccedil;ais</font></p>
<p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<input type="checkbox" name="cours" value="3">
Physique</font></p>
<p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<input type="checkbox" name="cours" value="4">
Histoire</font></p>

tienne Vandeput CeFIS 2005

15

Publier sur le Web - Perfectionnement

1.5.10 Le champ cach <input type="hidden">


L'attribut confre ici au champ le statut cach. L'intrt rside dans la possibilit de transmettre au
serveur des valeurs qui seraient disponibles au niveau du navigateur. Cest aussi de pallier le caractre
sans tat de http. Une variable portant le nom du champ est cre. Les attributs sont:
1.5.10.1 name
le nom du champ cach
1.5.10.2 value
la valeur transmettre
<input name="login" type="hidden" id="login" value="eva">

1.6 Attributs vs mthodes


Sans entrer dans le grand dtail, nous rappellerons que JavaScript est un langage de script interprt par
le client (le navigateur Web) et que ce langage est un langage orient objet 6. Il sappuie sur le
Document Object Model (DOM) dvelopp par le consortium w37. Parmi ces objets , on trouve bien
sr les formulaires et tous les objets quils peuvent eux-mmes contenir. JavaScript dfinit des mthodes
quil est possible dinvoquer sur ces objets. Nous nous intresserons peu ces mthodes tant donn que
la programmation en JavaScript nest pas le sujet principal de cet ouvrage. En revanche, nous avons
besoin des proprits et des vnements dtectables au niveau des objets car ils se traduisent en attributs
des lments correspondants. titre dexemple, voici pour un formulaire quelques attributs et mthodes
disponibles.
Quelques attributs possibles de llment formulaire (du point de vue HTML)

Proprits :
name : le nom du formulaire
action : ladresse du script de serveur excuter
method : la mthode d'appel du script (get ou post)

vnements :
onSubmit : pour dtecter la soumission du formulaire
onReset : pour dtecter la rinitialisation

Il en existe bien dautres qui sont moins spcifiques (id, class, pour les proprits ; onclick,
ondblclick, pour les vnements).
Quelques mthodes possibles de lobjet formulaire8 (du point de vue JavaScript) :
submit : pour dclencher l'action du formulaire
reset : pour rinitialiser les donnes du formulaire avec les valeurs par dfaut

La signification de ce qualificatif, en particulier en JavaScript, mriterait un large dbat que nous ne mneront pas.

http://w3.org

On pourrait trouver dans un script une instruction du genre if (valide) form.submit() ; pour autant que valide dsigne
une variable boolenne et form un formulaire.
tienne Vandeput CeFIS 2005

16

Publier sur le Web - Perfectionnement

Aprs avoir illustr les proprits des lments correspondant aux objets de formulaire, nous consacrons
la section suivante examiner les vnements qui peuvent galement y tre associs sous forme
dattributs.

1.7 La gestion des vnements


Les attributs correspondant des vnements peuvent se rvler utiles dans le contexte d'utilisation de
scripts locaux. En voici une description en fonction des lments concerns.

1.7.1 lment form et transmission des donnes


1.7.1.1 onsubmit
Cet attribut indique un script excuter localement avant l'envoi des donnes (par exemple, un certain
nombre de vrifications). Ce script doit renvoyer une valeur boolenne qui dtermine l'envoi ou non des
donnes. Il est dclench lorsque l'utilisateur clique sur le bouton d'envoi (voir plus loin).
La valeur doit tre constitue du mot return suivi du nom du script excuter. Exemple: onsubmit =
"return verification()"
<form action="test.php" method="post" name="formulaire" onSubmit="return
verification()">

Le script doit figurer dans le document, soit dans la partie entte, soit dans la partie corps, en tant que
contenu de llment script. Cet lment possde un attribut language qui prcise dans quel langage le
script est rdig (autrement dit, comment il doit tre interprt) et un attribut type qui prcise quel
encodage est utilis.
<script language="JavaScript" type="text/JavaScript">
function verification(){
if(document.forms["formulaire"].elements["denomination"].value==""){
alert("Vous n'avez pas fourni de dnomination pour le cours");
return false;
}
if(document.forms["formulaire"].elements["objectifs"].value==""){
alert("Vous n'avez pas fourni d'objectifs pour le cours");
return false;
} else{
return true;
}
}
</script>

Comme nous ne donnons pas trop de dtails propos de JavaScript, nous apportons ce script quelques
commentaires.
Il se compose dun double test de vrification de remplissage pour les rubriques Dnomination et
Objectifs. La fonction na pas dargument et renvoie une valeur boolenne (return=). alert() est une
fonction prdfinie qui affiche une bote de dialogue davertissement. Elle prend comme argument une
chane de caractre. Notez que JavaScript est un langage faiblement typ. Le typage des valeurs et des
variables est implicite. Observez aussi la syntaxe dcriture pour une structure alternative.

tienne Vandeput CeFIS 2005

17

Publier sur le Web - Perfectionnement

Le point le plus dlicat concerne laccs aux informations de la page. JavaScript utilise le modle objet
du document (DOM) pour accder ces informations. Lobjet principal est document. Il contient un
tableau index forms de ses (ventuels) formulaires. Chaque formulaire contient un tableau index de ses
lments : elements. Pour accder la valeur dun de ces lments, on utilise la proprit value. Notez
encore le symbole de comparaison (== et non =). Il est possible daccder litem dun tableau en
fournissant son numro dordre en commenant par 0 (exemple : si formulaire est le seul formulaire,
forms[0]).
Voici maintenant le code du fichier test.php. Ce dernier contient laction effectuer si la valeur renvoye
par le script est true savoir, laffichage dun message de russite et des donnes transmises. Pour ce
faire, des commandes lmentaires en PHP sont ncessaires. Une feuille de style, cefis.css, est attache
la page test.php.
<html>
<head>
<title>Fourniture de donnes un serveur</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../cefis.css" rel="stylesheet" type="text/css">
</head>
<body>
<h4>Ex&eacute;cution du code JavaScript</h4>
<p class="important1">Test concluant!</p>
<p>Les donn&eacute;es suivantes ont &eacute;t&eacute; envoy&eacute;es:</p>
<p class="important2">D&eacute;nomination du cours</p>
<p><?php echo $_POST["denomination"]; ?></p>
<p class="important2">Objectifs du cours</p>

tienne Vandeput CeFIS 2005

18

Publier sur le Web - Perfectionnement


<p><?php echo $_POST["objectifs"]; ?></p>
</body>
</html>

Cet exemple nous permet de dcouvrir un tout petit peu PHP. Lorsque le navigateur rencontre la suite
des symboles <?php, il sait quil doit interprter la suite comme du PHP et cela, tant quil na pas
rencontr les deux symboles ?>. Comme vous vous en doutez9, la commande echo est une commande
daffichage.
Une autre chose importante observer, cest que ( partir de sa version 4) PHP cre une variable
prdfinie10 sous forme dun tableau sappelant $_POST11 et contenant les valeurs transmises au serveur
par la mthode post. On accde une composante du tableau par son numro dordre ou le nom (attribut
name) de llment contenant linformation concerne.

1.7.1.2 onreset
Cet attribut indique un script excuter localement avant la rinitialisation du formulaire. Pour la valeur
de cet attribut, la syntaxe est identique celle de l'attribut onsubmit.

1.7.2 lment textarea


Voici quelques-uns des vnements (ou attributs de script) de llment textarea.
1.7.2.1 onfocus
Le script associ sera excut lorsque la zone de texte recevra le focus12.
9

Rappelez-vous la cration de fichiers batch en DOS.

10

Il en cre plein dautres.

11

En PHP, toutes les variables ont un nom commenant par le symbole $.

12

Un objet reoit le focus quand lutilisateur clique dessus, ou bien quil y accde par la touche de tabulation ou un
raccourci-clavier.

tienne Vandeput CeFIS 2005

19

Publier sur le Web - Perfectionnement

1.7.2.2 onblur
Il sagit ici de la perte du focus par llment.
1.7.2.3 onselect
Cet vnement se produit si tout ou partie du texte de la zone a t slectionn.
1.7.2.4 onchange
Celui-ci se produit en cas de perte de focus et pour autant que la valeur de la zone de texte ait t
modifie.

1.7.3 lment select


Parmi les vnements associables llment select on trouve onfocus, onblur et onchange.

1.7.4 lment input


1.7.4.1 Champs texte, texte spcial mot de passe et texte spcial rfrence de fichier
Les vnements intressants associer sont onfocus, onblur, onselect et onchange.
1.7.4.2 Bouton simple, denvoi,de rinitialisation, radio, case cocher
Les vnements associer sont onfocus, onblur et onchange.
1.7.4.3 Bouton denvoi image
Les vnements associer sont onfocus et onblur.

1.8 Autres vnements, autres lments


Si vous utilisez un diteur spcialis, vous constaterez peut-tre quil propose beaucoup dautres
vnements et quelques objets de formulaire supplmentaires.
Parmi les vnements, citons, par exemple : onclick, ondblclick, onmousedown, onmouseup,
onmouseover, onmouseout, onmousemove, onkeypress, onkeydown, onkeyup
Les lments button, fieldset, label et optgroup existent galement. Ils offrent de nouvelles possibilits
mais ils ne sont pas correctement interprts par tous les navigateurs.
Par exemple, llment button permet de combiner texte et image. Llment fieldset permet de
regrouper des champs sous un mme titre, grce un lment legend par lequel llment fieldset doit
commencer. Llment label permet dattribuer une tiquette un objet, ce qui na de vritable intrt
que pour les personnes malvoyantes utilisant des navigateurs coupls avec un systme sonore. Llment
optgroup sert regrouper des lments options lintrieur dun lment select ce qui permet la cration
de menus en cascade.

1.9 Exercices
crire des scripts JavaScript pour :

rendre un champ texte inaccessible

donner le focus un lment prcis

permettre lexcution dune action en fonction du choix dun bouton radio

tienne Vandeput CeFIS 2005

20

Publier sur le Web - Perfectionnement

1.9.1 Rendre un champ texte inaccessible


Il suffit de faire perdre le focus lobjet au moment o il la reoit.
<input type="text" name="couleur" onFocus="this.blur()">

Comme dans la plupart des langages objets, la rfrence lobjet courant est this.
Une autre solution consiste donner lobjet lattribut readonly.
<input type="text" name="couleur" readonly>

Les effets graphiques sont lgrement diffrents dans la mesure o, dans le premier cas, le point
dinsertion apparat avant de disparatre.

1.9.2 Donner le focus un lment prcis


Cette action est ralise au chargement de la page. Cest donc lattribut onload de llment body qui est
utilis.
<body onLoad="document.form1.nom.focus()">
<form name="form1" method="post" action="">
<p>Nom
<input type="text" name="nom">
</p>
</form>
</body>

1.9.3 Permettre lexcution dune action en fonction du choix dun bouton radio
Le problme est plus dlicat. Il sagit didentifier le bouton radio qui est slectionn et de complter
laction en consquence.
La premire fonction a pour but de renvoyer lindex correspondant ce bouton dans le tableau des
boutons radios concerns (index qui commence 0). La seconde fonction fixe laction qui est la valeur du
bouton et provoque la soumission du formulaire.
<script language="JavaScript" type="text/JavaScript">
function valeurChoix(groupeBouton){
for (var i=0;i<groupeBouton.length;i++){
if (groupeBouton[i].checked) {return i}
}
}
function choisirAction(formulaire,script){
var i=valeurChoix(script)
formulaire.action=script[i].value
formulaire.submit()
}
</script>

<form name="form1" method="post" action="">


<p>Nom
tienne Vandeput CeFIS 2005

21

Publier sur le Web - Perfectionnement


<input type="text" name="nom">
</p>
<p><strong>Choix du script</strong></p>
<p>
<label>
<input name="choix" type="radio" value="action1.php" checked>
action n&deg;1</label>
<br>
<label>
<input type="radio" name="choix" value="action2.php">
action n&deg;2</label>
<br>
<label>
<input type="radio" name="choix" value="action3.php">
action n&deg;3</label>
</p>
<p>
<input type="button" name="run" value="Ex&eacute;cuter" onClick=
"choisirAction(this.form,this.form.choix)">
<br>
</p>
</form>

Voici quoi ressemble linterface. Le choix dun des boutons


avant un clic sur le bouton simple permet de slectionner le script
dont lexcution sera demande au serveur.

1.10 Les styles CSS


Cette section, un peu hors contexte, trouve toutefois son utilit
dans la mesure o elle prsente un langage (un de plus) interprt
par les navigateurs.
CSS signifie Cascading Style Sheets (feuilles de style en cascade). Cest un langage dont lobjectif est de
paramtrer finement la mise en page et la mise en forme des lments dun document HTML. Il convient
den comprendre les principes, et notamment, le fonctionnement de la cascade. Il est galement utile de se
familiariser avec la syntaxe du langage.
Lutilisation de CSS permet de rflchir des stratgies efficaces de conception en prenant en compte, ds
le dpart, les possibles mises jour.

1.10.1 Feuille de styles


Le concept de feuille de styles est un concept abstrait qui trouve sa concrtisation sous de multiples
formes. On peut dfinir une feuille de styles comme un ensemble de rgles utilises par le navigateur
pour la mise en page et en forme des diffrents lments (au sens de HTML). Ces rgles sont dfinies:

par dfaut

tienne Vandeput CeFIS 2005

22

Publier sur le Web - Perfectionnement

par l'internaute

par l'auteur

Nous verrons plus loin quelles priorits le navigateur accorde ces diffrents niveaux.

1.10.2 Rgle
Une rgle se compose dun slecteur (d'lments) suivi dune dclaration (des paramtres appliquer).
La syntaxe en est la suivante :
<slecteur> {<dclaration>}
Examinons dabord la syntaxe dune dclaration. Elle se compose dun ou plusieurs ensembles constitus
dun mot-cl et dune valeur.
<mot-cl> : <valeur> ; [<mot-cl> : <valeur> ;]*
Il existe 52 mots-cls dans la version CSS1 que sont censs respecter tous les navigateurs. Chaque mot-cl
est spar de sa valeur par un double point et lensemble se termine par un point-virgule. Toutes les
valeurs ne sont pas acceptables.
1.10.2.1 Exemples
color : red ;
color : #FF0000 ;
font-family : Arial ;
color : red; font-size : 18px ;

1.10.3 Slecteur
Les slecteurs sont les paramtres qui autorisent le navigateur slectionner les rgles de mise en forme
applicables aux lments HTML. On distingue les slecteurs simples des slecteurs contextuels.
1.10.3.1 Slecteur simple
Un slecteur simple permet de slectionner les lments de trois manires. Soit :

quils portent le mme nom ;

quils ont les mmes valeurs pour certains attributs prcis (class et id) ;

quils portent le mme nom et ont les mmes valeurs pour certains attributs prcis (class ou id)

1.10.3.2 Exemples
Mme nom : p
Tous les lments p du document HTML tels <p>, <p
chapeau >,

class

= rouge >, <p

id

Mme valeur pour lattribut class : .important (attention au point initial)

Tous lments (quel que soit leur nom) qui ont un attribut class valant "important" tels : <???
class="important" >,

Mme valeur pour lattribut id : #titre (attention au dise initial)

Tous lments (quel que soit leur nom) qui ont un attribut id valant "titre" tels : <??? id="titre" >,

Mme nom et mme valeur pour lattribut class ou lattribut id : p.important ou td#titre

tienne Vandeput CeFIS 2005

23

Publier sur le Web - Perfectionnement

Tous les lments p (td) qui ont un attribut class (id) valant "important" ("titre")
<p class="important" >, <td id="titre" >,

1.10.3.3 Slecteur contextuel


Les slecteurs contextuels permettent de slectionner tous les lments qui sont dans un certain contexte.
La syntaxe est relativement simple puisquun slecteur contextuel se compose de plusieurs slecteurs
simples spars par des espaces.
Il est bon, pour en comprendre lintrt, de prendre en compte le principe d'embotement des lments
HTML. Les lments HTML sont embots. Cela signifie quils peuvent contenir dautres lments (p,
h1, strong, ul,). Un slecteur contextuel fait rfrence un lment contenu dans un ou plusieurs
autres.
La possibilit dutiliser des slecteurs contextuels donne une grande souplesse la mise en forme. Ainsi,
par exemple, les paragraphes peuvent-ils tre formats diffremment sils sont dans un tableau, dans un
calques ou hors de tout contexte.
1.10.3.4 Exemples
h4 strong dsigne les lments strong qui sont contenus dans un lment h4.
<h4>Titre en <strong>gras</strong></h4>

Autres exemples : h4 strong em ou encore td .important


Attention, p.important (slecteur simple) est diffrent de p .important (slecteur contextuel).

1.10.4 Exemples
Voici quelques exemples de rgles. Notez que ces rgles ne sont que du texte et quelles peuvent donc
tre dites avec un simple diteur de texte. Il reste savoir quel endroit on peut les dfinir.
p {color:red;}
les contenus des paragraphes en rouge
h1 {font-size:20px;font-family:Verdana;}
les titres de niveau 1 en taille 20 pixels et police Verdana
p.important {font-weight:bold;}
les paragraphes qualifis "important" en gras
div p,h1,.important {color:red;}
les paragraphes dans les calques, les titres de niveau 1 et tous les lments qualifis "important" en rouge
td p.mineur {color=#333333;font-size:15px;}
les paragraphes qualifis "mineur" dans les cellules de tableau en gris et taille 15 pixels
Il faut signaler que la plupart des diteurs HTML donnent au concepteur la possibilit de crer les rgles
de manire dynamique sans avoir en crire le code.

1.10.5 La cascade
Rappelons que la feuille de style se compose tant des rgles dfinies au niveau du navigateur (feuille de
style par dfaut) que de celles qui pourraient rsulter du choix de linternaute (prfrences au niveau du
navigateur) et, videmment, de celles du concepteur de la page.

tienne Vandeput CeFIS 2005

24

Publier sur le Web - Perfectionnement

Dautre part, une rgle est souvent partielle. Elle ne dfinit pas tous les paramtres des lments
considrs. Pour tablir lensemble des paramtres, le navigateur doit tenir compte dune certaine
hirarchie.
Enfin, comme les rgles peuvent tre dfinies plusieurs endroits, il convient de dterminer, en cas de
rgles concernant les mmes lments, quelle est celle qui doit lemporter. Nous verrons que dans ce cas,
cest la proximit de la dfinition par rapport llment qui compte.
1.10.5.1 Algorithme
Pour comprendre lalgorithme, il faut se rappeler que les lments HTML sont embots (llment qui
contient tous les autres tant html).

Rechercher toutes les dclarations qui concernent l'lment ou la proprit concerne


S'il n'y en a pas, prendre en considration les dclarations hrites (embotement)
S'il n'y en a toujours pas, prendre en considration les valeurs par dfaut

Trier les dclarations par poids explicites (certaines rgles peuvent tre dclares prioritaires par le
concepteur ou linternaute)

Trier par origine (auteur, internaute, agent)

Trier par spcificit du slecteur

Ce dernier point mrite une explication. Il sagit de calculer le poids des rgles quil nest pas encore
possible de trier, de la manire qui suit.
Il sagit de concatner les trois nombres suivants :

le nombre d'attributs id dans le slecteur (ex: 1)

le nombre d'attributs class dans le slecteur (ex: 1)

le nombre dlments (ex: 3)

Dans notre exemple, le poids est 113. Cest la rgle qui a le poids le plus lev qui lemporte.

1.10.6 Exercice
1.10.6.1 nonc
Si toutes les dclarations qui suivent sont valables pour un mme lment li, quel sera le slecteur dont la
dclaration sera retenue?
ol ul li.rouge {}
ul li {}
li {}
ol ul li {}
#titre {}
li.rouge {}
Imaginez une partie de la syntaxe de cet lment et ses embotements pour que cette situation soit
plausible.
1.10.6.2 Correction
ol ul li.rouge {}

013

tienne Vandeput CeFIS 2005

25

Publier sur le Web - Perfectionnement

ul li {}

002

li {}

001

ol ul li {}

003

#titre {}

100

li.rouge {}

011

Cest donc la dfinition de #titre qui sera prise en compte. Cest assez logique si on se dit quil sagit
dun lment trs particulier puisquil est appel titre.
Voici une structure qui rend toutes ces dfinitions plausibles.
<ol>

<ul>

<li class = rouge id = titre ></li>

</ul>

</ol>

1.10.7 Localisation des feuilles de styles


Les rgles dune feuille de styles peuvent se retrouver plusieurs endroits :

dans un fichier externe

dans lentte du document HTML

dans la balise douverture dun lment

dans les paramtres du navigateur

1.10.7.1 Fichier externe


Il est possible, et cest mme la meilleure des solutions, de rassembler les rgles dans un fichier texte qui
sera tlcharg. La liaison entre le document HTML et le fichier feuille de style se fait par
lintermdiaire de llment link.
<link rel="stylesheet" href="essai.css" type="text/css">

Lattribut rel dcrit le type de relation entre les fichiers. Lattribut href prcise la localisation du fichier.
Lattribut type dcrit le type de fichier au navigateur.
1.10.7.2 Entte du document HTML
Des rgles peuvent galement tre incluses l'intrieur de l'lment style de lentte. La syntaxe des
rgles est rigoureusement la mme.
<style type="text/css">
<!-.rouge {font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #FF0000}
-->
</style>
tienne Vandeput CeFIS 2005

26

Publier sur le Web - Perfectionnement

Les balises de commentaires sont ignores par les navigateurs sils sont capables dinterprter le langage
CSS.
1.10.7.3 lment
La seule possibilit ce niveau est dutiliser un attribut. Il sagit de lattribut style dont la valeur est la
rgle prendre en compte. La syntaxe est lgrement diffrente (pas de slecteur videmment et pas
daccolades).
<h1 style="color : #00ff00">

Rappelons que la priorit est accorde aux paramtres qui sont les plus proches de llment. Cette
dernire technique est donc une faon de revoir, en dernire minute, le style dun lment. Il nest pas dit
que cest une manire efficace de procder.

1.11 Les formulaires et JavaScript


Lintrt dun langage de script ct client est vident :

il permet une certaine interactivit ;

il autorise un certain contrle des interactions qui serait trop lourd demander un serveur.

Dans cette section, nous prsentons et commentons certains scripts. La plupart sont lis la gestion des
formulaires. Le but est de montrer comment fonctionnent le modle objet et le modle des vnements en
JavaScript et de faire percevoir qu peu prs tout est permis en matire dinteraction. Beaucoup de ces
scripts sont des classiques que lon retrouvera sous dautres formes sur des sites Web.

1.11.1 Scripts gnraux


Nous avons dj proposs des scripts titre dexercices. En voici dautres. Certains illustrent la
communication possible entre les langages et en particulier, entre JavaScript et PHP.
1.11.1.1 Faire afficher la date et lheure
Cet exemple illustre la possibilit de crer un objet de type Date et den extraire les informations. Un
objet est cr en utilisant le mot-cl new. Diverses mthodes peuvent tre invoques sur des objets de type
Date : getDate(), getMonth(),
Notez que getDate() renvoie un nombre entre 1 et 31 alors que getDay() renverrait un nombre entre 0 et 6
correspondant au jour de la semaine.
<script language="javascript">
<!-maintenant = new Date()
document.write("<br>Aujourd'hui, nous sommes le ", maintenant.getDate(), "/",
maintenant.getMonth() + 1, "/" , maintenant.getYear())
document.write("<br>Il est ",maintenant.getHours(),":",maintenant.getMinutes(),'.');
-->
</script>

1.11.1.2 Faire afficher la date du serveur


Cet exemple illustre le passage dun langage lautre. Nous utilisons ici la mthode write() de lobjet
document. Le mini script PHP fournira la date du serveur sous forme dune chane de caractres.
<script language="Javascript">

tienne Vandeput CeFIS 2005

27

Publier sur le Web - Perfectionnement


<!-document.write('Nous sommes le ' + '<?php echo date("d/m/Y"); ?>'+'.');
-->
</script>

Cette dernire sera concatne un bout de phrase par JavaScript (oprateur + pour la concatnation).
Notez que date() est une fonction PHP13.
Le fichier qui contiendra ce script devra avoir lextension php.
1.11.1.3 Faire afficher la date de dernire modification du document
On sintresse ici la proprit lastModified de lobjet document. Le rsultat (une chane de caractres)
est ensuite dcoup en morceaux pour reconstituer la date sous un format europen.
<script language="javascript">
<!-date=document.lastModified
jour=date.charAt(3)+date.charAt(4)
mois=date.charAt(0)+date.charAt(1)
annee=date.charAt(6)+date.charAt(7)+date.charAt(8)+date.charAt(9)
document.write("<br>Ce document a t modifi pour la dernire fois le
"/" + mois + "/" + annee)

" + jour +

-->
</script>

La mthode charAt() sapplique tous les objets chanes de caractres et renvoie le caractre la position
indique par largument (lindex commence 0 comme dhabitude). Une autre possibilit est dutiliser la
mthode substring().
On observe aussi que JavaScript peut produire des balises (exemple ici : <br>) qui seront interprtes par
le navigateur.
1.11.1.4 Recommander un site un(e) ami(e)
Il sagit dun script simple mais qui montre la souplesse dun langage comme JavaScript. Les variables
email, sujet et message correspondent des chanes de caractres. La proprit location de lobjet
window sert rediriger la fentre vers une nouvelle adresse (URL). Autrement dit, le navigateur fera
appel au client mail en fournissant le destinataire (adresse), le sujet (sujet) et le corps du message
(message). Ladresse est fournie par linternaute travers une bote de dialogue (fonction prompt()).
<script language="javascript">
<!-function recommander(){
var adresse= prompt('E-mail de votre ami(e) :',' ');
var sujet= "Le CeFIS un centre de formation aux technologies";
var message= "Le CeFIS est le centre de formation que vous cherchez !! Cliquez-ici :
http://www.det.fundp.ac.be/cefis/";
window.location="mailto:"+adresse+"?subject="+sujet+"&body="+message;

13

Pour information : http://be.php.net/manual/fr/function.date.php

tienne Vandeput CeFIS 2005

28

Publier sur le Web - Perfectionnement


}
-->
</script>

Un seul bouton est ncessaire pour le dclenchement de la fonction recommander().


<form name="form1" method="post" action="">
<p>
<input name="envoi" type="button" class="important1" value="Recommander &agrave;
un ami" onclick="recommander()">
</p>
</form>

En voici une illustration :

tienne Vandeput CeFIS 2005

29

Publier sur le Web - Perfectionnement

1.11.2 Scripts lis aux formulaires


1.11.2.1 Transformer en majuscules le contenu saisi dans un champ
Dans cet exemple, on dcouvre que la valeur dun attribut vnement peut tre une instruction et non une
fonction. La valeur de lattribut commence par le mot-cl javascript: suivi de linstruction.
<form name="form1" method="post" action="">
<p>Nom:
<input type="text" name="titre"
onChange="javascript:this.value=this.value.toUpperCase();">
</p>
<p>Pr&eacute;nom:
<input type="text" name="auteur">
</p>
</form>

Le script se rsume cette seule instruction. Lorsque lobjet titre perdra le focus, son contenu sera
transform en majuscules.
1.11.2.2 Vider le contenu dun champ en cliquant sur un bouton
Ce script peut tre intressant lorsque le champ contient une valeur par dfaut et que cette valeur ne
convient pas. Cela vite lutilisateur du formulaire de devoir effacer manuellement la valeur.
<script language="javascript">
<!-function vide(n)
{
document.form1.elements[n].value="";
}
-->
</script>

En cas de clic sur le bouton, le contenu de llment numro 0 est effac.


<form name="form1" method="post" action="">
<p>Valeur:
<input type="text" value="Valeur par dfaut">
<input type="button" value="Effacer" onclick="vide(0)">
</p>
</form>

1.11.2.3 Vider le contenu dun champ (valeur par dfaut) lorsquon lui donne le focus
Lutilit de ce script est semblable celle du script prcdent. La manipulation est encore plus rapide. Il
est parfois intressant demployer cette technique pour garnir le champ dune valeur par dfaut qui donne
une indication sur linformation fournir ( votre nom ).
<input name="nom" type="text" id="nom" value="Votre nom" size=18 maxlength=75
onfocus="this.value=''">

tienne Vandeput CeFIS 2005

30

Publier sur le Web - Perfectionnement

1.11.2.4 Contrler que le contenu dun champ est dune longueur minimale
La fonction alert() affiche une bote de dialogue comportant un message dalerte. Cest la proprit
length du contenu du champ qui est teste. La fonction renvoie un boolen car elle est utilise comme
valeur de lattribut onsubmit du formulaire.
<script language="javascript">
<!-function minimum(champ,nbre){
if (champ.length < nbre){
alert("Le mot de passe doit compter "+nbre+" caractres au minimum.");
return false;
}
return true;
}
-->
</script>

Au niveau du formulaire, on aura :


<form name="form1" method="post" action="../exemples/ok.php" onsubmit="return
minimum(this.mp.value,6)">
<p>Identificateur
<input name="id" type="text" id="id">
</p>
<p>Mot de passe
<input name="mp" type="password" id="mp">
</p>
<p>
<input name="envoi" type="submit" id="envoi" value="Envoyer">
</p>
</form>

Un des paramtres est la rfrence faite la proprit value du champ mp du formulaire courant (this).
1.11.2.5 Augmenter la taille dun champ en fonction de son contenu
Ce script permet un champ de slargir si son contenu est trop large pour la taille du champ. Cet
agrandissement na toutefois lieu que lorsque le champ perd le focus.
<script language="JavaScript">
function augmente(){
var taille = document.form1.champ.size;
if(document.form1.champ.value.length>=taille){
document.form1.champ.size = document.form1.champ.value.length;}
else {document.form1.champ.size = taille;}
}
</script>

tienne Vandeput CeFIS 2005

31

Publier sur le Web - Perfectionnement

Cest la valeur de lattribut size du champ texte et la proprit de longueur du contenu de celui-ci qui sont
concerns par ce script. Lorsquune modification du contenu du champ a lieu, la fonction augmente() est
active.
<form name="form1" method="post" action="">
<p>Champ qui s'agrandit:
<input type="text" name="champ" maxlength="50" size="2" onChange="augmente()">
</p>
<p>Autre champ
<input type="text" name="autrechamp">
</p>
</form>

1.11.2.6 Vrification (simple) dune adresse email


On se contente ici de vrifier que larrobase fait bien partie de la chane encode.
<script language="javascript">
<!-function arrobase_ok(email){
var a=document.forms[0].email.value;
var test="" + a;
for(var k = 0; k < test.length;k++){
var c = test.substring(k,k+1);
if(c == "@"){
return true;
}
}
alert("Ladresse email nest pas correcte!");
return false;
}
-->
</script>

tienne Vandeput CeFIS 2005

32

Publier sur le Web - Perfectionnement

Le corps du document contiendra la dfinition suivante de formulaire:


<form name="form1" method="post" action="" onsubmit="return arrobase_ok(email)">
<p>Nom
<input type="text" name="nom">
</p>
<p>Adresse email
<input name="email" type="text" class="important1">
</p>
<p>
<input type="submit" name="envoi" value="Envoyer">
</p>
</form>

En cas de fourniture dadresse dpourvue darrobase, un message sera affich comme le montre
lillustration ci-aprs.

1.11.2.7 Remplir une liste en fonction dun choix par bouton radio
Cet exemple montre que les choix proposs aux internautes peuvent tre fonction dautres choix que font
ces derniers. Il illustre aussi la cration dobjet et inclus des lments de mise en page au moyen de styles
CSS (voir dernire ligne de code et illustration).
<script language="javascript">
<!-function animaux(form,list){
list.options.length=0;
var o=new Option("Lapin","1");
form.liste.options[form.liste.options.length]=o;

tienne Vandeput CeFIS 2005

33

Publier sur le Web - Perfectionnement


var o=new Option("Chat","2");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Chien","3");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Renard","4");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Canard","5");
form.liste.options[form.liste.options.length]=o;
}
function sports(form,list){
list.options.length=0;
var o=new Option("Tennis","1");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Basket","2");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Natation","3");
form.liste.options[form.liste.options.length]=o;
}
function fleurs(form,list){
list.options.length=0;
var o=new Option("Rose","1");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Tulipe","2");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Narcisse","3");
form.liste.options[form.liste.options.length]=o;
var o=new Option("Jonquille","4");
form.liste.options[form.liste.options.length]=o;
}
-->
</script>
<link href="../cefis.css" rel="stylesheet" type="text/css">

Les fonctions animaux(), sports() et fleurs() ont pour but de crer des listes. Une de ces listes sera cre
en fonction du choix de linternaute. Un objet Option est cr en donnant son tiquette et sa valeur.
Dans la description du formulaire qui suit, on voit quen fonction du bouton radio cliqu, cest lune ou
lautres des trois fonctions qui est active, crant une liste danimaux, de sports ou de fleurs.
<form name="form1" action="" method="get">
<table width="260" cellspacing="2" cellpadding="5">

tienne Vandeput CeFIS 2005

34

Publier sur le Web - Perfectionnement


<tr>
<td width="96"><p>
<input type="radio" name="choix" value="Animaux" onClick =
"animaux(this.form,this.form.liste)">
Animaux</p>
<p>
<input type="radio" name="choix" value="Sports" onClick =
"sports(this.form,this.form.liste)">
Sports </p>
<p>
<input type="radio" name="choix" value="Fleurs" onClick =
"fleurs(this.form,this.form.liste)">
Fleurs </p></td>
<td width="132"><select name="liste" size="3" class="gris" align="top">
<option value="Liste vide" selected>Liste vide</option>
</select></td>
</tr>
</table>
</form>

Au dpart, la liste est vide ou plutt,


elle ne contient que litem Liste
vide . Lorsquun choix est fait, la
liste
se
remplit
des
items
correspondants.

1.12 Exercice
Crez un formulaire votre got et selon vos intrts. Il devra contenir des champs texte, une liste
droulante, un groupe de boutons radios et lune ou lautre case cocher, un bouton simple qui permet de
faire excuter un script local (vrification du remplissage de certains champs) et un bouton de soumission.
Noubliez pas de donner des tiquettes aux objets du formulaire.
La page contiendra la date du jour et la date de dernire modification.
Lorsque le formulaire sera soumis, une page contenant des bribes de code PHP reconstituera un
document HTML reprenant quelques-unes des donnes fournies avec, si possible, un petit traitement sur
lune ou lautre donne (par exemple en rcrivant nom et prnom dans lordre inverse avec linitiale du
prnom seulement)14.

14

Vous pouvez dj consulter la liste des fonctions PHP pour faire quelques manipulations simples.

tienne Vandeput CeFIS 2005

35

Publier sur le Web - Perfectionnement

2. Le langage PHP
2.1 En quoi consiste PHP ?
PHP est un langage de scripts open ource15. Comme beaucoup dautres langages, il a t spcialement
conu pour le dveloppement d'applications web. Il peut tre intgr au HTML. Pour ce faire, le code
PHP est inclus entre une balise de dbut (ensemble de symboles) et une balise de fin qui permettent au
serveur web de passer en mode PHP. La partie PHP correspond donc la partie crative et dynamique du
document HTML finalement envoy par le serveur et que le navigateur transformera en page Web.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>M&eacute;lange HTML - PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../cefis.css" rel="stylesheet" type="text/css">
</head>
<body>
<h4>Partie statique (HTML pur et dur)</h4>
<p>Cette partie du texte est du HTML classique.</p>
<h4>Partie dynamique (HTML construit)</h4>
<p><?php echo "Celle-ci a t transforme en HTML <strong>au niveau du
serveur</strong>, par l'analyseur PHP."; ?></p>
</body>
</html>

laffichage, cela donne :

15

Un logiciel est dit open source si le code source est inclus avec sa version compile, encourageant ainsi rellement sa
modification ou son adaptation. Pour tre considr comme tel, le logiciel doit tre distribu gratuitement, le code source doit y
tre inclus de sorte que chacun puisse le modifier et le redistribuer.
tienne Vandeput CeFIS 2005

36

Publier sur le Web - Perfectionnement

Contrairement au code JavaScript, le code PHP est excut par le serveur et non par le client. Le client ne
reoit que le rsultat du script, sans aucun moyen d'avoir accs au code qui a produit ce rsultat. Si vous
donnez aux fichiers HTML correspondant des pages statiques lextension PHP, linternaute na aucun
moyen de distinguer les pages qui sont produites dynamiquement des pages statiques. Voici la partie
intressante de la source qua reue le navigateur dans lexemple prcdent :
<body>
<h4>Partie statique (HTML pur et dur)</h4>
<p>Cette partie du texte est du HTML classique.</p>
<h4>Partie dynamique (HTML construit)</h4>
<p>Celle-ci a t transforme en HTML <strong>au niveau du serveur</strong>, par
l'analyseur PHP.</p>
</body>

Tous les fichiers contenant des instructions en PHP doivent possder lextension .php16.

2.2 Quoffre PHP?


PHP est principalement conu pour servir de langage de script cot serveur. Il est capable de raliser
tout ce qu'un script CGI peut faire17. Il est principalement utilis pour crire des scripts de collecte de
donnes issues de formulaires, de stockage ventuel de ces donnes dans une base de donnes, de
gnration dynamique de contenu (voir petit exemple ci-dessus), C'est l'utilisation la plus traditionnelle
et le principal objet de PHP. Trois composants sont ncessaires:

un analyseur PHP,

un serveur Web (Apache, par exemple),

un navigateur web.

Le serveur Web doit sexcuter en corrlation avec PHP, ce qui ncessite une configuration particulire et
pas forcment vidente raliser. Cest pourquoi il existe des environnements logiciels grce auxquels
ces problmes passent au second plan18.
Notez quil est aussi possible dcrire des scripts PHP et de les excuter en ligne de commande, sans
l'aide du serveur Web et d'un navigateur. Il faut, pour cela, disposer de l'excutable PHP. Cette utilisation
est intressante pour des scripts qui doivent tre excuts rgulirement.
PHP est utilisable sur la majorit des systmes d'exploitation et supporte la plupart des serveurs Web
actuels et notamment Apache et Microsoft Internet Information Server (IIS).
Vous avez galement le choix d'utiliser la programmation procdurale, la programmation objet, ou un
mlange des deux.

16

Dautres extensions sont reconnues telles php3, phtml, pour autant quelles soient fournies au serveur Web via le
fichier .httpd.conf. Par exemple : AddType application/x-httpd-php .phtml .pwml .php3 .php4 .php .php2 .inc.
17

CGI (Common Gateway Interface) est un moyen de faire communiquer le client Web avec des applications crites
dans diffrents langages et disponibles au niveau du serveur. Lutilisation de scripts CGI demande, bien entendu, quelques
efforts de configuration.

18

http://www.easyphp.org/telechargements.php3

tienne Vandeput CeFIS 2005

37

Publier sur le Web - Perfectionnement

PHP ne se limite pas la production de code HTML. Il peut aussi gnrer des images, des fichiers PDF,
et mme des animations Flash. Il gnre facilement du texte et donc aussi, du code XML ou XHTML.
PHP gnre ces fichiers et les sauve dans le systme de fichiers, ou bien les envoie au navigateur web.
Mais, ce qui nous intresse davantage, PHP possde de nombreuses fonctions permettant dexploiter les
bases de donnes parmi lesquelles: InterBase, PostgreSQL, dBase, MySQL, IBM DB2, ODBC, Informix,
Oracle et Ingres, pour ne citer que les plus connues.

2.3 Les bases du langage


2.3.1 lments de syntaxe
2.3.1.1 Les balises PHP
Il y a quatre jeux de balises pouvant servir dlimiter des blocs de code PHP. Seuls deux d'entre eux
sont actifs coup sr19: <?php. . .?> et <script language="php">. . .</script>.
<html>
<head>
<title>M&eacute;lange HTML - PHP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p>Cette partie du texte est interpr&eacute;t&eacute;e par le navigateur.</p>
<p>
<script language="php"> echo "Celle-ci le sera par l'analyseur PHP."; </script>
</p>
</body>
</html>

Cette deuxime syntaxe est videmment plus lourde. Dans la suite de ces notes, nous utiliserons toujours
la premire.
2.3.1.2 Les sparateurs d'instructions
Le sparateur d'instructions est le symbole ";". Il est ncessaire partout sauf devant la balise de fin
d'excution du PHP soit "?>".
2.3.1.3 Les commentaires
Comme dans de nombreux autres langages, les caractres se trouvant entre les couples de symboles "/*"
et "*/" ne sont pas pris en compte par l'analyseur.
Les commentaires jusqu'en fin de ligne commencent par les symboles "//" ou le symbole "#".
<html>
<head>
<title>M&eacute;lange HTML - PHP</title>
19

Les balises courtes (sans le mot-cl php) et les balises ASP peuvent tre actives et dasctives au niveau du fichier

php.ini.
tienne Vandeput CeFIS 2005

38

Publier sur le Web - Perfectionnement


<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p>Cette partie du texte est interpr&eacute;t&eacute;e par le navigateur.</p>
<p>
<?php
/*
echo est une fonction d'affichage.
Elle est suivie d'une chane de caractres.
*/
echo "Celle-ci le sera par l'analyseur PHP.<br>"; // La fonction print est ...
print "Et celle-ci aussi!"; # La preuve!
?>
</p>
</body>
</html>

2.3.2 Variables
2.3.2.1 Variables internes
Les variables sont reprsentes par le signe dollar "$" suivi du nom de la variable. Le nom est sensible
la casse ($x $X).
Un nom de variable doit commencer par une lettre ou le caractre soulign (_), suivi de lettres, chiffres ou
souligns.
<html>
<head>
<title>Nommage des variables et affectations</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$prenom='tienne';
$Prenom="Charles";
echo $prenom,' est l\'assistant de ',$Prenom,'.';
?>
</body>
</html>

Dans cet exemple, on constate que

la casse des caractres est importante dans les noms de variables,

les chanes de caractres constantes s'crivent entre guillemets ou apostrophes,

la fonction echo admet plusieurs arguments spars par des virgules,

tienne Vandeput CeFIS 2005

39

Publier sur le Web - Perfectionnement

une vraie apostrophe dans une chane de caractres, elle-mme dlimite par des apostrophes, doit
tre prcde de la barre oblique inverse (\).

Les variables sont affectes par valeur mais peuvent aussi l'tre par rfrence ( partir de PHP4). Dans
ce deuxime cas, la nouvelle variable ne fait que rfrencer la variable originale. Les modifications de la
nouvelle variable affecteront l'ancienne, et vice versa. Pour assigner par rfrence, on ajoute le symbole
"&" au nom de la variable source.
<html>
<head>
<title>Nommage des variables et affectations</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$a=12;
$b=23;
print $a+$b.' ';
// Affectation par valeur
$c=$a;
$c=20;
print $a+$b.' ';
// Affectation par rfrence
$c=&$a;
$c=15;
print $a+$b;
?>
</body>
</html>

Observez que l'affectation se fait au moyen du symbole "=" alors que l'oprateur de comparaison est (voir
plus loin) "==".
L'instruction print $a+$b.' '; est particulire. La premire expression est le rsultat d'une opration
entre deux entiers (voir les types, ci-aprs), alors que la seconde est une chane constitue du seul
caractre "espace". L'oprateur entre les deux, symbolis par le point (.), est un oprateur de
concatnation. L'expression entire est donc automatiquement transforme en chane de caractres avant
d'tre affiche.
2.3.2.2 Porte des variables
Les variables ont une porte globale si elles ne sont pas dfinies lintrieur dune fonction. Elles sont
accessibles partout dans le script. Les variables dfinies lintrieur dune fonction sont locales. De
mme, les variables dfinies en dehors dune fonction ne sont pas directement accessibles lintrieur de
celle-ci.

tienne Vandeput CeFIS 2005

40

Publier sur le Web - Perfectionnement

Il est possible daccder aux variables globales lintrieur des fonctions. De mme, il est possible de
rendre visibles partout les variables dfinies dans une fonction.
Le script qui suit illustre la porte des variables. lintrieur dune fonction, il est possible daccder
une variable globale par lintermdiaire du tableau prdfini $GLOBALS[]. Ce tableau est index par les
noms des variables (sans le symbole $). Pour rendre une variable locale visible, il faut utiliser la
dclaration global.
<?php
$a=1;
$b=2;
function portee(){
$a=101;
$b=102;
echo $a+$b.'<br>'; // Affichage de la somme l'intrieur de la fonction
echo $GLOBALS['a'].'<br>'; // Accs la variable globale $a (extrieure)
global $c; // Rendre la variable $c locale visible partout
$c=99;
}
portee();
echo $a+$b; echo '<br>'; // Affichage de la somme l'extrieur de la fonction
echo $c.'<br>'; // Affichage de la valeur de $c l'extrieur de la fonction
echo $GLOBALS['c'].'<br>';
?>

Voici le rsultat : la fonction portee() est excute, fournissant la somme des


valeurs des variables locales et la valeur de la variable globale $a. Puis cest la
somme des valeurs des variables globales qui est affiche, suivie de la valeur de
la variable $c qui a t rendue globale et qui est obtenue de deux manires
diffrentes, vu que la valeur de la variable $c garnit aussi le tableau
$GLOBALS[].
2.3.2.3 Variables dynamiques
Il est possible de s'arranger pour que le nom d'une variable soit lui-mme
variable. C'est particulirement pratique pour viter les problmes de
nomination. Cette opportunit existe en utilisant le symbole dollar ($) une
seconde fois. Voyez l'exemple qui suit.
<?php
$a="Charles";
$$a="Directeur du CeFIS";
echo $a.' '.$Charles;
?>

Lintrt de pouvoir crer des variables dynamiquement est dviter de devoir


utiliser des tableaux, voire de se casser la tte pour trouver des noms de variables.

tienne Vandeput CeFIS 2005

41

Publier sur le Web - Perfectionnement

En voici un exemple :
<?php
foreach($_POST as $key => $value) {
$varname = "_".$key;
$$varname = $value;
}
?>

Mme si vous ne connaissez pas encore cette structure rptitive, il est facile de comprendre ce que fait
cette partie de script. Les valeurs dun formulaire dcorent le tableau $_POST qui contient les valeurs
envoyes au serveur par le client. Pour clater ce tableau en autant de variables que ncessaire, on cre
des variables contenant chaque fois une chane de caractres commenant par le caractre de
soulignement, suivi du nom de la variable (cl dindex du tableau). On utilise ces chanes comme nom
pour des variables qui contiendront les valeurs transmises.
Exemple : si les couples cls-valeurs transmis sont (nom, Vandeput), (prenom, tienne), (departement,
DET), les variables cres seront respectivement $_nom, $_prenom et $_departement et contiendront les
valeurs Vandeput, tienne et DET.
2.3.2.4 Variables externes
PHP manipule aussi des variables provenant de l'extrieur comme, nous venons juste de le rappeler, les
variables provenant de la soumission d'un formulaire. C'est d'ailleurs l une de ses qualits. Ces
variables sont aisment accessibles travers des tableaux prdfinis. Parmi ceux-ci, notons $GLOBALS
qui rassemble les variables globales, $_POST et $_GET qui contiennent respectivement les valeurs
transmises par la mthode post et celles qui ont t transmises par la mthode get, ou encore $_SERVER.
Nous vous renvoyons la documentation pour plus de dtails. Nous donnons ici quelques exemples
dinformations normalement20 disponibles au niveau du serveur
<html>
<head>
<title>La variable $_SERVER</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../cefis.css" rel="stylesheet" type="text/css">
</head>
<body>
<p>
<?php
echo "<span class='important2'>Nom du fichier partir de la racine: </span>";
echo $_SERVER['PHP_SELF'].'<br><br>';
echo "<span class='important2'>Nom de la racine du script: </span>";
echo $_SERVER['DOCUMENT_ROOT'].'<br><br>';
echo "<span class='important2'>Nom du client HTML: </span>";
20

Il ny a aucune garantie sur la fourniture de toutes les informations prvues par un serveur donn.

tienne Vandeput CeFIS 2005

42

Publier sur le Web - Perfectionnement


echo $_SERVER['HTTP_USER_AGENT'].'<br><br>';
echo "<span class='important2'>Nom du serveur qui excute le script: </span>";
echo $_SERVER['SERVER_NAME'].'<br><br>';
?>
</p>
</body>
</html>

dont voici le rsultat dans un contexte donn :

Un autre moyen daccder aux valeurs du tableau $_server est dactiver la fonction prdfinie phpinfo()
dans un script.

Linstruction placer dans le fichier php est :


<?php phpinfo() ?>

tienne Vandeput CeFIS 2005

43

Publier sur le Web - Perfectionnement

Voici un petit exemple qui illustre le profit que lon peut ventuellement tirer de telles informations. La
composante $_SERVER[REMOTE_ADDR] reprsente ladresse IP du client. Supposons quune page soit
rserve une catgorie de clients identifiables par leur adresse IP (par exemple, les Facults :
138.48.). Il suffit de vrifier que le client a bien une adresse commenant par ces deux valeurs. La
fonction explode(<sparateur>,<chane>) renvoie un tableau dont les composantes sont les lments de
la chane <chane> spares par le sparateur <sparateur>.
$adresseIP=explode(".",$_SERVER['REMOTE_ADDR']);
if(adresseIP[0]!="138"||adresseIP[1]!="48"){
echo htmlentities("Accs limit aux FUNDP");
exit;
}

La fonction htmlentities(<chane>) convertit les caractres spciaux en entits HTML (exemple :


devient &eacute;. Lutilisation de cette fonction vite un certain nombre de surprises.

2.3.3 Les constantes


Une constante est un identifiant qui reprsente une valeur simple. Le nom de constante valide commence
par une lettre ou un soulign (_), suivi d'un nombre quelconque de lettre, chiffres ou souligns. Par
convention, les constantes sont toujours en majuscules.
Les constantes sont dfinies grce la fonction define() et ne peuvent tre redfinies.
$a=3;
define("VALMAX","100");
$a+=VALMAX;
echo $a;

affichera la valeur 103.


Elles sont accessibles de manire globale.
$a=3;
define("VALMAX","100");
$a+=VALMAX;
echo $a.'<br>';
function test(){
echo VALMAX;
}
test();

2.3.4 Types
Habituellement en PHP, le type d'une variable n'est pas dclar par le programmeur. Il est dcid au
moment de l'excution, en fonction du contexte dans lequel la variable est utilise (voir exemple ci-dessus
pour la variable adresseIP).
Il y a huit types de base dont:
quatre types scalaires (valeurs indcomposables)

tienne Vandeput CeFIS 2005

44

Publier sur le Web - Perfectionnement

boolen

entier

nombre virgule flottante

chane de caractres

deux types composs

tableau

objet

et deux types spciaux

ressource

null

Comme d'autres langages, PHP offre la possibilit de "transtyper" les variables (casting).
examinons rapidement les types scalaires. Les autres types seront analyss plus loin.

Nous

2.3.4.1 Boolen
Classiquement, les valeurs sont true et false (casse sans importance). Les variables des autres types
peuvent tre transtypes en variable boolenne. Ainsi, par exemple, la valeur entire 0, la valeur en
nombre virgule 0.0, la chane vide ou la chane "0" prennent la valeur false lorsqu'elles sont
transtypes en boolen.
2.3.4.2 Entier
Les entiers peuvent tre spcifis en base dcimale, en hexadcimal ou en octal et optionnellement tre
prcds d'un signe.
Selon les systmes, environ 4 milliard de valeurs signes sont possibles (codage sur 32 bits).
<?php
$i=123456;
$j=123.456E3;
$k=01234;
$l=0xAA45;
print $i."<br>".$j."<br>".$k."<br>".$l
?>

2.3.4.3 Nombre virgule flottante


Voici quelques exemples illustrant la syntaxe admise.
<?php
$i=123.456;
$j=1.23456E2;
$k=.123456e3;
print $i."<br>".$j."<br>".$k
?>

tienne Vandeput CeFIS 2005

45

Publier sur le Web - Perfectionnement

La taille des nombres dcimaux dpend de la plateforme. La configuration la plus rpandue permet de
coder des nombres dont l'ordre de grandeur est de 1.8E308 avec une prcision de 14 dcimales. C'est le
format 64 bits IEEE.
Il ne faut jamais faire confiance aux nombres virgule jusqu' leur dernire dcimale et s'interdire de les
comparer avec l'oprateur d'galit.
2.3.4.4 Chane de caractres
Il y a trois manires diffrentes de construire des chanes de caractres:

en utilisant les apostrophes;

en utilisant les guillemets;

en utilisant la syntaxe HEREDOC (dont nous ne parlerons pas).

2.3.4.5

Les apostrophes

$prenom='tienne';

Si la chane doit contenir des apostrophes, vous devez les chapper avec la barre oblique inverse (\).
$titre='L\'cole et les TIC';

C'est pareil pour la barre oblique inverse elle-mme.


$remarque='Utilisez la barre oblique inverse (\\) pour chapper les caractres.';

Les noms de variables prsents dans la chane apparatront tels quels.


$c='La variable $nom';
<?php
$prenom='tienne<br>';
$titre='L\'cole et les TIC<br>';
$remarque='Utilisez la barre oblique inverse (\\) pour chapper les caractres.<br>';
$c='La variable $nom';
echo $prenom.'<br>'.$titre.'<br>'.$remarque.'<br>'.$c;
?>

Observez que les balises HTML qui ne sont que du texte peuvent tre incluses dans les chanes de
caractres. Elles seront interprtes par le navigateur.
2.3.4.6 Les guillemets
L'apostrophe ne doit plus tre chapp mais bien le guillemet. Les noms de variables sont remplacs
par leurs valeurs respectives.
<?php
$prenom="tienne";
$titre="Le cours \"PHP\"<br>";
tienne Vandeput CeFIS 2005

46

Publier sur le Web - Perfectionnement


$remarque="Utilisez la barre oblique inverse (\\) pour chapper les caractres.<br>";
$c="Le cours PHP est donn par $prenom.<br>";
$d='Le cours PHP est donn par $prenom.<br>';
$e='Le cours PHP est donn par '.$prenom.'.<br>';
echo $prenom."<br><br>".$titre."<br>".$remarque."<br>".$c."<br>".$d."<br>".$e;
?>

2.3.5 Oprateurs
Comme tout langage de programmation, PHP propose des oprateurs et des fonctions prdfinies, mais
offre aussi au programmeur la possibilit de construire ses propres fonctions. Les oprateurs (comme les
fonctions prdfinies) sont trop nombreux pour tre dcrits ici. Vous pouvez vous rfrer la
documentation en ligne de PHP21. Dans ce qui suit, nous nous contentons dvoquer ceux, parmi les
moins classiques, qui prsentent un intrt immdiat. Ils sont utiliss et documents dans les exemples qui
suivent.
2.3.5.1 Oprateurs dassignation
Lassignation se fait classiquement en utilisant le symbole =. Des facilits sont offertes comme dans de
nombreux autres langages :
oprateurs combins += ou .=
$a += $b ; // $a = $a + $b ;
$a .= $b ; // $a = $a . $b ;

assignations combines
$a = ($b = 5) + 1; // $b = 5 ; $a = $b + 1 ;

2.3.5.2 Oprateurs de comparaison


La comparaison peut se faire sur les valeurs mais galement sur les types. Cest la raison pour laquelle,
loprateur classique de comparaison ==, sajoute un oprateur qui vrifie en plus lgalit des types ===.
$a === $b possde la valeur true uniquement si les deux variables contiennent les mmes valeurs et
sont de mme type.

On trouve de mme des oprateurs != et !== pour tester la diffrence des valeurs et la diffrence des
valeurs ou des types.
$a !== $b possde la valeur true si les deux variables contiennent des valeurs diffrentes ou sont de
types diffrents.
21

http://www.php.net/manual/fr/

tienne Vandeput CeFIS 2005

47

Publier sur le Web - Perfectionnement

2.3.5.3 Oprateurs dincrmentation dcrmentation


Ces oprateurs peuvent tre utiliss de concert avec des tests. Cest la raison pour laquelle on parle de pr
ou de post incrmentation/dcrmentation.
++$a incrmente $a avant de renvoyer sa valeur (pour un test ventuel).
$a++ renvoie la valeur de $a avant de lincrmenter.

Les expressions suivantes --$a et $a-- sont les quivalentes en dcrmentation.


2.3.5.4 Oprateurs logiques
Les oprateurs logiques habituels, ET, OU et NON sont respectivement symboliss par &&, || et !. Il
existe aussi des oprateurs and et or qui sont quivalents && et || ceci prs quils ont une priorit
diffrente. Profitons-en pour rappeler quil faut tre attentif la priorit des oprateurs et, en cas de doute,
utiliser les parenthses.
2.3.5.5 Oprateurs de chanes
Loprateur de concatnation des chanes de caractres est le point.
Si $nom contient la valeur Vandeput et $prenom, la valeur tienne , le texte affich par
echo "Bonjour".$prenom." ".$nom.".";

sera
Bonjour tienne Vandeput.

Notez la diffrence d'interprtation du point dans et en dehors des guillemets.

2.3.6 Fonctions
Une fonction est dfinie de la manire suivante :
function f(p1,p2,,pn){

return v;

partir de PHP4, les fonctions peuvent tre dfinies nimporte o. Toutefois, une fonction dfinie
lintrieur dune autre fonction nexiste que si cette dernire est appele. De mme, une fonction dfinie
de manire conditionnelle nexiste que si la condition est teste et vrifie.
Il est possible de passer les arguments par valeur (mthode par dfaut)
function multiplier($a,$b){
$p=$a*$b ;
return $p ;
}
echo multiplier(4,8);

ou par rfrence
function tripler(&$n){
$n*=3 ;
}
tienne Vandeput CeFIS 2005

48

Publier sur le Web - Perfectionnement


$a=5 ;
tripler($a);
echo $a;

Il existe videmment de trs nombreuses fonctions prdfinies en PHP.

2.3.7 Expressions
L'association des oprateurs, des fonctions, des variables et des constantes donne naissance des
expressions. On peut dire d'une expression, qu'elle a une valeur d'un certain type.
Dans l'exemple qui suit, l'oprateur % dsigne le reste de la division entire de par
<?php
$x=12;
$y=$x%5;
echo $x." modulo 5 gale ".$y.".<br>";
$x=($y=4)+5;
echo "x vaut $x et y vaut $y.";
?>

donnera
12 modulo 5 gale 2.
x vaut 9 et y vaut 4.

Comme vous pouvez le constater, PHP offre les facilits d'criture des langages rcents.

2.3.8 Instructions de contrle


Comme la plupart des langages de script, PHP offre une grande varit dinstructions de contrle et une
grande souplesse dcriture.
2.3.8.1 Linstruction if
Pour commencer, il est important de se rendre compte que des variables de tous types peuvent tre
considres comme des expressions boolennes. Ainsi, une variable $x utilise dans un contexte boolen
fournira la valeur true si elle ne contient ni la valeur zro numrique, ni la chane vide, ni la valeur
logique false et quelle est dfinie.
Par exemple,
$x=1;
if($x){
echo "vrai";
}
else{
echo "true";
}

affichera vrai.
Si lutilisation des accolades nest pas ncessaire, elle est souhaitable. Dautres instructions pourraient
venir sajouter par la suite.
tienne Vandeput CeFIS 2005

49

Publier sur le Web - Perfectionnement

2.3.8.2 Linstruction if-elseif-else


Linstruction if-elseif-else est une instruction trs souple qui permet deffectuer des tests de natures
trs diffrentes. Elle peut comporter autant de elseif que ncessaire. chaque nouveau test, comme
dans le bloc else, on ne sintresse quaux cas restants.
if($nombre%2){
echo "Nombre impair";
}
elseif($nombre%3){
echo "Nombre non divisible par 3";
}
else{
echo "Nombre pair, multiple de 3";
}

2.3.8.3 L'instruction switch


L'instruction switch est une alternative la construction if-elseif-else. Elle est plus souple que dans
d'autres langages car elle accepte d'autres valeurs que des valeurs entires. On la prfrera dans les cas o
c'est toujours la mme expression qui doit tre teste.
switch($a){
case ($a>99): $b="excessif"; break;
case ($a>75): $b="lev"; break;
case ($a>50): $b="normal"; break;
default: $b="faible";
}

L'instruction break vite le passage aux autres instructions. En l'absence de ces instructions, une valeur
de $a de 88 ferait afficher faible et non lev.
2.3.8.4 L'instruction while
L'instruction while est la plus courante des instructions de boucles. Le bloc des instructions qu'elle
encadre est excut tant que la condition est vrifie, ce qui implique que celle-ci soit value avant le
parcours de la boucle.
while($a>50){
$a-=5;
}
echo $a;

Si $a possde toujours la valeur 88, la valeur 48 sera affiche.


Les instructions break et continue permettent respectivement de quitter la boucle ou d'interrompre le
cycle en cours pour passer au cycle suivant.
2.3.8.5 L'instruction dowhile
L'instruction dowhile permet la boucle d'tre effectue au moins une fois. La condition n'est en effet
teste qu'en fin de boucle.
tienne Vandeput CeFIS 2005

50

Publier sur le Web - Perfectionnement

Les instructions qui suivent font afficher les dates des jours qui se succdent d'aujourd'hui jusqu'au
premier dimanche de mars.
$jourCourant=time();
echo "<ol>\n";
do{
echo "<li>".date("l j F",$jourCourant)." ".date("j",$jourCourant)."
".date("F",$jourCourant)."</li>\n";
$jourCourant+=86400;
}
while(date("l",$jourCourant)!="Sunday"||date("F",$jourCourant)!="March");
echo "</ol>\n";

La fonction time() gnre une estampille (le moment prsent exprim en secondes depuis le 1er janvier
1970). La fonction date() a comme arguments un format et une
estampille. Pour la signification des formats, rfrez-vous la
documentation PHP.
Le script augmente d'un jour le moment courant avant d'en afficher les
paramtres dans une liste numrote. Notez que si nous tions le
premier dimanche de mars, le script afficherait les paramtres de 365
jours.
2.3.8.6 L'instruction for
L'instruction for permet de faire des conomies d'criture dans le cas
o le nombre de passages dans la boucle est dterminable.
Voici, dans ces conditions, ce que devient le script prcdent:
echo "<ol>\n";
for(
$jourCourant=time();
date("l",$jourCourant)!="Sunday"
||date("F",$jourCourant)!="March";
$jourCourant+=86400
){
echo "<li>".date("l j F",$jourCourant)."</li>\n";
}
echo "</ol>\n";

2.3.8.7 L'instruction foreach


L'instruction foreach est relative aux tableaux. Nous la dcrirons au moment o nous dtaillerons
davantage ces structures intressantes.

2.4 Exercice
Un formulaire (incomplet) se prsente de la sorte :

tienne Vandeput CeFIS 2005

51

Publier sur le Web - Perfectionnement

Il s'agit de faire en sorte que le choix du bouton radio Madame introduise les modifications
graphiques suivantes :

On ajoutera que les diffrents champs doivent se vider de leur contenu ds quils reoivent le focus.
Lide est dajouter un attribut vnement chacun des boutons radios en y associant la soumission du
formulaire avec, comme action, un script de reconstitution du formulaire. Un premier fichier HTML
contiendra le formulaire initial. Un second fichier PHP contiendra le script qui reconstituera une nouvelle
page avec plus ou moins de champs textes selon le choix.
<form name="form1" method="post" action="transmis.php">
<p>
<label>
<input name="sexe" type="radio" onClick="this.form.action='sexe.php';
this.form.submit(); " value="0" checked>
Monsieur</label>
<br>
<label>
<input type="radio" name="sexe" value="1" onClick="this.form.action='sexe.php';
this.form.submit(); ">
Madame</label>
Coordonn&eacute;es:
<input name="textfield" type="text" class="gris" value="Nom"
onFocus="this.value='';">
<input name="Submit" type="submit" class="important1" value="Envoyer">
<br>
</p>
</form>

tienne Vandeput CeFIS 2005

52

Publier sur le Web - Perfectionnement

Les attributs class de certains lments traduisent lutilisation de styles personnaliss. Les attributs
onFocus servent au vidage des champs. Lorsquun des boutons est slectionn, laction du formulaire est
change et le formulaire est soumis en invoquant le script sexe.php dont le code suit et qui va
reconstituer un nouveau formulaire.
<form name="form1" method="post" action="transmis.php">
<p>
<label>
<input name="sexe" type="radio" onClick="this.form.action='sexe.php';
this.form.submit(); " value="0" checked>
Monsieur</label>
<br>
<label>
<input type="radio" name="sexe" value="1" <?php $sexe=$_POST["sexe"]; if($sexe=="1"){
echo "checked";} ?> onClick="this.form.action='sexe.php'; this.form.submit(); ">
Madame</label>
</p>
<p>Coordonn&eacute;es:
<?php
if($sexe=="1"){
echo "<input name='njf' type='text' class='gris' value='Nom de jeune fille'
onFocus='this.value=\"\"'>\n";
echo "<input name='nfm' type='text' size='25' class='gris' value='Nom de femme
marie' onFocus='this.value=\"\"'>\n";
}
else{
echo "<input name='nom' type='text' class='gris' value='nom'
onFocus='this.value=\"\"'>\n";
}
?>
<input name="Submit" type="submit" class="important1" value="Envoyer">
<br>
</p>
</form>

Le code PHP de ce document se trouve deux endroits. Le premier morceau de code sert cocher le
bouton radio correspondant au choix Madame dans le formulaire reconstitu. Il nest pas ncessaire de
le prciser pour lautre choix. Cest le premier choix qui est slectionn par dfaut. On observera que le
code est insr lintrieur mme de la dfinition dun lment, ce qui montre que les deux langages
peuvent tre intimement mlangs. Le deuxime morceau permet la cration des deux champs ou le
retour un seul champ avec les valeurs par dfaut ncessaires.
Au niveau syntaxique, vous noterez que les apostrophes, placs lintrieur des guillemets, permettent
dviter lchappement de ces caractres. Toutefois, un troisime niveau dinclusion, pour la chane de
caractres vide, oblige lchappement de certains guillemets.

tienne Vandeput CeFIS 2005

53

Publier sur le Web - Perfectionnement

2.5 Les tableaux en PHP


Un tableau est une association ordonne. Une association est un type qui fait correspondre des valeurs
des cls. Ce type est optimis de diverses faons, qui font quon peut le manipuler de diverses manires.
Comme une valeur peut elle-mme tre un tableau, vous pouvez simuler facilement un arbre.

2.5.1 Crer un tableau


Les lments dun tableau peuvent tre crs la vole.
$monTableau[]="Pomme";
$monTableau[]="Poire";
$monTableau[]="Abricot";
$monTableau[]="Cerise";
$monTableau[]="Pche";

Dans ce cas, un index de 0 est cr.


Un tableau peut galement tre cr avec la fonction array(). Cette fonction prend en argument des
structures key => value, spares par des virgules.
array( [key =>] value , ... )
// key est soit une chane soit un entier positif
// value peut tre de n'importe quel type (y compris un autre tableau)

En voici une illustration :


<?php
$table = array("nom" => "Vandeput", 10 => 125);
echo $table["nom"]; // affiche Vandeput
echo $table[10];

// affiche 125

?>

Un tableau peut tre multidimensionnel:


$voitures=array(
"allemandes" => array("opel", "bmw", "vw", "mercedes"),
"francaises" => array("peugeot", "citroen", "renault"),
"italiennes" => array("alpha romeo", "fiat")
);
echo $voitures["francaises"][2]; // affichera renault

On constate que le tableau est une structure de donnes relativement souple.

2.5.2 Fonctions lies aux tableaux


Voici un exemple qui illustre quelques-unes des nombreuses fonctions prdfinies prenant un tableau en
argument. Le tableau est parcouru du dbut la fin et les cls sont affiches en regard des valeurs
correspondantes.
<?php
$coordonnees['nom']="Vandeput";

tienne Vandeput CeFIS 2005

54

Publier sur le Web - Perfectionnement


$coordonnees['prenom']="tienne";
$coordonnees['organisme']="CeFIS";
for(reset($coordonnees);$k=key($coordonnees);next($coordonnees)){
$v=current($coordonnees);
echo "La valeur de la cl <span class='important2'>".$k."</span> est
<span class='important2'>".$v."</span><br>";
}
?>

Le tableau est rempli la vole. La boucle for fait apparatre les trois lments habituels: initialisation,
condition d'arrt, volution des variables. Examinons-les un un.
reset(coordonnees) : la fonction reset place le pointeur interne sur le premier lment du tableau.
key(coordonnees) : la fonction key fournit la cl de l'lment courant. En bout de tableau, la valeur
renvoye est false, ce qui convient comme test d'arrt.
next(coordonnees) : la fonction next place le pointeur interne sur llment suivant sil existe.
current(coordonnees) : la fonction current renvoie la valeur de llment courant.

2.6 Les sessions


Dans un certain nombre de cas, il est bon que laccs aux pages Web dun site soit rglement. La
technique consiste gnralement demander au client de fournir un identificateur et un mot de passe.
Pour viter le stockage en clair de ce mot de passe dans une base de donnes, celui-ci peut tre encrypt.
Lintrt dune session rside dans la production de variables dont lexistence servira vrifier que
lutilisateur sest identifi correctement. Ces variables, globales en PHP4, vitent notamment de devoir
vhiculer certaines valeurs dune page une autre du site.
Il faut distinguer la cration dun nouvel utilisateur de son authentification. Un script JavaScript peut
aisment traiter ces deux options au moyen de boutons radios.

2.6.1 Cration dun nouvel utilisateur


Lors de la cration dun nouvel utilisateur, on veillera particulirement vrifier lunicit de
lidentificateur et aura soin dencrypter le mot de passe avant de le stocker dans la base de donnes. On
utilisera deux fichiers. Le premier permettra de saisir les informations provenant de lutilisateur, le
second, de prparer et de stocker ces informations dans la base de donnes (voir la section consacre
MySQL). On en profitera aussi pour dfinir des variables de session quil ne sera plus ncessaire de
vhiculer dune page lautre.
Thoriquement, il faut galement veiller connecter lutilisateur au site.

2.6.2 Authentification dun utilisateur


Le processus dauthentification consiste vrifier que lidentificateur et le mot de passe encrypt
concordent. Cela passe videmment par un accs la base de donnes. Ici aussi, on en profitera pour
dfinir les variables de session ncessaires et on connectera lutilisateur au site.

2.6.3 Identificateur de session


Le principe est que chaque utilisateur reoit un numro unique identifiant sa session et appel session
ID . Sa cration est lie au dmarrage de la session provoque par la fonction session_start(). Le but de
cette fonction est soit de crer une session, si lutilisateur ne sest pas encore connect, soit de restaurer
tienne Vandeput CeFIS 2005

55

Publier sur le Web - Perfectionnement

une session trouve sur le serveur grce ce session ID . Dans ce cas, ce dernier est fourni, soit par un
cookie ou via une requte GET ou POST. Le fait que certains clients refusent les cookies ne parle
toutefois pas en faveur de cette solution toutefois trs souple. Le session ID peut tre aisment
propag, travers les URL, grce la constante SID qui le contient.
<a href="autrePage.php?<?php echo SID; ?>">Autre page</a>

Grce l'identifiant de session, PHP peut retrouver toutes les variables associes cette session.

2.7 Les inclusions de fichiers


Afin de modliser les pages dun site, il est utile de rcuprer des parties entires de code. PHP fournit,
avec la fonction include(), lopportunit dinclure dans un fichier le code de certains autres fichiers. Il
existe une autre fonction qui est la fonction require(). Dans ce dernier cas, l'absence du fichier provoque
l'interruption de l'excution pour cause d'erreur fatale.
titre d'exemple, on peut faire en sorte que l'excution d'un fichier produise l'entte des pages et
l'excution d'un autre, le pied-de-page.
Voici le code du fichier entete.php.
<html>
<head>
<title>Document sans titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../cefis.css" rel="stylesheet" type="text/css">
<style type="text/css">
<!-.grand {
font-size: 24px;
color: #999999;
}
-->
</style>
<style type="text/css">
<!-.blanc {
color: #FFFFFF;
}
td {
padding: 5px;
}
-->
</style>
</head>

tienne Vandeput CeFIS 2005

56

Publier sur le Web - Perfectionnement


<body>
<table width="555" height="113" border="1" cellpadding="10" cellspacing="0"
bordercolor="#FF8888" bgcolor="#FFDFD5" class="grand">
<tr>
<td height="109">
<div align="center"><img src="../images/cathedrale.jpg" width="112" height="89"
align="left"><span class="grand">D&eacute;partement &Eacute;ducation et
Technologie</span></div>
</td>
</tr>
</table>

Le fichier contient les instructions d'entte habituelles d'un fichier HTML. On y trouve galement
quelques dfinitions de styles propres ce fichier. Notez que les styles seront disponibles au niveau de
tous les fichiers qui incluront celui-ci.
L'lment <body> est ouvert dans ce fichier et sera ferm dans le fichier pied-de-page. Les autres
instructions sont celles de la dfinition d'un tableau.
Voil celui du fichier de pieddepage.php.
<table width="555" border="1" cellpadding="10" cellspacing="0" bordercolor="#FF8888"
bgcolor="#FFDFD5">
<tr>
<td><a href="mailto:webmaster@det.fundp.ac.be">Contacter</a>
<span class="gris"> le Webmaster</span></td>
</tr>
</table>
</body>
</html>

On y trouve la dfinition d'un autre tableau. Notez qu'il n'tait pas ncessaire de clturer le tableau dans le
fichier d'entte. On pouvait en continuer la dfinition dans les autres fichiers. Le style gris est utilis. Il
est dfini grce au fichier prcdent. On bnficie aussi d'autres dfinitions de styles pour la mise en
forme des liens.
Celui qui inclut les deux autres ne contient rien des balises de dbut et de fin d'un fichier HTML classique.
En voici le code:
<?php include('entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">Ceci est une page incluant
un ent&ecirc;te et un pied de page. </td>
</tr>
</table>
<?php include('pieddepage.php'); ?>

Il s'agit nouveau de la dfinition d'un tableau d'une seule cellule. On remarque la premire et la dernire
instructions qui sont des instructions PHP d'inclusion de fichiers. Et voici le rsultat l'affichage:
tienne Vandeput CeFIS 2005

57

Publier sur le Web - Perfectionnement

2.8 Exercice
Il s'agit de raliser un entte (entete.php) et un pied de page (pieddepage.php) qui serviront de modles
pour les pages d'un site. Une premire page de ce site (login.php) permettra de choisir, soit de s'y
connecter, soit de se constituer en tant que nouvel utilisateur. Dans ce cas, on demandera quelques
informations (formulaire.php): nom, prnom, adresse Les informations reues seront stockes dans une
base de donnes et l'utilisateur sera connect au site (enregistrer.php). Pour ce faire, un message
indiquant que les donnes ont t enregistres suffira. Auparavant, les donnes seront prpares: le mot de
passe encrypt, le nom transform en majuscules, les blancs inutiles dtruits Dans le cas d'une
connexion immdiate (connexion.php), un message annoncera que l'utilisateur est bien connect au site.
Toutes les pages auront le mme aspect gnral grce aux fichiers inclus. Les oprations de connexion
la BD, de vrification des mots de passe, d'enregistrement ne seront videmment pas programmes ce
stade des connaissances dveloppes.

tienne Vandeput CeFIS 2005

58

Publier sur le Web - Perfectionnement

3. MySQL
3.1 L'association entre MySQL et PHP
MySQL est un systme de gestion de bases de donnes relationnelles bas sur le langage d'interrogation
SQL (Structured Query Language). C'est un des derniers logiciels open source de cette catgorie apparu
sur le march (si ce terme a du sens). Dvelopp partir d'un autre SGBD portant le nom de mSQL, il
possde de nombreuses qualits et notamment celle d'tre portable, en ce sens qu'il s'excute sur peu
prs tous les systmes d'exploitation et tous les types de matriel.
Comme tous les SGBD, MySQL permet de crer et de grer des bases de donnes. Dans le contexte qui
nous intresse, un langage comme PHP est capable de prendre en compte les commandes de MySQL et
donc d'interroger des bases de donnes cres avec ce SGBD. La communication de l'un l'autre se fait de
manire souple. Nous en donnons ci-dessous une illustration.
Voici une requte telle qu'on peut l'effectuer sous MySQL:
SELECT upper(nom),prenom,login FROM inscrits WHERE choix='C' ORDER BY nom;

Cette requte slectionne les valeurs des colonnes22 nom et prenom dans une table s'appelant inscrits,
pour autant que la colonne choix contienne la valeur C, et en ordonne les rsultats par ordre alphabtique
des valeurs trouves dans la colonne nom. MySQL produira un rsultat sous la forme d'un affichage en
mettant la valeur de la colonne nom en majuscules.

La mme requte, effectue via un script PHP s'crira:

22

Les notions de tables et de colonnes sont les termes propres utiliser. Ils sont dfinis dans la suite du chapitre.

tienne Vandeput CeFIS 2005

59

Publier sur le Web - Perfectionnement


$sqlquery="SELECT upper(nom),prenom FROM inscrits WHERE choix='C' ORDER BY nom";
$queryresult=mysql_query($sqlquery) or die ("<p>La requte a chou.</p>");

Comme on peut le constater, la requte est fournie sous forme d'une chane de caractres (stocke
pralablement, ici, dans une variable $sqlquery). Syntaxiquement parlant, le point-virgule, ncessaire en
MySQL, est omis dans la chane de caractres. Un point-virgule termine toutefois l'instruction PHP. La
fonction mysql_query prend cette chane de caractre en argument et renvoie le rsultat de la requte dans
une variable tableau ($queryresult dans cet exemple), dont le script pourra exploiter le contenu sa
convenance.

3.2 La conception d'une base de donnes


La conception d'une base de donnes s'appuie gnralement sur la ralisation d'un schma dcrivant de
manire statique la ralit que l'on veut prendre en compte. Pour un de ces schmas que nous dcrivons,
la dmarche consiste isoler des entits et les associer. C'est la raison pour laquelle on parle
gnralement de schma entits-relations-associations ou schma ERA.
La ralisation de ces schmas ne va pas de soi. Nous nous contentons ici de dcrire les notions principales
et leur reprsentation. Nous ne nous attardons pas sur les stratgies (notamment les diffrentes formes de
normalisation des relations) et les mthodes de conception des bases de donnes.

3.2.1 Schmas ERA


Form
id
nom
prenom

Formation
participe
0-N

est suivie par


Participer

0-N

id
titre
nbrinscrits

est assure par

1-1

Assurer
assure

1-N

Formateur

Un schma ERA identifie donc des entits.


L'identification de ces entits est ralise, soit
au travers d'interviews de personnes occupes
dans le domaine, soit de documents dcrivant
les activits. Par exemple, l'interview du
directeur du CeFIS pourrait fournir des
renseignements propos des formations
organises, des personnes qui les organisent
ou en sont responsables, des participants, etc.
De cette interview, pourraient merger des
entits telles: formation, formateur, form,
ouvrage (de rfrence), local,

En principe, la description s'arrte l ou la


gestion s'arrte. Si, dans le problme de la
gestion des formations du CeFIS, l'attribution
des locaux n'est pas un problme, la notion de local ne sera pas prise en compte, ou en tous cas pas
comme entit grer.
id
nom

Les entits sont qualifies par des attributs qui les caractrisent. Pour tre identifie, une entit doit avoir
un identifiant. La nature d'un identifiant peut tre varie. L'identifiant est souvent un simple attribut. Il
est qualifi de naturel si l'information permet d'identifier naturellement l'enregistrement (le nom d'un
pays, par exemple). Il est souvent construit automatiquement (numro d'enregistrement) ou non
(matricule, ISBN,). Il peut tre multiple (le code postal et la localit pour identifier une ville ou un
village).

3.2.2 Entits, associations, attributs, rles et cardinalits


Dans un schma ERA, les entits sont relies entre elles par des associations. Les associations peuvent
tre dcrites par des verbes. Dans le schma prcdent, participer, assurer sont des associations.

tienne Vandeput CeFIS 2005

60

Publier sur le Web - Perfectionnement

Chaque entit possde des attributs. Une association peut en possder aussi. Un attribut est une proprit
qui ne doit pas tre considre comme une entit dans le problme trait. Ainsi, par exemple, le form
pourrait faire partie d'une institution. Si la base de donnes est conue de manire prendre en compte
des traitements spcifiques sur les institutions, celles-ci doivent tre considres comme des entits.
Sinon, l'institution peut tre considre comme un attribut du form.
Chaque entit joue un rle dans une association. Le formateur assure la formation, alors que la formation
est assure par le formateur. Le nombre d'entits pouvant jouer le mme rle est appel cardinalit. Dans
l'exemple qui prcde, le form est inscrit un nombre de formations variant entre 0 et N. On pourrait
s'tonner de trouver le nombre 0 et pas 1. Dans un contexte o le form est connu du systme, pour avoir
particip certaines annes des formations, cela a du sens. Une formation est assure par un et un seul
formateur qui, dans l'exemple, donne au moins une formation.
Form

Institution

id
nom
prenom
tel

travaille
1-N

id
nom
adresse
tel

a engag

Travailler
tel

1-N

La prsence d'un attribut tel dans chacun des lments (entits et association) de ce schma n'est pas
contradictoire. Le tlphone du form est son priv. Il y a celui de l'institution et celui de son lieu de
travail (bureau).

3.2.3 Transformation en tables


Trs concrtement, les entits et les associations qui vont subsister dans le schma final vont tre
transformes en tables. Une table est tout simplement un ensemble de lignes et/ou de colonnes. Chaque
ligne correspond un enregistrement, chaque colonne une information propos de cet enregistrement.
Tous les enregistrements d'une mme table sont videmment caractriss de la mme manire.
l'intersection d'une ligne et d'une colonne, on trouve une information qui, comme nous le verrons plus
loin, est d'un certain type.
La transformation s'effectue de la manire suivante.
Pour des relations 1 1:
E2

E1
id1

A
0-1

0-1

E1
id1

id2

id2

E1
ou

id1

E2
id2

E2
id2

id1

Les deux entits donnent naissance deux tables et l'association disparat. L'identifiant d'une des deux
entits sert de lien entre les deux tables. On parle de cl trangre car elle identifie les lments d'une
autre table.
Pour des relations 1 N:
Formateur

Formation
id1

Assurer
1-1

tienne Vandeput CeFIS 2005

1-N

id2

Formation
id1
id2

Formateur
id2

61

Publier sur le Web - Perfectionnement

Les deux entits donnent naissance deux tables et l'association disparat. L'identifiant de l'entit ct 1
sert de cl trangre pour l'entit ct N.
Pour des relations N N:
Les deux entits donnent naissance deux tables et l'association une troisime. Les identifiants des deux
entits se retrouvent dans la table correspondant l'association.
Formation

Form
id1

Participer
0-N

0-N

id2

Formation
id1

Form
id2

Participer
id1
id2

3.2.4 Associations ternaires


Il existe des relations plus complexes que les relations binaires. En voici un exemple.
Fournisseur
0-N

Commande
nocomm

nofourn

0-N
Assigner
Quantit

Proposer

1-N

0-N
0-N

Produit
noprod

Le fournisseur propose de 0 N produits. Un produit est propos par 0 N fournisseurs. Une commande
est assigne un fournisseur pour une certaine quantit d'un produit.

3.2.5 Cls trangres


Lorsqu'un schma ERA est tabli, il peut donc tre converti en une srie de tables. Les relations entre ces
tables dpendent des identifiants de chacune d'entre elles. Un identifiant d'une table prsent dans une
autre table est appel cl trangre. Ce sont les cls trangres qui permettent de relier les informations
entre elles. Les SGBD sont censs grer correctement les cls trangres et donc, notamment, les mises
jour, les insertions, les suppressions. Par exemple, si dans une table notes contenant les notes des
tudiants, chaque enregistrement contient l'identifiant de l'tudiant etud_id, par exemple, la suppression
d'un tudiant dans la table etudiants (dont l'identifiant est etud_id) devrait entraner automatiquement la
suppression de toutes les notes de cet tudiant. Ce n'est malheureusement pas le cas avec MySQL, le choix
d'implmentation s'tant focalis sur la vitesse de traitement, dterminante sur Internet. Cette gestion doit
donc tre prise en compte par le programmeur PHP.

tienne Vandeput CeFIS 2005

62

Publier sur le Web - Perfectionnement

3.3 Les tables et leurs contenus


3.3.1 Structure d'une table
Avant de prciser le contenu d'une table, il convient d'en dfinir la structure, savoir le nom des
colonnes, le type d'information qu'elles vont contenir et leur statut ventuel (identifiant, jamais vide,
unique,).

Ce tableau reprend le nom des colonnes, le type d'information contenue (voir plus loin pour une
description plus complte), une indication qui prcise si le champ peut tre vide (dans l'exemple, le
prnom peut l'tre), une autre qui prcise si le champ fait partie de l'identifiant (voir paragraphe suivant),
la valeur par dfaut s'il y en a une et une information supplmentaire (qui prcise, dans ce cas, que la
valeur du champ est incrmente de manire automatique).
Plus de dtails seront donns par la suite propos des diffrentes options possibles.

3.3.2 Types d'informations


Les types d'informations disponibles sont assez nombreux. Les types gnraux sont videmment:
numrique, chane de caractres et date/heure mais ils se dclinent en de multiples sous-types.
3.3.2.1 Les types numriques
Les types possibles sont repris dans le tableau ci-dessous:
Nom du type

Espace requis

Sign

Non sign

TINYINT[(M)]

1 octet

-27 27-1

0 28-1

SMALLINT[(M)]

2 octets

-215 215-1

0 216-1

MEDIUMINT[(M)]

3 octets

-223 223-1

0 224-1

INT[(M)]

4 octets

-231 231-1

0 232-1

BIGINT[(M)]

8 octets

-263 263-1

0 264-1

Espace requis

Minimum

Maximum

FLOAT[(M,D)]

4 octets

1,17E-38

3,40E+38

DOUBLE[(M,D)]

8 octets

2,23E-308

1,80E-308

DECIMAL(M,D)

M+2 octets

texte

texte

Nom du type

Les valeurs M et D sont optionnelles, sauf pour le type DECIMAL et servent grer l'affichage. Par
exemple, DECIMAL(4,2) permet de coder les nombre de -99.99 999,99.
tienne Vandeput CeFIS 2005

63

Publier sur le Web - Perfectionnement

C'est un attribut particulier UNSIGNED qui permet de dclarer les entiers signs ou non. De mme,
l'attribut ZEROFILL permet d'ajouter des zros l'affichage pour atteindre la valeur maximum autorise.
3.3.2.2 Les types chanes de caractres
Les types possibles sont repris dans le tableau ci-dessous:
Nom du type

Espace requis

Taille maximale

M octets

M octets

VARCHAR(M)

L+1 octets

M octets

TINYBLOB, TINYTEXT

L+1 octets

28-1 octets

BLOB, TEXT

L+2 octets

216-1 octets

MEDIUMBLOB, MEDIUMTEXT

L+3 octets

224-1 octets

LONGBLOB, LONGTEXT

L+4 octets

232-1 octets

ENUM("val1","val2",)

1 ou 2 octets

65.535 valeurs

SET("val1","val2",)

1, 2, 3, 4 ou 8 octets

64 valeurs

CHAR(M)

L est la longueur de la chane. Sa valeur est stocke dans les octets supplmentaires (1 4 selon cette
longueur). Les valeurs de type ENUM sont stockes comme des nombres (leur numro d'ordre), ce qui a
pour effet de diminuer considrablement leur taille (2 octets suffisent pour encoder 65.535 valeurs).
Chaque valeur d'un type SET est code avec un seul bit 1. Ainsi, s'il y a au plus 4 valeurs, elles seront
codes 0001, 0010, 0100 et 1000, de sorte que si un des enregistrements prend la premire et la troisime
de ces valeurs, l'information code soit 0101. Pour 64 valeurs, il faut donc au plus 8 octets.
Il faut encore noter que si une colonne est de type VARCHAR, toutes les autres colonnes de type CHAR le
deviendront aussi.
3.3.2.3 Les types dates et heures
Les types possibles sont repris dans le tableau ci-dessous:
Nom du type

Espace requis

Intervalle

DATE

3 octets

"1000-01-01" "9999-12-31"

TIME

3 octets

"-838:59:59" "838:59:59"

DATETIME

8 octets

"1000-01-01 00:00:00" "9999-12-31 00:00:00"

TIMESTAMP[(M)]

4 octets

19700101000000 2037

YEAR[(M)]

1 octet

1901 2155

Comme vous pouvez le constater, les dates commencent toujours par l'anne, suivie du mois et du jour.
La valeur par dfaut de TIMESTAMP correspond la date et l'heure du serveur dans son propre fuseau
horaire.

tienne Vandeput CeFIS 2005

64

Publier sur le Web - Perfectionnement

3.4 Les primitives de gestion d'une base de donnes


3.4.1 Accs une BD et ses tables
3.4.1.1

Connexion MySQL

En ligne de commande, vous devez prciser le nom de l'hte, le nom d'utilisateur et le mot de passe.
C:\Program Files\EasyPHP1-7\mysql\bin > mysql -h localhost -u root -p

Si le serveur se trouve sur la machine locale, le premier paramtre n'est pas obligatoire. Par dfaut, le seul
utilisateur reconnu par mysql est root et il ne faut pas fournir de mot de passe. L'instruction suivante
convient donc:
C:\Program Files\EasyPHP1-7\mysql\bin> mysql -u root

ou encore
C:\Program Files\EasyPHP1-7\mysql\bin> mysql uroot

Une des premires dmarches effectuer, si MySQL n'est pas install localement, c'est de le scuriser.
L'application PHPMyAdmin dont il est question dans le paragraphe suivant, permet d'effectuer cette
opration en remplaant, par exemple, l'utilisateur root par un utilisateur administrateur qui devra fournir
un mot de passe. L'administrateur pourra alors dfinir d'autres utilisateurs et dcider finement de leurs
privilges.
Les oprations dont il vient d'tre question sont toutefois raliser avec prudence pour viter de perdre
l'accs aux serveurs. Il est conseill de rechercher un peu de documentation sur Internet ce propos23,
avant de se lancer dans l'aventure. Toutefois, la dsinstallation et la rinstallation de EasyPHP sont
rapides, ce qui relativise le danger.
3.4.1.2 Dconnexion de MySQL
Pour se dconnecter de MySQL, on utilise la commande quit.
mysql> quit

Il faut noter que les commandes sont insensibles la casse, sauf en ce qui concerne le nom des bases de
donnes et les tables.
3.4.1.3 Informations sur les BD existantes
On peut obtenir la liste des bases de donnes par la commande
mysql> show databases;

Toutes les commandes fournies en ligne de commande doivent se


terminer par le point-virgule, une instruction pouvant s'tendre sur
plusieurs lignes.
Il convient alors de slectionner une base de donnes pour y travailler.
Cette opration est ralise grce la commande use.
mysql> use exemple;

La base de donnes est alors accessible et vous pouvez vous inquiter des

23

comme aux adresses http://www.wampserver.com/faq4.php ou http://linuxeduquebec.org/article.php3?id_article=4

tienne Vandeput CeFIS 2005

65

Publier sur le Web - Perfectionnement

tables qui la composent en vous servant de la commande show tables.


mysql> show tables;

La liste des tables constituant la base de donnes est affiche. Dans


l'exemple ci-contre, on constate qu'il n'y a qu'une seule table appele users
dans la base de donnes.
La structure d'une table (nom des colonnes, types et autres attributs) peut
tre obtenue grce la commande describe. Ce rsultat peut galement
tre obtenu avec la commande show columns from.
mysql> describe users;

La commande select database() permet de connatre la base de donnes active.


mysql> select database();

Voil donc un aperu des commandes qui permettent d'obtenir les


renseignements souhaits propos des bases de donnes existantes. Il
n'est videmment pas encore question, ce stade, d'interroger les bases
de donnes, d'effectuer des requtes sur le contenu.

3.4.2 Cration et gestion du contenu d'une BD


3.4.2.1 Cration d'une base de donnes
La cration d'une base de donnes implique videmment que celle-ci ait t compltement dcrite au
niveau conceptuel (schma ERA) et au niveau logique (transformation en tables). Elle commence par
l'instruction create database.
mysql> create database formations;

Cette commande devra tre suivie de la cration des diffrentes tables: dfinition de leur structure
(dfinition des colonnes) et encodage de leurs enregistrements (lignes).
La rgle d'attribution des noms permet d'utiliser les lettres, les chiffres et les caractres $ (dconseill, on
s'en doute, cause de PHP) et _. Un nom ne peut se composer uniquement de chiffres.
3.4.2.2 Suppression d'une base de donnes
La suppression d'une base de donnes se fera par l'instruction drop.
mysql> drop database formations;

Il est clair que la suppression d'une base de donnes entrane la suppression de toutes les tables et de tous
les enregistrements qu'elle contient.
Voici pour suivre, une squence qui illustre ces deux commandes ainsi que leurs effets.

tienne Vandeput CeFIS 2005

66

Publier sur le Web - Perfectionnement

3.4.2.3 Cration d'une table


Une table est cre au moyen de l'instruction create table. Cette instruction qui permet de nommer la
table s'accompagne de la description des colonnes, de leur type et de leurs attributs ventuels. Elle s'crit
gnralement sur plusieurs lignes pour plus de lisibilit24.

24

La plupart des instructions ncessitent une syntaxe (trop) rigoureuse. C'est pourquoi il existe des applications
permettant d'en gnrer le code via des interfaces graphiques. Nous en dcrivons une plus loin dans ce chapitre.

tienne Vandeput CeFIS 2005

67

Publier sur le Web - Perfectionnement

La colonne login est une colonne identifiante (primary key). Les colonnes prenom et statut peuvent ne pas
contenir de valeurs contrairement aux colonnes login, password et nom.
Il est possible de garnir rapidement une table pour autant que ses donnes se trouvent dans un fichier,
grce l'instruction load data. Par exemple, il est possible de crer un fichier texte partir d'Excel et de le
rcuprer.

Ce fichier tant enregistr au format texte sous le nom membres.txt et sauvegard dans le mme rpertoire
que la base de donnes exemples, on aura:

3.4.2.4 Suppression d'une table


Une table est supprime au moyen de l'instruction drop table.
mysql> drop table users;

La suppression de la table users s'accompagne, comme le montre le rsultat de la commande describe, de


la suppression de sa structure.
3.4.2.5 Modification d'une table
Par modification d'une table, on entend videmment une modification de sa structure. De nombreux
changements peuvent tre oprs. Nous en voquons quelques-uns. C'est la commande alter table qui
permet ces modifications. Elle est suivie du nom de(s) l'action(s) et de sa (leur) description(s). Parmi les
actions, on trouve: add, alter, drop, change, modify, rename as (ou to),
tienne Vandeput CeFIS 2005

68

Publier sur le Web - Perfectionnement

Si on souhaite ajouter une colonne depuis qui contiendra l'anne d'entre en service, on procdera comme
suit:
mysql> alter table users add (depuis varchar(4));

Pour supprimer la colonne depuis, on utilisera l'action drop:


mysql> alter table users drop depuis;

Avec l'action add, les options first ou after suivi du nom d'une colonne, permettent de positionner la
nouvelle l'endroit voulu. Par dfaut, c'est naturellement la fin.
Voici d'autres exemples:
mysql> alter table users add (depuis varchar(4)) after prenom;
mysql> alter table users add (depuis varchar(4), commentaires blob);

titre d'illustration:

tienne Vandeput CeFIS 2005

69

Publier sur le Web - Perfectionnement

Pour ajouter une cl primaire une colonne, on utilisera l'action add avec l'option primary key. Ainsi, par
exemple, si on estime que login seul n'est pas identifiant, mais la paire login-password, on commandera:
mysql> alter table users add (login,password) primary key;

Attention, MySQL considre qu'il n'y a qu'un seul identifiant possible. Donc, s'il en existe dj un, il faut
le supprimer avant d'en crer un autre. Pour cela, on utilise l'action drop et l'option primary key, comme
dans l'exemple ci-dessous:

On peut aussi ajouter des index sur les colonnes. Les index sont intressants en ce sens qu'ils acclrent
les recherches mais ils ralentissent certains autres traitements comme l'insertion d'une ligne dans une
table, par exemple. Cet ajout se fait par l'option index suivi du nom de la ou des colonnes.
mysql> alter table users add index (nom, login);

Il existe plusieurs sortes de cls, chaque type ayant son intrt. Vous connaissez les cls primaires et les
cls d'index. Les cls unique sont aussi des index mais qui n'autorisent pas les valeurs multiples des
colonnes sur lesquelles elles portent.
mysql> alter table users add unique (login);

ne permettra pas, lors d'une insertion, que deux enregistrements aient la mme valeur pour login. Pour
supprimer une cl unique, il faut utiliser l'action drop avec l'option index suivie du nom de la (des)
colonne(s).
mysql> alter table users drop index login;

Les actions change et modify permettent de changer la dfinition d'une colonne et, ventuellement, de la
repositionner. La premire permet aussi de changer le nom de la colonne.
Ainsi, la commande:
mysql> alter table users modify depuis varchar(4) not null after prenom;
tienne Vandeput CeFIS 2005

70

Publier sur le Web - Perfectionnement

fournira le rsultat suivant:

Pour renommer une table, on se servira de l'action rename as.

3.4.2.6 Copier des tables


On peut envisager la copie de tables de deux manires:

une copie intgrale ou partielle de la structure et des donnes

une copie de la structure

Les deux se ralisent au moyen de la commande create table combine avec une simple commande de
slection. Les commandes de slection font d'ailleurs l'objet de la section suivante.
Pour une copie intgrale:
mysql> create table util2 select * from utilisateurs;

Pour une copie de la structure:


tienne Vandeput CeFIS 2005

71

Publier sur le Web - Perfectionnement


mysql> create table util2 select * from utilisateurs where 1=0;

Cette commande donne dj quelques indications sur les attributs de la commande select. L'attribut where
est suivi d'une condition vrifier par les enregistrements prendre en compte. Comme 1 n'est jamais
gal 0, aucun enregistrement n'est repris dans la nouvelle table qui a toutefois la mme structure que la
table originale.
3.4.2.7 Ajouter, supprimer, mettre jour des lignes
Pour ajouter une ligne une table, on utilise la commande insert. Il y a diffrentes manires d'insrer une
ligne et notamment, en prcisant:

une liste de colonnes et une liste de valeurs

mysql> insert users (login,password,nom) values(ldo,dddddd,Doumont);

Observez que les colonnes ne sont pas cites dans l'ordre qu'elles occupent dans la structure.

une liste de paires colonne-valeur

mysql> insert utilisateurs set (nom='Donnay',login='jdo',password='eeeeee');

Cette commande ne permet d'insrer qu'une seule ligne la fois.

une slection, comme dans l'exemple ci-dessus

mysql> insert utilisateurs select

Cette instruction permet d'insrer plusieurs lignes la fois mais demande l'existence d'une table de
laquelle sont extraites les lignes insrer avec les contraintes que cela suppose (cohrence des noms, des
types et autres attributs de colonnes).
Pour supprimer des lignes, on utilise la commande delete from. Cette commande doit tre agrmente
d'une condition semblable celles que l'on trouve souvent dans les commandes select et qui prcise quels
sont les lignes qui doivent disparatre de la table.
mysql> delete from utilisateurs where isnull(statut);

La manire d'crire les conditions s'apparente celles que l'on trouve dans la plupart des langages de
programmation. Les expressions de ces conditions font appel des variables (dont les noms sont ceux des
colonnes), des oprateurs, des fonctions, des constantes.
En voici une illustration:
tienne Vandeput CeFIS 2005

72

Publier sur le Web - Perfectionnement

Dans l'expression de la condition utilise dans cet exemple, statut joue le rle de variable et isnull est une
fonction qui renvoie une valeur boolenne.
Un attribut limit peut tre utilis pour limiter le nombre de lignes supprimes.
mysql> delete from utilisateurs where isnull(statut) limit 1;

n'aurait supprim qu'une seule des deux lignes.


La mise jour des informations contenues dans les lignes s'effectue au moyen de la commande update.
Cette commande possde aussi des attributs where et limit. L'attribut set permet de prciser quelles
colonnes doivent tre mises jour et de quelle manire.
La commande
mysql> update utilisateurs set (login=concat('c-',login);

aura pour effet d'ajouter un c et un tiret devant les login de tous les utilisateurs.

tienne Vandeput CeFIS 2005

73

Publier sur le Web - Perfectionnement

Dans l'expression qui dcrit ce que doit devenir la colonne login, on retrouve une variable (login) une
fonction (concat) et une constante (la chane 'c-').

3.4.3 Gestion d'une BD avec PHPMyAdmin


Comme il a t dit par ailleurs, l'criture des instructions en MySQL est souvent fastidieuse. Pour cette
raison, il existe des gnrateurs de code qui permettent de grer les bases de donnes via des interfaces
graphiques. Toutefois, la connaissance de la syntaxe d'un tel langage reste un atout pour la rsolution des
problmes qui peuvent surgir lors de la gestion d'une base de donnes.
EasyPHP comprend une application, PHPMyAdmin, qui offre la possibilit de grer ses bases de donnes.
Elle est accessible partir du menu contextuel du programme EasyPHP. Si son interface mrite d'tre
amliore, elle permet nanmoins d'viter les problmes de syntaxe. Voici une illustration d'un des crans
de cette interface:

Sans entrer dans le dtail de cette application, prcisons que:

l'onglet Structure permet, comme on s'en doute, de modifier la structure des tables d'une base
donnes;

l'onglet Afficher permet non seulement de visualiser les lignes d'une table, mais aussi de les diter
facilement;

l'onglet SQL permet de formuler une requte qu'il n'est pas possible de formuler par l'intermdiaire
de l'interface;

l'onglet Slectionner permet de construire des requtes (comme il en sera question dans la section
suivante);

tienne Vandeput CeFIS 2005

74

Publier sur le Web - Perfectionnement

l'onglet Insrer offre des facilits de gnration des instructions permettant d'insrer des lignes
dans les tables.

Les autres options sont moins importantes ce stade.


Comme dans toutes les interfaces de ce type, la connaissance de la syntaxe est videmment trs clairante
quand la signification des options qu'elles proposent.

3.4.4 Slection d'informations dans une BD


3.4.4.1 Les requtes
Toutes les primitives dont nous venons de parler ne servent qu' crer, ou utiliser pour mettre jour, des
bases de donnes et les tables qu'elles sont censes contenir. Une tout autre activit consiste interroger
les bases de donnes pour en tirer un certain nombre d'informations. On parle gnralement de requte
formuler. Le rsultat d'une requte se prsente aussi sous forme d'une table. Ds lors, rien n'empche que
celle-ci soit stocke comme les autres dans une base de donnes.
Nous analysons, dans cette section, la commande select qui est la base de la formulation des requtes de
ce type. Pour pouvoir effectuer des requtes fines, la commande select est flanque de nombreuses
options. Nous prsentons d'abord les plus importantes d'entre elles et nous reviendrons, la fin de cette
section, sur une syntaxe plus complte de cette commande.
3.4.4.2 Slectionner
Quand on pense slectionner, on imagine extraire de l'information d'une ou plusieurs tables constituant
une base de donnes. La commande select qui permet de raliser ce souhait est toutefois plus gnrale. Il
n'est donc pas absolument ncessaire de prciser un (des) nom(s) de table(s). L'criture d'une simple
expression suffit. En voici quelques illustrations:

3.4.4.3 Slectionner des colonnes


Quand on parle de slection dans une seule table, il ne peut tre question que de colonnes, de lignes ou
d'un mlange des deux. On peut donc prciser quelles sont les colonnes dont on veut slectionner les
informations. La slection la plus simple est celle qui consiste slectionner toutes les colonnes.
mysql> select * from utilisateurs;

fera afficher toutes les colonnes de la table utilisateurs.

tienne Vandeput CeFIS 2005

75

Publier sur le Web - Perfectionnement

Toutes les commandes de slection demandent de prciser la ou les tables concernes par celle-ci. Le mot
cl qui l(es)'introduit est from.
Dans le cas o les informations de toutes les colonnes ne sont pas souhaites, il convient de prciser celles
qui sont concernes.
mysql> select nom, prenom, login from utilisateurs;

ne fera afficher que les informations des colonnes nom, prenom et login.

La slection peut tre accompagne d'un traitement des donnes. Ainsi, on peut souhaiter voir les noms
apparatre en majuscules.
mysql> select upper(nom),prenom from utilisateurs;

C'est le rle de la fonction upper de transformer les caractres en majuscules.

Les rsultats ne sont donc pas ncessairement composs que d'informations issues de la base de donnes,
mais aussi de traitements effectus sur ces informations comme dans...

ou mieux,

tienne Vandeput CeFIS 2005

76

Publier sur le Web - Perfectionnement

3.4.4.4 Slectionner des lignes


La slection des lignes partir d'une (de plusieurs) table(s) s'effectue en dfinissant une clause l'aide du
mot-cl where. La clause tant une expression boolenne, son criture est, nouveau, un assemblage de
variables (colonnes), constantes, oprateurs et fonctions. Parmi les oprateurs et les fonctions, on retrouve
les grands classiques prsents dans la plupart des langages. Nous n'allons pas les numrer ici25. Nous en
mentionnons quelques-uns qui sont plus spcifiques un SGBD travers quelques exemples.

L'oprateur in permet de rechercher une valeur dans une liste. Il est videmment possible de combiner
une slection de lignes avec une slection de colonnes.

Dans l'exemple qui prcde, l'oprateur between permet de rechercher une valeur dans un intervalle.

25

Vous pourrez trouver une documentation assez complte des oprateurs et des fonctions disponibles l'adresse
http://dev.mysql.com/doc/mysql/fr/.

tienne Vandeput CeFIS 2005

77

Publier sur le Web - Perfectionnement

Comme on peut le voir, l'oprateur like autorise des slections utilisant des caractres gnriques.
De nombreux autres oprateurs existent comme not like, not betweenand, not in, is null ou encore is not
null en dehors des oprateurs classiques arithmtiques, logiques et de comparaison.
3.4.4.5 Oprer des classements
L'option order by et son attribut asc ou desc, permettent de prsenter les informations dans un ordre
choisi pour les lments d'une colonne.
mysql> select prenom,upper(nom),login order by prenom asc;

Les lignes sont ici prsentes dans l'ordre (alphabtique) ascendant des prnoms.

3.4.4.6 Oprer des regroupements


Outre le fait de trier les lignes, on peut souhaiter que ces dernires subissent un certain regroupement. Ce
regroupement doit videmment prcder le tri s'il y en a un. La clause utilise dans ce cas est la clause
group by. Cette clause permet de regrouper les lignes selon les valeurs d'une ou de plusieurs colonnes.
Attention, mme s'il n'y a qu'une seule colonne concerne par la clause, il ne s'agit pas d'un tri, mais bien
d'un regroupement.
Pour illustrer ces regroupements, il convient de travailler avec une base de donnes un peu plus labore.
C'est ce que nous faisons, aprs avoir prcis deux nouveaux oprateurs utilisables dans la commande
select.
La clause group by peut tre accompagne d'une autre clause, having, permettant d'effectuer un filtrage
supplmentaire lorsque ce regroupement est effectu. Des exemples suivront.
3.4.4.7 Limiter le nombre des rsultats
On peut ne pas souhaiter obtenir tous les rsultats, mais seulement un certain nombre ou mme,
quelquefois, un seul. L'attribut limit permet de fixer ce nombre.
Ainsi, si on ne s'intresse qu' la premire ligne vrifiant un critre donn, on peut procder comme dans
l'exemple suivant.
mysql> select prenom,upper(nom) where depuis>'1990' order by nom limit 1;

La ligne retourne sera celle de la premire personne, par ordre alphabtique (des noms), qui a t
engage aprs 1990.

tienne Vandeput CeFIS 2005

78

Publier sur le Web - Perfectionnement

3.4.4.8 liminer les doublons


Il ne s'agit pas de considrer des lignes identiques dans la table de slection, mais des lignes identiques
dans la table des rsultats. On utilise pour cela l'oprateur distinct.

Dans cet exemple, on recherche par quelles lettres commencent les noms des utilisateurs.
3.4.4.9 Syntaxe plus complte de la commande select
Une commande select peut donc s'crire de manire relativement longue si plusieurs clauses et plusieurs
oprateurs sont utiliss. Les principales clauses et les principaux oprateurs sont les suivants:

distinct (oprateur)

from (mot-cl)

where (clause)

group by (clause)

having (clause)

order by asc ou desc (clause)

limit (oprateur)

3.4.5 Slections multi-tables


3.4.5.1 Cration des tables
Rappelons-nous qu'une base de donnes est
rarement compose d'une seule table, et que la
transformation du schma conceptuel aboutit
ncessairement un nombre plus ou moins
lev de tables. Pour continuer illustrer notre
propos, nous allons quelque peu modifier
notre base de donnes et repartir d'un des
schmas simples que nous avons proposs.
Ce schma dcrit que dans un centre de
formation, il y a des forms qui participent
des formations assures par des formateurs.

tienne Vandeput CeFIS 2005

Form
id
nom
prenom

Formation
participe
0-N

est suivie par


Participer

0-N

id
titre
nbrinscrits

est assure par

1-1

Assurer
assure

1-N

Formateur
id
nom

79

Publier sur le Web - Perfectionnement

Tchons de rflchir la transformation de ce schma en tables.


Nous allons modifier un peu ce schma en toffant le nombre d'attributs de ses entits et en ajoutant un,
voire deux attributs l'association: un attribut paye qui prcise si le form a pay son inscription et un
attribut attente qui prcise si l'inscription est retenue ou si le form fait partie d'une liste d'attente. Notez
aussi que la table utilisateurs qui nous a servi d'exemple jusqu'ici sera reconvertie en table formateurs
grce au vertu de la commande alter table rename as
Forme
id
nom
prenom
naissance
institution

Formation
participe
1-N

Participer
paye
attente

est suivie par


0-N

id
titre

est assure par

1-1

Assurer
assure

1-N

Formateur
id
nom
prenom
depuis
statut

L'identificateur id fait office d'identifiant


dans l'entit formateur. Il faudra donc
s'assurer, par la programmation, que deux
formateurs n'ont pas le mme identifiant.
Chaque form participe au moins une
formation, sauf qu'il est peut-tre en attente
pour cette formation.
Ce schma est simple et toutefois suffisant
pour illustrer notre propos. Il est clair que
nous pourrions rajouter des attributs tels
l'adresse des forms, des formateurs, les
prrequis d'une formation, etc. Mais ces
informations supplmentaires ne vont pas
nous aider comprendre mieux ce qu'il y a
comprendre.

La premire dmarche consiste transformer le schma en table. La relation entre form et formation est
une relation de plusieurs plusieurs. L'association Participer va donc donner naissance une table
reprenant les attributs de cette association, soit paye et attente, mais aussi, les identifiants de chacune des
entits qu'elle associe.
La relation entre formateur et formation est une relation de un plusieurs. En consquence, et comme
nous l'avons vu prcdemment, l'association Assurer ne donnera pas naissance une table.
Nous aurons donc en tout quatre tables:

formes qui correspond l'entit Form

formations qui correspond l'entit Formation

inscriptions qui correspond l'association Participer

formateurs qui correspond l'entit Formateur

Dans la table formes nous avons dcid de choisir un identifiant automatiquement gnr par MySQL. Le
form aura un nom, un prnom, une anne de naissance et une institution. Si on souhaitait dvelopper la
notion d'institution, par exemple pour des raisons de contact par courrier ou autre, on en ferait
certainement une entit.

tienne Vandeput CeFIS 2005

80

Publier sur le Web - Perfectionnement

La table formations comprend trois attributs: un identifiant construit (deux derniers chiffres de l'anne et
lettre de la formation), un titre et, provenant de l'association Assurer, l'identifiant du formateur.

La table inscriptions se compose des identifiants de chacune des entits de l'association Participer et de
ses attributs paye et attente qui ont t choisis de type enum.

Enfin, la table formateurs est l'ancienne table utilisateurs. Nous avons dcid que l'identificateur tait un
identifiant lui seul et non avec le mot de passe qui a d'ailleurs disparu de la structure.

Afin de bien comprendre les oprations de jointures qui font l'objet du paragraphe suivant, il importe de
visualiser le contenu de ces diffrentes tables au moment o ces jointures sont effectues. Les voici, avec
pour commencer, la table formes

tienne Vandeput CeFIS 2005

81

Publier sur le Web - Perfectionnement

ensuite, la table formations

la table inscriptions

et finalement, la table formateurs.

3.4.5.2 Jointures
L'opration qui consiste fusionner, d'une manire ou d'une autre, les informations de deux ou plusieurs
tables porte le nom de jointure. Il existe diffrents types de jointures et notre propos n'est pas de les
dcrire tous. Nous nous contenterons d'en illustrer deux.
Une des jointures les plus intressantes est l'quijointure. C'est une jointure base sur une condition
d'galit. Les noms des colonnes ne doivent pas ncessairement tre identiques, comme dans les jointures
dites naturelles26, et l'galit ne porte pas ncessairement sur des cls primaires ou trangres.
26

Les jointures naturelles se font sur base de colonnes portant les mmes noms et ayant les mmes caractristiques.

tienne Vandeput CeFIS 2005

82

Publier sur le Web - Perfectionnement


mysql> select nom,prenom,titre from formes,formations,inscriptions where
id_formation=formations.id && id_forme=formes.id;

La commande qui prcde va permettre de slectionner deux colonnes dans la table formes et une dans la
table formations. En ralit, elle va produire l'affichage de toutes les inscriptions prises sous la forme nom
et prnom de l'inscrit et titre de la formation laquelle il est inscrit. La jointure se fait par l'intermdiaire
de l'identifiant de la table inscriptions qui est compos de deux cls trangres.

Vous remarquerez que certaines colonnes de la clause where sont crites sous leur nom long (<nom de la
table>.<nom de la colonne>). C'est d la ncessit de ne pas confondre des noms de colonnes
identiques dans deux tables (ici, id). Pour les autres colonnes, il n'y a pas d'ambiguts. On peut combiner
une jointure et un tri, comme dans la commande suivante, en demandant d'afficher les rsultats par ordre
alphabtique des noms, puis des titres.
mysql> select nom,prenom,titre from formes,formations inscriptions where
id_formation=formations.id && id_forme=formes.id order by nom,titre

tienne Vandeput CeFIS 2005

83

Publier sur le Web - Perfectionnement

Ce qui est diffrent de la commande qui suit o le tri est d'abord ralis sur le titre puis sur le nom.
mysql> select nom,prenom,titre from formes,formations inscriptions where
id_formation=formations.id && id_forme=formes.id order by titre,nom

Dans certains cas, pour raccourcir l'criture des requtes, on utilise des alias pour les tables.
mysql> select nom,prenom,titre from formes as f1,formations as f2, inscriptions where
id_formation=f2.id && id_forme=f1.id order by titre,nom

La table formes a comme alias f1 et la table formations, f2.

Dans d'autres cas, cette utilisation est invitable comme dans le cas des autojointures.
Si nous recherchons la liste des inscrits qui sont ns la mme anne, nous donnerons la commande
mysql> select f1.nom,f1.naissance from formes as f1,formes as f2 where
f1.naissance=f2.naissance && f1.id!=f2.id;

tienne Vandeput CeFIS 2005

84

Publier sur le Web - Perfectionnement

Cette commande cre deux alias pour la mme table, ce qui permet de comparer une ligne avec toutes les
autres, par exemple. Seront retenus, les nom et date de naissance des lignes de la premire instance de la
table lorsque cette mme anne de naissance sera retrouve dans une autre ligne.

Il existe d'autres types de jointures. On trouvera en bibliographie des ouvrages intressants ce propos.

3.5 Grer une BD avec PHP


3.5.1 Le principe de communication
La gestion d'une base de donnes avec MySQL tant bien amorce, il reste voir comment PHP peut s'en
accommoder. Nous avons vu que les requtes taient fournies PHP sous forme de chanes de caractres
ventuellement stockes dans des variables avant d'tre prises en charge par des fonctions. Les fonctions
dont il est question sont des fonctions de communication avec MySQL. Il importe d'en connatre les
principales, de savoir ce qu'elles prennent en argument et ce qu'elles retournent comme types de valeurs.

3.5.2 Les fonctions PHP


Il existe une bonne trentaine de fonctions ddies la communication entre PHP et MySQL. Nous
illustrons ici celles qui paraissent les plus intressantes aux premiers stades du dveloppement d'une
application de gestion de base de donnes avec PHP.
3.5.2.1 mySql_connect
Cette fonction permet d'tablir la connexion avec un serveur MySQL. Elle prend trois arguments de type
chane: le nom de l'hte, le nom de l'utilisateur et le mot de passe.
entier mySql_connect(chaine hte, chane utilisateur, chane mot de passe)

Tous les arguments sont optionnels. Ils existent par dfaut (localhost, le propritaire du processus et le
mot de passe vide). Voici un exemple concret d'ouverture de connexion:
<?php
$link = mysql_connect("localhost", "root", "")
or die("<p>Impossible de se connecter : ".mysql_error()."</p>");

tienne Vandeput CeFIS 2005

85

Publier sur le Web - Perfectionnement


print ("Connexion russie.");
mysql_close($link);
?>

Cet exemple illustre diverses choses. La fonction renvoie un entier qui est un identifiant de la connexion.
Cette valeur est utilise pour clore la connexion au moyen d'une autre fonction mySql_close qui la prend
en argument et qui renvoie une valeur boolenne. Notez que la prcision de cette valeur, dans cet
exemple, est inutile. Ce n'est que lorsque la confusion est possible qu'elle devient ncessaire (plusieurs
connexions ouvertes, par exemple). De mme, la fermeture de la connexion n'est pas ncessaire. Elle
accompagne la fin de l'excution du script.
Les paramtres fournis la fonction sont ceux qui seraient fournis lors d'une connexion normale MySQL
via la ligne de commande.
L'excution de la fonction s'accompagne d'une option qui commande au script de se terminer si la
connexion ne peut avoir lieu. Le mot-cl die est synonyme de exit, mais die se comporte comme une
fonction en ce sens qu'elle peut prendre comme argument une chane de caractres qui sera affiche en
cas d'arrt du script.
mySql_error est aussi une fonction qui renvoie une chane de caractres contenant le texte du message
d'erreur. Il existe une fonction mySql_pconnect qui rend les connexions permanentes, ce qui vite des
pertes de temps, dans certains cas.
3.5.2.2 mySql_create_db
Une fois connect au serveur MySQL, il convient d'activer une base de donnes ou d'en crer une. La
cration d'une base de donnes s'effectue par le biais de la fonction mySql_create_db.
boolen mySql_create_db(chane base de donnes, entier lien)

Voici une illustration de l'utilisation de cette fonction:


<?php
$link = mysql_pconnect("localhost", "root", "") or die ("Connexion impossible");
if (mysql_create_db("ma_db")) {
echo "<p>La base de donnes a t correctement cre.\n</p>";
}
else {
echo "<p>Erreur lors de la cration de la base : ".mysql_error()."</p>";
}
?>

Il est noter que la fonction mySql_query que nous avons dj illustre tout au dbut de ce chapitre
permet d'obtenir le mme rsultat avec la commande create database. Elle sera prfre la prcdente.
Dans cet exemple, le rsultat renvoy par la fonction est utilis dans un test.
3.5.2.3 mySql_select_db
Cette fonction qui renvoie un boolen permet de slectionner une base de donnes. Elle prend comme
arguments, le nom de la base de donnes et l'entier lien rsultant de l'ouverture de la connexion.
boolen mySql_select_db(chane base de donnes, entier lien)

Une squence classique dans un script PHP sera donc:


<?php
$link = mysql_connect('localhost', 'root', '');

tienne Vandeput CeFIS 2005

86

Publier sur le Web - Perfectionnement


if (!$link) {
die('Non connect : ' . mysql_error());
}
$db = mysql_select_db('ma_db', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '.mysql_error().'</p>');
}
?>

3.5.2.4 mySql_query
Si la connexion a bien t tablie et la base de donnes bien slectionne, il est possible d'mettre toutes
les requtes possibles et imaginables: crations de tables, insertions, suppressions, mises jour de lignes,
slections diverses,
On ne confiera pas ncessairement un script PHP le soin de crer des tables, surtout si celles-ci sont
permanentes dans l'application, mais pourquoi pas?
La fonction mySql_query est importante car elle permet de vhiculer toutes les requtes et d'en rcuprer
les rsultats.
entier mySql_query(chane requte, entier lien)

Pour les requtes d'insertion, de suppression et de mise jour, elle retourne une valeur boolenne. Pour
une slection, elle renvoie un tableau de rsultats.
Voici nouveau une illustration de squence possible:
<?php
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('exemple', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$sqlquery="select prenom,nom,institution from formes order by nom";
$queryresult=mysql_query($sqlquery);

?>

La requte MySQL est stocke dans la variable $sqlquery qui est passe en argument la fonction
mysql_query.
Il existe galement une fonction mySql_db_query semblable la prcdente, si ce n'est qu'elle prend un
argument de plus, le nom de la base de donnes sur laquelle porte la requte.
La fonction renvoie un entier qui identifie la requte et qui est stock, dans l'exemple, dans la variable
$queryresult. Cet entier est utilis, par la suite, par des fonctions d'exploration des rsultats telles celles

qui suivent.
3.5.2.5 mySql_fetch_row
Cette fonction renvoie, sous forme d'un tableau, la ligne courante. chaque appel, c'est la ligne suivante
qui est prise en compte jusqu' ce qu'il n'y en ait plus (auquel cas la fonction renvoie la valeur false).
tienne Vandeput CeFIS 2005

87

Publier sur le Web - Perfectionnement


tableau mySql_fetch_row(entier rsultat)

L'entier rsultat est celui qui identifie la requte effectue via mySql_query. Le tableau est index partir
de 0 et peut tre parcouru pour exploitation des valeurs comme dans l'exemple suivant:
<?php
echo "<h1>Liste des inscrits</h1>";
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('exemple', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$sqlquery="select nom,prenom,institution from formes order by nom";
$queryresult=mysql_query($sqlquery);
while ($row=mysql_fetch_row($queryresult)){
echo "<p><strong>".$row[1]." ".$row[0]."</strong> ".$row[2]."</p>";
}
?>

Ce petit script ouvre la base de donnes exemple et lance une requte portant sur trois colonnes de la table
formes. Les informations sont rcupres, ligne par ligne, dans un tableau $row et mises en forme pour un
affichage correct. Voici ce que cela donne.

tienne Vandeput CeFIS 2005

88

Publier sur le Web - Perfectionnement

3.5.2.6 mySql_fetch_array
Cette function est quasi identique la prcdente. La diffrence rside dans le fait qu'elle possde un
argument de plus. Cet argument prcise par l'intermdiaire d'une constante (MYSQL_NUM ou
MYSQL_ASSOC) si le tableau est index classiquement ou si c'est un tableau associatif auquel cas, les
noms de colonnes peuvent tre utiliss.
tableau mySql_fetch_array(entier rsultat, entier type)

La boucle de l'exemple prcdent peut tre remplace par


while ($row=mysql_fetch_array($queryresult,MYSQL_ASSOC)){
echo "<p><strong>".$row['prenom']." ".$row['nom']
."</strong> ".$row['institution']."</p>";
}

3.5.2.7 mySql_num_rows
Cette fonction renvoie, comme on s'en doute, le nombre de lignes du rsultat dans le cas d'une requte de
slection. Elle est particulirement utile lorsqu'on veut s'assurer qu'il y en a.
<p>
<?php
$link = mysql_connect("localhost", "root", "");
mysql_select_db("exemple", $link);
$queryresult = mysql_query("SELECT * FROM formateurs", $link);
$num_rows = mysql_num_rows($queryresult);
if (!$num_rows){
echo "Pas de formateurs !";
}
else{
echo "Il y a $num_rows formateurs.\n";
}
?>
</p>

Dans notre exemple:

3.5.2.8 mySql_affected_rows
C'est tout simplement le correspondant de la fonction prcdente pour les requtes de mises jour. Elle se
rvle utile dans la mesure o elle permet de tenir l'utilisateur au courant de ce qui est en train de se
passer.
3.5.2.9 Autres fonctions
Nous n'avons illustr que les fonctions les plus directement utiles. Les autres fonctions sont utilises plus
occasionnellement. Leur rle est cependant facile comprendre si vous avez compris le rle de celles qui
ont prcd. Le plus souvent, leur nom fournit dj une bonne description de ce quoi elles sont
destines. Citons tout de mme les fonctions qui permettent de connatre les caractristiques de

tienne Vandeput CeFIS 2005

89

Publier sur le Web - Perfectionnement

l'information issue d'une colonne dans un rsultat et notamment, la longueur (mySql_field_len), le nom
(mySql_field_name), le nom de la table (mySql_field_table), le type (mySql_field_type)
Pour le reste, nous vous renvoyons l'excellente documentation en ligne et aux ouvrages cits en
bibliographie.

3.6 Bilan
Dans ce chapitre, nous avons survol un grand nombre de connaissances et voqu un certain nombre de
savoir-faire:

raliser un schma ERA,

transformer un schma en tables,

matriser le langage MySQL,

matriser les fonctions de base permettant PHP de communiquer avec MySQL,

Ces lments nous permettent de traiter compltement, des applications qui allient la cration de pages
dynamiques avec la gestion des bases de donnes. Certaines requtes n'ont pas t envisages sous l'angle
de PHP, telles l'insertion ou la mise jour des lignes d'une table, mais vous en connaissez le principe.
L'utilisation des formulaires va s'avrer particulirement intressante pour la gestion des donnes par
l'utilisateur. En les remplissant, il va permettre l'enregistrement de lignes dans des tables. Il sera
galement possible, via des scripts correctement crits, de lui renvoyer des formulaires garnis
d'information, complter ou modifier.
Tout est donc en place pour la ralisation d'une application en ligne, mme si les listes des primitives, des
fonctions et des oprateurs des diffrents langages sont loin d'avoir t explores fond.
Voici un petit exercice pour commencer en douceur.

3.7 Exercice

Il va s'agir de concevoir un mini schma ERA dcrivant une situation que vous connaissez. Ce
schma ne comprendra pas plus de deux ou trois entits (au minimum deux) et au moins une
association de plusieurs plusieurs.

Lorsque ce schma sera complet, transformez-le en tables selon les rgles que nous avons tablies.
Dterminez clairement les attributs de chacune des entits et identifiez correctement les cls
primaires et les cls trangres.

Crez la base de donnes et les tables en vous aidant de l'interface de PHPMyAdmin. Ajoutez-y
dj quelques lignes.

crivez un script PHP qui affiche quelques colonnes d'une des tables avec une mise en forme
particulire.

crivez un script PHP qui effectue une requte portant sur plusieurs tables.

crivez un script PHP qui permette de modifier les donnes d'une table. Pour ce faire, utilisez des
formulaires que vous allez garnir avec les informations disponibles. L'utilisateur modifiera les
donnes de ces formulaires et donnera l'ordre d'enregistrer. Une page dynamique sera construite
pour lui fournir tous les renseignements ncessaires sur le droulement du traitement effectu sur
la base de donnes.

tienne Vandeput CeFIS 2005

90

Publier sur le Web - Perfectionnement

4. Application
4.1 Introduction
Afin de mettre en musique les diffrents lments qui ont t prsents dans les trois premiers chapitres,
nous nous proposons d'insister sur les dmarches mettre en uvre lors du dveloppement d'une
application. Par application, nous entendons essentiellement deux choses:

la mise en place d'un programme sous forme d'un ensemble de scripts ayant pour objectif
principal, la fourniture d'informations extraites d'une base de donnes et leur mise jour,

la cration de l'interface de communication permettant un tre humain, selon les privilges qui
lui sont accords, de grer cette base de donnes et/ou de formuler des demandes propos
d'informations qu'elle est cense contenir.

La conception d'une telle application, si lmentaire soit-elle, demande une bonne analyse de
l'environnement dans lequel elle est suppose s'excuter. Sans aller jusqu'au dveloppement complet de
l'exemple que nous allons traiter, nous insisterons sur les points importants ne pas ngliger dans la
dmarche de conception d'une telle application.

4.2 Un nonc raffiner


Lorsqu'il s'agit d'imaginer une application sur le Web dont le but est de couvrir un domaine d'activit
relativement bien connu, il est ncessaire de disposer d'une bonne description de ce domaine. Diverses
techniques sont possibles, afin de rcolter un maximum d'informations pertinentes: interview des acteurs,
des responsables, analyse de documentation (si elle existe), exercice de description de l'application par
une analyse d'applications similaires,
Les acteurs et les activits sont galement importantes cerner, de manire modliser une ralit qui ne
soit pas trop tendue. D'o l'importance de prendre en compte le public auquel cette application est
destine.
Nous allons tcher d'illustrer cela trs concrtement sur base d'un nonc issu de la description crite
d'une situation, par une personne rpute bien la connatre. Cette description est forcment incomplte et
nous a amens faire des suppositions qui pourraient se rvler incorrectes si elles ne sont pas rapidement
confrontes l'avis des principaux acteurs. Ceci donne dj quelques indications sur la manire de
procder avant de rflchir un schma conceptuel.
Voici donc l'nonc fourni.
Il s'agirait de mettre sur l'intranet d'une cole, voire sur Internet, les informations concernant les stages
des lves. On peut dcrire la situation en disant qu'il y a :

des matres de stages,

des lves de puriculture (12 classes rparties en 5e, 6e et 7e puriculture), de nursing (6 classes
rparties en 5e et 6e nursing), de griatrie (2 classes rparties en 5e et 6e griatrie),

des lieux de stages (une vingtaine de lieux diffrents),

des priodes de stages.

Pendant une mme priode, dans un mme lieu, des lves aussi bien de nursing que de puriculture, tant
de 5e, 6e ou 7e se retrouvent parfois ensemble.
titre d'exemples, voici quelques oprations que diffrents acteurs pourraient avoir envie de raliser:

tienne Vandeput CeFIS 2005

91

Publier sur le Web - Perfectionnement

un lve de telle classe pourrait rechercher quel moment il va en stage, en quel lieu, avec quel
professeur et quels lves (de quelles classes);

un professeur chercherait quels lves il supervise quelle priode;

s'il y a un accs via Internet, telle crche pourrait savoir quels lves de telle classe, section, elle
va devoir accueillir tel moment.

Cette simple description, bien sr fort incomplte, va cependant nous permettre de mettre en vidence un
certain nombre de dmarches et de pratiques qui paraissent fondamentales.

4.3 Un bon schma conceptuel


4.3.1 Premire bauche
La premire dmarche consiste reprsenter le domaine de l'activit, sous forme d'un schma conceptuel.
Un schma entits-associations peut trs bien convenir pour ce genre d'opration. Les entits, comme les
associations et les rles, peuvent gnralement tre mis en vidence au travers du discours. Les
cardinalits peuvent galement tre dduites du discours ou faire l'objet, sinon, d'une demande de
prcision.
De la description qui prcde, nous retirons d'abord qu'il y a des lves, des professeurs ou matres de
stage, des lieux de stage.
Il est galement question de stages, mais la notion de stage est plus dlicate cerner, notamment en ce qui
concerne l'tablissement des cardinalits. On peut considrer qu'un stage est la prestation note d'un lve
dans un lieu et un domaine fixs.
Les lves font partie d'une classe. Nous considrons que les stages se droulent pendant une priode
compacte, ce qui signifie d'une date une autre27.
Nous retenons donc dans un premier temps, les entits lve, Matre, Stage, Lieu, Date et Classe. Un
lve fait partie d'une classe et il effectue des stages. Les stages se droulent dans des lieux et
commencent une certaine date pour finir une autre. Les matres de stage supervisent des stages.
Un lve appartient une (et une seule) classe et une classe se compose d'au moins un lve. L'lve
effectue ou participe au minimum un stage et lorsque nous parlons d'un stage, il s'agit de celui d'un seul
lve. Le stage se droule en un seul lieu, mme si des implantations diffrentes d'un mme lieu peuvent
exister. Nous considrons que celles-ci ne sont pas dterminantes dans l'activit de consultation et de mise
jour que nous envisageons. Un lieu accueille gnralement plusieurs stages. Un stage est supervis par
un seul matre de stage, mais un matre de stage supervise habituellement plusieurs stages. Un stage
commence une certaine date et se termine une autre. Une date est potentiellement la date de dbut
de plusieurs stages et la date de fin de plusieurs autres.
Tout cela nous donne le schma ERA suivant que nous allons remanier.
4.3.1.1 Rflexion sur les cardinalits
Plusieurs lments sont prendre en compte propos des associations. S'agit-il de relations de un un, de
un plusieurs ou de plusieurs plusieurs? Ceci concerne les deux cts de l'association. Si on s'intresse
un seul de deux cts, il faut galement dterminer si la cardinalit dmarre zro ou un.
La rponse la premire question est vidente si la description du domaine est claire. La rponse la
deuxime dpend de l'importance accorde l'entit. Existe-t-elle en l'absence d'instanciation de
27

Il est clair que de tels choix orientent la modlisation et que celle-ci reprsente plus ou moins bien la ralit.

tienne Vandeput CeFIS 2005

92

Publier sur le Web - Perfectionnement

l'association? Si oui, zro est le bon choix. Par exemple, un lieu de stage peut exister dans la base de
donnes alors qu'aucun lve ne s'y rend au cours de cette anne. De mme, un matre de stage peut se
retrouver occasionnellement sans lves superviser. Cela n'empche pas le systme de les prendre en
compte pour une srie de traitements, comme par exemple, leur permettre de consulter les informations
sur les stages.
Date

est la date de dbut de

0-N

0-N

dbut
commence le
lve

participe

fin

1-1

1-1

Stage

est excut par

est la date de fin de

se termine le
est supervis par

participation
1-N

appartient

1-1

appartenance
se compose de

1-N
Classe

supervise

Matre

supervision
1-1

1-1

se droule

0-N

1-1

droulement
accueille

0-N
Lieu

Ct dates, on admettra facilement qu'une date donne ne corresponde au dbut ou la fin d'aucun stage.
Mais en ce qui les concerne, nous allons quelque peu simplifier le schma.

4.3.2 Amliorations du schma


4.3.2.1 Retouches du schma conceptuel
ce stade, il importe de se demander si toutes les entits sont vraiment utiles dans le sens o, lors du
passage au schma logique, elles vont donner lieu des tables. Dans le cas prsent, il est aussi simple de
considrer que l'entit stage a comme attributs une date de dbut et une date de fin. Cela rduira le
nombre de tables grer.
De mme, l'activit envisage fait peu de place la notion de classe. Cette entit peut donc tre
transforme en attribut de l'entit lve.
Pour le lieu, c'est plus dlicat car nous souhaitons que les responsables d'un lieu de stage puissent
galement bnficier des services de l'application. Nous devons donc maintenir lieu comme entit.

tienne Vandeput CeFIS 2005

93

Publier sur le Web - Perfectionnement

4.3.2.2 Attributs des entits et des associations


Il est bon que chacune des entits possde un identifiant. De mme, notre application tant utilise par
diffrents types de clients, il est bon que chacun de ceux-ci possde en outre un mot de passe. On pourrait
galement faire voluer le schma en ce sens qu'un lieu de stage pourrait compter plusieurs utilisateurs
qui auraient chacun un identifiant et un mot de passe. Nous allons simplifier ce dernier problme en
considrant, ce qui est raisonnable, que ces utilisateurs potentiels se servent du mme identifiant et du
mme mot de passe. Ce faisant, nous pouvons crer deux attributs de l'entit lieu qui les reprsentent.
Les autres attributs dpendent essentiellement des informations dont on souhaite disposer propos des
entits et des associations mises en vidence. Citons au minimum comme exemples: un nom et un
prnom pour les lves et les matres, une dnomination et une adresse principale pour les lieux et une
note pour la participation un stage.
Nous avons dcid que la note tait un attribut de la participation, bien que dans ce cas, et vu la
cardinalit 1-1 entre cette association et l'entit stage, nous aurions pu en faire directement un attribut de
l'entit.
Voici donc comment volue notre schma.

lve
login
pw
nom
prenom
classe

participe

1-N

Stage

est excut par

participation
note

est supervis par

id
domaine
date_debut 1-1
date_fin

1-1

se droule

supervise

supervision
0-N

Matre
login
pw
nom
prenom

1-1

droulement
accueille

0-N
Lieu

login
pw
denomination
adresse
nom
prenom

Il est un peu anormal de voir apparatre des attributs nom et prnom dans l'entit lieu. Il s'agit des
coordonnes d'un responsable dont nous n'avons pas voulu faire une entit. Cet amnagement, non
obligatoire, est d l'intrt d'avoir une structure semblable pour l'ensemble des utilisateurs de
l'application (lves, matres de stage et responsables de site) qui autorise des simplifications au niveau du
code (voir plus loin).

4.4 Le schma logique


La transformation du schma conceptuel en schma logique est quasi automatique. Seules les associations
de plusieurs plusieurs donnent naissance des tables supplmentaires. Il n'y en a pas dans l'exemple.
Nous aurons donc seulement quatre tables correspondant aux entits du schma.

tienne Vandeput CeFIS 2005

94

Publier sur le Web - Perfectionnement

L'attribut note se retrouve dans la table stage qui, occupant une place centrale dans le schma, contiendra
des cls trangres permettant les liens aux entits lve, matre et lieu. Ces attributs porteront les noms
de id_eleve, id_lieu et id_maitre.
lve
login
pw
nom
prenom
classe

Stage
id
domaine
date_debut
date_fin
note
id_eleve
id_maitre
id_lieu

Matre
login
pw
nom
prenom

Lieu
login
pw
denomination
adresse
nom
prenom

Nous constatons que chacune des tables possde un identifiant (cl primaire) et que la table stage possde
des cls trangres permettant la liaison avec d'autres tables. D'autres attributs intressants pourraient
galement figurer en fonction des besoins, mais nous avons voulu nous concentrer sur la dmarche en
vitant de noyer les explications de celle-ci dans une foule de dtails.

4.5 La construction d'une interface


Une interface de communication entre des tres humains et une application se doit d'tre utile et
utilisable. En gros, l'utilit se mesure la concidence entre les attentes des utilisateurs (ses buts) lorsqu'il
utilise l'application et les fonctionnalits proposes par celle-ci au travers de cette interface. Alors que
l'utilisabilit mesure plutt le degr de facilit d'utilisation de l'interface.

4.5.1 Utilit
Une bonne manire de dvelopper une interface utile est d'imaginer les traitements que l'utilisateur aura
envie de faire effectuer par l'application. Ceci peut se faire de diffrentes manires: interview des
utilisateurs potentiels, examen de produits quivalents,
Dans une application comme celle qui nous occupe, il s'agit surtout de dterminer quelles sont les
requtes de slection d'informations qui risquent d'avoir le plus de succs aux yeux des utilisateurs et
quelles sont les requtes de mise jour qui sont souhaitables, par qui.
Nous avons repris ici quelques requtes possibles. Nous n'avons pas effectu un travail exhaustif qui nous
aurait men trop loin. L'interface que nous avons cre, dans l'tat de son dveloppement, permet de
rpondre aux besoins suivants.

Pour un lve:
o obtenir la liste des superviseurs de stage,
o obtenir la liste des lieux et dates de ses stages,

tienne Vandeput CeFIS 2005

95

Publier sur le Web - Perfectionnement

o prendre connaissance de son lieu de stage une date donne.

Pour un matre de stage:


o obtenir la liste des lves qu'il supervise,
o ajouter un lve dans la base de donnes,
o programmer un stage pour un lve.

Nous n'avons pas programm de requte pour les responsables de site, mais les exemples pris suffisent
faire comprendre quel est le principe de cette programmation.
Beaucoup de contraintes devraient tre prises en compte. Elles relvent de ce que l'on appelle la
prvention des erreurs dans la conception des interfaces homme-machine (IHM). Parmi celles-ci notons,
par exemple, la vrification de l'unicit de l'identifiant pour chacun des utilisateurs dans sa catgorie, le
non chevauchement des priodes de stage pour un mme lve (quoique), la validit des formats de date
utiliss, la validit des dates elles-mmes, Chacune de ces contraintes, considre sparment, ne
demande pas un gros effort de programmation. La dtermination et la prise en compte de toutes les
contraintes est un problme qui requiert une analyse fouille et surtout, l'criture de nombreuses lignes de
code.

4.5.2 Utilisabilit
Lutilisabilit se mesure davantage par la manire dont le concepteur de linterface facilite le travail de
lutilisateur en le guidant dans ses actions, en rduisant autant que faire se peut sa charge de travail, en lui
vitant de commettre des erreurs, notamment.
Sans entrer dans lcriture dun trait sur lergonomie des interfaces, nous donnons quelques conseils
permettant de les rendre relativement ergonomiques.
Par la cration dune feuille de style, il est possible de promouvoir :

lutilisation dune police de caractres lisibles (larges et sans empattements),

la non prolifration des polices (deux au plus),

des choix appropris pour lappariement des couleurs,

La cration de modles, et notamment, lutilisation de calques ou de tableaux, permet de grer une


certaine uniformit au niveau de la mise en page et favorise, par l, un bon guidage de lutilisateur.
Ce sont les options essentielles que nous avons prises dans lcriture des scripts PHP qui suivent.

4.5.3 Cration de modles


Avant daborder la cration de modles, il convient davoir une ide claire de la manire dont les fichiers
seront organiss en dossiers, sans quoi, toute rfrence correcte est impossible.
Nous avons imagin de procder comme suit (voir illustration au point 4.7) :

un dossier scripts pour contenir les diffrentes pages de lapplication, la plupart donnant lieu
lcriture de scripts PHP

un dossier images pour y placer toutes les images du site

un dossier modeles qui contiendra les fichiers permettant des conomies de code

Le fichier cefis.css contenant la feuille de style, quant lui, se trouvera la racine du site.
De la sorte, il ny a pas dquivoque sur la manire de rfrencer les fichiers.
tienne Vandeput CeFIS 2005

96

Publier sur le Web - Perfectionnement

4.5.3.1 Un modle basique


Si lon considre ce que doit tre une page dun site tel celui que nous voulons mettre en place, nous
pouvons en dgager un certain nombre de caractristiques communes, notamment en ce qui concerne la
rpartition de diverses zones, la prsence permanente de certaines informations (un bandeau, par
exemple), la prsence de certains liens,
Voici un modle de base. Il est constitu dune zone dentte (entete.php), dune zone de pied de page
(pieddepage.php). Le modle (modele.php) mentionnera linclusion du code de ces deux fichiers. Voici
son propre code.
<?php include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<em>&lt;Corps de texte ici&gt;</em>
</td>
</tr>
</table>
<?php include('../modeles/pieddepage.php'); ?>

On pourrait stonner de constater que la rfrence aux fichiers inclure fasse appel au dossier parent
pour ensuite se replonger dans le dossier modeles (../modeles/) alors que les fichiers se trouvent dans ce
mme dossier modeles. Il faut bien simaginer que le fichier construit va servir de modle des fichiers se
trouvant dans le dossier scripts. Cest la raison pour laquelle il faut utiliser une rfrence plus complte.
Le corps du modle est un tableau dune seule cellule contenant un titre gnrique et un texte par dfaut
qui sera supprimer lors de la cration dune page. Lintrt du texte par dfaut est de signaler lusager
quil est en prsence du modle.
Ce modle est trs gnrique et peut donner naissance dautres modles plus complets, rsultant de
linclusion dautres fichiers.
Voici le code du fichier entete.php
<html>
<head>
<title>Institut ABC</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../cefis.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="555" height="113" border="1" cellpadding="10" cellspacing="0"
bordercolor="#FF8888" bgcolor="#FFDFD5" class="grand">
<tr>
<td height="109">
<div align="center"><img src="../images/cathedrale.jpg" width="112" height="89"
align="left">
<span class="grand">Institut ABC</span>
</div>

tienne Vandeput CeFIS 2005

97

Publier sur le Web - Perfectionnement


</td>
</tr>
</table>

Ce fichier contient le code initial et, en particulier, la liaison la feuille de style cefis.css dont le code suit.
Un tableau dune seule cellule contient un calque dans lequel on trouve la photo et le titre du bandeau.
Voici le code du fichier pieddepage.php.
<table width="555" border="1" cellpadding="10" cellspacing="0" bordercolor="#FF8888"
bgcolor="#FFDFD5">
<tr>
<td>
<a href="mailto:webmaster@det.fundp.ac.be">Contacter</a><span class="gris"> le
Webmaster</span>
</td>
</tr>
</table>
</body>
</html>

Ce dernier contient la terminaison du fichier, mais aussi un tableau dune cellule contenant un lien vers un
message lectronique ladresse du Webmaster.

Le code du modle, interprt ci-dessus, nutilise quune petite partie des styles dfinis dans la feuille de
style contenue dans le fichier cefis.css et qui est dcrite ci-aprs.
tienne Vandeput CeFIS 2005

98

Publier sur le Web - Perfectionnement


body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal; background-color: #FFFFFF;
font-size: 11px
}
td {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal;
font-size: 11px;
margin: 0px;
padding: 5px;
}
a {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal; color: #00AAFF;
text-decoration: none;
font-weight: bold; font-size: 11px
}
a:hover {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal; color: #003399;
font-weight: bold; background-color: #DFDFFF;
font-size: 11px
}
a:link {
font-family: Verdana, Arial, Helvetica, sans-serif; font-style: normal;
font-size: 11px
}
div {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
font-style: normal
}
br {
font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px;
font-style: normal;
margin-bottom: auto
}
p {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal ;
margin-bottom: auto;
font-size: 11px
}
ol {
font-family: sans-serif;
list-style-image: none
}
tienne Vandeput CeFIS 2005

99

Publier sur le Web - Perfectionnement


ul {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal ;
list-style-image: url(images/puce.gif)
}
li {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal;
padding-bottom: 3px;
font-size: 11px
}
hr {
border-color: #333399 black black;
border-top-width: thick
}
h1 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal;
font-weight: bold;
color: #333399;
border-color: black #DFDFFF;
width: auto;
margin-right: 0px;
margin-left: 0px;
border: #DFDFFF;
border-top-width: 0px;
border-right-width: 10px;
border-bottom-width: 0px;
border-left-width: 10px ;
font-size: 13px;
background-color: #FFFFCC;
padding-right: 10px;
padding-left: 10px
}
h2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 13px;
font-weight: bold;
color: #CC0033;
background-color: #FFE4CA;
font-style: normal;
padding-right: 10px;
padding-left: 10px;
border-color: black #FFE4CA;
width: auto;
margin-right: 0px;
margin-left: 0px;
border: #FFE4CA;
border-top-width: 0px;
border-right-width: 10px;
border-bottom-width: 0px;
border-left-width: 10px ;
text-align: center
}
tienne Vandeput CeFIS 2005

100

Publier sur le Web - Perfectionnement


h3 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 13px;
font-style: normal;
font-weight: bold;
color: #CC0033;
width: auto;
border-width: 10px
}
h4 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 13px;
font-style: normal;
font-weight: bold;
color: #333399;
background-color: #DFFAFB;
padding-right: 10px;
padding-left: 10px;
width: auto;
border: 1px solid #333399;
padding-top: 2px;
padding-bottom: 2px;
}
h5 {

font-family: Verdana, Arial, Helvetica, sans-serif;


font-size: 13px;
font-style: normal;
font-weight: bold;
color: #FFFFCC;
width: auto;
border-width: 10px;
background-color: #333399;
padding-right: 10px;
padding-left: 10px

}
h6 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 13px;
font-weight: bold;
color: #CC0033;
background-color: #FFE4CA;
font-style: normal;
width: auto;
margin-right: 0px;
margin-left: 0px;
border: 1px solid #CC0033;
padding: 10px;
}
b {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
font-style: normal;
font-weight: bold
}

tienne Vandeput CeFIS 2005

101

Publier sur le Web - Perfectionnement


.important1 {
font-weight: bold;
color: #FF0000
}
.important2 {
font-weight: bold
}
.different {
font-style: italic
}
.inactif {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 11px;
font-style: normal;
font-weight: bold;
color: #999999
}
.encart {
background-color: #FFFFCC;
color: #333399;
padding-right: 20px;
padding-left: 20px;
padding-top: 20px;
padding-bottom: 20px;
font-weight: normal
}
.enum1 {
list-style-image: url(images/puce.gif)
}
.retrait {
margin-left: 20px
}
.justifie {
text-align: justify
}
.grand {
font-size: 24px;
color: #999999
}
.blanc {
color: #FFFFFF
}
.nouveau {
color: #FFFFFF;
font-weight: bolder;
tienne Vandeput CeFIS 2005

102

Publier sur le Web - Perfectionnement


border: #FF0000;
background-color: #FF0000;
padding-top: 3px;
padding-bottom: 3px;
text-align: center;
font-size: 13px
}
.titre {
font-size: 15px;
color: #333399;
font-weight: bold;
border-color: black black #333399;
border-style: solid;
border-top-width: 0px;
border-right-width: 0px;
border-bottom-width: 3px;
border-left-width: 0px
}
.intertitre {
font-size: 13px;
color: #990000;
font-weight: bold;
border-color: black black #990033;
border-style: solid;
border-top-width: 0px;
border-right-width: 0px;
border-bottom-width: 1px;
border-left-width: 0px
}
.evidence {
color: #FFFFCC;
background-color: #333399;
padding-right: 20px;
padding-top: 20px;
padding-bottom: 20px;
padding-left: 20px
}
.gris {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal;
font-weight: bold;
color: #999999;
font-size: 11px
}

4.5.3.2 Des sous-modles


Le principe des inclusions de fichiers que nous avons utilis pour entete.php et pieddepage.php peut tre
tendu dautres fins comme, par exemple, lajout de boutons spcifiques, dune barre de navigation,
de manire crer dautres modles.
Il est clair que la notion de modle telle que dfinie ici est beaucoup moins riche que la notion de modle
pouvant tre implante par des logiciels ddition HTML sophistiqus. Le modle est charg pour crer la
base du document et ds linstant o ce document est enregistr sous un nom propre, diffrent de celui du
tienne Vandeput CeFIS 2005

103

Publier sur le Web - Perfectionnement

modle, il ny a plus aucune liaison avec ce dernier. Il y a donc un grand intrt rflchir srieusement,
non seulement llaboration de ces modles, mais aussi larborescence des fichiers, dterminante en ce
qui concerne les liens relatifs dcrivant les fichiers inclure.
Dans notre exemple, nous avons cr deux autres modles, pas trs diffrents du modle gnral, mais
incluant des liens vers certaines pages importantes de lapplication. Ces modles sont lis aux interactions
minimales que nous souhaitons dans le site, savoir :

lutilisateur devra se connecter au site ( partir dune page de login)

lutilisateur devra se dconnecter du site (ce qui ne sera possible qu partir de certaines pages
seulement)

lutilisateur souhaitera rgulirement revenir lensemble des fonctionnalits qui lui sont
autorises (galement possible partir de certaines pages)

Ds lors, nous envisageons un modle qui inclut un lien de retour vers le menu (modele_retour.php) et un
modle qui inclut un lien pour la dconnexion (modele_deconnexion.php). Nous construisons, dans des
fichiers spars, la partie de code concernant lajout de ces liens. Les nouveaux modles sont construits
partir du modle basique.
Voici dabord le code des fichiers modles en commenant par modele_retour.php :
<?php include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<p><em>&lt;Corps de texte ici&gt;</em></p></td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Ce modle est construit partir du code du modle de base. On y a simplement ajout linclusion dun
fichier retour_menu.php dont voici aussi le code :
<table width="555" border="0" cellspacing="2" cellpadding="5">
<tr>
<td>&nbsp;</td>
<td><div align="right">Retour au <a href='menu.php?SID'>menu</a></div></td>
</tr>
</table>

La structure de tableau une cellule est nouveau privilgie pour y placer ce lien. Notez que celui-ci
renvoie vers un script menu.php qui est encore crire. De plus, une valeur est fournie ce script sous la
forme de la constante SID qui nest rien dautre que lidentifiant de la session.
Voici lautre sous-modle modele_deconnexion.php. Sa construction est identique.
<?php include('../modeles/entete.php'); ?>

tienne Vandeput CeFIS 2005

104

Publier sur le Web - Perfectionnement


<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h1>Systme de gestion des stages</h1>
<p><em>&lt;Corps de texte ici&gt;</em></p></td>
</tr>
</table>
<?php
include('../modeles/deconnexion.php');
include('../modeles/pieddepage.php');
?>

Le fichier inclus, deconnexion.php, nest compos que dune seule ligne dans le cas prsent. Il est donc
peu utile den faire un fichier inclure. Toutefois, cest le principe que nous souhaitons illustrer ici. Il
contient un lien vers le fichier login.php dont le code est
videmment crire.
<p><a href="login.php">Dconnecter</a></p>

ce stade du dveloppement de lapplication, larborescence du


site se prsente comme suit.
Un dossier images contient les images du site, en ce comprises,
les images correspondant des puces qui auraient pu tre
dfinies dans les styles.
Un dossier modeles contient le modle de base, les deux sousmodles et les quatre fichiers pour les inclusions de code.
Le fichier contenant la dfinition de la feuille de style est rest au
niveau de la racine du site.
Il reste maintenant construire les diffrents scripts sans trop
avoir se proccuper de la mise en page. Chaque fichier sera
construit partir dun des deux sous-modles. Dans une
conception plus sophistique, on pourrait avoir une rflexion plus
approfondie permettant de raffiner davantage les modles et donc
la mise en page et en forme.

4.5.4 La connexion
Le point de dpart de lapplication est une page de connexion. Celle-ci est gnralement sobre et se limite
la demande de fourniture dun identifiant et dun mot de passe. Elle peut proposer dautres services
tels :

la possibilit de crer soi-mme son identifiant et son mot de passe (utilit estimer en fonction de
la visibilit du site - Internet ou intranet - et la capacit grer les inscriptions bidons)

la possibilit de renvoyer le mot de passe oubli un utilisateur sur base de renseignements quil
aurait pralablement fournis

Nous avons considr, dans notre exemple, que chaque utilisateur recevait un identifiant et un mot de
passe de la part de ladministrateur. On peut fournir un principe simple de construction des identifiants
tienne Vandeput CeFIS 2005

105

Publier sur le Web - Perfectionnement

(par exemple, la premire lettre du prnom suivie des lettres du nom concurrence de huit caractres) et
attribuer la mme information comme mot de passe en demandant lutilisateur den changer ds la
premire connexion. Cette mthode prsente toutefois linconvnient que certains utilisateurs ne
changeront jamais leur mot de passe, permettant dautres qui connaissent la manire de les construire,
de sen servir de manire peu loyale.
4.5.4.1 Login
La page de login est un formulaire au sens HTML du terme.
<?php include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC"><h6>Connexion au syst&egrave;me
de gestion des stages</h6>
<form name="form1" method="post" action="connexion.php">
<p>
<label> Param&egrave;tres de connexion:</label>
</p>
<p>
<label>
<input name="categorie" type="radio" value="1" checked>
l&egrave;ve</label>
<br>
<label>
<input type="radio" name="categorie" value="2">
Matre de stage</label>
<br>
<label>
<input type="radio" name="categorie" value="3">
Responsable de site</label>
</p>
<p>ID
<input type="text" name="login">
</p>
<p>Mot de passe
<input type="password" name="pw">
<label></label>
</p>
<p>
<input type="submit" name="Submit" value="Aller">
</p>
</form>

tienne Vandeput CeFIS 2005

106

Publier sur le Web - Perfectionnement


<p>&nbsp;</p></td>
</tr>
</table>
<?php include('../modeles/pieddepage.php'); ?>

Cette page est construite partir du modle basique (sans lien de retour ou de dconnexion). Le
formulaire se compose dun groupe de boutons radios, de deux zones de texte pour la saisie de
lidentifiant et du mot de passe et dun bouton de soumission.
Il ny a pas de contrle de format et de validation prvus ici pour viter la prolifration de code, mais il
est certain que des scripts JavaScript sont en mesure de grer ces problmes potentiels.
Le groupe de boutons sert identifier la catgorie dutilisateur laquelle on a affaire. De la sorte, le script
associ la soumission (connexion.php) pourra transmettre cette information de manire fournir des
menus en rapport avec cette catgorie.

4.5.4.2 Connexion
Le script28 prcdent provoque (lorsque le bouton de soumission du formulaire est activ) lexcution du
script connexion.php. Celui se contente de slectionner la bonne table pour la vrification de la
correspondance identifiant - mot de passe et de proposer des alternatives en cas derreur. Si aucune erreur
nest dtecte, un lien permet de continuer. Ce lien fait excuter le script menu.php tout en fournissant
lidentificateur de session.
28

Le mot script est utilis dans le sens large de partie de code contenant des instructions en PHP.

tienne Vandeput CeFIS 2005

107

Publier sur le Web - Perfectionnement


<?php
session_start();
include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<?php
$_SESSION['categorie']=$_POST['categorie'];
$_SESSION['login']=$_POST['login'];
$_SESSION['pw']=$_POST['pw'];
echo "<h6>Systme de gestion des stages</h6>";
$c=$_POST['categorie'];
if($c==1){$t='eleve';}
elseif($c==2){$t='maitre';}
else{$t='lieu';}
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('gestionstages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$login=$_POST['login'];
$sqlquery="select nom,prenom,login,pw from $t where login='$login'";
$queryresult=mysql_query($sqlquery);
if(mysql_num_rows($queryresult)==0){
echo "<p>Identifiant inconnu!</p>";
echo "<p><a href='login.php'>Retour</a></p>";}
else{
$row=mysql_fetch_array($queryresult,MYSQL_ASSOC);
if($row['pw']!=$_POST['pw']){
echo "Mot de passe incorrect!";
echo "<p><a href='login.php'>Retour</a></p>";}
else{echo "<p>Bienvenue <strong>".$row['prenom']." ".$row['nom']."</strong>
"."</p>";
echo "<p><a href='menu.php?".SID."'>Continuer</a></p>";
include('../modeles/deconnexion.php');
}
}
?>
tienne Vandeput CeFIS 2005

108

Publier sur le Web - Perfectionnement

</tr>
</table>
<?php
include('../modeles/pieddepage.php'); ?>

La cration dune session et la gnration dun identifiant de session se fait grce la fonction
session_start. Cette instruction doit tre la premire si on utilise la technique des cookies pour retrouver
les variables de session.
Les valeurs fournies par le formulaire (variable $_POST) sont places dans le tableau global prdfini
$_SESSION, de faon pouvoir tre retrouves grce lidentifiant de session SID.
Comme ce script doit galement identifier lutilisateur, la page produire pourrait ne pas comprendre de
retour au menu, ni de possibilit de dconnexion. Cest la raison pour laquelle cette page est cre partir
du modle basique. On a ajout une instruction gnrant un lien de retour la page prcdente et
linstruction permettant la dconnexion, uniquement dans les cas concerns par ces options. Les autres
pages seront toutes cres sur base dun des deux sous-modles.
En cas didentification, le script appel est menu.php. Ce script va gnrer un menu qui va dpendre du
type dutilisateur connect. Lidentificateur de session est fourni dans ladresse (ce qui est ncessaire si le
client web de lutilisateur est configur pour ne pas accepter les cookies).

4.5.5 Les scripts


4.5.5.1 Menu
Le script contient la mme instruction de dmarrage de session qui permet de rcuprer, si ncessaire, les
variables de session. La page est construite sur le modle modele_deconnexion.php. La variable $t
contiendra le nom de la table slectionner. Ce nom est videmment fonction de la catgorie. Le menu
est galement constitu sur base de la catgorie de lutilisateur. Les adresses de chacun des liens sont
suivies de lidentifiant de session qui permet de propager, notamment, la catgorie de lutilisateur, mais
aussi dautres informations.
<?php
session_start();
include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<?php
$c=$_SESSION['categorie'];
if($c==1){$t='eleve';}
tienne Vandeput CeFIS 2005

109

Publier sur le Web - Perfectionnement


elseif($c==2){$t='maitre';}
else{$t='lieu';}
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('stages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$login=$_SESSION['login'];
$sqlquery="select nom,prenom,login,pw from $t where login='$login'";
$queryresult=mysql_query($sqlquery);
$row=mysql_fetch_array($queryresult,MYSQL_ASSOC);
echo "<p>Session de <strong>".$row['prenom']." ".$row['nom']."</strong> "."</p>";
echo "<h1>Faites votre choix</h1>";
if($c==1){
echo "<p>Obtenir la liste des lieux et dates de vos stages <a
href='stages_eleve.php?SID'>Ici</a></p>";
echo "<p>Savoir o vous tes en stage une date donne <a
href='stages_par_date.php?SID'>Ici</a></p>";
echo "<p>Obtenir la liste des superviseurs <a
href='superviseurs.php?SID'>Ici</a>";
echo "<p>Obtenir la liste des tudiants prsents au mme endroit un mme jour
<a href='date_stage.php?SID'>Ici</a>";
echo "</p>";
}
if($c==2){
echo "<p>Obtenir la liste des lves que vous supervisez <a
href='supervision.php?SID'>Ici</a></p>";
echo "<p>Ajouter un lve <a href='ajouter_eleve.php?SID'>Ici</a><p>";
echo "<p>Ajouter un stage un lve <a
href='ajouter_stage.php?SID'>Ici</a><p>";
}
if($c==3){ // dvelopper
}
?>
</tr>
</table>
<?php
include('../modeles/deconnexion.php');
include('../modeles/pieddepage.php'); ?>

tienne Vandeput CeFIS 2005

110

Publier sur le Web - Perfectionnement

Voici linterface de menu des lves.

Le menu des matres de stage ressemblera ce qui suit.

Chacun des sept scripts mentionns dans cette page vont tre dcrits. Nous le ferons en respectant une
certaine progression dans la difficult. Cest la raison pour laquelle nous dcrivons dabord le script pour
la construction dune page destine aux lves avant de traiter les pages pour les matres de stage et de
revenir aux pages destines aux lves.
4.5.5.2 Liste des superviseurs (lve)
Il sagit dune requte slection relativement lmentaire et ne sadressant qu une seule table, celle des
matres de stage. La requte est :
select nom,prenom from maitre order by nom ;

Le reste du code est classique si lon sen rfre aux exemples qui ont dj t donns.
<?php
session_start();
include('../modeles/entete.php');
?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">

tienne Vandeput CeFIS 2005

111

Publier sur le Web - Perfectionnement


<h6>Systme de gestion des stages</h6>
<?php
echo "<h1>Liste des superviseurs</h1>";
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('stages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$sqlquery="select nom,prenom from maitre order by nom";
$queryresult=mysql_query($sqlquery);
echo "<table><tr><td><strong>PRNOM</strong></td><td><strong>NOM</strong>
</td></tr>";
while($row=mysql_fetch_array($queryresult,MYSQL_ASSOC)){
echo "<tr><td>".$row['prenom']."</td><td>".$row['nom']."</td></tr>";
}
echo "</table>";
?>
</td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Ce qui donne, par exemple :

tienne Vandeput CeFIS 2005

112

Publier sur le Web - Perfectionnement

4.5.5.3 Liste des superviss (matre de stage)


La requte est un peu plus complique ds lors quelle travaille sur les tables eleve, maitre et stage. Il faut
que dans la liste des stages, lidentifiant du matre soit celui de lutilisateur et que les identifiants du
matre et des lves correspondent dans les tables eleve et maitre.
$sqlquery="select eleve.nom,eleve.prenom,stage.domaine from eleve,stage,maitre where
id_eleve=eleve.id && id_maitre=maitre.id && maitre.login='".$_SESSION['login']."'";

Ce qui donne quelque chose comme ceci :

4.5.5.4 Ajout dun lve (matre de stage)


Voici un script dont leffet ne sera pas visible. Il sagit, en effet, de modifier le contenu de la base de
donnes. Do limportance de fournir un feed-back lutilisateur lui indiquant comment se sont passes
les oprations. Cest le rle de la page qui sera gnre.
Mais avant lexcution de ce script, lutilisateur doit fournir les donnes ncessaires la requte de mise
jour de la base de donnes. Il y a donc deux fichiers construire dans ce cas.
<?php include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC"> <h6>Syst&egrave;me de gestion
des stages </h6>
<h1>Nouvel &eacute;l&egrave;ve </h1>
<form name="form1" method="post" action="fb_enregistrer_eleve.php">
<p>Nom:
<input name="nom" type="text" size="30" maxlength="50" >
</p>
<p>Pr&eacute;nom:
<input name="prenom" type="text" id="prenom" size="30" maxlength="50">
</p>
<p>Classe:
<select name="classe" size="1" id="classe">
<option value="5G">5B</option>
<option value="6G">6B</option>
tienne Vandeput CeFIS 2005

113

Publier sur le Web - Perfectionnement


<option value="5P">5P</option>
<option value="6P">6P</option>
</select>
</p>
<p>Identifiant:
<input name="login" type="text" id="login" size="8" maxlength="8">
</p>
<p>Mot de passe:
<input name="pw" type="password" id="pw" size="20" maxlength="50">
</p>
<p>
<input name="envoyer" type="submit" id="envoyer" value="Envoyer">
</p>
<p>&nbsp; </p>
</form></td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Voici le formulaire :

La soumission du formulaire entranera lexcution du script fb_enregister_eleve.php. Observez encore


que le choix de la classe se fait dans une liste fixe. On pourrait imaginer que le nombre de classes soit

tienne Vandeput CeFIS 2005

114

Publier sur le Web - Perfectionnement

variable dans le temps. Il faudrait alors en faire une entit dans le modle ERA. Il serait commode, dans
ce cas, de gnrer la liste sur base dune requte dans la base de donnes.
Voici le code de ce script incluant les instructions denregistrement dans la base et les instructions
daffichage du feed-back.
<?php include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>R&eacute;sultat de l'enregistrement</h1>
<p>
<?php
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('stages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
foreach($_POST as $key => $value) {
$varname = "_".$key;
$$varname = $value;
}
$sqlquery="insert eleve (nom,prenom,classe,login,pw) values
('$_nom','$_prenom','$_classe','$_login','$_pw')";
$queryresult=mysql_query($sqlquery) or die("chec de l'enregistrement");
echo "L'lve $_prenom $_nom a t enregistr correctement."
?>
</p>
</td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

La requte est une requte de mise jour :


$sqlquery="insert eleve (nom,prenom,classe,login,pw) values ('$_nom','$_prenom',
'$_classe','$_login','$_pw')";

tienne Vandeput CeFIS 2005

115

Publier sur le Web - Perfectionnement

Les noms des variables ont t gnrs dynamiquement laide dune instruction foreach comme nous
en avions dj donn un exemple.
Le feed-back est donn par la seule instruction :
echo "L'lve $_prenom $_nom a t enregistr correctement." ;

Et voici lcran donnant ce feed-back :

Chacun des scripts que nous venons de dcrire affiche videmment un lien permettant un retour au menu,
ce que les copies dcran ne montrent pas.
4.5.5.5 Ajout dun stage (matre de stage)
Un matre de stage peut encoder un nouveau stage pour un lve. Nous ferons les mmes observations
que pour le cas prcdent, savoir que deux fichiers sont ncessaires : un pour gnrer un formulaire,
lautre pour enregistrer les donnes et fournir le feed-back.
La particularit de ce script est que certaines donnes vont tre extraites de la base de donnes pour
faciliter les choix de lutilisateur. Cest le cas de la liste des lves, des lieux et des domaines. On aurait
galement pu associer un petit calendrier pour le choix des dates. Tous ces choix sont videmment
discutables.
<?php include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<?php
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('stages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$sqlquery1="select nom,prenom,id from eleve";
$queryresult1=mysql_query($sqlquery1);
$sqlquery2="select denomination,id from lieu";
$queryresult2=mysql_query($sqlquery2);
?>

tienne Vandeput CeFIS 2005

116

Publier sur le Web - Perfectionnement


<h1>Nouveau stage</h1>
<form name="form1" method="post" action="fb_ajouter_stage.php">
<p>&Eacute;l&egrave;ve:
<select name="id_eleve" size="1">
<?php
while($row=mysql_fetch_array($queryresult1,MYSQL_ASSOC)){
echo"<option value='".$row['id']."'>".$row['nom']." ".$row['prenom'].
"</option>";
}
?>
</select>
</p>
<p>Lieu:
<select name="lieu" size="1" id="lieu">
<?php
while($row=mysql_fetch_array($queryresult2,MYSQL_ASSOC)){
echo"<option value='".$row['id']."'>".$row['denomination']."</option>";
}
?>
</select>
</p>
<p>Domaine:
<select name="domaine" size="1" id="domaine">
<option value="P&eacute;diatrie">P&eacute;diatrie</option>
<option value="G&eacute;riatrie">G&eacute;riatrie</option>
<option value="Cr&egrave;che">Cr&egrave;che</option>
</select>
</p>
<p>Date de d&eacute;but (jj/mm/aaaa):
<input name="date_debut" type="text" id="date_debut" size="10" maxlength="10">
</p>
<p>Date de fin (jj/mm/aaaa):
<input name="date_fin" type="text" id="date_fin" size="10" maxlength="10">
</p>
<p>
<input name="envoyer" type="submit" id="envoyer" value="Envoyer">
</p>
<p>&nbsp; </p>
</form></p></td>
</tr>
</table>
tienne Vandeput CeFIS 2005

117

Publier sur le Web - Perfectionnement


<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Voici un aperu de ce formulaire :

Lenvoi de ce formulaire active le script fb_ajouter_stage.php dont voici le code :


<?php
session_start();
include('../modeles/entete.php');
?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>R&eacute;sultat de l'enregistrement</h1>
<p>
<?php
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('gestionstages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}

tienne Vandeput CeFIS 2005

118

Publier sur le Web - Perfectionnement


foreach($_POST as $key => $value) {
$varname = "_".$key;
$$varname = $value;
}
$_date_debut=substr($_date_debut,6,4).'/'.substr($_date_debut,3,2).'/'.substr($_date_
debut,0,2);
$_date_fin=substr($_date_fin,6,4).'/'.substr($_date_fin,3,2).'/'.substr($_date_fin,0,
2);
$sqlquery1="select id from maitre where login='".$_SESSION['login']."'";
$queryresult1=mysql_query($sqlquery1) or die('La requte a chou');
$row=mysql_fetch_array($queryresult1,MYSQL_ASSOC);
$sqlquery2="insert stage (domaine,date_debut,date_fin,id_eleve,id_lieu,
id_maitre) values ('$_domaine','$_date_debut','$_date_fin','$_id_eleve','$_lieu',
'".$row['id']."')";
$queryresult2=mysql_query($sqlquery2) or die("L'enregistrement a chou");
echo "Le stage a t enregistr correctement.";
?>
</p></td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Deux requtes sont effectues :


la premire est une requte slection pour connatre lidentifiant du matre de stage (ncessaire pour crer
le nouveau stage) ;
$sqlquery1="select id from maitre where login='".$_SESSION['login']."'";

la seconde est une requte de mise jour pour linsertion du nouveau stage.
$sqlquery2="insert
stage
(domaine,date_debut,date_fin,id_eleve,id_lieu,id_maitre)
values('$_domaine','$_date_debut','$_date_fin','$_id_eleve','$_lieu','".$row['id']
."')";

Comme dans le cas prcdent, le feed-back est relativement sobre.


echo "Le stage a t enregistr correctement.";

tienne Vandeput CeFIS 2005

119

Publier sur le Web - Perfectionnement

4.5.5.6 Lieux et dates de stage (lve)


Les requtes slections ne sont pas trs compliques, si ce nest que lune delles porte sur les tables eleve
et stage.
<?php
session_start();
include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>Liste des stages &agrave; prester</h1>
<p>
<?php
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('gestionstages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$sqlquery1="select stage.domaine,stage.date_debut,stage.date_fin,
stage.id_lieu,stage.id_eleve from eleve,stage where stage.id_eleve='".
$_SESSION['login']."' group by stage.domaine";
$queryresult1=mysql_query($sqlquery1) or die('La requte 1 a chou');
echo "<table><tr><td><strong>Lieu</strong></td><td><strong>Domaine</strong>
</td><td><strong>Date de dbut</strong></td><td><strong>Date de fin</strong>
</td></tr>";
while($row=mysql_fetch_array($queryresult1)){
$sqlquery2="select denomination from lieu where login='$row[3]'";
$queryresult2=mysql_query($sqlquery2) or die('La requte 2 a chou');
$row2=mysql_fetch_array($queryresult2);
$row[1]=substr($row[1],8,2).'/'.substr($row[1],5,2).'/'.substr($row[1],0,4);
$row[2]=substr($row[2],8,2).'/'.substr($row[2],5,2).'/'.substr($row[2],0,4);
</tr>";

echo "<tr><td>$row2[0]</td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td>
}
echo "</table>";
?>
</p></td>

</tr>
</table>

tienne Vandeput CeFIS 2005

120

Publier sur le Web - Perfectionnement


<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

La premire requte :
$sqlquery1="select stage.domaine,stage.date_debut,stage.date_fin,
stage.id_lieu,stage.id_eleve from eleve,stage where stage.id_eleve='".
$_SESSION['login']."' group by stage.domaine";

permet de retrouver tous les stages de llve connect.


La seconde requte sert retrouver les dnominations des lieux en fonction de leur identifiant dans la
table des stages.
$sqlquery2="select denomination from lieu where login='$row[3]'";

Voici un rsultat possible :

4.5.5.7 Stages date donne (lve)


La recherche des stages dun lve une date donne demande nouveau deux fichiers :

un formulaire pour prciser cette date

un script pour la recherche dans la base de donnes et laffichage des rsultats

La soumission du formulaire provoquera lexcution de ce script appel ici verifier_stage.php.


<?php
session_start();
include('../modeles/entete.php');
?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>Recherche de stage</h1>
<form name="form1" method="post" action="verifier_stage.php">
<p>Prcisez la date:
<input name="jour_de_stage" type="text" size="10" maxlength="10">

tienne Vandeput CeFIS 2005

121

Publier sur le Web - Perfectionnement


</p>
<p>
<input type="submit" name="Submit" value="Envoyer">
</p>
</form>
</td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Voici ce que donne laffichage ce formulaire :

Le code du script verifier_stage.php est le suivant :


<?php
session_start();
include('../modeles/entete.php');
?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>En stage &agrave;...</h1>
<p>
<?php
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('stages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
tienne Vandeput CeFIS 2005

122

Publier sur le Web - Perfectionnement


}
$jds=$_POST['jour_de_stage'];
$jds=substr($jds,6,4).'/'.substr($jds,3,2).'/'.substr($jds,0,2);
$sqlquery1="select stage.domaine,stage.date_debut,stage.date_fin from
eleve,stage where stage.id_eleve='".$_SESSION['login']."' && '".$jds."'>
stage.date_debut && '".$jds."'<stage.date_fin";
$queryresult1=mysql_query($sqlquery1) or die('La requte a chou');
echo "<table><tr><td><strong>Lieu</strong></td><td><strong>Domaine</strong>
</td><td><strong>Date de dbut</strong></td><td><strong>Date de fin</strong></td>
</tr>";
while($row=mysql_fetch_array($queryresult1)){
$row[1]=substr($row[1],8,2).'/'.substr($row[1],5,2).'/'.substr($row[1],0,4);
$row[2]=substr($row[2],8,2).'/'.substr($row[2],5,2).'/'.substr($row[2],0,4);
$sqlquery2="select denomination from lieu where id='$row[3]'";
$queryresult2=mysql_query($sqlquery2) or die('La requte a chou');
$row2=mysql_fetch_array($queryresult2);
echo "<tr><td>$row2[0]</td><td>$row[0]</td><td>$row[1]</td><td>$row[2]
</td></tr>";
}
echo "</table>";
?>
</p></td></tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

La premire requte recherche tous les stages correspondant lutilisateur dont lintervalle de
droulement inclut la date fournie.
$sqlquery1="select stage.domaine,stage.date_debut,stage.date_fin from eleve,stage
where stage.id_eleve='".$_SESSION['login']."' && '".$jds."'> stage.date_debut &&
'".$jds."'<stage.date_fin";

La seconde requte sert dterminer la dnomination du lieu.


$sqlquery2="select denomination from lieu where id='$row[3]'";

Voici un exemple de rsultat :

tienne Vandeput CeFIS 2005

123

Publier sur le Web - Perfectionnement

4.5.5.8 Liste des accompagnants (lve)


Pour cette dernire fonctionnalit dcrite, deux fichiers sont galement ncessaires. Le premier est
semblable celui de lexemple prcdent et gnre un formulaire pour la saisie dune date. Rappelons
quaucun script ne valide ici le format et la cohrence des dates.
<?php
include('../modeles/entete.php');
?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>Date de stage</h1>
<form name="form1" method="post" action="accompagnants.php">
<p>Date (jj/mm/aaaa):
<input name="date_de_stage" type="text" id="date_de_stage">
</p>
<p>
<input name="envoyer" type="submit" id="envoyer" value="Envoyer">
</p>
</form>
<p></p></td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

Le look du formulaire est semblable au prcdent. Sa soumission provoque lexcution du script


accompagnants.php dont voici le code :
<?php
session_start();
include('../modeles/entete.php'); ?>
<table width="556" border="0" cellspacing="2" cellpadding="10">
<tr>
<td height="300" valign="top" bgcolor="#FFFFCC">
<h6>Systme de gestion des stages</h6>
<h1>Liste des &eacute;tudiants en stage au m&ecirc;me endroit ce jour</h1>
<p>
<?php
tienne Vandeput CeFIS 2005

124

Publier sur le Web - Perfectionnement


$jds=$_POST['date_de_stage'];
$jds=substr($jds,6,4).'/'.substr($jds,3,2).'/'.substr($jds,0,2);
$link = mysql_connect('localhost', 'encodeur', 'aaaaaa');
if (!$link) {
die('<p>Impossible de se connecter : '. mysql_error().'</p>');
}
$db = mysql_select_db('gestionstages', $link);
if (!$db) {
die ('<p>Impossible d\'utiliser la base : '. mysql_error().'</p>');
}
$sqlquery1="select lieu.denomination,lieu.login from stage,eleve,lieu where
stage.id_eleve='".$_SESSION['login']."' && stage.date_debut<'".$jds."' &&
stage.date_fin>'".$jds."' && stage.id_lieu=lieu.login group by lieu.denomination";
$queryresult1=mysql_query($sqlquery1) or die('La requte 1 a chou');
while($row=mysql_fetch_row($queryresult1)){
echo "<table><tr><td><strong>Lieu</strong></td></tr>";
echo "<tr><td>$row[0]</td></tr>";
echo "<tr><td><strong>Nom des prsents ce jour</strong></td></tr>";
$sqlquery2="select eleve.nom from eleve,stage where stage.id_lieu=
'".$row[1]."' && eleve.login=stage.id_eleve && stage.date_debut<'".$jds."' &&
stage.date_fin>'".$jds."' group by eleve.nom order by eleve.nom";
$queryresult2=mysql_query($sqlquery2) or die('La requte 2 a chou');
while($row2=mysql_fetch_row($queryresult2)){
echo "<tr><td>$row2[0]</td></tr>";
}
}
echo "</table>";
?>
</p>
</td>
</tr>
</table>
<?php
include('../modeles/retour_menu.php');
include('../modeles/pieddepage.php');
?>

La premire requte permet de trouver les lieux de stage de lutilisateur la date fournie :
$sqlquery1="select lieu.denomination,lieu.login from stage,eleve,lieu where
stage.id_eleve='".$_SESSION['login']."' && stage.date_debut<'".$jds."' &&
stage.date_fin>'".$jds."' && stage.id_lieu=lieu.login group by lieu.denomination";

La seconde requte permet de trouver la liste des lves en stage au mme endroit cette date :

tienne Vandeput CeFIS 2005

125

Publier sur le Web - Perfectionnement


$sqlquery2="select eleve.nom from eleve,stage where stage.id_lieu= '".$row[1]."' &&
eleve.login=stage.id_eleve && stage.date_debut<'".$jds."' &&
stage.date_fin>'".$jds."' group by eleve.nom order by eleve.nom";

Voici un exemple de rsultat:

4.6 La base de donnes


Voici, titre documentaire, la structure des quatre tables de la base de donnes et leur contenu.

4.6.1 La table eleve


4.6.1.1

Structure

4.6.1.2

Contenu

tienne Vandeput CeFIS 2005

126

Publier sur le Web - Perfectionnement

4.6.2 La table maitre


4.6.2.1

Structure

4.6.2.2

Contenu

4.6.3 La table lieu


4.6.3.1

Structure

tienne Vandeput CeFIS 2005

127

Publier sur le Web - Perfectionnement

4.6.3.2

Contenu

4.6.4 La table stage


4.6.4.1

Structure

4.6.4.2

Contenu

4.7 Structure du site


Pour terminer, voici ce que donne la structure du mini-site de notre application en termes de dossiers et de
fichiers :
tienne Vandeput CeFIS 2005

128

Publier sur le Web - Perfectionnement

Constatez encore une fois que la structure dun tel site doit tre
connue avant la rdaction du moindre script. Lusage des
modles, les rfrences quils font dautres fichiers dont le
code doit tre inclus, tous ces lments font que chaque fichier
doit tre affect un dossier, avant mme davoir t construit.
Dautres rpartitions des fichiers sont possibles. Il faut
galement estimer la quantit de fichiers que lapplication va
ncessiter. Si le nombre de fonctionnalits proposes est
importante, il faut, non seulement envisager un autre type de
menu, voire une arborescence, mais aussi une autre rpartition
des fichiers en dossiers. On pourrait imaginer, par exemple, un
dossier pour les scripts concernant les lves, un dossier pour
les scripts concernant les matres de stage et un dossier pour
les scripts concernant les htes des stages.
La ralisation dune feuille de style correcte est aussi
dterminante quant la qualit relative de linterface que vous
pourrez proposer. Il nest pas vain de consacrer un certain
temps son laboration. Il est galement possible de vous
inspirer de feuilles de styles utilises dans des sites que vous
trouvez trs agrables et trs lisibles. Il ny a pas, que nous
sachions, de copyright sur les feuilles de styles et celles-ci se
retrouvent videmment dans le cache Internet de la machine
cliente. Ds lors,
Il vous reste appliquer la dmarche que nous venons dinitier
au dveloppement dune application qui vous concerne et dont
vous connaissez les caractristiques du domaine.
Bon travail.

tienne Vandeput CeFIS 2005

129

You might also like