Вы находитесь на странице: 1из 128

Universit Sidi Mohamed ben Abdellah

Facult des Sciences et Techniques Fs


Dpartement de Gnie Industriel

Bases de donnes
et Internet
Cours
Master Sciences et Techniques
en Gnie Industriel

Professeur : F. Kaghat

Plan du cours
Chapitre 1
Langage HTML/XHTML
Chapitre 2
Feuilles de style en cascade (CSS)
Chapitre 3
PHP 5
Premire partie : syntaxe de base et programmation en PHP
2me partie : cration de sites Web dynamiques
Chapitre 4
Introduction SQL et MySQL
Chapitre 5
MySQL

Chapitre 1

Langage HTML/XHTML

Langage HTML/XHTML

HTML - Introduction
HTML : HyperText Markup Language

Liens hypertextes
Langage base de balises
Objectif : publier sur le World Wide Web (ou WWW, W3 ou Web) des documents formats
Issu du SGML (Standard Generalized Markup Language), langage de dfinition de
langages
Dvelopp par Tim Berners-Lee au CERN (Suisse) en 1990 et utilis sur le Web depuis.

Versions successives de HTML

1990
1995
1995
1997
2000
2001
2003

:
:
:
:
:
:
:

HTML 1
HTML 2
HTML+ et HTML 3 (non standards)
HTML 3.2 et HTML 4 (W3C : World Wide Web Consortium)
XHTML 1.0 (HTML 4 rcrit en XML)
XHTML 1.1
XHTML 2 en prparation

De HTML XHTML
Le langage HTML est fond sur le modle du langage balise SGML.
Rcemment, un nouveau format issu lui aussi du SGML est apparu, on le nomme XML. Ce
langage permet de structurer et d'exprimer le type de donne, comme le HTML mais avec
un gros avantage : celui de ne pas possder de balises dfinies. Le concepteur est donc
libre de nommer ces balises, de dcrire le contenu qu'il veut.
Le XHTML n'est qu'une reformulation du HTML (en SGML) en XML. tout ceci dans le but de
conduire progressivement les webmasters utiliser le XML la place du HTML.

Elments, balises et attributs

XHTML (the eXtensible Hyper Text Markup Language) signifie langage de balisage
hypertexte extensible.
Elment : nom, notion abstraite
Ex. Document html : html
Balise : forme concrte dun lment
Ex. de balise ouvrante : <html>
Ex. de balise fermante : </html>
Attribut : proprit dun lment (nom, valeur)
EX. <html xmlns="http://www.w3.org/1999/xhtml">

Nom
Valeur

Rgles dcriture

Les noms des balises doivent tre crits en minuscules.


Toute balise ouvrante doit tre ferme.
Les chevauchements entre balises sont interdits (documents bien formats).
Les noms des attributs doivent tre crits en minuscules.
Les valeurs des attributs doivent tre entre guillemets doubles.

Squelette dun document XHTML


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<!-- En-tte (note : ceci est un commentaire) -->
</head>
<body>
<!-- Corps du document -->
</body>
</html>
En XHTML (et HTML) les retour la ligne sont considrs comme des espace. Plusieurs
espaces ou retour la ligne conscutifs ne donneront pour rsultat qu'un seul et unique
espace.

Le DTD : DocType Definition


Il est obligatoire de dfinir le DocType (ou DTD). Cette ligne de code sert dfinir la
version de HTML utilise pour coder le site. Les versions que l'on peut trouver sont
souvent HTML 4 et XHTML.
Il existe 3 DTD qui correspondent trois dclinaisons de XHTML :
XHTML 1.0 Strict : n'autorise aucune erreur de code. Cette variante n'autorise aucune
balise de mise en page (comme <font>), uniquement les balises de structure.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML 1.0 Transitional : ce code est plus permissif, il autorisera notamment certaines
balises de mise en page. Mais il faut essayer de l'viter, car cette variante est voue
disparaitre : elle est prsente principalement pour faire la transition entre HTML 4 et
XHTML plus facilement.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
XHTML 1.0 Frameset : cette variante est quivalente Transitional, mais accorde
l'utilisation des balises Frameset. Ces frames (ou cadres) sont dconseilles.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
A partir de la version XHTML 1.1, il n'existe plus qu'un Doctype Strict.
XHTML 1.1 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
Nous prfrerons le DTD XHTML 1.0 Strict ou le DTD XHTML 1.1

Les attributs xmlns et xml:lang


L'attribut xmlns : attribut obligatoire, il correspond une norme XML. Cet attribut sert

donner l'adresse d'une page sur le fonctionnement du XHTML.


On met toujours l'adresse d'une page prcise du w3c.
L'attribut xml:lang : on indique dans quelle langue est rdige la page. pour nous, sa

valeur est "fr".


<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

En-tte

Informations qui ne sont pas affiches mais qui sont utilises des fins diverses.

Titre : <title> </title>


Mtadonnes : < meta />

Ex. Auteur, mots cls, description de la page


Dans ces balises, on met des informations destines dfinir la page (son titre, ses
mots cls, etc pour les moteurs de recherche, ...).
c'est l'entte de la page (ou head en anglais...).
Note : Une balise vide peut se noter <balise></balise> ou <balise />, au choix.

En-tte
Mtadonnes : Les mta-tags (ou mta, balises mta...) .
Ces balises ont deux attributs :

name ou http-equiv : on dfinit le type d'information que l'on va prciser

content : contient la valeur de l'lment que l'on prcise.


<meta name="keywords" content="mot cl, mot cl 2" />

Il existe un mta obligatoire : il contient des informations essentielles pour la page,


comme le type de caractres utiliss (franais avec accents, anglais, ...) :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

text/html indique au navigateur que le contenu du fichier est du texte, et que le


langage employ est html.

L'attribut charset indique les caractres utiliss (iso-8859-1 correspond au franais avec
les accents " "...).

Exemple den-tte
<head>
<!-- Jeu de caractres accentus -->
<meta http-equiv="Content-Type"
Content="text/html; charset=iso-8859-1" />
<!-- Titre -->
<title> Exemple de page XHTML </title>
<!-- Autres mtadonnes -->
<meta name="Author" content="Kaghat" />
<meta name="Keywords" content="Enseignement,Informatique" />
<meta name="Description" content="Exemple de page XHTML" />
</head>

Corps du document, titres, paragraphes, sparateurs


Informations qui sont affiches dans la page Web
La balise <body> c'est dans cette balise que l'on devra inscrire tout le contenu visible qui

constitue le corps de la page (body en anglais...).


Titres (headings) : Six niveaux nots h1 h6

Ex. <h1>Titre de niveau 1</h1>

Paragraphes (spars entre eux par un espace)

Ex. <p>Ceci est un paragraphe</p>

Sparateurs :

Retour la ligne (sans espace) : <br />


Ligne horizontale : <hr />

Autres blocs de texte prdfinis


Adresse

Ex. <adress>FST Route dImouzzer B.P. 2202 </adress>

Citation

Ex. <blockquote>Le langage HTML tire son origine du langage SGML</ blockquote>

Texte prformat

Ex. <pre>Le formatage sera


Conserv
lcran </pre>

Formatage de texte

Caractres gras : <strong></strong>


Italiques : <em></em>
Police "machine crire" : <code></code>
En indice : <sub></sub>
En exposant : <sup></sup>
Caractres spciaux :
< : &lt;
& : &amp;
> : &gt;
" : &quot;
espace inscable : &nbsp;

Accents franais
Codes ncessaires si la balise meta http-equiv nest pas renseigne
Accents :
(remplacer # par une lettre)

Accent grave : &#grave;


Accent aigu :
&#acute;
Accent circonflexe :
&#circ;
Trma :
&#uml;
Cdille :
&#cedil;
Ex. Comment a va ?
Comment &ccedil;a va ?

Structurer le texte
<h1>1. Documentation du Produit</h1>
<h2>1.1. Spcificit</h2>
<p>
Un premier paragraphe
</p>
<h2>1.2. Fonctions avances</h2>
<p>
Un deuxime paragraphe
</p>

Imbrication des balises


<!-- Exemple -->
<p> La norme du XHTML est dfinie par le W3C, qui encourage les concepteurs de pages
web passer du HTML au XHTML. L'avantage du XHTML sur le HTML est son
<em>extensibilit</em>, qui lui vient du langage XML. C'est pourquoi <strong>on
recommande trs fortement de prfrer le XHTML au HTML</strong>.<br /> terme, le
HTML est appel disparatre.</p>

Liens Hypertextes
La balise <a></a> permet la cration dun lien hypertexte (attribut href) ou dun lien

vers un point dancrage du document.


Forme gnrale : <a href="URL">Libell</a>
Du cot du navigateur le texte Libell apparatra (en gnral) soulign et de couleur
bleue, indiquant l'utilisateur quil sagit dun hyperlien qui va appeler l'URL
correspondante.
URL : Uniform Ressource Locator
(ou URI : Uniform Ressource Identifier)
Absolue (adresse complte), Ex.
http://www.gi-fstfes.imaroc.com
ftp://ftp.lycos.fr
mailto:alain.dupont@gmail.com
Relative ( partir du rpertoire courant), Ex.
page_suivante.html
Rep/page_dans_repertoire.html

Liens Hypertextes

Il est bien sr possible de faire des liens vers autre chose qu'une page HTML. On peut
faire des liens vers des fichiers audio, des documents textes, etc.
Cet hyperlien peut tre de plusieurs types :
Un autre document HTML
<a href="http://www.php.net">Le site officiel de PHP</a>
Un lien vers une image
<a href="lphant.jpg">La mascotte de PHP</a>
Un lien sur fichier son, ou vido charger...
<a href="anim.mov">Cliquez ici pour visionner l'animation</a>
Un lien vers un programme de composition de mail.
<a href="mailto:alain.dupont@gmail.com"> Cliquer ici pour menvoyer un email </a>
Lien vers un fichier en tlchargement
<a href="archive.zip">Cliquez ici pour tlcharger le fichier</a>
etc.

Ancres
Permettent un lien vers un endroit prcis dans une page Web
Dfinition dans une page : attribut id

Ex. <h1 id="menu">MENU</h1>


Lattribut id Permet d'affecter une balise, un identifiant unique au document.
Rfrence depuis la mme page
Ex. <a href="#menu">Aller au menu</a>
Rfrence depuis une autre page
Ex. <a href="page.html#menu">retour menu</a>

Images

Formats reconnus : GIF, JPEG, PNG


Balise : <img src="URL" alt="description" />
On se sert de l'lment <img /> et de ses attributs. Le principal attribut est src : il
permet de spcifier l'adresse o aller chercher l'image.
Il est obligatoire d'indiquer une description de limage, en guise de texte alternatif pour
les navigateurs texte, ou si pour une raison quelconque l'image ne peut pas tre
tlcharge ; le texte alternatif sert, en particulier, pour les non-voyants qui disposent de
logiciels pour lire du texte haute voix, mais n'ont rien pour dcrire des images. Ce texte
doit tre court et informatif. On l'indique avec l'attribut alt.

Images
Balise : <img src="URL" alt="description" />
src indique ladresse du fichier :
Soit en relatif par rapport au fichier courant

Ex. <img src="logo.gif" alt="Le logo de la FST de Fs" />

Soit en absolu par un lien http

EX. <img src="http://www.gi-fstfes.imaroc.com/images/logo.gif" alt="Le logo de la


FST de Fs" />

Images

On peut aussi faire d'une image un lien hypertexte.


Lien sur une image
Ex.
<a href="http://www.gi-fstfes.imaroc.com"> <img src="logo.gif" alt="Le logo de la
FST de Fs" />
</a>
Quelques attributs de prsentation de <img />
height=n, width=n : Ces deux options permettent de spcifier la taille de l'image.
height : dfinit la hauteur de l'lment en pixels ou en pourcentage.
width : dfinit la largeur de l'lment en pixels ou en pourcentage.

Listes ordonnes et non-ordonnes

Les listes sont des outils bien utiles pour prsenter des informations. XHTML en offre 3
types diffrents. Le premier type de liste est la liste non ordonne ou liste puces.
Listes puces : <ul></ul>
<ul>
<li>1er lment</li>
<li>2me lment</li>
<li>3me lment</li>
</ul>
Elments de la liste : <li>
Ce type de liste sera prsent avec des petites puces avant le texte de chaque lment.

Listes ordonnes et non-ordonnes

Le second type de liste est la liste ordonne :


Listes numrotes : <ol></ol>
Exemple :
<ol>
<li>1er lment</li>
<li>2me lment</li>
<li>3me lment</li>
</ol>
Elments de la liste : <li>
Cette liste affiche un numro au lieu d'un puce avant le texte de chaque lment.

Listes de dfinitions (lexiques)

Le dernier type de liste est la liste de dfinition, permettant de crer des listes possdant
un terme et sa dfinition.
Liste de dfinitions : <dl>
On utilise l'lment <dl> (Definition list). l'intrieur de l'lment <dl>, <dt> (pour
definition term) est une entre du lexique, et <dd> (pour definition definition...) la
dfinition associe cette entre.

Contient des <dt> et des <dd> en alternance


<dt> : nom du terme dfini
<dd> : dfinition

Listes de dfinitions

Exemple
<dl>
<dt>1er terme</dt>
<dd>Dfinition du 1er terme</dd>
<dt>2me terme</dt>
<dd>Dfinition du 2me terme</dd>
</dl>
Rsultat laffichage
1er terme
Dfinition du 1er terme
2me terme
Dfinition du 2me terme
Ce dernier type de liste est gnralement affich avec la dfinition en retrait du terme.

Imbrication des listes


Exemple :
<ul>
<li>Elment non ordonn 1
<ol>
<li>Sous-lment ordonn 1.1</li>
<li>Sous-lment ordonn 1.2</li>
</ol>
</li>
<li>Elment non ordonn 2</li>
</ul>

Tableaux simples

Un tableau HTML est dcoup en lignes contenant des cellules. Le nombre de cellules
dans chaque ligne doit tre le mme, ou alors il est ncessaire de spcifier des options de
recouvrement.
Tableau : Ensemble de lignes elles-mmes constitues de cellules
Dfinition dun tableau : <table> </table>
Lgende : <caption> </caption>
Dfinition dune ligne : <tr> </tr> (Table Row)
Dfinition dune cellule den-tte : <th> </th> (Table Heading)
Dfinition dune cellule normale : <td> </td> (Table Data)

Tableaux simples
<table border= 1>
<tr>
<td>Cellule 1.1</td>
<td>Cellule 1.2</td>
</tr>
<tr>
<td>Cellule 2.1</td>
<td>Cellule 2.2</td>

</tr>
</table>
border : dtermine l'paisseur de la bordure du tableau et des cellules, en pixels.

Exemple de tableau
<table>
<caption>Mes totaux</caption>
<tr>
<th>Jour de la semaine</th><th>Montant</th><th>Total</th>
</tr>
<tr>
<td>Lundi</td><td>456 dirhams</td><td>456 dirhams</td>
</tr>
<tr>
<td>Mardi</td><td>200 dirhams</td><td>656 dirhams</td>
</tr>
</table>

Tableaux simples
Les balises <tr> et </tr> dlimitent les lignes du tableau.
Dans la premire ligne, la balise <th> dsigne des cellules d'un type particulier : elles ne

contiennent pas de donnes, mais l'en-tte (ou titre) des colonnes correspondantes.
Dans les lignes suivantes, <td> spcifie les cellules de donnes.

Apparence du tableau exemple


Mes totaux
Jour de la semaine
Lundi
Mardi

Montant
Total
456 dirhams 456 dirhams
200 dirhams 656 dirhams

Tableaux cellules recouvrantes


Des cellules peuvent en recouvrir d'autres, que ce soit en largeur ou en hauteur. Pour
qu'une cellule occupe n cellules vers la fin de la ligne, on utilise l'attribut colspan="n".
Pour qu'une cellule occupe n cellules vers la fin de la colonne, on utilise l'attribut
rowspan="n".

Fusion de cellules (<td> ou <th>)

L'attribut colspan=n indique que la cellule stend sur n colonnes


<table border="1">
<tr>
<td colspan="2">Cellule 1</td>
</tr>
<tr>
<td>Cellule 2 </td>
<td>Cellule 3</td>
</tr>
</table>

Tableaux cellules recouvrantes


L'attribut rowspan=n indique que la cellule stend sur n lignes :

10

<table border="1">
<tr>
<td rowspan="2">Cellule 1</td>
<td>Cellule 2</td>
</tr>
<tr>
<td>Cellule 3</td>
</tr>
</table>

Exemple
<table>
<tr>
<td rowspan="2">ligne 1 et 2, colonne 1</td>
<td>ligne 1, colonne 2</td>
<td>ligne 1, colonne 3</td>
</tr>
<tr>
<td>ligne 2, colonne 2</td>
<td>ligne 2, colonne 3</td>
</tr>
<tr>
<td>ligne 3, colonne 1</td>
<td colspan="2">ligne 3, colonne 2 et 3</td>
</tr>
</table>

Formulaires
En sance de cours : PHP 5.
En sance de travaux pratiques.

11

Chapitre 2

Feuilles de style en cascade


(CSS)

12

Feuilles de style en cascade (CSS)

Dfinition et caractristiques
Les Cascading Style Sheets ou Feuilles de Styles en Cascade ont t initialement conues

pour le langage HTML.


La premire version du standard, dite CSS niveau 1 (CSS1), a t publie en 1996
Mai 1998, le W3 Consortium a publi une nouvelle version, dite CSS niveau 2 (CSS2)
Sparation du contenu et de la prsentation
Dfinition de styles gnriques pour les balises
Syntaxe diffrente de HTML

Avantages

Gestion simplifie et globale de la prsentation dun site


Cots de dveloppement et de maintenance allgs (code plus simple)
Code source allg
Possibilit de prsentations diffrentes selon le profil utilisateur, la rsolution cran
Meilleure accessibilit

Dfinitions de styles
Trois localisations possibles (+local au +global)
Dans une balise HTML : attribut style
Ex. <p style="color: blue; text-align: center;"></p>
Dans une page HTML : balise <style>
Dans len-tte de la page Web (head) :
<style type="text/css"></style>
Dans un fichier spar
Appel dans len-tte de la page Web (head) :
<link rel="stylesheet" type="text/css" href="feuille_style.css" />

A l'intrieur des marqueurs <head>

La balise <style>
L'attribut type="text/css" : il s'agit de feuilles de style en cascade
La balise de commentaire <! -- ... -->
<head>
<style type="text/css">
<!-contenu d une feuille de style CSS
-->
</style>
</head>

A lextrieur du document HTML

Stocker la dfinition des feuilles de style dans un fichier


Crer un fichier texte contenant les feuilles de style avec l'extension ".css"
Changer l'allure de toutes les pages Web s'y rfrant.
Ex.

13

<head>
<link rel="stylesheet" type="text/css" href="feuille_style.css" />
</head>
<link> : tablir un lien , peut y en avoir plusieurs
rel="stylesheet" : il s'agit d'une feuille externe
type="text/css" : il s'agit de feuilles de style en cascade (CSS)
href=" ... " dfinit l'emplacement de la feuille de style
cette solution qui consiste crire une feuille de style dans un fichier spar est prfre.

Notion de cascade
Imbrication des dfinitions : la plus locale lemporte.

Ex. Dfinition de style dans un fichier externe vs. Dfinition dans une balise
La dfinition locale de la balise prvaut
Imbrication des balises : le style dune balise sapplique aux balises imbriques.

Ex. <p><em></em></p>
Si un style est appliqu <p>, il sapplique <em>.

Concept de base
Feuille de style : ensemble de rgles

Un slecteur
Des proprits
Une valeur pour chaque proprit
Exemple
h1 { color: yellow;
font-weight: bold;
}

Dfinition d'un style


Une rgle de style se compose

d'un slecteur qui indique l'lment auquel elle s'applique, et d'une ou de plusieurs
proprits ainsi que leurs valeurs respectives.

Le couple proprit: valeur forme ce que l'on appelle la dclaration.

slecteur {proprit1: valeur1; proprit2: valeur2; }

Slecteurs

Slecteur universel : tous les lments HTML


Ex. * { color: blue; }

Style dune catgorie de balises


Ex. h1 { color: #FF00FF; }

Style de plusieurs catgories de balises


Ex. h1, h2, h3, p { color: green; }

Style pour balises imbriques


Ex. p em { color: red; } /* Italiques dans un paragraphe */

Remarque : Les commentaires utiliss l'intrieur des feuilles de style sont similaires
ceux que l'on utilise en langage C.

14

Hritage
Considrons la rgle de style :

h1 { color: blue; }
Considrons le code HTML suivant :

<h1>Le titre d'un document <em>est</em> trs important !</h1>


Si aucune couleur n'a t spcifie pour l'lment em, le mot en italique "est" hritera

automatiquement de la couleur de son lment parent (h1), soit bleue pour notre
exemple.

Hritage

Pour dfinir un style "par dfaut" pour tout un document, il suffit de le dfinir sur
l'lment parent tous les autres - llment racine - i.e en HTML, l'lment <body>.
body {
color : black;
background: white;
font-style: arial;
}

Remarque : on ne peut pas appliquer un style la balise html !

Les Classes de Style


Les classes permettent de crer, au niveau du document ou dune feuille de style externe,

plusieurs styles diffrents pour une mme balise, chacun se dmarquant des autres par
un nom de classe.
Pour appliquer une classe de style, il faut lindiquer comme valeur dattribut class dans la
balise.

Les Classes de Style


Parfois, il est ncessaire de pouvoir choisir entre plusieurs types de prsentations pour un
mme lment HTML. C'est souvent le cas pour les paragraphes dans un document long.
Par exemple, on peut avoir les paragraphes d'en-tte, des remarques et des paragraphes
normaux.

Ex.
.style_rouge { color: red; }
.style_bleu { color: blue; }
p.entete { font-style: italic; }

Dans le premier cas, on indique que tous les lments de classe "style_rouge", quels
qu'ils soient, devront tre affichs en rouge. Dans le 3me exemple, seuls les lments p
de classe "entete" devront tre affichs en italique.

Les Classes de Style


Utilisation dans une page Web
Ex.
<h1 class="style_rouge">Titre rouge</h1>
<p class="style_rouge">Texte rouge</p>
<p class="style_bleu">Texte bleu</p>
<p class="entete">Ceci est le paragraphe d'entte...</p>
<p>
Ceci est un paragraphe normal... </p>

15

Les Classes de Style


Dfinir une classe se rsume ajouter un nom de classe comme suffixe au nom de balise
reprsentant le slecteur dune rgle de style et les sparer par un point.
Le nom de classe peut tre une squence quelconque de lettres, de nombres et de tirets
mais doit commencer par une lettre.
balise.nom_de_classe { proprit de style: valeur }
Pour appeler l'effet de style dans le document, on ajoute le nom de la classe la balise.
<balise class="nom_de-classe"> .... </balise>

Classes gnriques
On peut dfinir une classe sans lassocier une balise particulire et lappliquer ensuite au
cas par cas selon les balises du document. Par exemple :
.italique {font-style: italic}
cre une classe gnrique appele italique. Pour lutiliser, il suffit dassocier son nom
lattribut class.
<p class="italique">
<h1 class="italique">
Les classes gnriques sont pratiques et facilitent lapplication dun style particulier une
large gamme de balises.

Application des styles

A un ensemble dlments : <div> </div>


Ex. <div class="style_bleu">
<h1></h1>
<p></p>
<p></p>
</div>
A une partie dun paragraphe : <span> </span>
Ex. <p class="style_rouge">Ceci est rouge sauf
<span class="style_bleu">ce qui est bleu</span>
</p>

Les proprits CSS

Consulter le document :
Les balises XHTML - les proprits CSS

Proprits de couleur
color

color: black;
color: #000000;
background-color
background-color: white;
background-color: #FFFFFF;
background-iamge background-image: url("URL");
background-repeat
background-repeat: no-repeat;
background-position
background-position: center;

Proprits de typographie
font-family
font-size
font-style
font-weight

font-family: times;
font-family: arial, verdana;
font-size: 1.5em;
font-style: italic;
font-weight: bold;

16

font-weight: bolder;
font-decoration: underline;
font-decoration: line-through;

font-decoration

Proprits de texte
text-align

text-align: left;
text-align: right;
text-align: center;
text-align: justify;
text-indent: 10pt;
text-indent: 15px;
text-indent: 5%;

text-indent

Proprits de bote englobante


width
height
padding

-left, -right, -top, -bottom


margin

-left, -right, -top, -bottom


border

-width, -style, -color

width: 80pt;
height: 25%;
padding: 5px;
padding-bottom: 10px;
margin: 10px;
margin-left: 10%;
border: 2px solid #FF00FF;
border-style: dotted;

Proprits dhyperlien
Hyperliens

Ex. a { color: blue; }


Hyperliens visits

Ex. a:visited { color: purple; }


Hyperliens survols (avec le pointeur de la souris)

Ex. a:hover { color: white; background-color: blue; }


Hyperliens activs

Ex. a:active { color: purple; }

Proprits de liste
Listes non-ordonnes

list-style

list-style-image

list-style: disc;
list-style: circle;
list-style: square;
list-style-image: url("URL");

Listes ordonnes

list-style

list-style: decimal;
list-style: upper-roman;
list-style: lower-alpha;

Proprits de tableau
Balise table : border, width
Balise caption : caption-side top;

caption-side bottom;
Balise tr : height
Balises td et th : border, width

et

vertical-align top;
vertical-align middle;

17

vertical-align bottom;

Exemple

Exemple films.css : Exemple de feuille CSS qui donne quelques directives de


prsentation pour les pages HTML de notre site.

/*-----------------------------------* La feuille de style du site Films


*-----------------------------------*/
/* Le fond est toujours en blanc */
body {background-color: white;}
/* On utilise une couleur rouge pour les ancres
* et les enttes
*/
a, h1, h2, h3 {color: #ca0000;}
caption {font-size:large; color: #ca0000;}
/* Alternance des couleurs pour les lignes des tables */
tr.A0 {background-color:white;}
tr.A1 {background-color:yellow;}

Application un document
Exemple : page_films.html : Document HTML avec feuille de style
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type"
Content="text/html; charset=iso-8859-1" />
<title>Document HTML avec feuille de style</title>
<meta name="Author" content="Kaghat" />
<meta name="Keywords" content="Cinma,film" />
<meta name="Description" content="Un site consacr l'art cinmatographique" />
<link rel="stylesheet" type="text/css" href="films.css" />
</head>
Application un document
<body>
<h1>Une table HTML</h1>
<table border="4">
<caption>Quelques films</caption>
<tr>
<th>Titre</th><th>Anne</th><th>Nom Ralisateur</th><th>Prnom</th> <th>Anne
naissance</th>
</tr>
<tr class="A0">
<td>Alien</td><td>1979</td><td>Scott</td><td>Ridley</td><td>1943</td>
</tr>
Application un document

18

<tr class="A1">
<td>Vertigo</td><td>1958</td><td>Hitchcock</td><td>Alfred</td> <td>1899</td>
</tr>
<tr class="A0">
<td>Van Gogh</td><td>1991</td><td>Pialat</td><td>Maurice</td> <td>1925</td>
</tr>
<tr class="A1">
<td>Titanic</td><td>1997</td><td>Cameron</td><td>James</td> <td>1954</td>
</tr>
</table></body></html>

Autre exemple : les liens


Exemple: style_liens.css : exemple de feuille CSS
a { color: #0066CC; } /* Liens en bleu (entre clair et fonc) */
a:visited { color: black; } /* et en noir (comme le texte normal, mais soulign) si dj
visits */
a:hover, a:active { color: white; /* Lors du passage de la souris ou activation, */
background-color: #0066CC; } /* couleur blanc sur fond bleu */
le slecteur a pour les liens normaux, a:visited pour les liens dj visits, a:hover pour le
lien actuellement sous la souris et a:active pour le lien actif (slectionn en utilisant les
touches de tabulation).

Application un document
Exemple : exemple_liens.html : Document HTML avec feuille de style
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type"
Content="text/html; charset=iso-8859-1" />
<title>Document HTML avec feuille de style</title>
<meta name="Author" content="Kaghat" />
<meta name="Keywords" content="mot1,mot2" />
<meta name="Description" content="description du site" />
<link rel="stylesheet" type="text/css" href="style_liens.css" />
</head>
Application un document
<body>
Voici un paragraphe avec un
<a href="#">lien</a>,et encore un autre
<a href="#">autre lien</a>, et toujours de <a href="#">nouveaux liens</a>, ! De quoi
tester le rendu des liens en CSS.
</body>
</html>

19

Chapitre 3

PHP 5
Premire partie : syntaxe de base et
programmation en PHP
2me partie : cration de sites Web
dynamiques

20

Premire partie : syntaxe de base et


programmation en PHP
Introduction
Lenvironnement PHP/MySQL
Qu'est ce que PHP?
PHP: Hypertext Preprocessor

Langage de script Open Source, spcialement conu pour le dveloppement d'applications


Web. Il peut tre intgr facilement au HTML.
PHP est un langage interprt (un langage de script) excut du ct serveur (comme
les scripts CGI, ASP, ...) et non du ct client (un script crit en Javascript ou une applet
Java s'excute sur votre ordinateur...).
La syntaxe du langage provient de celles du langage C, du Perl et de Java.

PHP = SERVER SIDE


PHP est ce qu'on appelle un langage SERVER SIDE, ou ct serveur . Le visiteur du
site (on l'appellera le CLIENT) demande voir une page php : cette requte parvient au
serveur hbergeant le site, qui va l'interprter avec les paramtres ventuellement
demands dans la requte, et renverra le RESULTAT de la requte au client.
Premier avantage : les sources PHP sont protges car elles ne transitent jamais sur le
Web.
Second avantage : les performances du code sont indpendantes de la configuration de la
machine ou des logiciels du client, et il n'est pas besoin de logiciel ou de module
particulier install chez lui.

Modle

Client

Requt
e
Interne
t
Rpons
e

Serveur

Appel de la
page

Base de
donne
s
MySQL

Extractio
n
de
donnes

Script
PHP

Excutio
n

Documen
t
Html

21

Histoire et origine
Il a t cr en 1994 par Rasmus Lerdorf pour les besoins des pages Web personnelles

(livre d'or, compteurs, etc.). A l'poque, PHP signifiait Personnal Home Page.
En 1997, PHP devient un projet collectif et son interprteur est rcrit par Zeev Suraski et

Andi Gutmans pour donner la version 3 qui s'appelle dsormais PHP : Hypertext
Preprocessor
PHP4, 2000
Juillet 2004 : version 5.0.0 de PHP, 30-juin-2009 : PHP 5.3.0
PHP 5 amliore l'orientation objet de PHP.

Quelques dfinitions
SGBD:
La gestion de la base de donnes se fait grce un systme appel SGBD (systme de
gestion de bases de donnes). Le SGBD est un ensemble de services (applications
logicielles) permettant de grer les bases de donnes, c'est--dire:
Prendre connaissance des donnes.
Manipuler les donnes prsentes dans la base de donnes (insertion, suppression,
modification.).
MySQL, Oracle sont des SGBD.
MySQL
C'est un Systme de Gestion de Bases de Donnes (SGBD) fonctionnant sous Linux et
Windows. Depuis la version 3.23.19, MySQL est sous Licence GPL (aussi bien sous Linux
que Windows), ce qui signifie qu'il peut tre utilis gratuitement.

Principaux atouts de PHP


La gratuit et la disponibilit du code source (PHP est distribu sous licence GNU GPL);
La possibilit d'inclure le script PHP au sein d'une page HTML (contrairement aux scripts
CGI, pour lesquels il faut crire des lignes de code pour afficher chaque ligne en langage
HTML) ;
La simplicit d'interfaage avec des bases de donnes (de nombreux SGBD sont
supports, mais le plus utilis avec ce langage est MySQL).
L'intgration au sein de nombreux serveurs Web (Apache, Microsoft IIS, etc.).

SGBD supports par PHP

Une des grandes forces de PHP est le support de nombreuses bases de donnes. Les
bases de donnes suivantes sont toutes supportes par PHP :
Adabas D
dBase
Empress
FilePro (lecture seule)
Hyperwave
IBM DB2
Informix
Ingres
InterBase
FrontBase
mSQL

Direct MSSQL
MySQL
ODBC
Oracle (OCI7 et OCI8)
Ovrimos
PostgreSQL
SQLite
Solid
Sybase
Velocis
Unix dbm

22

MySQL: prsentation
C'est en fait un serveur MySQL, un ensemble de programmes ayant pour tche
d'administrer les bases de donnes, il manipule les instructions adresses la BD.
Exemple: cration et gestion de bases, de tables.
Le dialogue avec une base de donnes s'effectue en envoyant des messages au serveur
de BD (ici MySQL). Le langage utilis pour ce faire sera, en ce qui nous concerne PHP. En
ralit, les requtes sont rdiges en langage SQL, mais PHP a pour rle de transmettre
les requtes SQL de faon transparente.
Couple PHP/MySQL:
Dans une application de base de donnes sur le web, PHP est la partie application et
MySQL est le ct base de donnes.

L'environnement ncessaire l'application web - base de donnes :

Un serveur Web qui hberge les pages et renvoie les rsultats des requtes aux
utilisateurs.
MySQL, le SGBDR que nous utiliserons qui permettra de manipuler les donnes de la
base.
PHP, le langage de script que nous utiliserons pour crire les programmes du site Web
dynamique.

Environnement de dveloppement
Trois outils sont ncssaires la ralisation d'un site PHP/mySQL:
Le serveur web (Apache pour nous).
Un SGBDR (en l'occurence, MySQL, en ce qui nous concerne), il manipulera les donnes
de la base.
PHP, le langage de script.

Autres technologies analogues


Pour produire des pages dynamiques.

Cold Fusion.
JavaServer Page.
Microsoft ASP.
CGI et autres langages (Perl, C, C++, etc).

Positionnement face aux autres langages


A l'heure actuelle les "concurrents" de PHP sont :

- ASP : Technologie de Microsoft trs similaire, utilisant un langage de script,


gnralement VBScript (Version allge de Visual Basic)
- PERL : Langage de script puissant, adapt Internet mais trs difficile matriser
- CGI : Composants excutables, rapide mais spcifiques la plate forme-serveur

23

A - Syntaxe de base
1. Passer du HTML au PHP
Passer du HTML au PHP
Il y a quatre jeux de balises qui servent dlimiter des blocs de code PHP.
Seules deux d'entre elles sont toujours actives :

<?php ... ?>


et <script language="php">...</script>)
Les autres peuvent tre actives et dsactives depuis le fichier de configuration php.ini.
Les balises courtes <? ?> et les balises ASP <% %> peuvent tre pratiques, mais
elles ne sont pas aussi portables que les versions longues.
si vous envisagez d'inclure du PHP dans des fichiers XML ou XHTML, vous devrez utiliser la
forme <?php ...?> pour vous conformer au XML.

Exemple

<?php
echo "Nous utilisons apache comme serveur Web";
?>
<?
echo "Bonjour !";
?>
Le style script :
<script language="php">
echo "Bonjour !";
</script>
Le style ASP :
<%
echo "Bonjour !";
%>

Remarque
La premire mthode est gnralement utilise, car elle permet une implmentation aise
de PHP avec la prochaine gnration de XHTML.

Le sparateur d'instructions
Les instructions sont spares par un point virgule chaque fin d'instruction, comme en

langage C ou en Perl.
La balise de fin (?>) implique la fin d'une instruction, et donc ajoute implicitement un

point virgule. Les deux exemples suivants sont quivalents.


<?php
echo "Ceci est un test";
?>
<?php echo "Ceci est un test" ?>

24

Envoi des donnes au navigateur


Il existe plusieurs fonctions pour envoyer des donnes au navigateur, les plus courantes

tant echo() et print():


echo 'Hello, world ! ';
print "Ceci est un test";
On peut employer des apostrophes ou des guillemets pour encadrer une chane de
caractre.

Lchappement
Une des complications de lenvoi de donnes un navigateur est laffichage de guillemets

ou dapostrophes. Ces deux exemples provoqueront une erreur:


echo "Vous excutez le fichier : "exemple.php" ";
print 'Comme un script PHP doit tre dcod par un serveur, vous devez utiliser

l'URL http://localhost/exemple.php si vous disposez d'un serveur local';


A cette difficult, il y a deux solutions :
1) Utiliser des guillemets quand on veut afficher une apostrophe et rciproquement:
echo 'Vous excutez le fichier : "exemple.php" ';
print "Comme un script PHP . utiliser l'URL . si vous disposez d'un serveur
local";
2) Echapper le caractre litigieux en le faisant prcder par un antislash (\):
echo "Vous excutez le fichier : \"exemple.php\" ";
print 'Comme . utiliser l\'URL . d\'un serveur local';

Remarques
PHP est insensible la casse en ce qui concerne les noms de fonctions:
echo() = ECHO() = eCHo()
On peut utiliser ces fonctions pour envoyer du HTML au navigateur:
echo '<b>Hello, <FONT SIZE=+2>world</FONT> !</b>';
Echo() (mais pas print) permet denvoyer plusieurs informations dcoupes au
navigateur en les sparant par des virgules:
echo 'Hello, ', "world!";

PHP, HTML et lespace blanc


Pour modifier la mise en page en accentuant lespacement des lignes de la page Web

affiche, on peut utiliser les balises <br /> (rupture de ligne) ou <p></p> (marques de
paragraphe). Pour modifier lespacement du code HTML laide de PHP, on a le choix
entre:
Utiliser echo() ou print() entre plusieurs lignes;
Utiliser le caractre alina (\n) plac entre une paire de guillemets.

Crer des espaces blancs


<?php
echo 'Cette instruction echo() se continue
sur deux lignes!';
echo "<br />Cette ligne devrait apparatre isole dans la page Web.\n\n";
echo 'C\'est gagn !';
?>

25

Commentaires

PHP supporte les commentaires comme en C, C++ et Shell Unix. Par exemple :

<?php
echo "Ceci est un test"; // Ceci est un commentaire sur une ligne comme en C++
/* Ceci est un commentaire sur plusieurs lignes,
comme en C et C++ */
echo "Ceci est encore un test";
echo "Enfin, le test final"; # Ceci est un commentaire comme en Shell Unix
?>
Faites attention ne pas emboter les commentaires de type langage C, ce qui arrive de
temps en temps lorsque vous voulez commenter une grande partie de code.
<?php
/*
echo "Ceci est un test"; /* Ce commentaire va poser un problme */
*/
?>

2. Les variables
Les variables, qu'est ce que c'est?
Les variables sont destines conserver temporairement des valeurs.
Le typage des variables est implicite en php. Il nest donc pas ncessaire de dclarer leur
type au pralable ni mme de les initialiser avant leur utilisation.

Il y a huit types de variables dans le langage PHP:

Les variables, qu'est ce que c'est?


4 de types scalaires (valeur unique):
boolennes (TRUE ou FALSE), entires, flottantes (avec une partie dcimale), et chanes de
caractres (texte),
Deux non scalaires (plusieurs valeurs): tableaux et objets.
Plus les ressources (rencontres lorsqu'on travaille avec une base de donnes) et NULL
(qui est une variable spciale dpourvue de valeur).

Les variables: rgles syntaxiques


Tout nom de variable doit commencer par un caractre ($). Exemple: $nom.
Le nom peut contenir une combinaison de caractres, chiffres et du caractre blanc
soulign (_). Exemple: $le_prix2.
Le premier caractre qui suit le $ initial ne doit pas tre un chiffre. Il doit tre une lettre
ou un blanc soulign.
Les noms de variables sont sensibles la casse. $nom et $Nom sont deux variables
entirement diffrentes.
On affecte des valeurs aux variables l'aide du signe gale (=).

Les variables PHP prdfinies (1)


Affichons les valeurs du script qui va tre excut:
echo "Vous excutez le fichier <b>$PHP_SELF</b>.<br /><br />\n";
Variable prdfinie utilise ici est : $PHP_SELF, laquelle fait rfrence au script en cours
d'excution. Selon le serveur qu'on utilise, son contenu peut tre diffrent : depuis
nom_du_script.php jusqu' /chemin/vers/ nom_du_script.php.

26

Les variables PHP prdfinies (2)


Affichons les informations concernant l'utilisateur qui accde au script :
echo 'Vous voyez cette page avec:<br /><b>', $HTTP_USER_AGENT, '</b><br /> partir
de l\'adresse IP ', $REMOTE_ADDR;
Les variables prdfinies : ($HTTP_USER_AGENT) fait rfrence au systme d'exploitation,
au type du navigateur utilis et sa version.
($REMOTE_ADDR) concerne l'adresse IP de l'utilisateur qui accde la page (s'il s'agit du
serveur local localhost, l'dresse IP est 127.0.0.1).

Les variables PHP prdfinies (3)


<html>
<head>
<title>Variables prdfinies</title>
</head>
<body>
<?php
# Listing - predefini.php
// Afficher le nom du script
echo "Vous excutez le fichier <b>$PHP_SELF</b>.<br /><br />\n";
// Afficher les informations concernant l'utilisateur
echo 'Vous voyez cette page avec:<br /><b>', $HTTP_USER_AGENT,
'</b><br /> partir de l\'adresse IP ', $REMOTE_ADDR;
?>
</body>
</html>

3. Les chanes de caractres


Les chanes de caractres
Le type string (chane de caractres) : Une chane de caractres est simplement une suite
place entre (') ou entre ('') de caractres quelconques (lettres accentues ou non
chiffres, espaces, signes de ponctuation, etc.).

Affectation d'une chane de caractre un nom de variable au moyen du signe = :


<?php
# Listing - strings.php
// Cre les variables
$prnom = 'Nicolas';
$nom = 'Hornby';
$livre = 'Haute fidlit';
// Affichez les valeurs
echo "Le livre <i>$livre</i> a t crit par $prnom $nom.";
?>

Utiliser des guillemets pour que les variables soient correctement affiches.

Concatnation de chanes de caractres

La concatnation est une opration importante pour les chanes de caractres. Elle est
l'quivalent de ce qu'est l'addition pour les nombres. Elle s'effectue avec l'oprateur (.).

<?php
# Listing - concat.php
// Cre les variables
$prnom = 'Jules';

27

$nom = 'Verne';
$auteur = $prnom . ' ' . $nom;
// Une nouvelle variable, $auteur, est cre pour recevoir le rsultat de la concatnation.
$livre = 'Vingt mille lieues sous les mers';
// Affichez les valeurs
echo "Le livre <i>$livre</i> a t crit par $auteur.";
// Le livre Vingt mille lieues sous les mers a t crit par Jules Verne.
?>

Remarques
PHP possde un grand nombre de fonctions de traitement de chanes de caractres. Par

exemple, pour connatre le nombre de caractres que contient une chane de caractres,
on peut utiliser la fonction strlen() :
$nb = strlen($chane);
Lorsqu'on affecte une nouvelle valeur une variable, elle crase la prcdente, dont

l'ancienne valeur est donc perdue.


Pour concatner une valeur une autre, on peut utiliser l'oprateur associatif (.=). Les 2
instructions suivantes donnent un rsultat identique :
$titre = $titre . $sous_titre;
$titre .= $sous_titre;

On pourrait rcrire ainsi l'exemple prcdent:


$nom_complet = ''$prnom $nom'';

Ou :
$nom_complet = $prnom;
$nom_complet .= '' '';
$nom_complet .= $nom;

L'oprateur de concatnation peut tre utilis l'intrieur d'une fonction.


Print $prnom . ' . $nom;

4. Variables numriques, oprateurs et fonctions


arithmtiques
Variables numriques entires et flottantes
Nombres entiers :
Il est possible de spcifier les nombres entiers (Integers) de la manire suivante :
$a = 1234; # nombre entier
$a = -123; # nombre entier ngatif
Les nombres virgule flottante :
Les nombres virgule flottante ("doubles") peuvent tres spcifi en utilisant la syntaxe
suivante :
$a = 1.234;
$a = 1.2e3;

28

Oprateurs arithmtiques
Exemple

Nom

Rsultat

$a + $b

Addition

Somme de $a et $b

$a - $b

Soustraction

Diffrence de $a et $b

$a * $b

Multiplication

Produit de $a et $b

$a / $b

Division

Quotient de $a et $b

$a % $b

Modulo

Reste de $a divis par $b

Fonctions arithmtiques
Il existe une kyrielle de fonctions arithmtiques. Exemples :
round() : effectue un arrondi sur un nombre dcimal en lui donnant la valeur de lentier
le plus proche :
$n = 3.14;
$n = round ($n); // rsultat : 3
On peut spcifier le nombre de positions dcimales o doit intervenir larrondi au moyen
dun second argument dans lappel de la fonction :
$n = 3.142857;
$n = round ($n, 3); // rsultat : 3.143

La fonction number_format () formate un nombre dcimal en une chane de caractres


dans laquelle les parties entire et dcimale sont spares par un point dcimal (.) et les
chiffres de la partie entire sont groups par trois avec interposition dune virgule, selon
lusage anglo-saxon. Exemple :
$n = 12345.67;
$a = number_format ($n); // 12,345
Avec un second argument, on peut spcifier le nombre de chiffres de la partie dcimale:
$n = 12345.67;
$a = number_format ($n, 2); // 12,345.67
On peut passer en notation franaise en ajoutant trois arguments supplmentaires, le
nombre de chiffres de la partie dcimale (usuellement deux), le sparateur dcimal (,) et
le sparateur des groupes de chiffres de la partie entire (un simple espace) :
$n = 12345.67;
$a = number_format ($n, 2, ','' , ' ''); // 12 345,67

Ce script prsente un exemple de mise en forme de nombre flottant


<?php
# Script - nombres.php
// Crer les variables
$quantit = 30;
// nombre d'objets achets : 30
$prix = 119.95;
// prix unitaire : 119.95 euros
$taux_de_taxe = .05; // taux de la taxe : 5%
// Calculer le total
$total = $quantit * $prix;
$total = $total + ($total * $taux_de_taxe); // Ajouter la taxe
$total = number_format ($total, 2, ",", " "); // Formater le rsultat
// Afficher le rsultat

29

echo 'Vous avez achet <b>', $quantit,


'</b> machin(s) d\'un cot unitaire de <b>', $prix,
' &#128;</b>.<br>',
'Avec la taxe, le total se monte : <b>', $total, ' &#128;</b>.';
?>
Remarque : = (&#128;)

5. Les constantes
Les constantes
Les constantes sont des types de donnes PHP spcifiques qui, la diffrence des
variables, conservent leur valeur initiale tout au long dun script.
Pour crer une constante, on utilise la fonction define () la place de loprateur
daffectation (=). Exemple :
define ('NOM', 'toto');
Contrairement aux variables, les identificateurs de constantes (et aussi ceux de fonction)
ne sont pas sensibles la casse.
Usuellement, les constantes scrivent en majuscules, mais ce nest pas une obligation.
Et, ce qui est plus important, leur nom ne commence pas par un caractre dollar ($)
comme cest le cas pour les variables.
Laffichage des constantes peut se faire de deux faons :
echo 'Hello, ' . NOM;
Ou
echo 'Hello, ' . NOM;
Mais on ne peut pas crire :
echo 'Hello, NOM''; (PHP afficherait tout simplement : Hello, NOM et non pas la valeur de la
constante NOM).
Il existe un certain nombre de constantes prdfinies dans PHP. Exemples :
PHP_VERSION (le numro de la version de PHP que vous utilisez) et PHP_OS (le
systme dexploitation du serveur).

Exemple : avoir des informations sur lenvironnement de PHP et du


serveur
<?php
# Listing - constantes.php
// Dfinir la date
define ('AUJOURD_HUI', '1 janvier 2004');
// Afficher le message
echo Aujourd\hui nous sommes le . AUJOURD_HUI .
'.<br />La version de PHP de ce serveur est la <b> . PHP_VERSION .
</b> et son systme d\exploitation est <b> . PHP_OS.
</b>.<br /><br />';
/* Les constantes ne peuvent pas tre affiches lintrieur de chanes de caractres
places entre apostrophes ou entre guillemets car labsence du caractre dollar initial
entranerait leur affichage sous forme de texte. On a donc utilis loprateur de
concatnation lintrieur de cette instruction */.
?>

30

B - Programmation en PHP
Au sommaire de ce partie
Comment utiliser PHP pour manipuler les valeurs transmises par les formulaires HTML?

Nous parlerons dans ce chapitre :


des instructions conditionnelles,
des oprateurs restants,
des tableaux,
et des diffrents moyens de raliser des boucles de programme.

1. Cration dun formulaire HTML


Cration dun formulaire HTML
Pour crer un formulaire HTML, on se sert de la balise <form> et des diffrents types de
balises <input>.

La balise <form> :
<form action= ''script.php'' method=''post'>
<!-- On place les diffrentes balises dentre, botes de texte, boutons radio, cases cocher
..
</form>

Lattribut action indique quelle page seront envoyes les donnes du formulaire.

Lattribut method dun formulaire commande le choix de la faon dont les lments
recueillis seront envoys la page de traitement.

Les deux valeurs possibles get et post font rfrence la mthode du protocole HTTP
(HyperText Transfer protocol) qui sera utilis pour le transfert.

Lattribut method

La mthode get envoie les donnes sous forme dune suite de couples nom/valeur
abouts lURL. Exemple :
www.mon-site.com/decode-formu.php?name=Jules&genre=M
Lavantage de cette mthode : permet dajouter la page aux signets du navigateur (de la
bookmarker ).
On peut galement cliquer sur licne page prcdente du navigateur pour revenir la
page get ou la recharger sans problme.
Ces deux facilits sont interdites si le formulaire utilise la valeur post pour lattribut
method.
On est limit dans le nombre de couples nom/valeur envoys, et la scurit est mauvaise
car ces donnes sont parfaitement visibles puisquelles figurent la suite de lURL.

Crer un formulaire HTML Exemple


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Formulaire HTML</title>
</head>
<body>

31

<!-- Listing - formu.html -->


<! On donne lattribut action la valeur qui reprsente le nom du programme PHP de
traitement des donnes : traite_formu.php
<form action="traite_formu.php" method="post">
<fieldset>
<legend>Saisissez vos donnes dans le formulaire ci-dessous :
</legend>
<p>
<b>Nom :
</b> <input type="text" name="nom" size="20" maxlength="40" />
</p>
<p>
<b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="60" />
</p>
<p>
<b>Sexe:</b>
<input type="radio" name="sexe" value="M" />
Masculin <input type="radio" name="sexe" value="F" />
Fminin
</p>
<p>
<b>Age :</b>
<select name="age">
<option value="0-30">Moins de 30 ans</option>
<option value="30-60">Entre 30 et 60 ans</option>
<option value="60+">Plus de 60 ans</option>
</select>
</p>
<p>
<b>Commentaires :
</b> <textarea name="commentaires" rows="3" cols="50"></textarea>
</p>
</fieldset>
<div align="center"><input type="submit" name="submit"
value="Envoyez les donnes">
</div>
</form><!-- Fin du formulaire -->
</body></html>
Formulaire rassemblant quelques informations saisies par lutilisateur

32

Formulaire HTML
Ce formulaire formu.html reoit 5 valeurs de quatre types diffrents : un nom (texte),
une adresse e-mail (texte galement), une indication de sexe (boutons radio) et des
commentaires (zone de texte). Le 5me lment est llment submit qui gnre le
bouton denvoi.

2. Traitement dun formulaire HTML


Traitement dun formulaire HTML
La faon dont PHP dialogue avec un formulaire HTML :

Si on a une bote dentre dans le formulaire dont la valeur de lattribut name est email,
PHP va placer le texte saisi dans la variable dont le nom est $email.
Ceci est valable quel que soit le type dentre. Dans notre exemple traite_formu.php peut
manipuler les variables $nom, $email, $sexe, $age, $commentaires et $submit.

Traitement dun formulaire HTML


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;

33

charset=iso-8859-1" />
<title>Accus de rception de formulaire</title>
</head>
<body>
<?php
# Listing - traite_formu.php
echo "Merci, <b>$nom</b>, pour les commentaires suivants :<br />
<tt>$commentaires</tt>
<p>Nous allons y rpondre votre adresse e-mail <i>$email</i></p>";
?>
</body>
</html>

On enregistre ce fichier sous le nom traite_formu.php, on le tlcharge sur notre


serveur Web dans le mme rpertoire que formu.html.
Trois des lments du formulaire HTML avaient pour nom nom, email, et commentaires
(les deux autres tant sexe et age). Pour y accder, il suffit dutiliser les variables $nom,
$email, et $commentaires.

Magic Quotes
Lorsque cette option est active, apostrophes et guillemets seront automatiquement

chapps dans les valeurs rcupres par les variables.


Il existe deux types de Magic Quotes : magic_quotes_gpc, qui sapplique aux

formulaires, URL et cookies (gpc signifie : get, post, cookie) et magic_quotes_runtime,


qui sapplique aux donnes rcupres partir de fichiers externes ou de bases de
donnes.
Si loption Magic Quotes est active sur votre serveur, vous pouvez annuler son effet en
appelant la fonction stripslashes () :
$var = stripslashes ($var);
Cette fonction supprimera tous les antislashes dchappement qui peuvent se trouver dans
$var.

La fonction stripslashes() va annihiler leffet de Magic Qutes sur


deux variables
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Accus de rception de formulaire</title>
</head>
<body>
<?php
# Listing traite_formu.php
$nom = stripslashes($nom);
$commentaires = stripslashes($commentaires);
# Ce sont les deux seules variables dans lesquelles on risque de
# trouver une apostrophe. ge et sexe ont des valeurs prdfinis.
# Pas dapostrophe dans $email.

34

echo "Merci, <b>$nom</b>, pour les commentaires suivants :<br />


<tt>$commentaires</tt>
<p>Nous allons y rpondre votre adresse e-mail <i>$email</i></p>";
echo "Vous avez indiqu comme ge : $age et comme sexe : $sexe<p>";
?>
</body>
</html>

3. Structures de contrle et oprateurs


Les structures de contrle
Dans tout langage de programmation, y compris en PHP, il existe deux types de

structures de contrle :
Instructions conditionnelles. Ces instructions excutent du code si une condition est

soit vraie, soit fausse.


Boucles conditionnelles. Ces boucles excutent un jeu dinstructions une ou plusieurs

fois jusqu ce quune condition soit value soit comme vraie, soit comme fausse.

Instructions conditionnelles
Le principe dune instruction conditionnelle est le suivant : une expression conditionnelle
est value et, si la condition est vraie ou fausse, du code est excut.
En PHP, les instructions conditionnelles les plus courantes sont :
if else elseif
switch case

Linstruction if
Syntaxe :
if (expression)
{
bloc dinstructions;
}

Linstruction if est utilise pour valuer une expression. Elle rend compte du rsultat de
cette valuation en renvoyant la valeur boolenne True ou False. Si la condition est
value comme vraie (True), le jeu dinstructions qui suit la condition if est excut. Dans
le cas contraire, le contrle est transfr aux instructions qui succdent au bloc if.

if else
Linstruction else est utilise uniquement avec linstruction if, et jamais sparment.
Syntaxe :
if (expression)
{
bloc dinstructions 1;
}
else
{
bloc dinstructions 2;
}

if elseif else

Une deuxime expression est value dans elseif si la premire est value False, la

35

partie else jouant le mme rle que prcdemment si aucune des deux conditions nest
remplie.

Syntaxe :
if (expression1)
{
bloc dinstructions 1;
}
elseif (expression2)
{
bloc dinstructions 2;
}
else
{
bloc dinstructions 3;
}

Remarques
Les accolades qui servent marquer le dbut et la fin dun bloc ne sont pas ncessaire si

le bloc ne comporte quune seule instruction.


La clause elseif peut aussi scrire else if.
On peut (et on aura souvent besoin de le faire) imbriquer des instructions conditionnelles.

Oprateurs frquemment utiliss pour crire une condition


Symbole

Signification

Type

Exemple

assigne une
valeur

affectation

$n = 1;

==

gal

comparaison

$x = = $y

!=

diffrent de

comparaison

$x != $y

<

infrieur

comparaison

$x < $y

>

suprieur

comparaison

$x > $y

<=

infrieur ou gal

comparaison

$x <= $y

>=

suprieur ou
gal

comparaison

$x >=$y

36

Les oprateurs Logiques


Oprateur

Sens

or

OU

xor

Exemple
($a or $b) vaut true si $a OU $b valent true, et false
sinon.

OU exclusif ($a xor $b) vaut true si une seule parmi $a ou $b


vaut true, et false dans tous les autres cas.

and

ET

($a and $b) vaut true si $a ET $b valent true, et false


sinon.

&&

ET

($a && $b) vaut true si $a ET $b valent true, et false


sinon.

||

OU

($a || $b) vaut true si $a OU $b valent true, et false


sinon.

NON

(!$a) vaut true si $a vaut false et rciproquement.

Utilisation des instructions conditionnelles - Exemple


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Accus de rception de formulaire</title>
</head>
<body>
<?php
# Listing - traite_formu.php
$nom = stripslashes($nom);
$commentaires = stripslashes($commentaires);
echo "Merci, <b>$nom</b>, pour les commentaires suivants :<br />
<tt>$commentaires</tt>
<p>Nous allons y rpondre votre adresse e-mail <i>$email</i></p>";
// Instructions conditionnelles
if ($sexe == "M")
{ echo "<b><p>Bonjour Monsieur</p></b>";
}
elseif ($sexe == "F")
{ echo "<b><p>Bonjour Madame</p></b>";
}
else
{ echo "<b><p>Vous avez oubli d'indiquer votre sexe</p></b>";
}
?>

37

</body>
</html>

switch
Il existe en PHP une autre instruction conditionnelle appele switch que lon peut utiliser
la place dune cascade de if elseif else.

Syntaxe :
switch ($variable)
{case "valeur_1" :
// Faire ce traitement
Break;
case "valeur_2" :
// Faire cet autre traitement
Break;
default :
// Troisime traitement
}

Fonctionnement
La valeur de $variable est compare successivement toutes les valeurs de case.

Lorsquon trouve une galit, le code qui suit est excut jusques et y compris le break,
qui a pour effet de faire sortir du switch. Si aucune galit nest trouve, cest la clause
default qui est excute. A sa suite, aucun break nest videmment ncessaire.

switch - Exemple
switch ($sexe)
{ case "M" :
echo "<b><p>Bonjour Monsieur</p></b>";
break;
case "F" :
echo "<b><p>Bonjour Madame</p></b>";
break;
default :
echo "<b><p>Vous avez oubli d'indiquer votre sexe</p></b>";
}

Validation des donnes dun formulaire


Larchitecte dune application Web se doit de tester ce quil reoit afin de dtecter toute
anomalie intervenant par inadvertance ou dans un but malintentionn.
La validation dun formulaire requiert lusage dinstructions conditionnelles et dun certain
nombre de fonctions, doprateurs et dexpressions.
La fonction isset () : teste si une variable contient bien une valeur (0 compris mais ni
NULL ni FALSE) :
if (isset ($var))
{ // $var a bien une valeur
}
else
{ // $var na aucune valeur
}

Mais isset () prsente une difficult : le test dune chane de caractre vide revoie TRUE.
Pour liminer ce cas, il faut faire usage de la fonction strlen (), qui renvoie la longueur

38

de la chane passe en argument :


if (strlen ($var) > 0)
{ // $var a bien une valeur
}
else
{ // $var na aucune valeur
}

Valider un formulaire Exemple

La nouvelle version du script traite_formu.php.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Accus de rception de formulaire</title>
</head>
<body>
<?php
# Listing traite_formu.php
// Vrifier $nom et la dbarrasser de tout antislash possible
if (strlen($nom) > 0)
{ $nom = stripslashes($nom);
}
else
{ // Si aucun nom n'a t saisi
$nom = NULL;
echo "<b><p>Vous avez oubli de saisir votre nom</p></b>";
}
// Vrifier $commentaires et la dbarrasser de tout antislash possible
if (strlen($commentaires) > 0)
{ $commentaires = stripslashes($commentaires);
}
else
{ // Si aucun nom n'a t saisi
$nom = NULL;
echo "<b><p>Vous avez oubli de saisir un commentaire</p></b>";
}
// Vrifier $email
if (! strlen($email) > 0)
{ $email = NULL;
echo "<b><p>Vous avez oubli de saisir votre adresse e-mail</p></b>";
}
// Vrifier $sexe
if (isset($sexe))
{ if ($sexe == "M")

39

{ $message = "<b><p>Bonjour Monsieur</p></b>";


}
elseif ($sexe == "F")
{ $message = "<b><p>Bonjour Madame</p></b>";
}
}
else // aucune des deux cases n'a t coche
{ $sexe = NULL;
echo "<b><p>Vous avez oubli d'indiquer votre sexe</p></b>";
}
// Si toutes les informations ont bien t saisies, afficher les messages
if ($nom && $commentaires && $email && $sexe)
{ echo "Merci, <b>$nom</b>, pour les commentaires suivants :<br />
<tt>$commentaires</tt>
<p>Nous allons y rpondre votre adresse e-mail <i>$email</i></p>";
echo $message;
}
?>
</body>
</html>

4. Envoi manuel des donnes un script


Envoi manuel des donnes un script
Dans lexemple prcdent : les donnes reus par traite_formu.php provenaient de ce qui
avait t saisi par un utilisateur dans un formulaire.
Il y a deux autres faons de procder pour cet envoi :
Utiliser une balise HTML <input> dont lattribut type vaut hidden :
<input type="hidden" name="nom" value="Arthur" />
La variable $nom aura la valeur Arthur.

Abouter lURL la valeur quon veut faire traiter par le script qui est appel :
www.mon-site.com/page.php?nom=Arthur
Technique qui mule la mthode get dun formulaire HTML.

Envoi manuel des donnes un script


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/$1$
xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Calculateur de cot</title>
</head>
<body>
<!-- Listing - calculateur.html -->

40

<form action="traite_calculateur.php?source=calculateur.html" method="post">


<select name="quantite">
<option value="">choisissez une quantit :</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
<div align="left">
<input type="submit" name="submit" value="Total !" />
</div>
<input type="hidden" name="prix" value="19.95" />
<input type="hidden" name="taxe" value=".05" />
</form><!-- Fin du Formulaire -->
</body>
</html>

Envoi manuel des donnes un script

41

Envoi manuel des donnes un script


Deux nouveauts :
Le prix et la quantit sont conservs dans des champs cachs.
La valeur de lattribut action se termine par ?source=calculateur.html la suite de

traite_calculateur.php. La page qui va traiter le formulaire recevra une variable $source


lui indiquant la provenance de lappel.

Traiter le formulaire du calculateur : traite_calculateur.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/$1$
xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Calculateur de cot</title>
</head>
<body>
<?php
# Listing - traite_calculateur.php
// Il faut vrifier que la provenance est correcte
if (isset($source)) // Ce premier if vrifie que $source contient bien une valeur
{ if ($source == 'calculateur.html')
{ // Est-ce que a vient de la bonne page ?
if (is_numeric($quantite))// Est-ce que "quantite" est un nombre ?
{ // Si oui, faire les calcul est afficher les rsultats
$total = ($quantite * $prix) * ($taxe + 1);
$total = number_format ($total, 2, ",", " ");
echo "Vous achetez <b>$quantite</b> machin(s) d'un cot unitaire de <b>$prix
&#128;.</b><br>";
echo "Le montant TTC de votre achat s'lve <b>$total</b>&#128;.\n";
}
else
{ // La quantit n'est pas un nombre
echo '<p><b>Saisissez une quantit correcte, svp</b></p>';
}
}
else // La provenance n'est pas la bonne
{ echo '<p><b>Vous avez illgalement accd cette page</b></p>';
}
}
else // La provenance n'est pas dfinie
{ echo '<p><b>Vous avez illgalement accd cette page</b></p>';
}
?>
</body>
</html>

42

Remarque
Les lments cachs dun formulaire ne sont pas affichs dans la fentre du navigateur

mais sont nanmoins prsents dans le source. Il ne faut jamais les utiliser pour conserver
des lments confidentiels.

5. Les tableaux
Les tableaux
Les chanes de caractres et les nombres sont des variables scalaires, c..d. qui nont

quune seule valeur.


Un tableau peut contenir plusieurs informations spares.
Les tableaux sont structurs sous la forme de couples cl/valeur. A chaque lment du

tableau est associ une cl (parfois appele index).


PHP reconnat deux types de tableaux :
Tableaux indexs (dont la cl est numrique).
Les tableaux associatifs (dont la cl est une chane de caractres).
Avec la premire catgorie, le numro du premier lment est 0, sauf si on prcise une
autre valeur.
Cl

Valeur

Bruel

Piaf

Martin

Souchon

Le tableau $artistes a des cls numrique.


Cl

Valeur

France

BE

Belgique

CDN

Canada

MA

Maroc

Le tableau $pays a des cls reprsentes par des chanes de caractres.

Tableaux superglobaux
Il existe une notation permettant de reprer plusieurs types de tableaux par dfaut dfinis

laide des variables superglobales : $_GET, $_POST, $_SESSION, $_COOKIE, etc.

43

Cette notion est apparue dans la version 4.1 de PHP.


La variable $_GET reprsente lendroit o sont conserves toutes les variables et valeurs

envoyes au moyen dun attribut method=get (venant dun formulaire par exemple).
La variable $_POST reprsente lendroit o sont conserves toutes les variables et

valeurs envoyes au moyen dun attribut method=post.


Ainsi, pour le script traite_calculateur.php, les variables $quantite et

$_POST['quantite'] reprsentent la mme valeur.


Dans tout le reste de ce cours, je continuerai utiliser les tableaux superglobaux

(scurit amliore, visibilit globale).


Si on prfre simplifier lcriture des scripts et que loption register_globals soit active

sur notre serveur, on peut choisir dcrire, par exemple, $nom au lieu de
$_POST['nom'].

Les tableaux
Un tableau obit aux mmes rgles dappellation que nimporte quelle autre variable.
Hors de son contexte, on ne peut pas savoir si $var dsigne un scalaire ou un tableau.
La seule diffrence quil y a rside dans la faon de reprer un lment particulier lorsquil

sagit dun tableau.


Pour adresser un lment du tableau : faire suivre son nom de sa cl place en crochets:
echo $artistes[2]; // Martin
echo $pays['CDN']; // Canada
Laffichage dlments de tableaux est un peu plus dlicat que celui des variables
scalaires. Par exemple, linstruction suivante provoquera une erreur :
ech "BE est le code des voitures immatricules en $pays[BE']";
Il faut placer le nom du tableau indic entre accolades :
ech "BE est le code des voitures immatricules en {$pays[BE']}";

Le script traite_calculateur.php
Rcrire le script traite_calculateur.php en utilisant les tableaux superglobaux :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD$1$
/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Calculateur de cot</title>
</head>
<body>
<?php
# Listing - traite_calculateur-1.php
// Etant donn que la variable $source a t aboute lURL,
// cest le tableau $_GET qui va permettre dy accder.
if (isset($_GET['source']))
{ if ($_GET['source'] == 'calculateur.html')
{
if (is_numeric($_POST['quantite']))
{
$total = ($_POST['quantite'] * $_POST['prix'])*($_POST['taxe']+1);

44

$total = number_format ($total, 2, ",", " ");


echo "Vous achetez <b>{$_POST['quantite']}</b> machin(s) d'un cot unitaire de
<b>{$_POST['prix']} &#128;.</b><br>";
echo "Le montant TTC de votre achat s'lve <b>$total</b> &#128;.\n";
} else
# (La suite du srcipt)
#
?>
</body>
</html>

Remarques concernant ce script


A la place de $quantie, $prix et $taxe, on utilise maintenant $_POST['quantite'] ,

$_POST['prix'], et $_POST['taxe'] puisque ces variables sont transmises par le


formulaire au moyen de lattribut method=POST. La variable $total reste inchange
puisque cest un scalaire.
Pour une instruction echo () ou print (), il faut placer les lments entre accolades :
{$_POST['quantite']}

Remarques
Un tableau peut utiliser une association de nombres et de chanes de caractres en guise

de cls. La seule exigence est que toutes les cls dun mme tableau soient uniques.
Pour une version plus ancienne que la 4.1 de PHP, on doit utiliser $HTTP_POST_VARS

au lieu de $_POST et $HTTP_GET_VARS au lieu de $_GET.

Crer des tableaux


Dans lexemple prcdent, on a utilis un tableau gnr par PHP mais, la plupart du
temps, nous crerons nous-mme nos tableaux.

Deux faons :
1) Placer des lments en par un :
$tableau[] = "une valeur";
$tableau[] = "une autre valeur";
$tableau['alpha'] = "encore une valeur";
2) Faire usage de la construction array () pour crer un tableau en une seule tape:
$tableau = array ('non'=>'Toto', 'profession'=>'boulanger');

Si les cls sont numriques, on peut les omettre :


$tableau = array ('Toto', 'boulanger');

On peut modifier lorigine des cls numriques (0, par dfaut) de cette faon :
$jours = array (3=>'mardi', 'mercredi', 'jeudi');
echo $jours[5]; // jeudi

Crer un tableau contenant une suite dentiers : utiliser la fonction range () :


$dix = range (1, 10);

Accder aux tableaux


Lorsquon sait exactement quel lment dun tableau on veut accder, il suffit dcrire
par exemple $_POST['prix'].
Pour accder en squence chacun des lments dun tableau, on utilise une boucle
foreach (pour chacun) :
foreach ($tableau as $valeur)
{ // faire quelque chose
}

45

La boucle foreach va nous permettre de parcourir tout le tableau en accdant


successivement chacun de ses lments. Cet lment sera plac dans la variable
scalaire $valeur.
On peut aussi accder aux cls en crivant :
foreach ($tableau as $cl=>$valeur)
{ echo "Llment dont la cl est $cl vaut $valeur<br>";
}

Crer dynamiquement des menus droulants


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/$1$
xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Calendrier</title>
</head>
<body>
<?php
# Listing - calendrier.php
// Ce script cre trois menus droulants pour les mois,
// jour et annes
// Cration du tableau des mois
$mois = array (1 => 'janvier', 'fvrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'aot',
'septembre', 'octobre', 'novembre', 'dcembre');
// Les cls du tableaux $mois sont les valeurs numriques 1 12.
// On a prcis 1 pour le premier indice, les indices suivants croissent
// en squence.
// Cration des tableaux des jours et des annes
$jours = range (1, 31);
$annes = range (2003, 2010);
// Cration du formulaire et des menus droulants
echo '<form action="calendrier.php" method="post">';
// Comme ce formulaire ne fera rien de particulier, son attribut
// action pointe sur lui-mme.
// Gnrons le menu droulant des mois
echo '<select name="mois">';
foreach ($mois as $cl => $valeur)
{ echo "<option value=\"$cl\">$valeur</option>\n";
}
echo '</select>';
// Boucle foreach : A chaque tour, on cre une nouvelle ligne de code
// du genre : <option value="1">janvier<option>.
// Gnrons le menu droulant des jours

46

echo '<select name="jours">';


foreach ($jours as $valeur)
{ echo "<option value=\"$valeur\">$valeur</option>\n";
}
echo '</select>';
// Les cls sont numriques, il est inutile de spcifier des cls
// particulires.
// Gnrons le menu droulant des annes
echo '<select name="an">';
$an = 2003;
foreach ($annes as $an)
{ echo "<option value=\"$an\">$an</option>\n";
$an++;
}
echo '</select>
</form>';
// Les cls sont numriques, il est inutile de spcifier des cls particulires.
?>
</body>
</html>

calendrier.php

Ces trois menus droulants ont t crs avec des tableaux et une boucle foreach.

47

Remarques
Pour connatre le nombre dlments que contient un tableau, il existe la fonction sizeof
() et la fonction count () qui sont des synonymes :
$n = count ($tableau);
Depuis la version 4.1 de PHP, la fonction range () peut galement crer un tableau
squentiel de lettres :
$alphabet = range (a, z);
La fonction is_array () permet de vrifier quune variable est bien de type tableau.
Les noms qui interviennent dans la boucle foreach peuvent tre quelconques. Les
amricains prfrent $key et $value. Dans la version franaise, nous avons choisi $cl et
$valeur, mais on aurait aussi bien pu (au dtriment de la lisibilit du script) les appeler
$minet et $casimir.

Tableaux plusieurs dimensions


Les tableaux peuvent tre composs eux-mmes de tableaux. Cest de cette faon quon
peut crer des tableaux plusieurs dimensions.
$artistes = array ("Bruel", "Piaf", "Martin", " Souchon ");
$vedettes = array ("Gabbin", "Monroe", "Andrews",.);
Association des deux tableaux :
$stars = array ("artistes" =>$artistes, "vedettes" =>$vedettes);

$stars est un tableau deux dimensions. Pour accder au tableau $artistes, on crirait
$stars['artistes'] et, pour accder Monroe, on crirait $stars["vedettes"][1].

Rgle : crire le nom du tableau deux dimensions suivi par la cl du premier tableau
entre crochets suivi par la cl du second, galement place entre crochets.

Pour afficher de telles valeurs : les encadrer par des accolades:


echo "La deuxime vedette sappelle {$stars['vedettes'][1]}";

Utilisation des tableaux plusieurs dimensions : qqch.html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/$1$
xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title>Dites-nous quelque chose de votre personnalit</title>
</head>
<body>
<!-- Listing - qqch.html -->
<!-- Dbut du formulaire -->
<form action="traite_qqch.php" method="post">
<fieldset>
<legend>Renseignez les lments ci-dessous :</legend>
<p>
<b>Nom :</b> <input type="text" name="nom" size="20" maxlength="40" />
</p>
<-- Srie de cases cocher -->

48

<p><b>Interts :</b>
<input type="checkbox"
<input type="checkbox"
<input type="checkbox"
<input type="checkbox"
<input type="checkbox"
</p>

name="interet[]"
name="interet[]"
name="interet[]"
name="interet[]"
name="interet[]"

value="Musique" /> Musique


value="Cinma" /> Cinma
value="Lecture" /> Lecture
value="Ski" /> Ski
value="Bricolage" /> Bricolage

<!-- Possibilit de choisir une ou plusieurs activits. -->


<!-- Il existe deux faons de nommer les diffrentes entres : soit leur donner un nom qui
correspond leur valeur (Musique, Cinma, par exp.), soit utiliser un tableau. Ici on a
opt pour cette solution avec le tableau interet[]. -->
<!-- Dans le script PHP de traitement, ce tableau sappellera $interet et contiendra toutes
les cases coches par lutilisateur. -->
<! Compltons la page. -->
</fieldset>
<p>
<div align="center"><input type="submit" name="submit"
value="Envoyez !" /></div>
</form><!-- Fin du formulaire -->
</body>
</html>

qqch.html

49

Traitement du formulaire : traite_qqch.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Dpouillement d'un formulaire</title>
</head>
<body>
<?php
# Listing - traite_qqch.php
// Vrifier $_POST['nom'] et supprimer d'ventuels antislashes
if (strlen($_POST['nom']) > 0)
{ $nom = stripslashes($_POST['nom']);
}
else
{ // Si aucun nom n'a t saisi
$nom = NULL;
echo '<p><b>Vous avez oubli d\'indiquer votre nom</b></p>';
}
// Vrifier $interet[]
if (isset($_POST['interet']))
{ $ints = NULL;
foreach ($_POST['interet'] as $cl=>$valeur)
{ $ints .= "$valeur, ";
}
$ints = substr($ints, 0, -2); // Supprimer les caractres superflus
$interet = TRUE;
}
/* La premire partie du code vrifie que la variable a une valeur.
Si cest la cas, une boucle va crer un message ($ints) qui contiendra tous les intrts qui
ont t slectionns.
Pour construire ce message, on commence par linitialiser NULL. Puis, lintrieur de la
boucle, on concatne la valeur suivante au message sans oublier une virgule et un
espace. Chacune des valeurs correspondra une des cases coches par lutilisateur.
Comme de cette faon, le message se terminerait par deux caractres superflus (une
virgule suivie dun espace), on les supprime la fin en appelant la fonction substr ().*/

Remarque concernant : substr($ints, 0, -2);


$ints = substr($ints, 0, -2);
// Supprimer les caractres superflus
<?php
$rest = substr("abcdef", 0, -1); // retourne "abcde"
$rest = substr("abcdef", 2, -1); // retourne "cde"
?>

Traitement du formulaire : traite_qqch.php (suite)


else
{ $interet = NULL;

50

echo '<p><b>Vous n\'avez indiqu aucun intrt</b></p>';


}
// Si tout est correct, afficher le message
if ($nom && $interet)
{ echo "Merci, <b>{$_POST['nom']}</b>. Ce qui vous intresse :<br
/><tt>$ints</tt></p>";
}
?>
</body>
</html>

Traitement du formulaire : traite_qqch.php

Un utilisateur qui a correctement renseign le formulaire.

51

Traitement du formulaire : traite_qqch.php

En cas doubli(s), lutilisateur recevra un ou deux messages derreur.

Boucles for et while


Boucles :
foreach : utilise pour grer des tableaux.
while : syntaxe :
while (condition)
{// Faire quelque chose
}
Tant que condition est satisfaite, la boucle est excute.
Lorsque la condition nest plus vrifie, on sort de la boucle.
Si la condition nest jamais vrifie, la boucle nest jamais excute.
Si la condition est toujours vrifie, il en rsulte un mouvement perptuel.

52

Syntaxe de la boucle for :

for (expression initiale; condition; expression de fermeture)


{// Faire quelque chose
}
Lors de la premire excution de la boucle, expression initiale est excute. Puis
condition est teste et, si elle est vrifie, la boucle est excute. A la fin de ce passage,
expression de fermeture est excute et condition est nouveau teste. Ce
processus continue jusqu ce que condition ne soit plus vrifie.

Exemple :
for ($i=1; $i<=10; $i++)
{echo "$i<br>";
}

53

2me partie : cration de sites Web


dynamiques
Au sommaire de cette partie

Utilisation de fichiers externes


Crer et appeler des fonctions personnalises
Visibilit des variables
Traitement des formulaires HTML avec redux
En-ttes HTTP
Formulaires mmoire

1. Utilisation de fichiers externes


Utilisation de fichiers externes
4 fonctions pour linclusion de fichiers dans une page : include(), include_once, require(),

require_once :
include_once ("monfichier.php");
require ("/chemin/vers/monfichier.php");
include() et require() produisent le mme rsultat lorsquelles sont correctement
employes, mais donnent lieu des erreurs dans le cas contraire.
Si un appel include() ne produit pas le rsultat escompt (le fichier ne peut pas tre
inclus, quelle quen soit la raison), un avertissement sera affich dans la fentre du
navigateur, mais le script continuera tourner.
Dans le cas de require(), un message derreur sera affich et le script sarrtera.
Si, gnralement par suite dune erreur, on avait voulu inclure deux fois de suite le mme
fichier, lopration ne serait effectue que la premire fois sans qu'un message derreur
soit affich. Exemple :
include_once ("monfichier.php");

Utilisation de fichiers externes. Exemple. Fichier den-tte


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/$1$
xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title><?php echo $titre_page; ?></title>
</head>
<body bgcolor="#FFFFFF">
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tr>
<td width="100%" bgcolor="#666666">
<font color="#CCCCCC"><big><b>Bienvenue sur mon site</b></big>
</font><
</td>

54

</tr>
<tr>
<td bgcolor="#CCCCCC">
<table width="100%" border="0" cellspacing="1" cellpadding="2">
<tr>
<td align="center"><a href="index.php">Accueil</a></td>
<td align="center"><a href="menuder.php">Menus droulants</a></td>
<td align="center"><a href="calculateur.php">Calculateur</a></td>
<td align="center"><a href="enreg.php">Enregistrement</a></td>
</tr>
</table></td>
</tr>
</table>
<br />
<!-- Listing entete.inc -->
<!-- Le contenu spcifique d'une page commence ici -->

Fichier de pied de page


<!-- Listing pied_page.inc -->
<br />
<table width="100%" border="0" cellspacing="0"
cellpadding="2" bgcolor="#CCCCCC">
<tr>
<td>
<div align="center">
&copy; 2005 Progweb.php, Inc.
</div>
</td>
</tr>
</table>
</body>
</html>

Ralisation dune page Web avec inclusion de 2 fichiers externes


<?php # Listing - index.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Bienvenue';
include ('./entete.inc');
?>
<table width="90%" border="0" cellspacing="2" cellpadding="4" align="center">
<tr bgcolor="#333333">
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="4">
<tr>
<td bgcolor="#FFFFFF">&nbsp;!&nbsp;</td>
<td width="100%">
<font color="#CCCCCC"><b>Titre du contenu</b></font>
</td>
</tr>

55

</table></td>
</tr>
</table>
<table width="90%" border="0" cellspacing="4" cellpadding="4" align="center">
<tr>
<td width="70%" valign="top"> <p><b>Content....</b></p>
<hr />
<p>Bla bla bla... et le reste...</p>
</td>
</tr>
</table>
<?php
include ('./pied_page.inc'); // Inclure le fichier du pied de page
?>

http://localhost/scripts_du_cours/chapitre3/index.php

Remarques
Il est prfrable dinclure les fichiers importants (comme ceux qui permettent la

connexion une base de donnes) avec require() et de rserver include() linclusion des
fichiers qui ne concernent que lapparence ou la mise en page.

56

On peut supprimer laffichage du message derreur rsultant dun include() manqu en

prfixant le nom de la fonction par une arrobase :


@include ('mon_fichier.inc');

2. Cration et appel de fonctions


Fonctions
Crations de fonctions, la syntaxe :

function ma_fonction (liste darguments)


{// code de la fonction
}
Le nom de la fonction obit aux mmes rgles que les noms de variables mais,
contrairement ceux-ci, il est insensible la casse.

Exemple : menuder.php
<?php
# Listing - menuder.php
// Crer le titre et inclure un fichier d'en-tte
$titre_page = 'Formulaire pour calendrier';
require ('./entete.inc');
// Tableau associatif des jours
$jours = array('Mon'=>'lundi', 'Tue'=>'mardi', 'Wen'=>'mercredi',
'Thu'=>'jeudi', 'Fri'=>'vendredi', 'Sat'=>'samedi',
'Sun'=>'dimanche');
// Cette fonction cre trois menus droulants : mois, jours et annes
function menu_der()
{ // Tableau index des mois
$mois = array (1 => 'janvier', 'fvrier', 'mars', 'avril', 'mai',
'juin', 'juillet', 'aot', 'septembre', 'octobre', 'novembre',
'dcembre');
// Cration des menus droulants
echo "<select name='jour'>";
for ($jour = 1; $jour <= 31; $jour++)
{ echo "<option value=\"$jour\">$jour</option>\n";
}
echo "</select>\n";
echo "<select name='mois'>";
foreach ($mois as $cl => $valeur)
{ echo "<option value=\"$cl\">$valeur</option>\n";
}
echo "</select>\n";
echo "<select name='anne'>";
$anne = 2003;
while ($anne <= 2010)
{ echo "<option value=\"$anne\">$anne</option>\n";
$anne++;
}

57

echo "</select>\n";
} // Fin de la fonction menu_der().
echo '<form action="menuder.php" method="post">'; // Crer le formulaire
menu_der ();
echo '</form>'; // Fin du formulaire
echo '<p>Nous sommes ', $jours[date ('D')], ' et il est ', date ('H \h i'), '.</p>';
include ('./pied_page.inc'); // Inclure le pied de page
?>

http://localhost/scripts_du_cours/chapitre3/menuder.php

Fonctions recevant des arguments


Les fonctions personnelles cres en PHP peuvent recevoir des arguments en nombre
quelconque. Ils doivent tre crits sous forme de variables :
function ma_fonction ($arg1, $arg2)
{// code de la fonction
}
Les noms de variables crits dans la dfinition de la fonction sont des noms fictifs qui

58

seront remplacs, lors de lappel, par de vritables valeurs. Appel de la fonction :


ma_fonction ('Joseph', 'Dupont');
ou
ma_fonction ('Emile', $nom_propre);
Comme pour les fonctions natives proposes par PHP, faire figurer un nombre
darguments insuffisant dans lappel de la fonction conduira laffichage dun message
derreur.
Les noms fictifs darguments qui se trouvent dans la liste de dfinition nont rien voir
avec dventuels homonymes prsents dans le reste du document. (Voir la section :
Visibilit des variables).

Rcriture du script calculateur.php


<?php # Listing - calculateur.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$page_title = 'Calculateur';
include ('./entete.inc');
?>
<form action="traite_calculateur.php" method="post">
<select name="quantite">
<option value="">Choisissez une quantit :</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
<div align="left">
<input type="submit" name="submit" value="Total" />
</div>
<input type="hidden" name="prix" value="19.95" />
<input type="hidden" name="taxe" value=".05" />
</form><!-- Fin du formulaire -->
<?php
include ('./pied_page.inc'); // Inclure le fichier de pied de page
?>

http://localhost/scripts_du_cours/chapitre3/calculateur.php

59

traite_calculateur.php
<?php # Listing - traite_calculateur.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Calculateur';
include ('./entete.inc');
/* --------------------------Cette fonction calcule un prix total d'aprs une quantit, un prix unitaire et un taux de
taxe puis affiche le rsultat.
*/
function calcul_total ($quantite, $prix, $taxe)
{ $total = ($quantite * $prix) * ($taxe + 1);
$total = number_format ($total, 2, ",", " ");
echo "Vous achetez <b>$quantite</b> machin(s) d'un cot unitaire ",
"de <b>$prix &#128;.</b><br>";
echo "Le montant TTC de votre achat s'lve <b>$total</b> &#128;.\n";
}
/*---------------------------------------------------------*/
// Vrification
if (is_numeric($_POST['quantite'])) // la quantit est-elle un nombre ?
{ calcul_total ($_POST['quantite'], $_POST['prix'], $_POST['taxe']);

60

}
else
{ // La quantit n'est pas un nombre
echo '<p><b>La quantit indique n\'est pas un nombre</b></p>';
}
include ('./pied_page.inc'); // Inclure le pied de page
?>

http://localhost/scripts_du_cours/chapitre3/traite_calculateur.php

Dfinir des arguments par dfaut


Lorsquon cre des fonctions acceptant des arguments, on peut dfinir des valeurs par
dfaut pour ces arguments. Exemple :
function ma_fonction ($arg1, $arg2='Ernest');
Lors de lappel de cette fonction, si on lui passe rellement tous les arguments quelle
demande, le ou les arguments par dfaut seront ignors. Sil manque un ou plusieurs
arguments et que des variables par dfaut aient t prvues, ce sont celles-l qui seront
prises.
Les arguments par dfaut doivent figurer en queue dans la liste de dfinition. Les
arguments obligatoires doivent toujours figurer en tte.
ma_fonction ($var1, $var2);

61

ma_fonction ('Thomas');
ma_fonction ('Jean', 'Racine');

Dfinir des arguments par dfaut: traite_calculateur-1.php


<?php # Listing - traite_calculateur-1.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Calculateur';
include ('./entete.inc');
/* ------- Cette fonction calcule un prix total d'aprs une quantit, un prix unitaire et un taux
de taxe puis affiche le rsultat.
*/
function calcul_total ($quantite, $prix=19.95, $taxe=.05)
{ $total = ($quantite * $prix) * ($taxe + 1);
$total = number_format ($total, 2, ",", " ");
echo "Vous achetez <b>$quantite</b> machin(s) d'un cot unitaire ",
"de <b>$prix &#128;.</b><br>";
echo "Le montant TTC de votre achat s'lve <b>$total</b> &#128;.<br>";
}
/*---------------------------------------------------------*/
// Vrification
if (is_numeric($_POST['quantite'])) // la quantit est-elle un nombre ?
{ calcul_total ($_POST['quantite']);
calcul_total ($_POST['quantite'], 29.99, 0.0875);
}
else
{ // La quantit n'est pas un nombre
echo '<p><b>La quantit indique n\'est pas un nombre</b></p>';
}
include ('./pied_page.inc'); // Inclure le pied de page
?>

Dans le fichier calculateur.php,il faut modifier la balise qui cre le formulaire : <form
action="traite_calculateur-1.php" method="post">

http://localhost/scripts_du_cours/chapitre3/traite_calculateur-1.php

62

Fonction renvoyant un rsultat


Pour quune fonction renvoie un rsultat, on doit utiliser linstruction return :
function ma_fonction ($arg1, $arg2='toto')
{ // code de la fonction
return $ma_varleur;
}
Le rsultat peut tre une constante ou une variable (numrique ou chane de caractres).
Pour lexploiter, il suffit de la ranger dans une variable :
$var = ma_fonction ($arg1, $arg2='toto');

Fonction renvoyant un rsultat traite_calculateur-2.php


<?php # Listing - traite_calculateur-2.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Calculateur';
include ('./entete.inc');
/* ------- Cette fonction calcule un prix total d'aprs
une quantit, un prix unitaire et un taux de taxe.
*/
function calcul_total ($quantite, $prix=19.95, $taxe=.05)
{ $total = ($quantite * $prix) * ($taxe + 1);
return number_format ($total, 2, ",", " ");

63

}
/* Lexcution de cette fonction naffiche plus rien, elle renvoie seulement le prix total sous
forme dune valeur numrique */
/*---------------------------------------------------------*/
// Vrification
if (is_numeric($_POST['quantite'])) // la quantit est-elle un nombre ?
{ $total = calcul_total ($_POST['quantite']);
echo "Le montant TTC de votre achat s'lve <b>$total</b> &#128;.<br>";
}
else
{ // La quantit n'est pas un nombre
echo '<p><b>La quantit indique n\'est pas un nombre</b></p>';
}
include ('./pied_page.inc'); // Inclure le pied de page
?>

Dans le fichier calculateur.php,il faut modifier la balise qui cre le formulaire : <form
action="traite_calculateur-2.php" method="post">

http://localhost/scripts_du_cours/chapitre3/traite_calculateur-2.php

Remarques
Une fonction peut contenir plusieurs instructions return, par exemple dans une instruction

64

switch ou dans un bloc dinstructions conditionnelles :


function ma_fonction ()
{ if (condition)
{ return $var1;
}
else
{ return $var2;
}
}
Depuis la version 4 de PHP, les dfinitions de fonctions peuvent tre situes nimporte o
dans un script PHP.
Pour amliorer la lisibilit du code, donc faciliter sa maintenance, il est recommand de
placer les dfinitions des fonctions utilisateur en tte du script, voire de les dfinir dans
un fichier externe qui sera inclus dans le script (par include() ou require()).

3. Visibilit des variables


Visibilit des variables
Chaque variable dun script est visible dans un certain domaine : il est possible daccder

sa valeur, cest--dire de la lire ou de la modifier.


Si dans la configuration de PHP loption register_globals est active, les valeurs dun

formulaire seront visibles dans toute la page.


Les fichiers externes insrs dans la page par un include() ou un require() sont considrs

comme faisant partie de la page; cest galement vrai pour les variables qui sy trouvent
dfinies.
Les variables dfinies dans une fonction utilisateur ne sont visibles qu lintrieur de cette
fonction.
Sauf prcaution particulire, depuis lintrieur de cette fonction on ne "voit" pas les
variables dfinies dans le reste du script ou dans les autres fonctions utilisateur.
Une variable dfinie dans une fonction utilisateur peut donc avoir le mme nom quune
variable dfinie dans le reste du script sans quil y ait risque de confusion (cas de la
variable $total dans le listing prcdent traite_calculateur-2.php).
Linstruction global permet de modifier la visibilit dune variable dans une fonction
utilisateur :
function ma_fonction ()
{ global $ma_var;
}

$ma_var=12345;
Dans cet exemple, la variable $ma_var a la mme valeur lintrieur et lextrieur de la
fonction ma_fonction(). Si cette fonction modifie sa valeur, cette nouvelle valeur sera
accessible dans tout le script.
Il existe une autre possibilit de modifier la visibilit dune variable, cest de faire appel
aux superglobaux $_GET, $_POST, $_SESSION, etc. Puisquelles sont "superglobales",
ces variables sont accessibles de partout dans le script.

65

Utiliser des variables globales


<?php # Listing - traite_calculateur-3.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Calculateur';
include ('./entete.inc');
/* ------- Cette fonction calcule un prix total d'aprs une quantit, un prix unitaire et un taux
de taxe puis affiche le rsultat. */
function calcul_total ()
{ global $total;
$total = ($_POST['quantite'] * $_POST['prix']) * ($_POST['taxe'] + 1);
$total = number_format ($total, 2, ",", " ");
}
/*Comme on accde aux variables par le moyen des superglobaux, il nes plus ncessaire de
les faire figurer dans la liste des arguments. De la mme faon, linstruction return
devient inutile puisquon modifie directement la valeur de $total. Pour la mme raison,
linstruction dappel de la fonction se simplifie en
calcul_total ();
---------------------------------------------------------*/
// Vrification
if (is_numeric($_POST['quantite'])) // la quantit est-elle un nombre ?
{ calcul_total ();
echo "Vous achetez <b>$quantite</b> machin(s) d'un cot unitaire ",
"de <b>$prix &#128;.</b><br>";
echo "Le montant TTC de votre achat s'lve <b>$total</b> &#128;.<br>";
}
else
{ // La quantit n'est pas un nombre
echo '<p><b>La quantit indique n\'est pas un nombre</b></p>';
}
include ('./pied_page.inc'); // Inclure le pied de page
?>

Dans le fichier calculateur.php,il faut modifier la balise qui cre le formulaire : <form
action="traite_calculateur-3.php" method="post">
http://localhost/scripts_du_cours/chapitre3/traite_calculateur-3.php

Remarques
Depuis la version 3 de PHP, on peut aussi utiliser la tableau $GLOBALS, qui renferme

toutes les variables dfinies dans le script.


Depuis la version 4.1 de PHP, il existe un autre superglobal, $_REQUEST, qui contient

toutes les variables et toutes les valeurs transmises au moyen des mthodes get ou post
ou des cookies.

4. Traitement des formulaires HTML avec redux


Traitement des formulaires
On utilis deux scripts spars pour traiter un formulaire HTML : le premier pour afficher

66

le formulaire et le second pour traiter les valeurs qui ont t transmises par ce formulaire
(cette mthode fonctionne parfaitement).
Il peut savrer commode de regrouper ces deux scripts en un seul. Une instruction
conditionnelle permet dy parvenir :
if (isset($_POST['submit']))
{ // Traiter le formulaire
}
else
{ // Afficher le formulaire
}
Si on veut que le script raffiche le formulaire aprs en avoir affich les rsultats, on peut
crire :
if (isset($_POST['submit']))
{ // Traiter le formulaire
}
// Afficher le formulaire

Formulaire denregistrement
<?php # Listing - enregistrer.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = 'Enregistrement';
include ('./entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire. Si le formulaire a dj t envoy, il faut vrifier son contenu
// Vrifier la prsence d'un nom
if (strlen($_POST['nom']) > 0)
{ $nom = TRUE;
}
else
{ $nom = FALSE;
echo '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
// Vrifier l'existence d'une adresse e-mail
if (strlen($_POST['email']) > 0)
{ $email = TRUE;
}
else
{ $email = FALSE;
echo "<p>Vous avez oubli d'indiquer votre adresse e-mail</p>";
}
// Vrifier la prsence d'un nom d'utilisateur
if (strlen($_POST['nom_d_utilisateur']) > 0)
{ $nom_d_utilisateur = TRUE;
}
else
{ $nom_d_utilisateur = FALSE;
echo "<p>Vous avez oubli d'indiquer votre nom d'utilisateur</p>";

67

}
// Vrifier l'existence et l'exactitude du mot de passe
if (strlen($_POST['mot_de_passe1']) > 0)
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mot_de_passe = TRUE;
}
else
{ $mot_de_passe = FALSE;
echo '<p>Votre mot de passe est diffrent de celui que vous avez prcdemment
dclar</p>';
}
} else
{ $mot_de_passe = FALSE;
echo "<p>Vous avez oubli d'indiquer votre mot de passe</p>";
}
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct
// Enregistrer l'utilisateur
echo "<p>Vous tes maintenant enregistr</p>";
}
else
{ // Quelque chose n'est pas correct
echo "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
} else
{ // Afficher le formulaire
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Nom :</b>
<input type="text" name="nom"
size="20" maxlength="40" />
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email"
size="40" maxlength="60" />
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_d_utilisateur"
size="20" maxlength="40" />
</p>
<p><b>Mot de passe :</b>

68

<input type="password" name="mot_de_passe1"


size="20" maxlength="40" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2"
size="20" maxlength="40" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit"
value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
} // Fin de l'instruction conditionnelle principale
include ('./pied_page.inc'); // Inclure le pied de page
?>

Remarques

Pour que lors du submit le formulaire se rappelle lui-mme, on utilis la notation


$_SERVER['PHP_SELF']. Cette variable contient le nom du script dans lequel elle apparat.
On peut savoir si un formulaire a t "soumis" en testant la valeur de la variable
$_SERVER['REQUEST_METHOD']. Si elle vaut post ou get , cest que le formulaire a t
bien envoy.
Cette mthode ne peut fonctionner que si le nom indiqu dans le test principal est
identique celui qui figure dans la balise <input type="submit" >.
On peut indiquer lutilisateur quels sont les champs qui doivent obligatoirement tre
renseigns et, ventuellement, le type dinformation fournir (format du numro de
tlphone par exemple).

Envoyer un courrier lectronique


Sur un serveur correctement configur, il suffit dappeler la fonction mail() en lui passant
3 arguments :
mail($, $sujet, $corps_du_message)
$ : adresse e-mail du destinataire (ou des destinataires, spars par des virgules, sil y
en a plusieurs). Les 2 autres variables sont explicites.
Pour que le texte du message apparaisse au destinataire sur plusieurs lignes, on insre
aux bons endroits des "\n" pour sparer les lignes.
me
La fonction mail() accepte un 4
argument, facultatif, qui permet dajouter des en-ttes
supplmentaires comme From, Reply to, Cc, Bcc, etc.

Envoyer un courrier lectronique


<?php # Listing - email.php
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = "Confirmation d'enregistrement";
include ('./entete.inc');

69

if (isset($_POST['submit']))
{ // Traiter le formulaire
..
..
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct, enregistrer l'utilisateur
$texte_message = "Merci de vous tre enregistr sur notre site.\n";
$texte_message .= "Votre nom d'utilisateur est : \"{$_POST['nom_d_utilisateur']}\"";
$texte_message .= " et votre mot de passe : \"{$_POST['mot_de_passe1']}\"";
mail ($_POST['email'],
'Merci de votre enregistrement', $texte_message,
'From: admin@site.com');
echo "<p>Vous tes maintenant enregistr. Un e-mail de confirmation a t envoy
l'adresse e-mail que vous nous avez indique.</p>";
}
else
{ // Quelque chose n'est pas correct
echo '<p>Veuillez avoir l\'obligeance de recommencer</p>';
}
} else
{ // Afficher le formulaire
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

...................

Remarques
On ne peut pas envoyer ainsi des pices jointes, mais on peut envoy un texte format

en HTML.
Pour ajouter plusieurs en-ttes, on les spare par des \r\n :

$en_tetes = 'from: pierre@wanadoo.com\r\n';


$en_tetes .= 'Cc: jean@menara.ma, toto@free.fr\r\n';
mail ('phpmysql@wanadoo.ma\r\n',
'Questions sur le script',
$texte_message,
$en_tetes');

5. En-ttes HTTP
Redirection dun utilisateur laide de la fonction header()
HTTP (HyperText Transfer Protocol) : Protocole de transfert dinformations qui est au

cur du Web. Il dfinit la faon dont clients et serveurs communiquent entre eux.
On peut tirer parti de ce protocole en appelant la fonction native header() de PHP.

Lapplication la plus frquente est la redirection du navigateur depuis la page courante


vers une autre page.
header ("Location: http://www.url.com/page.php");

70

Comme cest en principe la dernire instruction de la page qui va tre excute (puisque
le contenu de cette page va tre remplac), elle devrait tre suivie dune instruction
exit() qui arrte lexcution du script.
La fonction header() doit tre appele avant que soit effectue une sortie dinformation
quelconque vers le navigateur. Mme du code HTML ou le moindre espace. Si le code
contient une instruction echo() ou print() ou des lignes vierges en dehors des balises PHP
ou sil inclut des fichiers qui peuvent jouer le mme rle, on verra safficher un message
indiquant limpossibilit de la redirection.
La fonction headers_sent() regarde si de linformation a dj t envoye au navigateur
:
if (! headers_sent())
{ header ("Location: http://www.url.com/page.php");
exit;
}
else
{ echo "La redirection ne peut pas tre effectue<p>";
}

Exercice : Modifier le script denregistrement pour que lutilisateur soit redirig vers une
autre page lorsque son enregistrement aura t ralis. Pour cela, il faut restructurer la
page pour viter que quelque chose soit envoy au navigateur avant lappel de header().
Suggestions :

Nouvelle version du script :


Redirection dun utilisateur laide de la fonction header()
<?php # Listing - redir.php
if (isset($_POST['submit']))
{ // Traiter le formulaire
$message = NULL;
// Vrifier la prsence d'un nom
if (strlen($_POST['nom']) > 0)
{ $nom = TRUE;
}
else
{ $nom = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
// Vrifier l'existence d'une adresse e-mail
if (strlen($_POST['email']) > 0)
{ $email = TRUE;
}
else
{ $email = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre adresse e-mail</p>';
}
// Vrifier la prsence d'un nom d'utilisateur
if (strlen($_POST['nom_d_utilisateur']) > 0)

71

{ $nom_d_utilisateur = TRUE;
}
else
{ $nom_d_utilisateur = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
// Vrifier l'existence et l'exactitude du mot de passe
if (strlen($_POST['mot_de_passe1']) > 0)
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mot_de_passe = TRUE;
}
else
{ $mot_de_passe = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>';
}
} else
{ $mot_de_passe = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct, enregistrer l'utilisateur
$texte_message = "Merci de vous tre enregistr sur notre site.\n";
$texte_message .= "Votre nom d'utilisateur est : \"{$_POST['nom_d_utilisateur']}\"";
$texte_message .= " et votre mot de passe : \"{$_POST['mot_de_passe1']}\"";
mail ($_POST['email'],
'Merci de votre enregistrement',
$texte_message,
'From: admin@site.com');
header("Location: merci.php");
exit;
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = "Confirmation d'enregistrement";
include ('./entete.inc');
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

72

<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Nom :</b>
<input type="text" name="nom" size="20" maxlength="40" />
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="60" />
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_d_utilisateur" size="20" maxlength="40" />
</p>
<p><b>Mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="40" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="40" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
// Fin de l'instruction conditionnelle principale
include ('./pied_page.inc'); // Inclure le pied de page
?>

Script de remerciement la suite dun enregistrement


<?php # Listing - merci.php
// Crer le titre et inclure un fichier d'en-tte
$page_title = 'Enregistrement';
include ('./entete.inc');
echo '<p>Merci de vous tre enregistr!</p>';
include ('./pied_page.inc'); // Inclure le pied de page.
?>

Remarques
Il est prfrable de faire usage dune adresse absolue dans largument pass la fonction

header() :

73

header ("Location: http://www.monserveur.com/merci.php");


HTTP est appel un protocole "sans tat" (stateless), cest--dire quil ne conserve aucun
souvenir de ce qui sest pass dune page lautre.
La fonction header() est galement frquemment utilise lorsquon a un script qui gnre
des pages en PDF ou sur tout autre mdia.

6. Formulaires mmoire
Formulaires mmoire
Formulaires qui gardent trace des informations quils ont reues et qui peuvent les

rafficher en cas derreur pour viter que lutilisateur ait toutes les valeurs ressaisir.
Lattribut value dune balise <input> donne une valeur prdfinie au contenu dun champ

de saisie :
<input type="text" size="20" maxlength="40" name="nom" value= "Jules" />
Pour que PHP prdfinisse cette valeur, on crit :
<input type="text" size="20" maxlength="40" name="nom" value="<?php echo
$_POST['nom']; ?>" />
Dans notre script denregistrement redir.php, on modifie toutes les instructions du
formulaire de saisie destines recueillir les informations de lutilisateur de faon que ces
instructions se prsentent sous cette forme :
<p><b>Nom dutilisateur :</b>
<input type="text" name="nom_d_utilisateur" size="20" maxlength="40"
value="<?php if (isset($_POST['nom_d_utilisateur']))
echo $_POST['nom_d_utilisateur']; ?>" /></p>

Formulaires mmoire
<?php # Listing - formem.php
if (isset($_POST['submit']))
{ // Traiter le formulaire
$message = NULL;
// Vrifier la prsence d'un nom
if (strlen($_POST['nom']) > 0)
{ $nom = TRUE;
}
else
{ $nom = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
// Vrifier l'existence d'une adresse e-mail
if (strlen($_POST['email']) > 0)
{ $email = TRUE;
}
else
{ $email = FALSE;
$message .= "<p>Vous avez oubli d'indiquer votre $1$
adresse e-mail</p>';
}

74

// Vrifier la prsence d'un nom d'utilisateur


if (strlen($_POST['nom_d_utilisateur']) > 0)
{ $nom_d_utilisateur = TRUE;
}
else
{ $nom_d_utilisateur = FALSE;
$message .= "<p>Vous avez oubli d'indiquer votre nom d'utilisateur</p>';
}
// Vrifier l'existence et l'exactitude du mot de passe
if (strlen($_POST['mot_de_passe1']) > 0)
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mot_de_passe = TRUE;
}
else
{ $mot_de_passe = FALSE;
$message .= "<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>";
}
} else
{ $mot_de_passe = FALSE;
$message .= "<p>Vous avez oubli d'indiquer votre mot de passe</p>";
}
if ($nom && $email && $nom_d_utilisateur && $mot_de_passe)
{ // Si tout est correct, enregistrer l'utilisateur
$texte_message = "Merci de vous tre enregistr sur notre site.\n";
$texte_message .= "Votre nom d'utilisateur est : $1$
\"{$_POST['nom_d_utilisateur']}\"";
$texte_message .= " et votre mot de passe : $1$
\"{$_POST['mot_de_passe1']}\"";
mail ($_POST['email'], 'Merci de votre enregistrement',
$texte_message, 'From: admin@site.com');
header("Location: merci.php");
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}
// Dfinir le titre de la page et inclure le fichier d'en-tte
$titre_page = "Enregistrement";
include ('./entete.inc');
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>

75

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">


<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Nom :</b>
<input type="text" name="nom" size="20" maxlength="40"
value="<?php if (isset($_POST['nom']))
echo $_POST['nom']; ?>" /></p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="20" maxlength="40"
value="<?php if (isset($_POST['email']))
echo $_POST['email']; ?>" /></p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_d_utilisateur" size="20"
maxlength="40"
value="<?php if (isset($_POST['nom_d_utilisateur']))
echo $_POST['nom_d_utilisateur']; ?>" /></p>
<p><b>Mot de passe :</b>
<input type="text" name="mot_de_passe1" size="20" maxlength="40"
value="<?php if (isset($_POST['mot_de_passe1']))
echo $_POST['mot_de_passe1']; ?>" /></p>
<p><b>Confirmez votre mot de passe :</b>
<input type="text" name="mot_de_passe2" size="20" maxlength="40"
value="<?php if (isset($_POST['mot_de_passe2']))
echo $_POST['mot_de_passe2']; ?>" /></p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
// Fin de l'instruction conditionnelle principale
include ('./pied_page.inc'); // Inclure le pied de page
?>

Remarques
Pour des raisons videntes, il nest pas possible de dfinir la valeur dun champ dentre

du type password.
Pour prdfinir ltat dun bouton radio ou dune case cocher : ajouter lattribut checked
leur balise HTML :
<input type="radio" name="interets[]" value="Ski" checked />

Remarques

Pour prslectionner une rubrique de menu droulant : faire figurer lattribut boolen

76

selected dans llment <option> de la balise <select>:


<select name="an">
<option value="2006">2006</option>
<option value="2007" selected>2007</option>
</select>
Pour prdfinir le contenu dune zone de texte (textarea) : insrer la valeur utiliser
entre les balises initiale et terminal:
<textarea name="commentaires" rows="10" cols="50">
Cette valeur est prdfinie.
</textarea>

77

Chapitre 4

Introduction SQL et MySQL

78

Introduction SQL et MySQL

Introduction
SQL : Structured Query Language (langage structur de requtes) est un langage de
requte vers les bases de donnes exploitant le modle relationnel.
Chaque SGBD important utilise SQL, et MySQL ne fait pas exception la rgle.
SQL a t cr au dbut des annes 70 daprs la thorie des bases de donnes
relationnelles, labore par E. F. Godd.
Le serveur de base de donnes MySQL est trs souvent utilis avec le langage de cration
de pages web dynamiques : PHP.
Sommaire
Conception dune table
Le moniteur mysql
Cration de bases de donnes et de tables
Insertion denregistrements
Slection de donnes
Affichages conditionnels
LIKE et NOT LIKE
Tri des rsultats de recherche
Limitation du nombre de rsultats affichs
Mise jour des donnes
Suppression denregistrements

Conception dune table

On va crer une base de donnes quon appellera ma_base et dans laquelle seront
conserves des informations concernant des enregistrements dutilisateurs.
Elle contiendra une unique table, utilisateurs, compose de plusieurs colonnes destines
conserver
lidentificateur personnel de lutilisateur,
son nom,
son prnom,
son adresse e-mail,
son mot de passe
et la date laquelle il sest enregistr.
Le nom des colonnes respecte les rgles de grammaire de SQL : noms alphanumriques
sans espace avec le blanc soulign (_) possible.

79

Conception dune table

Nom de la colonne

Exemple

id-utilisateur

834

prnom

Dupont

nom

Pierre

email

p.dupont@monserveur.com

mot_de_passe

56hf228

date_enreg

2003-05-13 17:03:24

Il faut dterminer le type de donnes de chacun des champs qui seront utiliss car il
faudra lindiquer lors de la cration de la structure de la base.
Pour tout SGBD, il existe 3 catgories principales de donnes:
Texte;
Nombres;
Dates et heures.
A lintrieur de chacune de ces catgories, il existe plusieurs variantes, certaines propres
MySQL.
Le choix de la catgorie la plus approprie a un impact non seulement sur le type des
informations pouvant tre conserv mais aussi sur les performances dexploitation
ultrieures.

Types de donnes MySQL Entiers

nom

borne infrieure

borne suprieure

TINYINT

-128

127

TINYINT UNSIGNED

255

SMALLINT

-32768

32767

SMALLINT UNSIGNED

65535

MEDIUMINT

-8388608

8388607

MEDIUMINT UNSIGNED 0

16777215

INT*

-2147483648

2147483647

INT* UNSIGNED

4294967295

BIGINT

-9223372036854775808 9223372036854775807

BIGINT UNSIGNED

18446744073709551615

(*) : INTEGER est un synonyme de INT

80

Types de donnes MySQL Flottants


Les flottants dits aussi nombres rels sont des nombres virgule. Contrairement aux
entiers, leur domaine nest pas continu du fait de limpossibilit de les reprsenter avec une
prcision absolue.

nom

domaine ngatif :
borne infrieure
borne suprieure

Domaine positif :
borne infrieure
borne suprieure

FLOAT

-3.402823466E+38
-1.175494351E-38

1.175494351E-38
3.402823466E+38

DOUBLE*

-1.7976931348623157E+308 2.2250738585072014E-308
-2.2250738585072014E-308 1.7976931348623157E+308

(*) : REAL est un synonyme de DOUBLE.


Types de donnes MySQL Chanes (1)

nom

longueur

CHAR(M)

Chane de taille fixe M, o 1<M<255,


complte avec des espaces si ncessaire.

CHAR(M) BINARY

Idem, mais insensible la casse lors des tris et


recherches.

VARCHAR(M)

Chane de taille variable, de taille maximum M, o


1<M<255, complt avec des espaces si
ncessaire.

VARCHAR(M) BINARY

Idem, mais insensible la casse lors des tris et


recherches.

Types de donnes MySQL Chanes (2)

nom

longueur

TINYTEXT

Longueur maximale de 255 caractres.

TEXT

Longueur maximale de 65535 caractres.

MEDIUMTEXT

Longueur maximale de 16777215 caractres.

LONGTEXT

Longueur maximale de 4294967295 caractres.

DECIMAL(M,D)*

Simule un nombre flottant de D chiffres aprs la


virgule et de M chiffres au maximum. Chaque
chiffre ainsi que la virgule et le signe moins (pas
le plus) occupe un caractre.

(*) : NUMERIC est un synonyme de DECIMAL.

81

Types de donnes MySQL Chanes (3)

Les types TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT peuvent tre judicieusement


remplacs respectivement par TINYBLOB, BLOB, MEDIUMBLOB et LONGBLOB.
Ils ne diffrent que par la sensibilit la casse qui caractrise la famille des BLOB.
Alors que la famille des TEXT sont insensibles la casse lors des tris et recherches.
Les BLOB peuvent tre utiliss pour stocker des donnes binaires.
Les VARCHAR, TEXT et BLOB sont de taille variable. Alors que les CHAR et DECIMAL
sont de taille fixe.

Types de donnes MySQL Dates et heures (1)

nom

description

DATE

Date au format anglophone AAAA-MM-JJ.

DATETIME

Date et heure au format anglophone


AAAA-MM-JJ HH:MM:SS.

TIMESTAMP

Affiche la date et lheure sans sparateur :


AAAAMMJJHHMMSS.

TIMESTAMP(M)

Idem mais M vaut un entier pair entre 2 et 14.


Affiche les M premiers caractres de TIMESTAMP.

TIME

Heure au format HH:MM:SS.

YEAR

Anne au format AAAA.

Types de donnes MySQL Dates et heures (2)

nom

description

TIMESTAMP(2)

AA

TIMESTAMP(4)

AAMM

TIMESTAMP(6)

AAMMJJ

TIMESTAMP(8)

AAAAMMJJ

TIMESTAMP(10)

AAMMJJHHMM

TIMESTAMP(12)

AAMMJJHHMMSS

TIMESTAMP(14)

AAAAMMJJHHMMSS

En cas dinsertion dun enregistrement en laissant vide un attribut de type TIMESTAMP,


celui-ci prendra automatiquement la date et heure de linsertion. Contrairement Unix (o
le timestamp est le nombre de secondes coules depuis le 1er janvier 1970), en MySQL, il
est une chane de format comme indiqu ci-contre.

82

Types de donnes MySQL numrations


Un attribut de type ENUM peut prendre une valeur parmi celles dfinies lors de la cration
de la table plus la chane vide ainsi que NULL si la dfinition le permet. Ces valeurs sont
exclusivement des chanes de caractres. Une numration peut contenir 65535 lments au
maximum.
Dfinition dun tel attribut :
nom_attribut ENUM(valeur 1,valeur 2)
nom_attribut ENUM(valeur 1,valeur 2) NULL
A chaque valeur est associe un index allant de 0 N si N valeurs ont t dfinies. Lindex 0
est associ la chane nulle, lindex 1 la premire valeur Lindex NULL est associ la
valeur NULL.
Si une slection (SELECT ou WHERE) est faite dans un contexte numrique, lindex est
renvoy. Sinon, cest la valeur qui est retourne.
Il peut tre dfini jusqu 65535 valeurs distinctes insensibles la casse.
Types de donnes MySQL Ensembles
Un attribut de type SET peut prendre pour valeur la chane vide, NULL ou une chane
contenant une liste de valeurs qui doivent tre dclares lors de la dfinition de lattribut lors
de la cration de la relation.
Par exemple, un attribut dclar comme ci :
SET(voiture, moto, vlo) NOT NULL
peut prendre les valeurs suivantes :
(chane vide)
voiture,moto
vlo,voiture,moto
et autres combinaisons de listes des trois valeurs dfinie plus haut.
Un attribut dclar comme suit :
SET(voiture, moto, vlo) NULL
peut prendre, en plus ce celles prcdentes, la valeur NULL.
Il ne peut tre dfini que 64 lments maximum.
Remarques

Les types ENUM et SET sont une extension de MySQL et nexistent donc pas dans
tous les SGBD. Leur emploi limite donc la potabilit dune base de donnes.
Lorsquon place une chane de caractres de cinq caractres dans un champ char (2),
les trois derniers caractres sont perdus. Cest la mme chose pour tous les champs
dont la longueur est dfinie lavance.

83

Conception dune table


Dcider du type de donner que contiendra une colonne (tape facile et vidente)

Nom de la colonne

Type

id_utilisateur

nombre

prnom

texte

nom

texte

email

texte

mot_de_passe

texte

date_enreg

date

Types de donnes gnriques de la table utilisateurs

Les nombres (les codes postaux, les prix, ) seront des zones de texte si on choisit de les
conserver avec leur ponctuation (caractre euro, tirets, espace), mais on obtiendra de
meilleures performances si on les conserve sous forme numrique (on les mettra en
forme au moment de leur utilisation).
Notre exemple :
Le champ id_utilisateur (qui est numrique) sera un MEDIUMINT (environ 17 millions de
valeurs sous forme non signe).
La date denregistrement (date_enreg) sera un DATETIME (conserver la date et lheure).
Les autres champs seront le plus souvent des VARCHAR puisque leur longueur peut
varier dun enregistrement lautre.
Le mot de passe sera une chane de caractres de longueur fixe.

Conception dune table

Nom de la colonne

Type

id_utilisateur

MEDIUMINT

prnom

VARCHAR

nom

VARCHAR

email

VARCHAR

mot_de_passe

CHAR

date_enreg

DATETIME

Types de donnes MySQL de la table utilisateurs

84

Dfinir la longueur des zones de texte et des colonnes devant contenir des nombres ainsi
que les autres attributs (UNSIGNED ou NOT NULL par exemple).
La taille dun champ doit tre choisie la plus petite possible daprs la plus grande valeur
quon prvoit dy conserver. Par exp. si le champ id_utilisateur na que 3 chiffres : dfinir
la colonne qui le recevra comme un SMALLINT, (ce qui permet de loger 999 utilisateurs).
Il sera videmment du type non sign .
Dans notre exemple : tous les champs doivent tre renseigns (ils ne peuvent pas avoir la
valeur NULL), sauf en ce qui concerne ladresse e-mail.

Conception dune table

Nom de la colonne

Type

id_utilisateur

MEDIUMINT UNSIGNED NOT NULL

prnom

VARCHAR (15) NOT NULL

nom

VARCHAR (30) NOT NULL

email

VARCHAR (40)

mot_de_passe

CHAR (16) NOT NULL

date_enreg

DATETIME NOT NULL

Dfinitions finales de la table utilisateurs

Le moniteur mysql
A part lusage de PHP, la faon la plus courante dadresser la serveur MySQL est de
passer par le client mysql (aussi appel le moniteur mysql). Avec lui, il est possible de se
connecter mysqld (la vritable application, qui contrle les bases de donnes) sur la
mme machine ou sur une autre.
Il ne faut pas confondre mysql avec MySQL, lequel est le systme de bases de donnes
considr dans son ensemble.
Sous Windows : on accde au client mysql au moyen dune fentre DOS.
Sous Mac OS X ou Linux : Utiliser lapplication Terminal pour cela.
Le client mysql utilise plusieurs arguments parmi lesquels le nom dutilisateur, le mot de
passe et le nom de lordinateur hte :
Mysql -u nom_d_utilisateur -p -h ordinateur_hte
Prsence de loption -p : mysql demandera le mot de passe. Mais on peut spcifier ce
dernier sur la ligne de commande en le tapant immdiatement aprs -p. Cette procdure
est moins scurise car tout le monde pourra ainsi le voir.
Sous mysqld, chaque commande MySQL doit se terminer par un point-virgule (;). On peut
donc poursuivre la frappe dune mme commande sur plusieurs lignes conscutives.

85

Fonctionnement en ligne de commande (sous Windows):


1. On se place dans le rpertoire o rside mysql :
cd\program files\easyphp\mysql\bin
Il ne faut pas terminer la ligne par un (;) : nous ne sommes pas encore sous mysql.
2. mysql -u root linvite de mysql saffiche.
A partir de maintenant, on devra terminer les commandes par un (;).
3. Slection dune base de donnes (une base de donnes dessai test, prsente avec
EasyPHP :
USE test; mysql rpond en affichant : Database changed.
4. Quitter mysql :
exit; mysql rpond en affichant : Bye.
Pour quitter mysql : exit; = quit;
Si on connat davance le nom de la base de donnes on peut utiliser (pour accder, par
exp., la base de donnes test) :
mysql -u root test
Connatre la liste des commandes reconnues par mysql :
mysql --help;

Lorsquon envoie des commandes mysql au moyen dun script, les commandes qui sy
trouvent ne doivent pas tre termines par un (;).

Cration de bases de donnes et de tables


Crer une base de donnes :
CREATE DATABASE nom_de_la_base;
CREATE est aussi utilis pour crer une table :
CREATE TABLE nom_de_la_table (description_co_1, description_co_2, );
Une fois la table cre, il faut dfinir sa structure, colonne par colonne. On peut dcider de
crer des index ce moment-l ou de le faire plus tard.

Index et cls :
Dans une base de donnes, un index permet de demander que cette base de donnes garde
un il sur les valeurs dune certaine colonne ou dun certain groupe de colonnes. De cette
faon, la lecture ou la mise jour de ces donnes seffectuera plus vite.

Dans une base de donnes, une cl fait partie intgrante du processus de normalisation mis
en place pour la conception de bases de donnes plus compliques. Il existe deux types de
cls, les cls primaires et les cls trangres (externes). En principe, chaque table doit avoir
une cl primaire. La cl primaire dune table est souvent lie une autre table sous forme
de cl externe.
La cl primaire dune table est un moyen artificiel de se rfrer un enregistrement et doit
respecter ces trois conditions :
Elle doit avoir une valeur.
Cette valeur ne doit jamais tre modifie.
Cette valeur doit tre unique pour chaque enregistrement de la base de donnes.
Dans la table utilisateurs, cest le champ id_utilisateur qui sera considr comme cl
primaire (MRIMARY KEY). Comme cest un nombre (toutes les cls primaires doivent
presque toujours tre des nombres), on lui a ajout lattribut AUTO_INCREMENT, ce qui
obligera MySQL incrmenter sa valeur chaque fois quune nouvelle valeur de id_utilisateur

86

sera ajoute la base de donnes. Vous verrez ce que cela signifie lorsque vous
commencerez insrer des enregistrements.
Cration de bases de donnes et de tables

1. Lancement d moniteur mysql : mysql -u root

2. Cration et slection dune nouvelle base de donnes :


CREATE DATABASE ma_base;
USE ma_base;

3. Cration de la table utilisateurs :


CREATE TABLE utilisateurs
( id_utilisateur MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
prenom VARCHAR(15) NOT NULL,
nom VARCHAR(30) NOT NULL,
email VARCHAR(40),
mot_de_passe CHAR(16) NOT NULL,
date_enreg DATETIME NOT NULL,
PRIMARY KEY (id_utilisateur)
);
Lordre dans lequel ces colonnes figurent dans la dclaration dtermine lordre dans lequel
elles seront implantes dans la base de donnes.
4. Vrifier que la table a bien t cre et vrifier la structure de la table utilisateurs au
moyen des commandes SHOW :
SHOW TABLES;
SHOW COLUMNS FROM utilisateurs;
Bien que MySQL soit insensible la casse, on a pris lhabitude dcrire en majuscules les
noms des commandes MySQL, ce qui permet de les sparer visuellement des noms de
bases de donnes, tables et colonnes.
A la place de la commande SHOW COLUMNS FROM, on peut crire: DESCRIBE.

Insertion denregistrements
Il existe deux formats pour enregistrer des valeurs dans une table :
1. On spcifie une une les colonnes garnir et les valeurs y placer :
INSERT INTO nom_base (col1, col2, ) VALUES (val1, val2, );
INSERT INTO nom_base (col4, col8, ) VALUES (val4, val8, );
Cette mthode nous permet de ne saisir que les valeurs non nulles. Les autres se verront
automatiquement affecter la valeur NULL ou toute autre valeur qui aurait pu tre
spcifie. Si parmi ces colonnes lune dentre elles a lattribut NOT NULL, une erreur sera
signale.
2. Saisir autant de valeurs quil y a de colonnes garnir:
INSERT INTO nom_base VALUES (val1, val2, NULL, , valn);
Il faut que toutes les valeurs soient spcifies , mme si certaines ont la valeur NULL. Sil ny
a pas exactement autant de valeurs quil existe de colonnes, une erreur sera signale.
On peut affecter des valeurs plusieurs lignes la fois :
INSERT INTO nom_base (col1, col2, )
VALUES (val1, val2, )
VALUES (valA, valB, )
VALUES (valx, valy, );
Cette mthode nest pas standard. Elle ne doit pas tre employe avec dautres SGBD que
MySQL.

87

Insertion denregistrements
Deux fonctions MySQL:
La fonction PASSWORD() : chiffrer les mots de passe qui permettent daccder MySQL.
Elle cre une chane de caractres qui a exactement 16 caractres (cest la raison du
choix de CHAR (16) dans la table utilisateurs). Lalgorithme de chiffrement est
irrversible, c--d quen partant du mot de passe chiffr il ny a aucun moyen de
retrouver le mot de passe original.
La fonction NOW() : insre un groupe date-heure correspondant au moment de linsertion
dans le champ o elle est appele.
Il ne faut pas placer une fonction de MySQL entre apostrophes ou entre guillemets. Il ne
doit pas y avoir despace entre la parenthse ouvrante et le dernier caractre du nom de
la fonction.
Insrer des donnes dans une table
1. Sous mysql, pour insrer une nouvelle ligne de donnes dans la table utilisateurs, on
utilise lune des 2 commandes suivantes :
INSERT INTO utilisateurs
(prenom, nom, email, mot_de_passe, date_enreg)
Values ('Jules', 'Cesar', 'j.cesar@roma.org',
PASSWORD('motpasse'), NOW());
INSERT INTO utilisateurs VALUES
('Jules', 'Cesar', 'j.cesar@roma.org',
PASSWORD('motpasse'), NOW());

En ne donnant aucune valeur au champ id_utilisateur (premire forme) ou en lui donnant


la valeur NULL, MySQL va lui attribuer la valeur immdiatement suprieure la dernire
utilise.

2. Insrons plusieurs valeurs dans la table utilisateurs :


INSERT INTO utilisateurs
(prenom, nom, email, mot_de_passe, date_enreg)
Values ('John', 'Lennon', 'john@beatles.com',
PASSWORD('Happiness'), NOW()),
('Paul', 'McCartney', 'paul@beatles.com',
PASSWORD('LetItBe'), NOW()),
('George', 'Harrison', 'george@beatles.com',
PASSWORD('something'), NOW()),
('Ringo', 'Starr', 'ringo@beatles.com',
PASSWORD('thisboy'), NOW());

Insrer des donnes dans une table


Plusieurs lignes de texte taper risque derreurs.
Autre moyen plus sr et rapide de procder : crer un script contenant les commandes
excuter. On peut enregistrer ce script sous forme de fichier texte (extension .txt). On le
place dans un rpertoire qui nous convient, par exp. \program files\easyphp\mysql\data
(existe dj).
3. On saisie dans un diteur de texte la mme commande que la prcdente lexception
du point-virgule final, qui nest pas ncessaire lorsque la commande se trouve dans un
script.
beatles.txt dans le rpertoire \program files\easyphp\mysql\data :
INSERT INTO utilisateurs

88

(prenom, nom, email, mot_de_passe, date_enreg)


Values ('John', 'Lennon', 'john@beatles.com',
PASSWORD('Happiness'), NOW()),
('Paul', 'McCartney', 'paul@beatles.com',
PASSWORD('LetItBe'), NOW()),
('George', 'Harrison', 'george@beatles.com',
PASSWORD('something'), NOW()),
('Ringo', 'Starr', 'ringo@beatles.com',
PASSWORD('thisboy'), NOW())
4. On quitte mysql : quit;
5. La commande taper dans la fentre DOS :
mysql -u root -D utilisateurs <..\data\beatles.txt
Le symbole "<" est un caractre de redirection qui indique que les commandes adresses
mysql doivent tre lues dans le fichier dont le nom suit.
Aucun accus de rception nest affich, on retrouve simplement linvite de commande. Mais
sil y a une erreur dans la commande, on verra safficher un message derreur.

Remarques
Pour insrer une valeur contenant une apostrophe ou un guillemet, on doit lchapper
avec un antislash :
INSERT INTO utilisateurs
(prenom, nom) VALUES ('Patrick', 'O\'Maley');
MySQL supprimera automatiquement les espaces terminaux dune valeur insrer dans
un champ de type VARCHAR.
Dans les versions actuelles de MySQL, le terme INTO qui intervient dans la commande
INSERT est facultatif.
En gnral, on place les chanes de caractres entre apostrophes et les nombres entre
apostrophes ou entre guillemets. Ceci est valable pour toutes les commandes et pas
seulement pour INSERT.

Slection des donnes


La commande MySQL SELECT :
SELECT quelles_colonnes FROM quelle_table;
Voir lensemble des valeurs de la table utilisateurs :

SELECT * FROM utilisateurs;


* Signifie tout .

Pour un affichage partiel, on peut crire par exp. :

SELECT id_utilisateur, prenom, nom FROM utilisateurs;

On peut afficher les colonnes dune table dans un ordre diffrent de leur ordre naturel.
Les colonnes seront affiches dans lordre o nous les numrons dans la commande
SELECT.

89

Affichages conditionnels

On ajoute une condition daffichage avec la clause WHERE:

SELECT * FROM utilisateurs WHERE nom='Mozart';


SELECT email FROM utilisateurs WHERE prenom='John';
SELECT nom FROM habitants WHERE naissance='2000-01-01';

Les oprateurs les plus couramment utiliss avec une commande SELECT : (ils peuvent
tre associs dans des expressions parentses pour permettre une slection plus
fouille).

Oprateurs MySQL (1)

Oprateur

Signification

galit

<

infrieur

>

suprieur

<=

infrieur ou gal

>=

suprieur ou gal

!=

diffrent de

Oprateurs MySQL (2)

Oprateur

Signification

IS NOT NULL

a une valeur

IS NULL

na aucune valeur

BETWEEN

entre deux valeurs

NOT BEETWEEN

lextrieur de deux valeurs

OR (ou ||)

si une des deux conditions est vrifie

AND (ou &&)

si les deux conditions sont vrifies

NOT (ou !)

lorsque la condition nest pas vrifie

90

Exemples
SELECT * FROM utilisateurs WHERE (id_utilisateur>=10)
AND (id_utilisateur<=20);
SELECT * FROM utilisateurs WHERE (nom='Mozart')
OR (nom='Mozar');

La liste des utilisateurs qui se sont enregistrs partir de 14 h et avant 15 h le 29


novembre 2010 :

SELECT * FROM utilisateurs


WHERE (date_enreg > '2010-11-29 14:00:00')
AND (date_enreg < '2010-11-29 14:59:59');
On peut aussi utiliser la clause BETWEEN.

Slection des noms des utilisateurs dont le prnom est Frantz:

SELECT nom FROM utilisateurs WHERE prenom='Frantz';

Slection des noms des utilisateurs qui nont pas dadresse e-mail:

SELECT * FROM utilisateurs WHERE email IS NULL;


ou
SELECT * FROM utilisateurs WHERE email ='';

Slection de lutilisateur dont le mot de passe est "sonate" : les mots de passe ont t
stocks aprs avoir t chiffrs avec la fonction PASSWORD(), il suffit de comparer
"sonate" avec le rsultat du chiffrement de ce mot par cette fonction :

SELECT * FROM utilisateurs WHERE mot_de_passe=PASSWORD('sonate');


Remarques
On peut galement utiliser les oprateurs IN et NOT IN pour savoir si une valeur de
champ est ou nest pas dans une liste de valeurs :
SELECT * FROM habitants WHERE naissance
IN ('2000-01-01', '2001-01-01', '2002-01-01');
On peut faire des calculs lintrieur de notre critre de recherche au moyen des 4
oprateurs usuels.
Nous retrouverons, plus loin dans ce chap., les oprateurs de conditions dans dautres
emplois quavec une clause SELECT.

LIKE et NOT LIKE


Supposons quon recherche quelquun dont le nom peut tre Dupont, Dupond, Dupontel
ou Duponk-joly. Cest l quinterviennent les clauses LIKE et NOT LIKE associes aux 2
caractres jokers "_" et "%".
"_" correspond nimporte quel caractre unique,
A "%" correspond aucun, un ou plusieurs caractres.

91

SELECT * FROM utilisateurs WHERE nom LIKE 'Dupon%';


tous les noms commenant par "Dupon".

Slectionnons tous les enregistrements o le prnom commence par "Joh". La recherche


tant insensible la casse trouverait aussi les prnoms commenant par "joh".

SELECT * FROM utilisateurs WHERE prenom LIKE 'Joh%';

Slectionnons les utilisateurs (nom, prnom) dont ladresse e-mail nest pas de la forme
xxx@menara.ma :

SELECT nom, prenom FROM utilisateurs WHERE email NOT LIKE '%@menara.ma';

Les caractres jokers peuvent tre utiliss au dbut et/ou la fin dune chane de
caractre :

SELECT * FROM utilisateurs WHERE nom LIKE '_upon%';

Bien que LIKE et NOT LIKE soient normalement utilises avec des chanes de caractres,
elles peuvent aussi sappliquer des champs numriques.

Pour utiliser un caractre "_" et "%" dans une condition de recherche avec LIKE ou NOT
LIKE, il faut lchapper avec un antislash.

Le caractre joker "_" peut sassocier lui-mme.


combinaison de deux caractres.

LIKE '__' recherchera toue

Tri des rsultats de recherche

La clause ORDER BY modifie la prsentation des rsultats, par exemple en les triant sur
un champ donn dans un certain ordre.
Lorsquon ne prcise rien, les rsultas sont prsents dans un ordre imprvisible
(probablement dans lordre croissant des cls primaires).

SELECT * FROM utilisateurs ORDER BY prenom;

SELECT email FROM utilisateurs ORDER BY date_enreg;

Par dfaut, le sens du tri effectu par la clause ORDER BY est le sens ascendant (abrg
en ASC). Les nombres iront en croissant et les dates, du plus ancien au plus rcent.
On peut inverser le sens du tri au moyen de la clause DESC (descendant).

Slectionner tous les utilisateurs sur leur nom, par ordre alphabtique :

SELECT prenom, nom FROM utilisateurs ORDER BY nom;

Afficher par ordre alphabtique les champs nom, prnom (dans cet ordre) pour tous les
utilisateurs :

92

SELECT prenom, nom FROM utilisateurs ORDER BY nom ASC, prenom ASC;

Afficher tous les utilisateurs par date denregistrement (le plus rcent en tte) :

SELECT * FROM utilisateurs ORDER BY date_enreg DESC;

Limitation du nombre de rsultats affichs

La clause LIMIT permet de limiter le nombre de rsultats quaffichera MySQL.

SELECT * FROM utilisateurs LIMIT 10;


Seuls les 10 Premiers rsultats seront affichs.
SELECT * FROM utilisateurs LIMIT 10, 20;
20 enregistrements seront affichs en commenant par le onzime.

On peut utiliser LIMIT en mme temps que WHERE et/ou ORDR BY en lajoutant la fin
de la requte :

SELECT * FROM utilisateurs WHERE prenom='Frantz


ORDER BY date_enreg DESC LIMIT 5;

Slectionner les 5 derniers utilisateurs enregistrs :

SELECT * FROM utilisateurs ORDER BY date_enreg DESC LIMIT 5;

Slectionner la deuxime personne qui sest enregistre:

SELECT * FROM utilisateurs ORDER BY date_enreg ASC LIMIT 1, 1;


(Les lignes sont numrotes partir de 0)
La clause LIMIT x, y est la plus frquemment utilise lorsquon veut afficher plusieurs
pages de rsultats par tranches de 20 (ou toute autre valeur).
La clause LIMIT ne fait pas partie du standard SQL et nest donc pas disponible sur tous
les SGBD.
La clause LIMIT peut tre prsente dans dautres commandes MySQL et pas seulement
dans SELECT.

Mis jour des donnes


On a toujours la possibilit de modifier les enregistrements dj prsents dans une table
(corriger une erreur de saisie initiale).
Commande de mise jour :
UPDATE nom_de_la_table SET champ='valeur';
On peut modifier en mme temps plusieurs champs dun enregistrement en les sparant

93

par des virgules :


UPDATE nom_de_la_table SET champ1='valeur1', champ2='valeur2', ;
On utilisera une clause WHERE pour slectionner la ligne de la table sur laquelle porteront
les modifications. Sinon ces modifications seraient apportes toutes les lignes. Exp. :
UPDATE nom_de_la_table SET champ1='valeur1' WHERE champ2='valeur2';

Comme les suppressions, les mises jour sont lune des plus importantes raisons
dutiliser une cl primaire. (cette valeur qui ne devrait jamais changer) peut construire un
point de rfrence dans les clauses WHERE mme si chacun des autres champs doit tre
modifi.
Exemple : On veut modifier ladresse e-mail dun utilisateur (prnom : Fantz nom : Liszt).
On commence donc par dterminer la cl primaire de lenregistrement qui mintresse (
modifier) :

SELECT id_utilisateur FROM utilisateurs


WHERE prenom='Fantz' AND nom='Liszt';
MySQL affiche pour id_utilisateur : 15
La mise jour de cet enregistrement :
UPDATE utilisateurs SET email='fran@hungary.net'
WHERE id_utilisateur=15;
MySQL va afficher des informations sur la faon dont sest droule la commande et sur le
nombre denregistrements affects.
Vrifier que la mise jour a bien t effectue :
SELECT * FROM utilisateurs WHERE id_utilisateur=15;
Remarques

Utilisons toujours une clause WHERE pour faire une mise jour, sauf si nous voulons
modifier tous les enregistrements de la table.

Pour se protger contre une mise jour accidentelle dun trop grand nombre
denregistrements, on peut ajouter une clause LIMIT.

On ne doit jamais modifier le champ qui contient la cl primaire car cela pourrait
compromettre lintgrit des relations avec une autre table.

Suppression denregistrements
On peut supprimer des enregistrements dune table au moyen de la commande DELETE :
DELETE FROM nom_de_la_table WHERE champ='valeur';
Une fois supprim, un enregistrement est perdu sans espoir de rcupration.
Par prudence, on peut faire une copie de la table avant toute suppression.
Il est fortement recommand de faire figurer une clause WHERE dans la commande de
suppression. La requte DELETE FROM nom_de_la_table supprimera tout le contenu
dune table mais laissera intacte sa structure.

La commande TRUNCATE TABLE nom_de_la_table supprimera la totalit de la table ainsi

94

que sa structure mais recrera cette dernire. Le rsultat est identique, mais cette
mthode, inspire du SGBD Oracle, est plus rapide et plus sr.
Exemple de suppression de donnes :
Dterminons dabord la valeur du champ id_utilisateur (cl primaire) de lenregistrement
supprimer :
SELECT id_utilisateur FROM utilisateurs
WHERE prenom='Claudio' AND nom='Monteverdi';
MySQL affiche pour id_utilisateur : 14

Vrifions ensuite quil sagit bien de lenregistrement que nous voulons supprimer :

SELECT * FROM utilisateurs WHERE id_utilisateur=14;

Excutons la requte de suppression :

DELETE FROM utilisateurs WHERE id_utilisateur=14;


Comme pour UPDATE, MySQL affiche un compte rendu dexcution. Lenregistrement qui
vient dtre supprim nest plus rcuprable.

On peut vrifier la bonne excution de la prcdente requte:

SELECT id_utilisateur, prenom, nom FROM utilisateurs


ORDER BY id_utilisateur ASC;
On voit que lenregistrement supprim napparat plus dans la liste des lments de la
table.
Remarques :
Pour supprimer toutes les donnes dune table ainsi que la table elle-mme :
DROP TABLE nom_de_la_table;
Pour supprimer une base de donnes dans sa totalit (donc ainsi que toutes les tables
quelle contient) :
DROP DATABASE nom_de_la_base;
Depuis MySQL 4.0 on peut lancer une requte DELETE sur plusieurs tables en mme
temps.
Suppression denregistrements
Pour des raisons de scurit, on peut ajouter une clause LIMIT toute requte de
suppression de faon en limiter la porte. On ne doit le faire que si on connat ce
nombre lavance :
DELETE FROM nom_de_la_table WHERE id=4 LIMIT 1;

95

Chapitre 5

MySQL

96

MySQL

Sommaire
Ralisation de la maquette de notre application Web
Connexion MySQL et slection dune base de donnes
Gestion derreurs
Excution de requtes simples
Rcupration des rsultats dune requte
La scurit
Utilisation de mysql_num_rows()
Modification des enregistrements avec PHP
Introduction
Parmi toutes les API quon peut interfacer avec MySQL (Perl, Java, C, C++, Python et
autres), PHP est la plus rpandue.
Le support de MySQL doit tre dfini dans la configuration de PHP.
Dans ce chapitre, on va utiliser la base de donnes ma_base, cre au chapitre
prcdent, et raliser une interface permettant de dialoguer avec la table utilisateurs.

Ralisation de la maquette de notre application


Web
Ralisation de la maquette
Commenons par concevoir la maquette de notre application Web :
On va rcrire les fichiers den-tte et de pied de page.
On va utiliser deux sous rpertoires du rpertoire principal : images (qui contiendra les
images) et modeles (qui contiendra les fichiers den-tte et de pied de page).
Ralisation de la maquette
Fichier den-tte :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/ $1$
xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
<title><?php echo $titre_page; ?></title>
</head>
<body>
<!-- Listing - entete.inc -->
<table border="0" cellspacing="0" cellpadding="4">
<tr>
<!-- LIGNE SUPERIEURE -->
<td rowspan="2" bgcolor="#999966">
<!-- <img src="images/mysql.gif" alt="PHP/MySQL" width="100" height="47" /> -->
</td>

97

<td width="*" bgcolor="#999966">


<font color="#FFFFFF" size="+2" face="Couner New, Courier, mono">
<strong>Bases de donn&eacute;es et Internet avec PHP et MySQL</strong>
</font>
</td>
<td width="10" rowspan="2" bgcolor="#999966">&nbsp;</td>
</tr>
<tr> <!-- LIGNE DE NAVIGATION -->
<td bgcolor="#CC9933">
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td width="20%" align="center" bgcolor="#FFCC66">
<a href="index.php">Accueil</a>
</td>
<td width="20%" align="center" bgcolor="#FFCC66">
<a href="enregistrer.php">Enregistrement</a>
</td>
<td width="20%" align="center" bgcolor="#FFCC66">
<a href="login.php">Login</a>
</td>
<td width="20%" align="center" bgcolor="#FFCC66">
<a href="change_mp.php">Changer votre mot de passe</a>
</td>
<td width="20%" align="center" bgcolor="#FFCC66">
<a href= visualiser.php">Afficher les utilisateurs</a>
</td>
</tr>
</table>
</td>
</tr>
<tr> <!-- LIGNE DU CONTENU -->
<td bgcolor="#999966">&nbsp;</td>
<td bgcolor="#FFFFFF">
<!-- LE CONTENU SPECIFIQUE D'UNE PAGE COMMENCE ICI -->
Fichier de pied de page :
<!-- LE CONTENU SPECIFIQUE D'UNE PAGE SE TERMINE ICI -->
</td>
<td width="10" bgcolor="#999966">&nbsp;</td>
</tr>
<tr> <!-- LIGNE DE NAVIGATION DU BAS -->
<td bgcolor="#999966">&nbsp;</td>
<td bgcolor="#CC9933">
<div align="center"><small>
<a href="index.php">Accueil</a> &ordm;
<a href= enregistrer.php">Enregistrement</a> &ordm;
<a href="login.php">Login</a> &ordm;
<a href="change_mp.php">Changer le mot de passe</a> &ordm;
<a href= visualiser.php">Afficher les utilisateurs</a>
</small></div>
</td>
<td width="10" bgcolor="#999966">&nbsp;

98

</td>
</tr>
<tr> <!-- LIGNE DE COPYRIGHT -->
<td bgcolor="#999966">&nbsp;</td>
<td bgcolor="#999966">
<div align="center">
<font size="-l">Copyright &copy; 2007 PHP & MySQL &ordm;
<a href="#">ProgWeb, Inc. </a>
</font>
</div>
</td>
<td bgcolor="#999966">&nbsp;</td>
</tr>
</table> <!-- Script - pied_page.inc -->
</body>
</html>
Ralisation de la maquette
Cration de la Page daccueil :
<?php # Listing - index.php
$titre_page = "Bienvenue";
include ('modeles/entete.inc'); // inclure le fichier d'en-tte
echo '<p>Bienvenue ProgWeb.net</p>';
include ('modeles/pied_page.inc'); // inclure fichier de pied de page
?>

Connexion MySQL et slection dune base de


donnes
Connexion MySQL et slection dune base de donnes
re
1
tape : se connecter au serveur: on appelle la fonction mysql_connect () :
$bd = mysql_connect ($hote, $utilisateur, $mot_de_passe);
Largument $hote sera gnralement localhost sil sagit dun serveur local, mais on peut
aussi se connecter un serveur distant pour utiliser MySQL.
2me tape : une fois connect MySQL, on choisit la base de donnes avec laquelle
nous allons travailler. Cest lquivalent de la requte USE nom_de_la_base que nous
utilisions avec le moniteur mysql. Ce choix seffectue en appelant la fonction
mysql_select_db () : mysql_select_db ($nom_de_la_base);
Script de connexion MySQL et slection dune base de donnes
<?php # Listing - mysql_connect-0.php
// Ce fichier contient les informations d'accs la base de donnes.
// Il tablit aussi une connexion avec MySQL et slectionne une
// base de donnes
// Dfinition des paramtres d'accs sous forme de constantes
DEFINE ('DB_USER', 'root'); // l'utilisateur root
DEFINE ('DB_PASSWORD', ''); // sans mot de passe
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'ma_base');

99

// Ouvrir la connexion et slectionner la base de donnes


$dbc = @mysql_connect (DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db (DB_NAME);
?>
Remarque
Pour que le script fonctionne correctement, on a repris pour les paramtres de connexion
les valeurs utilises dans le chapitre prcdent.
Il existe une fonction mysql_pconnect () destine tablir une connexion permanente
avec MySQL (pour lutiliser, on doit repenser notre application).
Avec ce script, il suffit de changer les valeurs intervenant dans les 4 DEFINE pour se
connecter nimporte quel autre base de donnes.
Remarque
Il faut prendre des prcautions pour scuriser les scripts de connexion.
Recommandations :
les conserver en dehors du rpertoire normal des pages Web. De cette faon, ces fichiers ne
seront pas accessibles par un navigateur.
Il faut donner une extension .php aux scripts de connexion. Un serveur correctement
configur naffichera pas le contenu de ces scripts mais lexcutera (ce qui nest pas le cas
pour les fichiers dont lextension est .inc).

Gestion derreurs
Gestion derreurs
Erreurs frquentes :
Impossibilit de se connecter au gestionnaire de bases de donnes;
impossibilit de slectionner une base de donnes;
erreur dans lexcution dune requte;
absence de rsultat envoy par une requte.
Pour avoir des renseignements sur ces erreurs : on utilise les fonctions
mysql_error () : affiche une explication de lerreur qui est survenue sous forme de texte,
et mysql_errno () : renvoie le numro de lerreur.
Gestion derreurs
PHP propose deux moyens de prendre les erreurs en charge : @ et or die.
La prsence du caractre @ devant un nom de fonction empche cette fonction dafficher
un message derreur.
La fonction die () est un synonyme de la fonction
exit (). Toutes deux affichent la
valeur de lexpression (constante, variable, chane de caractres ) qui se trouve entre
parenthses et mettent fin lexcution du programme. Exemple :
$db = mysql_connect (DB_HOST, DB_USER, DB_PASSWORD) or die (mysql_error ());
Gestion derreurs
En rgle gnrale :
On emploie die () pour toute fonction dont le rsultat correct est vital pour la poursuite de
lexcution du script (connexion MySQL et slection de la base de donnes, par exp.).
On emploie @ pour les fonctions dont le rsultat nest pas certain mais qui, en cas
derreur, ne compromettent pas la suite du programme (inclusion dun fichier HTML ou
excution dune requte, par exp.).

100

Gestion derreurs
Nouvelle version de mysql_connect.php avec gestion derreurs:
<?php # Listing - mysql_connect-1.php
// Ce fichier contient les informations d'accs la base de donnes.
// Il tablit aussi une connexion avec MySQL et slectionne une base de donnes
// Dfinition des paramtres d'accs sous forme de constantes
DEFINE ('DB_USER', 'root'); // l'utilisateur root
DEFINE ('DB_PASSWORD', ''); // sans mot de passe
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'ma_base');
Gestion derreurs
// Ouvrir la connexion et slectionner la base de donnes
$dbc = @mysql_connect (DB_HOST, DB_USER, DB_PASSWORD)
OR die ('Connexion MySQL impossible : '.mysql_error().'<br>');
mysql_select_db (DB_NAME)
OR die ('Slection de la base de donnes impossible : '.mysql_error().'<br>');
?>
Remarques :
Le caractre @ peut prfixer nimporte quelle fonction pour lempcher dafficher des
erreurs et pas seulement les fonctions MySQL. Exp. :
@include ('monfichier.php');
De la mme faon, la clause or die nest pas une exclusivit MySQL et peut tre utilise
sans faire intervenir mysql_error ().

Excution de requtes simples


Excution de requtes simples
La fonction PHP destine excuter une requte est mysql_query () :
$resutat = mysql_query ($requete);
Pour des requtes simples comme INSERT, UPDATE, DLETE, etc. (qui ne renvoient aucun
enregistrement), la variable $resultat prendra la valeur TRUE ou FALSE selon que la
requte sest bien ou mal excute.
Pour des requtes plus complexes (SELECT, SHOW, DESCRIBE et EXPLAIN), cette variable
contiendra le rsultat de la requte si elle a t correctement excute ou, sinon, FALSE.
Dernire opration (facultative) dans le traitement dune base de donnes : refermer la
connexion avec MySQL : mysql_close ();
Excution de requtes simples
On va crire un script denregistrement enregistrer.php destin enregistrer lutilisateur
dans la base de donnes ma_base.
Travail prparatoire : (moniteur mysql ou phpMyAdmin)
On slectionne la base de donnes ma_base : USE ma_base;
On vrifie la structure de la base : DESCRIBE utilisateurs;
Telle quelle tait, cette table manquait dun champ destin recevoir le "nom
dutilisateur". On ajoute un champ nom_utilisateur :
ALTER TABLE utilisateurs ADD COLUMN nom_utilisateur
VARCHAR(20) AFTER id_utilisateur;

101

Excution de requtes simples


La table avait dj un index pour la cl primaire (id_utilisateur), mais on va en ajouter
aux champs qui seront les plus frquemment utiliss dans les requtes afin damliorer
les performances dexploitation :
ALTER TABLE utilisateurs ADD UNIQUE (nom_utilisateur),
ADD INDEX (prenom),
ADD INDEX (nom),
ADD INDEX (mot_de_passe);
Je pourrais aussi regrouper prenom et nom en crivant :
ADD INDEX (nom, prenom)
On vrifie la nouvelle structure de la table :
DESCRIBE utilisateurs;
Excution de requtes simples
<?php # Listing - enregistrer.php
// Dfinir le titre de la page et inclure l'en-tte de page
$titre_page = "Enregistrement";
include ('modeles/entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire
$message = NULL;

// crer une variable vide

// Vrifier la prsence d'un prnom


if (empty($_POST['prenom']))
{ $p = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre prnom</p>';
}
else
{ $p = $_POST['prenom'];
}
// Vrifier la prsence d'un nom
if (empty($_POST['nom']))
{ $n = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
else
{ $n = $_POST['nom'];
}
// Vrifier l'existence d'une adresse e-mail
if (empty($_POST['email']))
{ $e = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre adresse e-mail</p>';
}
else
{ $e = $_POST['email'];
}
// Vrifier la prsence d'un nom d'utilisateur
if (empty($_POST['nom_utilisateur']))

102

{ $u = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
else
{ $u = $_POST['nom_utilisateur'];
}
// Vrifier l'existence et l'exactitude du mot de passe
if (empty($_POST['mot_de_passe1']))
{ $mp = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
else
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mp = $_POST['mot_de_passe1'];
}
else
{ $mp = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>';
}
}
if ($p && $n && $e && $u && $mp)
{ // Si tout est correct, enregistrer l'utilisateur dans la base de donnes
require_once ('modeles/mysql_connect-1.php'); // connexion
// la base de donnes
// crer la requte
$rq = "INSERT INTO utilisateurs (nom_utilisateur, prenom, nom,
email, mot_de_passe, date_enreg)
VALUES ('$u', '$p', '$n', '$e', PASSWORD('$mp'), NOW())";
// lancer la requte
$result = mysql_query($rq);
if ($result) // Si l'enregistrement est correct
{ // Envoyer ventuellement un e-mail
echo "<p><b>Merci de vous tre enregistr sur notre site.
</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
{ echo "<p>Vous n'avez pas pu tre enregistr cause d'une erreur systme".
"<p></p>" . mysql_error() . "<p></p>";
}
mysql_close();
// refermer la connexion avec la base de donnes
}
else
{ // Quelque chose n'est pas correct
$message .= '<p>Veuillez avoir l\'obligeance de recommencer</p>';
}
}

103

// Afficher ventuellement un ou plusieurs messages d'erreur


if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Prnom :</b>
<input type="text" name="prenom" size="15" maxlength="15"
value="<?php if (isset($_POST['prenom'])) echo $_POST['prenom']; ?>"/>
</p>
<p><b>Nom :</b>
<input type="text" name="nom" size="30" maxlength="30"
value="<?php if (isset($_POST['nom'])) echo $_POST['nom']; ?>"/>
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="40"
value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>"/>
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_utilisateur']))
echo $_POST['nom_utilisateur']; ?>"/>
</p>
<p><b>Mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="20" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="20" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>
Remarques
On peut vrifier que le nouvel utilisateur a bien t insr dans la table utilisateurs au
moyen du moniteur mysql ou de phpMyAdmin.

104

La fonction mysql_query () renvoie TRUE lorsque la requte a pu tre excute, mais cela
nimplique pas que les rsultats de cette requte soient conforme ce que nous esprions
(effectuer une vrification plus pousse).
On nest pas oblig de crer une variable temporaire, $rq. On peut crire la requte
directement dans lappel mysql_query (). Mais, pour les requtes complexes, cela
facilite le travail dcriture et de mise au point.

Rcupration des rsultats dune requte


Rcupration des rsultats dune requte
Requte simple : une requte commenant par INSERT, UPDATE, DELETE ou ALTER :
ces requtes ne renvoient aucun rsultat, juste TRUE ou FALSE selon la faon dont elles
se sont excutes.
La requte SELECT va renvoyer un ou plusieurs enregistrements quil est ncessaire de
traiter avec des instructions PHP.
Le principal outil utiliser pour ce traitement : la fonction mysql_fetch_array () , qui
rcupre ce qu renvoy la requte et renvoie les rsultats un par un. On utilise donc
cette fonction lintrieur dune boucle qui se poursuit tant quil existe des rsultats
disponibles :
Rcupration des rsultats dune requte
while ($enreg = mysql_fetch_array ($resultat))
{ // traiter cet enregistrement
}
La fonction mysql_fetch_array () accepte un argument facultatif spcifiant le type de
tableau quon souhaite obtenir : associatif, index ou les deux.
er
Dans le 1 cas (associatif), on peut adresser les diffrents champs par leur nom alors
quun tableau index ne nous permet dy accder que par des indices numriques (la 1 re
colonne ayant lindice 0).
Rcupration des rsultats dune requte
On prfre MYSQL_NUM, qui est un peu plus rapide et utilise moins de mmoire que les
autres options.
Un fois les rsultats traits, on peut librer la ressource utilise pour pointer sur les
rsultat :
mysql_free_result ($resultat);

Mot cl

Exemple

MYSQL_ASSOC $enreg['champ']
MYSQL_NUM $enreg[3]
MYSQL_BOTH $enreg['champ'] ou
$enreg[3]
Mots cls dterminant le type de tableau renvoy par mysql_fetch_array ()
Rcupration des rsultats dune requte
Exemple de traitement des rsultats : on va crer un script visualiser.php, qui permet
dafficher les utilisateurs couramment inscrits.
<?php # Listing - visualiser.php

105

// Ce script rcupre et affiche tous les enregistrements


// de la table "utilisateurs"
$titre_page = 'Utilisateurs couramment enregistrs';
include ('modeles/entete.inc');
// Connexion la base de donnes
require_once ('modeles/mysql_connect-1.php');
Rcupration des rsultats dune requte
// Crer la requte.
$rq = "SELECT CONCAT(nom, ', ', prenom) AS nom_complet, ".
"DATE_FORMAT(date_enreg, '%d/%m/%Y') AS d_enr FROM utilisateurs ".
"ORDER BY date_enreg ASC";
$result = @mysql_query ($rq); // lancer la requte
if ($result)
{ // Si c'est OK, afficher les enregistrements
echo '<table align="center" cellspacing="2" cellpadding="2">
<tr><td align="center"><b>Nom</b></td>
<td align="center"><b>Date<br>d\'enregistrement</b></td></tr>';
// Rcuprer et afficher tous les enregistrements
while ($ligne = mysql_fetch_array($result, MYSQL_NUM))
{ echo "<tr><td>$ligne[0]</td>
<td align='center'>$ligne[1]</td></tr>\n";
}
echo '</table>';
mysql_free_result ($result); // Librer les ressources
}
else
{ // Il y a eu un os !
echo '<p>Toutes nos excuses. Une erreur systme ('.mysql_error().
') nous empche de vous prsenter la liste des utilisateurs.</p><p></p>';
}
mysql_close(); // Refermer la connexion avec la base de donnes
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>
Remarques
La fonction mysql_fetch_row () est lquivalence de la fonction mysql_fetch_array ($resul,
MYSQL_NUM).
La fonction mysql_fetch_assoc () est lquivalence de la fonction mysql_fetch_array
($resul, MYSQL_ASSOC).
me
Il existe une 3
fonction, mysql_fetch_object (), qui renvoie une ligne de rsultat sous
la forme dun objet.

Comme pour nimporte quel tableau, lorsquon rcupre des enregistrements dune base
de donnes, on doit se rfrer aux colonnes exactement comme elles sont dfinies dans

106

le tableau si on utilise le mode associatif. Autrement dit, il faut se rappeler que les cls
sont sensibles la casse.

La scurit
La scurit
La scurit dune base de donnes manipule avec PHP concerne 2 larges domaines :
la protection des informations contre des accs indsirables ;
la prudence lors des insertions de donnes dans la base.
re
On peut satisfaire la 1
condition en Plaant le script de connexion en dehors du
rpertoire Web.
Pour la 2me condition :
Lorsquon effectue des requtes sur des bases de donnes, des apostrophes ou des
guillemets, par exp., pourraient crer des erreurs dans nos commandes SQL.
La scurit
On peut appeler la fonction mysql_real_escape_string () :
mysql_real_escape_string ($val);

Cette fonction est comparable la fonction add_slashes () et devrait normalement tre


utilise avec tous les champs de type texte de nos formulaires.
Elle ne peut tre appele que si la connexion la base de donnes a t
prcdemment effectue.

La scurit
Magic Quotes et mysql_real_escape_string () :
Lorsque loption Magic Quotes est active, certains caractres particuliers saisis dans
un formulaire seront automatiquement chapps.
On commence par tester le statut de Magic Quotes au moyen dun appel la fonction
ini_get () qui va renvoyer ltat de loption dont le nom figure en argument, option qui
figure dans le fichier php.ini.
TRUE signifie que loption est active. Dans ce cas, on commencerai par dbarrasser la
chane de caractres de ses antislashes dchappement avant dappeler
mysql_real_escape_string ()
Utiliser mysql_real_escape_string ()
Nouvelle version du script denregistrement avec la fonction mysql_real_escape_string ()
:
<?php # Listing - enregistrer-1.php
// Dfinir le titre de la page et inclure l'en-tte de page
$titre_page = "Enregistrement";
include ('modeles/entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire
// se connecter la base
require_once ('modeles/mysql_connect-1.php');
// Crer une fonction pour chapper les donnes.
function echappement ($data)

107

{ global $bd; // connexion ncessaire


if (ini_get('magic_quotes_gpc'))
{ $data = stripslashes($data);
}
return mysql_escape_string($data);
} // fin de la fonction
$message = NULL;

// crer une variable vide

// Vrifier la prsence d'un prnom


if (empty($_POST['prenom']))
{ $p = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre prnom</p>';
}
else
{ $p = echappement($_POST['prenom']);
}
// Vrifier la prsence d'un nom
if (empty($_POST['nom']))
{ $n = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
else
{ $n = echappement($_POST['nom']);
}
// Vrifier l'existence d'une adresse e-mail
if (empty($_POST['email']))
{ $e = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre adresse e-mail</p>';
}
else
{ $e = echappement($_POST['email']);
}
// Vrifier la prsence d'un nom d'utilisateur
if (empty($_POST['nom_utilisateur']))
{ $u = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
else
{ $u = echappement($_POST['nom_utilisateur']);
}
// Vrifier l'existence et l'exactitude du mot de passe
if (empty($_POST['mot_de_passe1']))
{ $mp = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
else
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])

108

{ $mp = echappement($_POST['mot_de_passe1']);
}
else
{ $mp = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez
prcdemment dclar</p>';
}
}
if ($p && $n && $e && $u && $mp)
{ // Si tout est correct, enregistrer l'utilisateur dans la base
// crer la requte
$rq = "INSERT INTO utilisateurs(nom_utilisateur, prenom, nom, email,
mot_de_passe, date_enreg)
VALUES ('$u', '$p', '$n', '$e', PASSWORD('$mp'), NOW())";
// lancer la requte
$result = mysql_query($rq);
if ($result) // Si l'enregistrement est correct
{ // Envoyer ventuellement un e-mail
echo "<p><b>Merci de vous tre enregistr sur notre site.</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
{ echo "<p>Vous n'avez pas pu tre enregistr cause d'une erreur systme".
"<p></p>" . mysql_error() . "<p></p>";
}
mysql_close();

// refermer la connexion avec la base de donnes


}
else
{ // Quelque chose n'est pas correct
$message .= '<p>Veuillez avoir l\'obligeance de recommencer</p>';
}
}
// Afficher ventuellement un ou plusieurs messages d'erreur
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Prnom :</b>
<input type="text" name="prenom" size="15" maxlength="15"
value="<?php if (isset($_POST['prenom'])) echo $_POST['prenom']; ?>"/>
</p>
<p><b>Nom :</b>

109

<input type="text" name="nom" size="30" maxlength="30"


value="<?php if (isset($_POST['nom'])) echo $_POST['nom']; ?>"/>
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="40"
value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>"/>
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_utilisateur']))
echo $_POST['nom_utilisateur']; ?>"/>
</p>
<p><b>Mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="20" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="20" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>
Remarques
Cette fonction nexiste que depuis la version 4.3.0 de PHP.
Sans le recours cette fonction et avec Magic Quotes dsactive, un nom irlandais
comme "O'Maley" gnrera une erreur parce que lapostrophe prsente dans le
patronyme va entrer en conflit avec les apostrophes utilises dans la requte.
Avec Magic Quotes active, on peut utiliser la fonction stripslashes(). Mais, lorsquon
voudrai rcuprer la valeur enregistre pour la rafficher dans le formulaire, elle sera
incorrectement affiche.
La fonction get_magic_quotes_gpci() permet de connatre ltat de Magic Quotes.

Utilisation de mysql_num_rows()
Utilisation de mysql_num_rows()
La fonction mysql_num_rows () renvoie le nombre de lignes rcupres par une requte SELECT
partir de son rsultat.
Exemples dutilisation :
Modifier visualiser.php pour afficher le nombre dutilisateurs enregistrs.
Modifier enregistrer-1.php pour voir si un nom dutilisateur existe dj.

110

Utilisation de mysql_num_rows()
Nouvelle version du script visualiser.php :
Afficher le nombre dutilisateurs enregistrs
<?php # Listing - visualiser-1.php
// Ce script rcupre et affiche tous les enregistrements
// de la table utilisateurs
$titre_page = 'Utilisateurs couramment enregistrs';
include ('modeles/entete.inc');
// Connexion la base de donnes
require_once ('modeles/mysql_connect-1.php');
// Crer la requte.
$rq = "SELECT CONCAT(nom, ', ', prenom) AS nom_complet, ".
"DATE_FORMAT(date_enreg, '%d/%m/%Y') AS d_enr FROM utilisateurs ".
"ORDER BY date_enreg ASC";
// lancer la requte
$result = @mysql_query ($rq) or die (mysql_error());
$nb = mysql_num_rows($result); // Combien y a-t-il d'utilisateurs ?
if ($nb > 0)
{ // S'il y en a, afficher les enregistrements
echo '<table align="center" cellspacing="2" cellpadding="2" '.
'width="400">';
echo "<caption><big><b>Il y a actuellement $nb utilisateurs ".
"enregistrs</b></big></caption>
<tr><td align='center'><b>Nom</b></td>
<td align='center'><b>Date<br>d'enregistrement</b></td></tr>";
// Rcuprer et afficher tous les enregistrements
while ($ligne = mysql_fetch_array($result, MYSQL_NUM))
{ echo "<tr><td>".stripslashes($ligne[0])."</td>
<td align='center'>$ligne[1]</td></tr>\n";
}
echo '</table>';
mysql_free_result ($result); // Librer les ressources
}
else
{ // Il n'y a personne
echo "<p>Aucun utilisateur n'est actuellement enregistr.</p>";
}
mysql_close(); // Refermer la connexion avec la base de donnes
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>
Utilisation de mysql_num_rows()
Nouvelle version du script enregistrer.php :
Vrification de lexistence dun nom dutilisateur identique
<?php # Listing - enregistrer-2.php
// Dfinir le titre de la page et inclure l'en-tte de page
$titre_page = "Enregistrement";

111

include ('modeles/entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire
// Crer une fonction pour chapper les donnes.
function echappement ($data)
{ global $bd;
// connexion ncessaire
if (ini_get('magic_quotes_gpc'))
{ $data = stripslashes($data);
}
return mysql_escape_string($data);
} // fin de la fonction
require_once ('modeles/mysql_connect-1.php'); // connexion la base de donnes
$message = NULL;
// crer une variable vide
// Vrifier la prsence d'un prnom
if (empty($_POST['prenom']))
{ $p = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre prnom</p>';
}
else
{ $p = echappement($_POST['prenom']);
}
// Vrifier la prsence d'un nom
if (empty($_POST['nom']))
{ $n = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom</p>';
}
else
{ $n = echappement($_POST['nom']);
}
// Vrifier l'existence d'une adresse e-mail
if (empty($_POST['email']))
{ $e = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre adresse e-mail</p>';
}
else
{ $e = echappement($_POST['email']);
}
// Vrifier la prsence d'un nom d'utilisateur
if (empty($_POST['nom_utilisateur']))
{ $u = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
else
{ $u = echappement($_POST['nom_utilisateur']);
}
// Vrifier l'existence et l'exactitude du mot de passe
if (empty($_POST['mot_de_passe1']))
{ $mp = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre mot de passe</p>';
}
else

112

{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $mp = echappement($_POST['mot_de_passe1']);
}
else
{ $mp = FALSE;
$message .= '<p>Votre mot de passe est diffrent de celui que vous avez prcdemment
dclar</p>';
}
}
if ($p && $n && $e && $u && $mp)
// Si tout est correct
{ // Voir si l'utilisateur existe dj
$rq = "SELECT id_utilisateur FROM utilisateurs WHERE nom_utilisateur='$u'";
$result = mysql_query ($rq);
// excuter la requte
if (mysql_num_rows($result) == 0) // pas encore enregistr
{ // crer une nouvelle requte
$rq = "INSERT INTO utilisateurs (nom_utilisateur, prenom, nom, email, mot_de_passe,
date_enreg) VALUES ('$u', '$p', '$n', '$e',
PASSWORD('$mp'), NOW())";
// lancer la requte d'enregistrement
$result = mysql_query($rq);
if ($result)
// Si l'enregistrement est correct
{ // Envoyer ventuellement un e-mail
echo "<p><b>Merci de vous tre enregistr sur notre site.</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
{ echo "<p>Vous n'avez pas pu tre enregistr cause d'une erreur systme".
"<p></p>" . mysql_error() . "<p></p>";
}
}
else
{ $message .= "<p>Nom d'utilisateur dj utilis</p>";
}
mysql_close();
// refermer la connexion avec la base de donnes
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}
// Afficher ventuellement un ou plusieurs messages d'erreur
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>
<p><b>Prnom :</b>
<input type="text" name="prenom" size="15" maxlength="15"
value="<?php if (isset($_POST['prenom'])) echo $_POST['prenom']; ?>"/>
</p>

113

<p><b>Nom :</b>
<input type="text" name="nom" size="30" maxlength="30"
value="<?php if (isset($_POST['nom'])) echo $_POST['nom']; ?>"/>
</p>
<p><b>Adresse e-mail :</b>
<input type="text" name="email" size="40" maxlength="40"
value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>"/>
</p>
<p><b>Nom d'utilisateur :</b>
<input type="text" name="nom_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_utilisateur']))
echo $_POST['nom_utilisateur']; ?>"/>
</p>
<p><b>Mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="20" />
</p>
<p><b>Confirmez votre mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="20" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Envoyer les informations" />
</div>
</form><!-- Fin du formulaire -->
<?php
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>

Modification des enregistrements avec PHP


Modification des enregistrements avec PHP
La fonction mysql_affected_rows () renvoie le nombre denregistrements qui ont t
affects par une requte de type INSERT, UPDATE ou DELETE :
$nb = mysql_afected_rows ($bd);
O $bd est lidentificateur de connexion renvoy lors de ltablissement de la connexion avec
la base de donnes et non pas le rsultat dune prcdente requte.
Modification des enregistrements avec PHP
On va crire un script change_mp.php qui permet un utilisateur dj enregistr de
modifier son mot de passe.
Application de deux ides importantes :
comparaison dun nom dutilisateur et dun mot de passe saisis par un utilisateur avec
des valeurs prcdemment enregistres,
mise jour denregistrements en utilisant la cl primaire comme point de rfrence.
Modification des enregistrements avec PHP
<?php # Listing - change_mp.php

114

// Dfinir le titre de la page et inclure l'en-tte de page


$titre_page = "Changer un mot de passe";
include ('modeles/entete.inc');
if (isset($_POST['submit']))
{ // Traiter le formulaire
// Crer une fonction pour chapper les donnes.
function echappement ($data)
{ global $bd;
// connexion ncessaire
if (ini_get('magic_quotes_gpc'))
{ $data = stripslashes($data);
}
return mysql_escape_string($data);
} // fin de la fonction
// connexion la base de donnes
require_once ('modeles/mysql_connect-1.php');
// crer une variable vide
$message = NULL;
// Vrifier la prsence d'un nom d'utilisateur
if (empty($_POST['nom_utilisateur']))
{ $u = FALSE;
$message .= '<p>Vous avez oubli d\'indiquer votre nom d\'utilisateur</p>';
}
else
{ $u = echappement($_POST['nom_utilisateur']);
}
// Vrifier l'existence de l'ancien mot de passe
if (empty($_POST['mot_de_passe']))
{ $mp = FALSE;
$message .= "<p>Vous avez oubli d'indiquer votre ancien mot de passe</p>";
}
else
{ $mp = echappement($_POST['mot_de_passe']);
}
// Vrifier l'existence d'un nouveau mot de passe
if (empty($_POST['mot_de_passe1']))
{ $np = FALSE;
$message .= "<p>Vous avez oubli d'indiquer votre nouveau mot de passe</p>";
}
else
{ if ($_POST['mot_de_passe1'] == $_POST['mot_de_passe2'])
{ $np = echappement($_POST['mot_de_passe1']);
}
else
{ $np = FALSE;
$message .= "<p>Votre second mot de passe est diffrent de ".

115

"celui que vous venez de saisir</p>";


}
}
if ($u && $mp && $np)
{ $rq = "SELECT id_utilisateur FROM utilisateurs
WHERE (nom_utilisateur= '$u' AND mot_de_passe=PASSWORD('$mp'))";
$result = mysql_query($rq);
$nb = mysql_num_rows($result);
if ($nb == 1)
// cest quil existe bien un utilisateur rpondant aux critres dfinis. On rcupre
// le paramtre id_utilisateur dans llment de tableau $ligne[0] par :
{ $ligne = mysql_fetch_array($result, MYSQL_NUM);
// On peut alors lancer un requte de modification par :
$rq = "UPDATE utilisateurs SET mot_de_passe=PASSWORD('$np')
WHERE id_utilisateur=$ligne[0]";
$result = mysql_query($rq);
if (mysql_affected_rows() == 1) // Si c'est OK, la modification a russi
{ // Envoyer ventuellement un e-mail
echo "<p><b>Votre mot de passe vient d'tre modifi.</b></p>";
include ('modeles/pied_page.inc'); // inclure le pied de page
exit();
// terminer le script
}
else
// il y a eu un problme
{ echo "<p>Votre nouveau mot de passe n'a pas pu tre modifi ".
" cause d'une erreur systme : <p></p>".mysql_error()."<p></p>";
}
}
else
{ $message .= "<p>Votre nom d'utilisateur et votre mot de passe ne".
" correspondent pas un utilisateur enregistr.</p>";
}
// refermer la connexion avec la base de donnes
mysql_close();
}
else
{ // Quelque chose n'est pas correct
$message .= "<p>Veuillez avoir l'obligeance de recommencer</p>";
}
}
// Afficher ventuellement un ou plusieurs messages d'erreur
if (isset($message))
{ echo "<font color='red'>$message</font>";
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<legend>Veuillez renseigner le formulaire ci-dessous :</legend>

116

<p><b>Nom d'utilisateur :</b>


<input type="text" name="nom_utilisateur" size="10" maxlength="20"
value="<?php if (isset($_POST['nom_utilisateur']))
echo $_POST['nom_utilisateur']; ?>"/>
</p>
<p><b>Mot de passe actuel :</b>
<input type="password" name="mot_de_passe" size="20" maxlength="20" />
</p>
<p><b>Nouveau mot de passe :</b>
<input type="password" name="mot_de_passe1" size="20" maxlength="20" />
</p>
<p><b>Confirmez votre nouveau mot de passe :</b>
<input type="password" name="mot_de_passe2" size="20" maxlength="20" />
</p>
</fieldset>
<div align="center">
<input type="submit" name="submit" value="Changer mon mot de passe" />
</div>
</form><!-- Fin du formulaire -->
<?php
include ('modeles/pied_page.inc'); // Inclure le pied de page
?>

117

Annexe
Les balises (X)HTML - Les proprits CSS
Balises (X)HTML
<html></html>

BALISES FONDAMENTALES
Dlimite le document HTML.

<head></head>

Dlimite len-tte du document HTML.

<frameset></frameset>

Dfinit le jeu de cadres dune fentre ou dun cadre.

<body></body>

Dlimite le corps du document HTML.

< !---->

Commentaire.

href=""

BALISES DEN-TTE
Dfinit une valeur de rfrence globale pour le document. Utilis avec un et un seul
des attributs ci-dessous.
URL de rfrence, qui servira de base au traitement des URL relatives.

target=""

Cadre cible des liens par dfaut.

<meta></meta>

Permet dinsrer de linformation non affiche par le navigateur (mta-information).

name=""

Type de mta-information. Exemple de valeur : keywords.

content=""

Contenu de la mta-information. Exemple : liste de mots-cls.

<meta></meta>

Permet de spcifier la valeur dun champ den-tte HTTP.

http-equiv=""

Nom du champ den-tte. Exemple de valeur : Refresh (ractualise la page aprs un


dlai dfini).
Contenu du champ den-tte. Exemple de valeur :
5 ; URL=http://www.monsite.com (5 est le temps entre les rafrachissements, suivi
de lURL o aller chercher la page).

<base />

content=""

<link />

Lie le document une ressource externe (par exemple une feuille de style).
Utilis dans <head>.

href=""

Adresse de la ressource.

rel=""

Type lien (stylesheet pour les feuilles de style).

type=""

Type de contenu internet (text/css pour les feuilles de style CSS).

<style></style>

Permet dinclure une feuille de style CSS interne dans un document.

<script></script>

Permet de dfinir un script pour rendre une page HTML dynamique.

<title></title>

Indique le titre du document.

<frameset></frameset>

BALISES DE DFINITION DE CADRES


Dfinit le jeu de cadres dune fentre ou dun cadre.

118

rows=""

Sparation des cadres horizontale. Utilis dans <frameset>.


Valeur : les largeurs des cadres spares par des virgules. Unit : points (px) ou
pourcents (%).

cols=""

Sparation des cadres verticale. Utilis dans <frameset>.


Valeur : les largeurs des cadres spares par des virgules. Unit : points (px) ou
pourcents (%).

<frame />

Identifie chaque cadre de <frameset> dans lordre o ils sont dfinis.

src=""

Nom du fichier HTML source du cadre.

id=""

Identificateur du cadre. Permet dy faire rfrence depuis un autre cadre.

BALISES DE CORPS DE DOCUMENT : BALISES DE STRUCTURATION DE TEXTE


er
<h1></h1>
Titre de 1 niveau.
me
<h2></h2>
Titre de 2 niveau.
me
<h3></h3>
Titre de 3 niveau.
ime
<h4>, <h5>, <h6>
Titre de n niveau. Pas de mise en forme prdfinie.
<p></p>
Paragraphe.
<br />

Saut de ligne.

<hr />

Ligne horizontale.

id=""

Identifiant dun lment quelconque du document XHTML. Doit tre unique.

name=" "

Nom dun lment du document HTML. Utilis pour la compatibilit ascendante


avec les navigateurs non compatibles XHTML. Il est conseill dutiliser les deux
attributs avec la mme valeur.

<span></span>

Ne fait rien, dfinit lemplacement dattributs style ou autres.

<div></div>

Identique <span>, mais insre un saut de ligne en fin de balise.

class=""

Permet dappliquer un style dfini dans une feuille de style CSS (interne ou externe).
Utilisable dans <span>, <div>,<body> et dans la plupart des autres balises HTML.
Fortement recommand en XHTML.
Contient les dfinitions de style intgrs avec la syntaxe CSS. Utilisable dans
<span>, <div>,<body> et dans la plupart des autres balises HTML. Tolr par la
recommandation XHTML-Strict.

style=""

<table></table>

BALISES DE CORPS DE DOCUMENT : TABLES


Dfinit une table.

<th></th>

En-tte de table. Mise en forme particulire du contenu. Utilis dans <table>.

<tr></tr>

Ligne de table. Utilis dans <table>.

<td></td>

Colonne de table. Utilis dans <tr>.

border="."

paisseur de la bordure de la table. Valeurs : 0 (dfaut)= invisible ; 1, 2 etc.

<form></form>

BALISES DE CORPS DE DOCUMENT : FORMULAIRES


Dlimite lemplacement dun formulaire.

method=""

Type de mthode utilise pour lenvoi du formulaire. Valeurs autorises : get, post.
Valeur par dfaut : get.

action=""

Action raliser la soumission du formulaire.

119

<button></button>

Introduit un bouton standard dans la page.

<input></input>

Balise gnrique dentre dans un formulaire.

type=""

Type de lentre standard. Valeurs autorises : text, hidden, checkbox, radio, submit,
reset.

checked="checked"

Indique quun lment de type radio (bouton radio) est coch par dfaut.

<select></select>

Liste droulante.

<option></option>

lment de la liste droulante. Utilis dans <select>.

selected="selected"

Indique quune option de la liste est slectionne par dfaut.

<textarea></textarea>

Zone de texte.

<img />

BALISES DE CORPS DE DOCUMENT : IMAGES


Identifie le point dinsertion dune image.

src=""

URL permettant daccder au fichier contenant limage.

alt=""

Info-bulle (pop-up) o on peut faire apparatre des informations sur limage.


BALISES DE CORPS DE DOCUMENT : ANCRES DE LIENS
Avec lattribut href, dfinit le point dancrage dun lien vers un autre document ;
avec lattribut name, dfinit un point dancrage vers lequel un lien peut pointer.

<a></a>

href=""

URL du document ou du point dancrage vers lequel pointe le lien.

title=""

Info-bulle (pop-up) o on peut faire apparatre des informations sur le lien.

<applet></applet>

BALISES DE CORPS DE DOCUMENT : AUTRES OBJETS


Applet Java.

code=""

Fichier java compil de lapplet (.class).

<object></object>

Objet de type quelconque.

param=""

Dfinition dun paramtre de lobjet.

BALISES DE CORPS DE DOCUMENT : LISTES ET CARACTERES SPCIAUX


<ol></ol>
Liste puces classe(numrote).
<ul></ul>

Liste puces non classe.

start=""

Valeur initiale de numrotation de cette liste (balise <ol>).

type=""

- Type de numrotation ; valeurs possibles A, a, I, i et 1 (dfaut).


- Type de puce utilis pour marquer les lments de la liste ; valeurs possibles : disc,
circle et square.

<li></li>

lment de liste utilis avec <ol> et <ul>.

value=""
<dl></dl>

Valeur numrique de cet lment de liste ( affecte cet lment et tous les lments
suivants dans les listes <ol>).
Liste de dfinitions

<dt></dt>

Terme de dfinition appartenant une liste de dfinitions.

<dd></dd>

<b></b>

Dfinition correspondant un terme de dfinition, appartenant une liste de


dfinition. Contenu dcal vers la droite.
BALISES DE CORPS DE DOCUMENT : MISE EN FORME DU TEXTE
(HTML et XHTML transitionnel seulement)
Gras.

120

<i></i>

Italique.

<u></u>

Soulign.

<strike></strike>

Barr petit (trace une ligne sur le texte).

<small></small>

Petit texte.

<big></big>

Gros texte.

<sup></sup>

Exposant.

<sub></sub>

Indice.

<tt></tt>

Petite police tltype chasse fixe.

<pre><pre>

Petite police tltype chasse fixe. Conserve les espaces et les sauts de ligne.

BALISES DE CORPS DE DOCUMENT : POLICES (HTML et XHTML transitionnel seulement)


<font></font>
Dfinition dune police.
size=""
color=""

Taille de la police, de 1 7. La taille par dfaut est 3. Peut galement tre spcifie
comme valeur relative la taille actuelle, par exemple,+2 ou-1.
Change la couleur du texte.

face=""

Nom de la police utilise si elle se trouve dans le systme de lutilisateur. Des


virgules peuvent sparer plusieurs noms de polices et la premire police utilise dans
la liste sera utilise.
BALISES DE CORPS DE DOCUMENT : ATTRIBUTS DE STYLE (HTML et XHTML transitionnel
seulement)
align=""
Alignement horizontal du texte. Utilisable avec <p>,<h1>,<h2> etc.
Valeurs autorises : left, center, right.
valign=""

Alignement vertical du texte dun lment de table. Utilisable avec <tr>,<td>.


Valeurs autorises : top, middle, bottom.

height=""

Hauteur dune zone dcran. Utilisable avec <div>, <table> ou <applet>.

width=""

Largeur dune zone dcran. Utilisable avec <div>, <table> ou <applet>.

121

Liste des proprits CSS


La liste suivante prsente brivement les principaux attributs de style CSS, leffet des proprits
quils implmentent, les valeurs les plus utilises de ces attributs et des exemples dutilisation.
Ces spcifications sont tires de la recommandation CSS2 du W3C.

1. Styles de police
font-family

Nom de police (une police prcise : Arial, Times, Helvetica...) ou une famille de police (serif,
sans-serif, cursive, fantasy, monospace)
h3 {font-family: Arial}
font-style

Style du texte : normal, italic ou oblique


h3 {font-style: italic}
font-weight

paisseur de la police : normal, bold, bolder ou lighter ou valeur numrique (100 | 200 | 300 | 400
| 500 | 600 | 700 | 800 | 900)
p {font-weight: bold}
font-size

Taille de la police : xx-small, x-small, small, mdium, large, x-large, xx-large, larger ou smaller ou
taille prcise en points (pt), inches (in), centimtres (cm), pixels (px) ou pourcentage de la
police parente(%).
p {font-size: 12pt}
font-variant

Modification de la police normale : normal ou small-caps


p {font-variant: small-caps}
font

Raccourci pour les diffrentes proprits de police.


p {font: bold italic}

2. Styles de texte
text-align

Alignement du texte : left, center ou right.


h1 {text-align: center}
text-indent

Retrait dans la premire ligne d'un bloc de texte. Spcifi en inches (in), centimtres (cm),
pixels (px) ou pourcentage (%).
p {text-indent: 1cm}
text-decoration

122

Mise en forme particulire du texte (barr, clignotant, etc.) : blink, underline, line-through,
overline ou none.
a:visited {text-decoration: blink}
text-transform

Modification de la casse du texte : uppercase (met les caractres en majuscules), lowercase


(met les caractres en minuscules) ou capitalize (met le premier caractre en majuscule).
p {text-transform: uppercase}
color

Couleur du texte : nom de couleur HTML 4.0 ou code RGB hexadcimal.


h3 {color: #000080}
word-spacing

Espacement des mots : valeur en points (pt), inches (in), centimtres (cm), pixels (px) ou
pourcentage (%).
p {word-spacing: 5pt}
letter-spacing

Espacement des lettres : valeur en points (pt), inches (in), centimtres (cm), pixels (px), ou
pourcentage (%).
p {letter-spacing: 2pt}
line-height

Interligne (i.e. espace entre les lignes du texte) : en points (pt), inches (in), centimtres (cm),
pixels (px) ou pourcentage (%).
p {line-height: 10pt}
width

Largeur d'un lment de bloc : en points (pt), inches (in), centimtres (cm), pixels (px), ou
pourcentage (%).
h1 {width: 200px}
height

Hauteur d'un lment de bloc : en points (pt), inches (in), centimtres (cm), pixels (px), ou
pourcentage (%).
h1 {height: 100px}
white-space

Espace ou blanc : normal, pre ou nowrap.


pre {white-space: pre}

3. Arrire-plans
background-color

Couleur de l'arrire-plan : nom de couleur HTML 4.0, code RGB hexadcimal ou transparent.
body {background-color: #000000}
background-image

Image d'arrire-plan : URL de l'image.


123

body {background-image: Images/image1.gif}


background-repeat

Nombre de rptitions de l'image d'arrire-plan : repeat (par dfaut), no-repeat, repeat-x


(l'image ne se rpte qu'horizontalement) ou repeat-y (L'image ne se rpte que
verticalement).
p {background-image: image.gif; background-repeat: repeat-x}
background-attachment

Spcifie si l'image d'arrire-plan reste fixe avec les dplacements de l'cran : scroll ou fixed.
body {background-image: image.gif; background-attachement: fixed}
background-position

Position de l'image d'arrire-plan par rapport au coin suprieur gauche de la fentre ; spcifie
par un couple de valeurs spares par une espace : {top ou center ou bottom ET left ou center
ou right}, ou en points (pt), inches (in), centimtres (cm), pixels (px) ou pourcentage (%).
body {background-image: img.gif; background-position: right top}
background

Raccourci pour les diffrentes proprits d'arrire-plan.


p {background: image.gif fixed repeat-y}

4. Marges
margin-top

Taille de la marge suprieure : auto ou en points (pt), inches (in), centimtres (cm), pixels (px)
ou pourcentage (%).
td {margin-top: 5px }
margin-right

Taille de la marge droite : auto ou en points (pt), inches (in), centimtres (cm), pixels (px) ou
pourcentage (%).
p {margin-right: 5px }
margin-bottom

Taille de la marge infrieure : auto ou en points (pt), inches (in), centimtres (cm), pixels (px)
ou pourcentage (%).
h1 {margin-bottom: 5px }
margin-left

Taille de la marge gauche : auto ou en points (pt), inches (in), centimtres (cm), pixels (px) ou
pourcentage (%).
h3 {margin-left: 5px }
margin-left

Taille de la marge pour les quatre cts la fois : auto ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h5 {margin: 5px }

124

5. Bordures et "enrobages"
border-top-width

paisseur de la bordure suprieure : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-top-width: thin}
border-right-width

paisseur de la bordure droite : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-right-width: medium}
border-bottom-width

paisseur de la bordure infrieure : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-bottom-width: thick}
border-left-width

paisseur de la bordure gauche : thin ou medium ou thick ou en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {border-left-width: 0.5cm}
border-width

paisseur de la bordure des quatre cts la fois : thin ou medium ou thick ou en points (pt),
inches (in), centimtres (cm), pixels (px) ou pourcentage (%).
h4 {border- width: 5px}
border-color

Couleur de la bordure : nom de couleur HTML 4.0 ou code RGB hexadcimal.


h3 {border-color: yellow}
border-style

Style du trait de la bordure : none, solid, dotted, dashed, double, groove, ridge, inset ou outset.
table {border-style: solid dashed}
border

Regroupe toutes les proprits de bordure.


padding-top

Remplissage entre le haut du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-top: 3px}
padding-right

Remplissage entre la droite du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-right: 3px}
padding-bottom

125

Remplissage entre le bas du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-bottom: 3px}
padding-left

Remplissage entre la gauche du contenu de l'lment et le bord : en points (pt), inches (in),
centimtres (cm), pixels (px) ou pourcentage (%).
h3 {padding-left: 3px}
padding

Remplissage entre le contenu de l'lment et le bord des quatre cts la fois : en points (pt),
inches (in), centimtres (cm), pixels (px) ou pourcentage (%).
h5 {padding: 3px}

6. Listes
list-style-type

Type de puces ou de numrotation : disc, circle, square decimal, lower-roman, upper-roman,


lower-alpha ou upper-alpha.
ul {list-style-type: square}
list-style-image

Remplacement des puces par une image : URL ou none.


ul {list-style-image: image.gif}
list-style-position

Spcifie si les puces sont l'intrieur ou l'extrieur du texte : inside ou outside.


ul {list-style-position: inside}
list-style

Regroupe toutes les proprits de liste.

126

Bibliographie

PHP 5 - MySQL 5 AJAX : 1re dition, 12/2007 Editions ENI, ISBN13 : 978-2-74604057-1

Pratique de MySQL et PHP : 3me dition, Janvier 2005 Editions O'Reilly, ISBN13 :
9782841773381

PHP 5 et Apache 2 : 1 dition, 2006-06-08 Editions ENI, ISBN13 : 9782746033252

Les Cahiers du programmeur PHP 5 : 1 dition, 2004-06-01 Editions Eyrolles, ISBN13 :


9782212112344

Premires applications Web 2.0 avec Ajax et PHP : Janvier 2008 Editions Eyrolles,
ISBN13 : 9782212120905

PHP 5 Avanc : 3eme dition, 2 octobre 2006 Editions Eyrolles, ISBN10 : 2212120044

127

Вам также может понравиться