Web Ada
Web Ada
Web Ada
Développement WEB
Chapitre 1 – Généralités
Chapitre 2 – Liens
Chapitre 3 – Contenus
Chapitre 1
HTML & Généralités
1.Préambule
HTML5 apporte des évolutions majeures et sera la plateforme de développement principale dans un
proche avenir.
Le balisage est la partie visible de l'iceberg de HTML5 avec entre autre le support natif des lecteurs
vidéo/audio, la spécialisation des blocs conteneurs (div & span) etc.
Mais il faut ajouter à cela la naissance d'une véritable API ( Application Programming Interface) pour
étendre le dynamisme et l'interaction avec le DOM (Document Object Model – déjà existant depuis
HTML4).
Le volet balisage d'HTML5 est semblable dans le principe que HTML4, en revanche sous le nom HTML5 on
désigne une API de développement ce qui n'est pas le cas de la version 4.
Dans l'absolu :
HTML 5 = Balisage + Style + API
Le style permet, à la manière des traitements de texte, de mettre en forme les documents HTML. Ce sont
des instructions spécifiques regroupées sous la norme CSS ( Current Style Sheet ).
L'API repose sur le langage « JavaScript » qui apporte le dynamisme, l'ergonomie et l'interaction pour
développer de véritables applications exécutées par le navigateur.
Pour résumer :
Remarque :
La version 5 n'est toujours pas validée par le consortium W3C ( chargé de mettre en place les
recommandations ) mais déjà supportée par la plupart des navigateurs.
2.Introduction HTML
HTML (HyperText Markup Language) est un langage de description de documents. Quelques autres
langages, ayant la même vocation existaient au démarrage du World Wide Web, mais le besoin de
définir un nouveau langage s'est imposé ; il fallait fournir une fonctionnalité supplémentaire : la
navigation hypertexte
La navigation hypertexte consiste à fournir la possibilité de cliquer sur certaines zones du document
(lien hypertexte) pour accéder une autre partie du site, voire un autre site Web.
Comme écrit ci-dessus, HTML est un langage de description de documents mais en aucun cas un langage
de programmation. La distinction est importante car elle permet de dissocier les fonctions de l'API dans sa
globalité. La programmation sera faite en JavaScript.
Non, HTML décrit la façon dont le navigateur interprète la page web, elle sera chargée une fois et ne
bougera plus. On parle alors de page « statique ».
La navigateur lit le contenu du fichier et fait la distinction entre le contenu et la mise en page. Les
informations sont lues à la volées ( au moment du chargement) et interprétée en même temps quelle
qu'en soit la source (fichier sur disque dur ou via la connexion réseau ). Ce mode de lecture « instantanée »
remonte à l'époque où les connexions étaient très lentes ( via modem) et pour éviter d'avoir une page
blanche pendant de très longues secondes, le navigateur affichait progressivement la page web en
fonction de la vitesse de téléchargement.
Rien n'est plus facile que d'écrire un document HTML : il suffit d'écrire le texte dans un fichier
(d'extension .htm ou .html).
Cependant, il existe des « instructions » HTML permettant de rendre un document plus complet, plus
agréable à lire.
Toute instruction HTML, pour être reconnue du texte proprement dit, doit être entourée par les
caractères < et > par exemple <hr> est donc une instruction du langage HTML (elle permet de placer
un ligne horizontale de séparation dans le document). On parle alors de balise HTML.
Elle doit débutée par une balise particulière notée <html> qui indique au navigateur qu'il va recevoir une
page HTML. Cette balise indiquera aussi la fin du document.
Exemple :
<html> ← début du document HTML
… document web
</html> ← fin du document HTML
Tout ce qui est situé entre <html> et </html> est considéré par le navigateur comme étant du HTML.
Remarque :
Le caractère « / » permet de créer une balise dite « antagoniste » ( on parle aussi de balise fermante ) qui
délimite la zone d'influence. Certaines balises ne nécessitent pas d'antagoniste .
a. L'en-tête
Exemple :
<html>
<head>
… définition de l'entête
</head>
… suite du document HTML
</html>
On remarque que l'en-tête est intégrée au document html ( située dans la zone délimitée par <html>).
Elle est toujours placée au début du document.
L'en-tête contient des informations qui ne seront pas affichées dans la page web mais qui ont une
influence sur celle-ci.
Elle permet :
• de titrer le document
• de définir des méta-données qui serviront à l'affichage, aux moteurs de recherches etc.
• d'inclure des scripts javascript, des instructions CSS
• de faire le lien entre le document HTML et des fichiers externes
Cela signifie que l'en-tête va contenir des balises qui lui sont propres et qui doivent être interprétées au
début du chargement de la page web.
Exemple :
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <meta httpequiv="contenttype" content="text/html; charset=utf8">
5. <meta name="keywords" content="Lycée félix le dantec, lycée,BTS,licence pro">
6. <meta name="description" content="Lycée Félix le Dantec, 4 BTS et 3 licences Pro.">
7. <title>Lycée Félix le Dantec V2014</title>
8. <link rel="stylesheet" href="/media/system/css/modal.css" type="text/css">
9. <style type="text/css">
10. #jsnpage {
11. minwidth: 1100px;
12. }
13. .boxtitle {
fontfamily: Verdana;
14. fontsize: 12px;
15. fontweight: bold;
16. textalign: left;
17. color: #E9E9E9;}
18. </style>
19. <script src="/media/jui/js/jquery.min.js" type="text/javascript"></script>
20. <script type="text/javascript">
21. window.addEvent('domready', function() {
22. SqueezeBox.initialize({});
23. SqueezeBox.assign($$('a.modal'), {
24. parse: 'rel'
25. });
26. });
27. jQuery(window).on('load', function() {
28. new JCaption('img.caption');
29. });
30. (function($){
31. $('.dropdowntoggle').dropdown();
32. })(jQuery);
33. </script>
34. </head>
…Reste de la page HTML
</html>
Exercice
A partir de l'exemple ci-dessus :
1-Donnez la zone d'influence de l'en-tête ( numéros de ligne)
Lignes 3 à 34
2-Donnez les différentes balises incluses dans l'en-tête ainsi que leur rôle respectif.
<meta> , balise qui fournit des informations relatives à la page, mots clés pour les moteurs de
recherche, la table d'encodage de caractères
<link>, associe un fichier externe de style modal.css
<style>, balise qui délimite du code CSS
<script> ligne 19, associe un fichier js externe
<script> ligne 20, délimite du code js
3-Que constatez-vous pour certaines d'entre elles - ligne 4 par exemple en comparaison avec la ligne 7 ?
<meta> ne délimite pas de zone d'influence, pas de </meta> d'ou le / en fin de balise
b. Le corps
Le corps d'un fichier HTML débute par la balise <body> et se termine par </body>. Ce couple de balises
succède à l’en-tête .
Elle peut prendre un certain nombre de paramètres qui permettent de spécifier les caractères
généraux de la page comme les différentes couleurs dans la page (texte, fond, lien etc.), les polices et
les tailles de caractères par défaut etc.
On utilise de moins en moins ces paramètres, la présentation et le style sont désormais décrits dans
les feuilles de styles CSS.
Exemple :
<html>
<head>
...zone entête
</head>
<body>
...zone du corps du document HTML
</body>
</html>
Cette balise permet de définir la partie du document html qui sera affichée dans la fenêtre du navigateur.
Elle contient le texte, les images, vidéos etc. qui sont intégrés dans la page web.
Exemple :
1. <!DOCTYPE html>
2. <html>
3. <head>
4. <title>TP 8.1 Manipulation des Canvas</title>
5. <meta httpequiv="ContentType" content="text/html; charset=UTF8">
6. <link rel="stylesheet" type="text/css" href="style.css">
7. <!TP gestion graphique par canvas>
8. </head>
9. <body>
10. <canvas id="dessin" width="900" height="600"></canvas><span id="trait">Epaisseur:<br><input
type="radio" name="epaisseur" onclick="chgEpaisseur(1);">1px<br>
11. <input type="radio" name="epaisseur" onclick="chgEpaisseur(2);" checked="checked"
>2px<br/><input type="radio" name="epaisseur" onclick="chgEpaisseur(4);" />4px<br>
12. <input type="radio" name="epaisseur" onclick="chgEpaisseur(8);" />8px<br><br>
13. <span id="gomme" onclick="gomme();">Gomme</span>
14. </span>
15. <div class="palette">Couleur active :<input type="text" size="6" maxlength="7" id="coulActive"
><span id="affCoul"></span><br>
16.
17. <center><p id="bouton" onclick="genererImage();">Générer Image</p></center><br>
18.
19. <p id="coords"></p><br>
20. </div>
21. <script type="text/javascript" src="script.js"></script>
22. </body>
23. </html>
Remarque :
<!doctype html> ligne 1 de l'exemple précédent permet de signifier que la page web répond à la
recommandation HTML5. Ce n'est pas une balise au sens strict, mais c'est obligatoire et cela indique au
navigateur que ce qui suit est écrit suivant la recommandation HTML5.
3.2-les attributs
Les attributs sont des éléments associés aux balises parentes afin d'améliorer les propriétés de celle-ci.
Certaines balises ne nécessitent pas d'attribut.
Exemple
<meta httpequiv="ContentType" content="text/html; charset=UTF8">
http-equiv et content sont des attributs et leurs valeurs respectives sont placées entre ".
Exercice
D'après l'exemple page précédente :
1-Donnez les attributs et leurs valeurs respectives de la balise ligne6. Que signifient-elles ?
rel="stylesheet" type="text/css" href="style.css"
2-Donnez une balise qui renferme de attributs numériques ainsi que leur signification.
<canvas id="dessin" width="900" height="600">
width et height désigne la taille du canvas longueur et hauteur en pixels.
Remarque
<body> ne doit pas avoir d'attributs en HTML5 (style imposé en CSS) en revanche avec HTML4, elle peut
prendre un certain nombre de paramètres qui permettent de spécifier les caractères généraux de la page
comme les différentes couleurs dans la page (texte, fond, lien etc.), les polices et les tailles de caractères
par défaut etc.
On utilise de moins en moins ces paramètres, la présentation et le style sont désormais décrits dans
les feuilles de styles CSS.
Malgré cela, voici quelques paramètres employés :
• background, ce paramètre permet de spécifier le motif pour le fond la page. Il est important de
noter que les dimensions du motif (au format GIF ou JPEG) ne sont pas importantes. En effet, si le
motif est plus grand que la page alors il sera tronqué. Dans le cas inverse où le motif est plus petit,
alors il sera répété autant de fois qu'il sera nécessaire pour couvrir la totalité de la page.
• bgcolor, cet autre paramètre est utilisé pour spécifier la Couleur de fond de la page. En présence
d'un paramètre 'background' c'est l'image de fond qui prévaut sur la couleur de fond. Malgré tout,
il peut être intéressant de spécifier les deux paramètres. En effet, si la personne qui visualise une
page est distante, ou si le réseau est encombré, les images vont arriver avec un certain décalage
par rapport au code HTML : il serait donc être judicieux d'avoir, durant ce laps de temps, une
Couleur rappelant les nuances du motif de fond, afin d'assurer une certaine cohésion pour le
document.
• text, permet de fixer la Couleur par défaut du texte de la page HTML. Il est bien entendu possible
d'écrire des pages avec des textes de différentes Couleurs, mais en l'absence de spécification,
celle définie par défaut sera prise. Si ce paramètre n'est pas initialisé, c'est la Couleur par défaut
du navigateur Web qui sera prise le cas échéant.
• link, de la même manière, ce paramètre permet de définir la Couleur des liens non encore
explorés.
• vlink, spécifie la Couleur des liens déjà visités.
• alink, ce dernier paramètre permet donc définir la Couleur que prendrons les liens lorsqu'ils
seront sélectionnés par un click souris ou bien le clavier (un instant relativement bref).
3.3-Commentaires
Comme pour la plupart des langages, HTML permet de faire des commentaires dans le code HTML. Le
commentaire n'est pas destiné à être affiché et il doit être placé entre <! commentaire >.
Ligne 7 - <!TP gestion graphique par canvas>
L'intérêt du langage HTML est de pouvoir écrire des documents visualisables quelle que soit la
plateforme utilisée (Système Unix, Windows, ...).
Un problème se pose toutefois . La table de caractères ASCII souvent utilisée, ne permet que de
coder 128 caractères. Les caractères accentués ne font pas partie de cette table de caractères.
Cependant, chaque plate-forme a étendu, à sa guise, le jeu de caractères ASCII à 256 caractères, bien
entendu, simple e accentué (é ou è) n'est pas codé de la même manière. A cela il faut ajouter la
langue dans laquelle le document a été écrit (Les caractères accentués n’existent pas en anglais).
Pour pallier à ce petit problème, des séquences de caractères ont été définies pour pouvoir spécifier
un caractère non ASCII. Le tableau qui suit, donne les correspondances entre les séquences de
caractères et le caractère sous-jacent (notez que les signes < et >, utilisés par le langage, sont donc
eux aussi utilisables dans vos documents par le biais d'une séquence particulière).
3.5-Les couleurs
La première consiste à donner les trois composantes RGB de la couleur désirée sous le format
"#RRGGBB", où RR représente l'intensité de rouge entre 00 et FF (en hexadécimal), GG l'intensité de
vert et BB celle du bleu : il est donc possible de définir jusqu'à 16 581 375 couleurs.
La seconde méthode, plus simple, consiste à simplement nommer la couleur désirée. Cette méthode
est peu précise, car elle implémente un nombre restreint de couleurs.
Exemples :
Rouge = #FF0000 Vert=#00FF00 Bleu=#0000FF Blanc=#FFFFFF Noir=#000000
Exercice
Écrire la ligne permettant de définir les couleurs par défaut dans le corps du document HTML.
Couleur du fond = gris Lien non actif, déjà visité en jaune
Texte = bleu
<body bgcolor="#CCCCCC" text="#0000FF" link="#FFFF00" vlink="#FFFF00">
3.6-Table d'encodage
Les caractères transmis entre client et serveur sont définis dans une table d’encodage. A la base on
se réfère toujours à une table dite ASCII (American Standard Code for Information Interchange).
Les tables d’encodage permettent donc palier ce défaut et d’ajouter les caractères manquants suivant
la langue employée. UTF8 est un encodage qui est réalisé sur 4 octets maximum contrairement à
ASCII qui est effectué sur 7 bits ( 1 octet).
Le système unicode s'appuyant sur la table d'encodage UTF-8 doit prendre en compte toutes les langues.
Le navigateur semble extrêmement tolérant en terme d'interprétation des instructions HTML. Le W3C a
toujours souhaité que la rétro-compatibilité soit effective, les différentes versions d'HTML doivent être
prises en compte. Cela se traduit par un traitement complexe et un mode de fonctionnement particulier
du navigateur – le mode « QUIRK ».
Pour éviter cela, il existe une syntaxe HTML5 ( issue de la recommandation XHTML) qui consiste à :
-Toutes les balises encadrantes doivent être fermées sauf les balises <img>, <hr>, <br> par
exemple. En XHTML il y a obligation de fermer toutes les balises en ajoutant un / à la fin ( <br />)
-le nom des balises et attributs écrit en minuscules
-toutes les valeurs des attributs sont toujours placées entre apostrophes ou guillemets
-chaque attribut doit avoir une valeur y compris ceux qui étaient considérés comme vides, par
exemple checked s’écrit checked="checked"
-tout comme HTML, les balises doivent être correctement imbriquées , la première ouverte sera la
dernière fermée. Si cette propriété n'est pas respectée, la/les balise(s) impliquée(s) ne sera(ont)
pas interprétée(s)
Chapitre 2
HTML & Liens
Les liens Hypertextes ou sur Objets (images, fichiers etc.) sont l’essence même du Web. Ils permettent de
naviguer de page sur une même page, de page en page ou même de site en site, ils assurent aussi la
possibilité d’échanger des fichiers de tout type tant que le navigateur n’est pas capable de l’interpréter.
Un lien hypertexte est considéré comme un élément actif d’une page Web, en cliquant sur un mot ou un
ensemble de mot, on peut « surfer » au grès de nos envies. Comme son nom l’indique, le lien hypertexte
n’est réalisé que sur des caractères de type Texte.
D’une manière générale, c’est toujours la même balise qui est employée <a ...> … </a> .
1.1-Ancre
Une Ancre permet de se déplacer directement sur un emplacement donné dans une même page sans
utiliser « l’ascenseur vertical » du navigateur.
Exemple :
En supposant que l’introduction et les 3 chapitres font parties intégrantes de la même page, en cliquant
sur l’un des chapitres, on accède immédiatement à la zone de texte correspondante.
Syntaxe :
<a href="#nom_de_lancre">Lien hypertexte</a>
href, attribut qui désigne la cible vers laquelle pointe le lien hypertexte placé entre les balises <a> et
</a>. On remarque aussi que le lien peut comprendre plusieurs mots séparés par des espaces et la
ponctuation. La valeur de href doit obligatoirement commencer par un # pour désigner une ancre dans
la page.
<a name="nom_de_lancre"></a>
C'est l'attribut name qui distingue le lien de l'ancre. Cette fois on utilise name sans # devant le nom de
l'ancre. Il n'est pas nécessaire de placer du texte entre <a> et </a> .
Exercice :
En reprenant l'exemple précédent et en supposant que l'on nomme l'ancre 'dpt' pour accéder au chapitre
départements :
<a href="#dpt" >Les départements</a>
2- Écrire l'ancre qui caractérise le chapitre 'Les départements', on supposera que , d'un point de vue HTML,
c'est un titre de type h3.
<a name="dpt"></a><h3>Les Départements</h3>
Remarque :
Une ancre peut être désignée par l'attribut 'id' dans n'importe quelle balise. Cet attribut est employé dans
d'autres contextes qui seront vus par la suite.
<p id="article1">bla bla bla … </p> → ici le paragraphe a une ancre nommée article1 et qui
correspond aussi à un id.
1.2-Lien interne
L’ancrage est considéré comme un lien interne mais pour passer de page en page on associe en
paramètre l’URL de celle-ci de deux façons :
• Soit en absolu en tenant compte de la totalité de l'URL
• Soit en relatif en prenant en compte la racine du site ou de la page active
Exemples :
Sur le site 'monsite.fr', lien entre pageA.html et pageB.html ( lien sur la pageA.html).
En absolu :
<a href="http://www.monsite.fr/pageB.html"> Voir la page B </a>
En relatif :
<a href="pageB.html"> Voir la page B </a>
Cas où page B est située dans un sous répertoire 'chap1' ( racine_du site/chap1) pageA étant dans
sous la racine du site
<a href="chap1/pageB.html"> Voir la page B</a>
Le navigateur prend en compte la première requête de connexion pour compléter dynamiquement l'URL.
Exercice
xx, numéro du
département
#xx, ancre du
département
Les visiteurs accèdent aux différents pages des départements à partir d'index.html. Puis peuvent accéder
directement à la page tourisme.html et au chapitre correspondant au département qu'il souhaite visiter
via une ancre.
L'arborescence du site :
www.bretagne.bzh/index.html
+departements/xx.html
+articles/tourisme.html
1-Que caractérise « www.bretagne.bzh » sur le serveur web ? Pourquoi utilise t-on un nom de domaine ?
Une URL est caractérisée par un chemin et un fichier car un serveur web ou http est avant tout un
serveur de fichier. Elle masque l'arborescence réelle sur le serveur par un nom de domaine pour
des raisons de sécurité.
2-Quelle URL permet d'accéder directement à index.html ? Est-ce un accès en absolu ou relatif ?
www.bretagne.bzh/index.html
Accès en absolu obligatoirement pour la racine du site.
3-Si on suppose que www.bretagne.bzh correspond réellement à /var/www sur le serveur, quel est le
chemin complet pour accéder à index.html ? Même question pour accéder à la page des Côtes d'Armor.
/var/www/index.html
/var/www/departements/22.html
4-On souhaite créer le menu d'index.html. On vous demande d'écrire le lien qui permet d'accéder à la page
de présentation des Côtes d'Armor.
En absolu :
En relatif :
5-On vous demande d'écrire l'ancre du département des Côtes d'Armor en respectant la carte du site
présentée page précédente.
<a name="22"></a>
6-Écrire le lien qui pointe sur la page tourisme au chapitre des Côtes d'Armor à partir de la page du même
département.
En absolu :
En relatif :
1.3-Lien externe
Le lien externe permet d'accéder à un autre site. Compte tenu que les noms de domaines ne sont plus les
mêmes, le lien ne pourra être écrit qu'en absolu.
Valeur Signification
_blank Ouvre une nouvelle fenêtre pour afficher la page visée par le lien
_self Affiche la page ciblée dans la fenêtre active ( valeur par défaut si target n'est pas
spécifiée)
_parent Ouvre le lien sur la page hiérarchiquement supérieure
_top Ouvre la page au-delà du « FRAMESET »
Nom du cadre Cas particulier ( voir les iFrames/Frameset)
Exercice
Écrire le lien « Bretagne » permettant d'ouvrir une nouvelle fenêtre pour accéder sur le site
« bretagne.bzh », le lien sera marqué par un texte flottant au passage de la souris indiquant « Site internet
des départements bretons ».
<a href="http://www.bretagne.bzh" target="_blank" title="Site internet des
départements bretons">Bretagne</a>
Le lien sur objet correspond à un lien sur un élément de la page Web qui n’est pas du texte. La plupart du
temps ce sont des liens sur images mais on peut aussi réaliser sur les fichiers, des documents multimédia
(rich média) etc.
Avant même de faire un lien sur une image, il faut l'intégrer dans la page web. Pour cela on utilise la balise
<img>.
Cette balise dispose d'un certains nombre de paramètres :
• src, paramètres qui contient l’URL de l’image à afficher ( même méthode que le paramètre HREF
pour <a>)
• width et height , qui définissent la taille à l’affichage , valeur exprimée soit en pixels soit en %
de la taille d’origine.
• alt, affiche une courte description quand la souris passe sur l’image
• border, affiche un cadre autour de l’image, la valeur de celui-ci en pixels définit l’épaisseur du
cadre
• hspace et vspace, attributs fixant un espace vertical et horizontal autour de l’image
• align, permet de positionner l’image par rapport à un texte. Cet attribut peut prendre 9 valeurs
<img> associée à <a> permet de créer un lien à condition que cette dernière inclus la première.
Exercice
1- En vous référant à l'exercice de page 2, on vous demande d'insérer dans la page index.html l'image
« carte.png », celle-ci est stockée dans le répertoire images situé sous la racine du site. L'image insérée
doit avoir une taille de 640 x 480 pixels.
En relatif :
<img src="images/carte.png" width="640" height="480">
2- Ajoutez un lien sur cette image pour que l'on accède au site de la région Bretagne
« www.bretagne.fr » dans une nouvelle fenêtre.
<a href="http://www.bretagne.fr"><img src="images/carte.png" width="640"
height="480"></a>
Un navigateur est susceptible de lire n'importe quelle image toutefois il est fortement conseillé d'en
utiliser certains particulièrement bien adaptés pour le web comme png, jpg ou gif.
Le format png est d'autant plus intéressant qu'il gère nativement la transparence comme le gif et une
grande palette de couleur comme le jpg, de plus le format est libre.
Dans tous les cas, ces formats permettent de compresser une image tout en conservant le meilleur rendu
possible. Au final, la taille de l'image ( en octets) doit être minimisée pour garantir un téléchargement
rapide surtout si la page html en contient plusieurs.
Les paramètres width et height réduisent la taille à l'écran mais en aucun cas son « poids » en octets. Le
navigateur mettra autant de temps à télécharger l'image. Donc il est conseillé d'utiliser un logiciel de
traitement d'image avant publication.
3.3-Mapping
Méthode qui permet, à partir d’une seule image, de créer plusieurs liens placés à différents endroits sur
cette même image. Pour cela on utilise la balise <map>, on lui associe un paramètre name. Il ne faut
surtout pas oublier de nommer cette balise, cela permet de faire le lien avec l’image qui va servir au
mapping.
Principe
Le navigateur a besoin de calculer les formes géométriques associées à des liens puis de les associer à une
image. Naturellement, il faut que le mapping soit cohérent avec la taille de l'image.
Pour « mapper » une image, il faut définir les formes, 3 possibles :
• rectangulaire avec deux sommets ( haut à gauche et bas à droite)
• circulaire avec les coordonnées du centre et le rayon
• polygonale avec tous les points de la forme
<map name="bzh">
<area shape="rect" coords="x1,y1,x2,y2" href="url1">
<area shape="circle" coords="x,y,r" href="url2">
<area shape="poly" coords="x1,y1,x2,y2,x3,y3,...,xn,yn" href="url3"
</map>
<img src="carteBzh.png" usemap="#bzh">
Les attributs :
• shape désigne la forme découpée
• coords définit les points caractéristiques de la forme
• href définit le lien associé à la forme
Les liens sur fichier peuvent être interprétés différemment suivant les extensions prises en charge par le
navigateur. En effet, si celui-ci fait le lien avec une application installée sur le poste client, il peut exécuter
un « plug-in » pour l’afficher directement (Fichier PDF, certains fichiers texte etc.).
En revanche, si une extension est non reconnue, le navigateur procède au téléchargement du fichier. A vrai
dire, toutes les informations sont téléchargées, certaines seront directement interprétées par le
navigateur ou un logiciel externe d’autres seront enregistrées localement.
Chapitre 3
HTML & Cadres – Contenus
Il arrive parfois que la mise en page soit complètement déstructurée en changeant de résolution d’écran.
L’utilisation des cadres et tableaux permet de maintenir une cohésion dans l’affichage de la page HTML
grâce à un astucieux système d’auto-adaptation.
1.Tableau
L’insertion d’un tableau se fait par le biais de la balise <table>...</table>. On lui adjoint ensuite des
balises qui permettent de créer des lignes et enfin des cellules. Les colonnes ne sont pas déclarées afin de
faciliter la fusion des cellules.
<table>
<tr>
<td>Cellule 1</td><td>Cellule 2</td>
<tr>
</table>
Un tableau est défini en fonction du nombre de lignes (axe vertical) et du nombre de cellules par ligne
(axe horizontal). Ces cellules renferment le contenu du tableau à mettre en page. On ne parle pas des
colonnes car elles ne disposent pas de balise HTML dédiée.
Exercice
1- D'après vous à quoi correspondent les balises <tr> et <td> ? Quels sont leurs rôles respectifs et quelles
en sont les contraintes?
<tr> permet de définir une ligne et contient des cellules. Elle doit être fermantes.
<td> caractérise une cellule et son contenu doit être encadré, autre remarque une cellule est incluse dans
une ligne et pas l'inverse.
2-On vous demande de créer un tableau simple contenant 2 lignes et 3 colonnes. Ci-dessous le contenu de
celui-ci :
Ville Département Population
Lannion 22 19 920 (2011)
<!doctype html>
<html>
<head>
<meta charset="utf8">
</head>
<table>
<tr><td>Ville</td><td>Département</td><td>Population</td></tr>
<tr><td>Lannion</td><td>22</td><td>19 920 (2011)</td></tr>
</table>
</html>
3-On souhaite que sur la première ligne, le texte des cellules soit en gras . Modifiez le tableau en
conséquence.
<tr><td><b>Ville</b></td><td><b>Département</b></td><td><b>Population</b></td></tr>
Remarques
Par défaut le tableau fait toute la largeur de l’écran, le texte est systématiquement justifié à gauche et les
bordures des cellules sont fixées. Il existe des paramètres qui permettent de personnaliser le tableau.
En HTML5, cette balise (comme beaucoup) n'ont pas d'attribut, le style et la mise en forme doit être faite
avec CSS.
Toutefois avec HTML4 il est possible de définir certains attributs :
1.3-Lignes et cellules
En HTML5, <tr> et <td> sont soumises aux mêmes règles que <table>. Avec HTML4, il y a certains
attributs autorisés.
Exercice
On vous demande de coder le tableau fourni en capture ci-dessous, la taille de celui-ci sera fixée à 500
pixels, la couleur de fond de la première ligne sera grise ( #c0c0c0). Le titre du tableau est associé à la
balise <caption>titre</caption> située en début de tableau et avant la définition de la première
ligne.
<table border="1" width="500">
<caption>Tableau et fusion de cellule</caption>
<tr align="center" bgcolor="#c0c0c0"><td><b>Départements</b></td><td
colspan="2"><b>Villes</b></td></tr>
<tr><td rowspan="4">22</td><td>Lannion</td><td>19 920 (2011)</td></tr>
<tr><td>Saint Brieuc</td><td>46 173 (2011)</td></tr>
<tr><td>Dinan</td><td>10 851 (2011)</td></tr>
<tr><td>Guingamp</td><td>7 276 (2011)</td></tr>
</table>
1.4-Balises complémentaires
Pour faciliter la gestion des styles et affichages avec CSS, HTML5 fournit des balises « enfants » dissociant
le tableau en 3 parties distinctes :
• En-tête du tableau qui correspond à la (aux) première(s) ligne(s) avec la balise <thead>...</thead>
• Le pied du tableau qui correspond à la (aux) dernière(s) ligne(s) avec la balise <tfoot>...</tfoot>
• Le corps du tableau avec <tbody>...</tbody>
Constatations :
• <tfoot> et <thead> sont déclarées avant <tbody>, cela permet au navigateur d'anticiper le calcul
du rendu
• <thead> dispose d'une balise spécifique pour les cellules <th>
• <tfoot> et <tbody> conservent la balise <td>
• <th> formate le texte en gras et centré automatiquement
• Comme ces balises délimitent des zones elles doivent être fermées systématiquement
Remarque
<th> dispose d'attributs particuliers, le cours n'étant pas exhaustif, vous trouverez des informations
complémentaires sur le site du W3C ( http://www.w3.org/community/webed/wiki/HTML/Elements/th).
2.Les cadres
Nous aborderons les deux parties car il existe encore de nombreuses applications web qui reposent sur les
FRAMES ( interface de configuration des switchs par exemple).
Les cadres permettent de découper la page support en parties complètement indépendantes. Chacune
d'entre elles affiche un contenu différent ( une autre page HTML). Cela permet de mettre en œuvre une
zone réservée à la navigation (contenu dynamique ou changeant) et des zones statiques comme une en-
tête ou un menu.
Zone en-tête
Page support
Il est possible de créer autant de cadre que l'on souhaite, toutefois 3 ou 4 cadres maximums suffisent, il
faut assurer la lisibilité du site.
2.2-Page support
C'est la première page HTML à créer car elle permet de définir la position, la taille de chaque cadre et leur
contenu par défaut. C'est cette même page que l'on chargera avec le navigateur.
1. <!doctype html>
2. <html>
3. <head>
4. <title>Exercices Cadres</title>
5. </head>
6. <frameset ...>
7. <frame ...>
8. <noframes>
9. … Partie affichée quand le navigateur ne prend pas en charge les cadres
10. </noframes>
11. </frameset>
12. </html>
Elle n'a pas de balise <body>, ce qui signifie que rien dans cette balise sera affiché.
C'est la balise <frameset> car elle signale au navigateur qu'il va devoir insérer des cadres à la place d'un
contenu normalement définit par <body>
Grâce à la balise <frame>, il doit y en avoir autant que de cadre à mettre en place.
<frameset> définit la taille des cadres (par rapport à la fenêtre) et leur orientation ( en lignes ou
colonnes).
En % ou px En % ou px
Exercice
On veut 3 cadres superposés les uns aux autres, le premier fera 20 % de la fenêtre et le second 50 %.
On vous demande d'écrire la déclaration des cadres à l'aide de frameset.
<frameset rows="20 %,50 %,30 %">
Remarques:
Il n'est pas possible avec une même balise frameset de déclarer des cadres verticaux et horizontaux. En
revanche l'imbrication des framesets est possible (voir plus bas).
Seconde remarque la définition de la taille d'un cadre en pixel permet de le figer quelque soit la taille de la
fenêtre :
<frameset cols="200,*">
Dans ce cas, le premier cadre fera 200 pixel de large et le second occupera le reste de la fenêtre.
2.4-Cadres imbriqués
Cadre A
Cadre B Cadre C
Frameset Enfant
<frameset rows="30%,70%">
… définition du cadre A
<frameset cols="80%,20%">
… cadre B Frameset Enfant Frameset parent
… cadre C
</frameset>
</frameset>
Exercice
Créer la structure ci-dessous en HTML, vous indiquerez les lignes de définition des cadres à la façon de
l'exemple précédent. La largeur du cadre C devra être fixer à 300 pixels, les hauteurs de A et B seront
relatives – respectivement 30 et 70 %.
code HTML
Cadre A
<frameset cols="*,300">
<frameset rows="30%,70%">
… cadre A
Cadre C … cadre B
Cadre B </frameset>
… cadre C
</frameset>
Les cadres vont contenir des pages HTML indépendantes les unes des autres, bien souvent on retrouve un
bandeau horizontal qui caractérise le site, une barre de menu verticale et un cadre dit de navigation qui
affiche les pages HTML désirées. Prenons une structure simple :
L'insertion des pages HTML est réalisée avec la balise <frame>. Elle spécifie la page à afficher par défaut
ainsi que le nom du cadre déclaré.
Structure ci-dessus :
<frameset rows="200,*">
<frame src="bandeau.html" name="cadreA">
<frame src="accueil.html" name="cabreB">
</frameset>
L'attribut src indique la page contenue dans le cadre par défaut et name définit un nom pour le cadre. Ce
nom est associé ensuite avec l'attribut target1 d'un lien.
Exercice
1-Reprendre l'exercice de la page précédente en faisant cette fois la déclaration des cadres sachant que :
• cadre A contiendra la page « titre.html »
• cadre B contiendra « accueil.html »
• cadre C contiendra « menu.html »
L'arborescence du site est la suivante :
racine du site → index.html
+ accueil.html
+ annexes/titre.html
+ javaScript/menu.html
<frameset cols="*,300">
<frameset rows="30%,70%">
<frame src="annexes/titre.html" name="cadreA">
<frame src="accueil.html" name="cadreB">
</frameset>
<frame src="javaScript/menu.html" name="cadreC">
</frameset>
<a href="accueil.html" target="cadreB">Retour page d'Accueil</a>
<a href="annexes/carte.html" target="cadreB">Carte du site</a>
Ce sont ces balises qu'il faut désormais utiliser pour la recommandation HTML5 ( ce que nous ferons après
le TP relatif à ce cours).
3.1- <iframe>
iframe est appelée à remplacer frameset et frame ( balises non implémentées en HTML5). Cette balise
remplit les mêmes fonctions tout en donnant beaucoup plus de souplesse dans la mise en page ( qui se
fera principalement avec CSS).
seamless seamless ou rien Le rendu graphique de l’iframe fait que celle-ci fait partie
intégrante de la page support
Exercice
Créer une iframe dans la page support, d’une longueur de 1000px, hauteur de 500px, contenant par défaut
le fichier iframe1.html, portant le nom cadre et positionner par défaut à 200px du bord gauche de l’écran.
<iframe width="1000" height="500" src="iframe1.html" name="cadre" style="margin
left: 200px;"></iframe>
Il existe des balises « container » spécialisées. Elles sont issues d’une balise généraliste <div>2. La mise en
page avec ces balises doit se faire avec CSS afin de définir la position de chacune par rapport aux autres
(en relatif) ou par rapport à la page (absolu).
HTML5.0 introduit la notion de balises spécialisées dont le seul but est de rendre plus visible le code de la
page HTML.
Remarque
Il y a d’autres balises avec un rôle similaire en particulier avec le formatage des titres et texte comme
<span>, <pre> etc. Ces balises seront utilisées en TP après avoir vu CSS et JavaScript.
Chapitre 4 – Styles
Chapitre 5 – Techniques Avancées
Chapitre 4
CSS & Notions de style
1.Introduction
Le langage CSS (Cascading Style Sheet) est un complément d’HTML. Il définit, d’une manière globale, les
propriétés de format des balises HTML employées dans une page ou sur la totalité d’un site Web.
Dans la pratique, il est possible d’intégrer le langage CSS dans une page HTML mais pour un site complet, il
est plus utile d’écrire un fichier externe qui sera appelé pour chaque page HTML visitée.
Il n’y a pas de règle précise mais par principe nous lui donnerons comme extension « .css » .
Avantages :
• La structure et la présentation sont gérées séparément
• La conception se fait sans se soucier de la présentation
• Le code HTML est réduit en taille et en complexité.
• CSS permet de contrôler le style de tous les éléments d'une page web
Exemple comparaison entre déclaration <HTML> et {CSS} de la couleur de fond de la page HTML :
<!en HTML −>
<body bgcolor="#c0c0c0">
Serait équivalent :
/* en CSS */
body {
backgroundcolor :#c0c0c0 ;
}
A première vue cela semble plus long à écrire et pourtant ce n'est pas le cas. En effet, en développement
web, on privilégie la modularisation du code. Cela revient à dire que chaque partie du site est dissociée en
plusieurs fichiers dont les rôles sont distincts.
Dans l'exemple ci-dessus, on peut imaginer des fichiers HTML et un fichier CSS. On obtient ainsi un style
commun à tout le site sans avoir de doublon. Ici, la couleur du fond de chaque page serait définie de la
même façon. Il en serait de même pour tout ce qui est présent dans le fichier de style.
<body style="backgroundcolor:#c0c0c0 ;">
<head>
…
<style>
body {
backgroundcolor:#c0c0c0 ;
}
</style>
</head>
<head>
…
<link rel="stylesheet" type="text/css" href="fichierDeStyle.css">
</head>
On remarque que l'instruction CSS est écrite de la même façon mais la structuration peut changer (entre
les 2 premiers exemples). Dans un fichier css, aucune balise HTML n'est tolérée, tout doit être écrit en CSS.
Il est fortement conseillé de placer le code CSS ou le lien vers un fichier externe dans l'en-tête. Le
navigateur interprète la page HTML dès le début du téléchargement et calcule la mise en page à
partir de ce qu'il connaît à cet instant précis.
4.1-Syntaxe
La syntaxe du langage CSS est simple, elle repose sur le concept de définition de balise et de propriété
associée. Toutefois les propriétés CSS ne portent pas nécessairement le même nom qu’en HTML, même si
elles ont une action identique.
sélecteur {
propriété: valeur; bloc CSS
}
• sélecteur, ce peut être une balise mais pas seulement, en général il désigne un « objet » de
la page HTML sur lequel on applique le style décrit dans le bloc
• propriété, c'est l'élément pour lequel on associe une valeur. Elle doit être compatible avec
le type du sélecteur
Règles d'écriture :
• Un sélecteur peut se voir appliquer un bloc CSS comprenant plusieurs propriétés
• Plusieurs sélecteurs peuvent avoir un bloc CSS commun
• L'affection de valeur à une propriété est réalisée par « : »
• Chaque ligne du bloc CSS doit se terminer par « ; »
• Le bloc CSS est délimité par « { } »
Exemple :
body {
backgroundcolor:#c0c0c0 ;
}
Remarque :
Le navigateur n’interprète pas les erreurs de syntaxe et surtout ne les signale pas.
Exercice :
On souhaite que le texte dans un paragraphe – balise HTML <p> - soit bleu, taille 12 pixels, justifié et
police « ubuntu ».
1-Codez en CSS le style de cette balise.
Propriétés nécessaires « fontsize », « fontfamily », « textalign » dont les valeurs attendues
sont « right,left,center ou justify » et « color ».
p {
fontsize:12px ;
fontfamily:ubuntu ;
textalign:justify ;
color:#0000FF ;
}
p {
font : 12px ubuntu ;
text : justify ;
color:#00F ;
}
Remarques :
Certaines propriétés peuvent avoir plusieurs valeurs séparées par un espace. Attention, cette règle ne
s'applique pas systématiquement ( voir site W3C, W3School & co). La définition d'une couleur peut être
réduite à la condition que les deux caractères d'un canal soient identiques.
4.2-Héritage
La notion d'héritage est très usitée dans de nombreux domaines de l'informatique. On en parle beaucoup
en programmation orientée objet ( C++, java, php etc.) mais aussi en HTML/CSS.
Ce modèle s'appuie sur la relation « parent » - « enfant » sachant que ce que l'on entend par parent/enfant
correspond à l'imbrication des sélecteurs entre eux. Par exemple, en général la balise <body> contient
d’innombrables autres balises, on considère que <body> est le parent de ce qu'elle contient.
Exercice
Soit le Code source d'une page HTML :
1. <!doctype html>
2. <html>
3. <head>
4. <title>
5. Héritage en CSS
6. </title>
7. <meta charset="utf8">
8. </head>
9. <body>
10. <div>
11. <p>....blablabla... <a href="http://www.blabla.bla">BLABLA</a>...</p>
12. <img src="blablabl.png">
13. </div>
14. <table>
15. <caption>Tableau Héritage</caption>
16. <thead><tr><th>Colonne 1</th><th>Colonne 2</th><tr>
17. <tfoot><tr><td colspan="2">blablabla</td></tr></tfoot>
18. <tbody><tr><td>blablala1</td><td>blablabla2</td></tr></tbody>
19. </table>
20. </body>
21. </html>
lignes 15/16 et 18 on a th et td
L'héritage des CSS est fondé sur le modèle Parent-Enfant(s) ce qui signifie que chaque élément Enfant
reçoit en héritage tous les styles de son élément Parent.
Cet héritage est très pratique et permet d'éviter beaucoup de répétitions inutiles : en effet, en attribuant
une propriété à un parent (par exemple font-size: 15px), elle sera transmise à tous ses enfants, mais aussi
aux enfants de ces enfants, etc.
Précision : l'élément enfant héritera de toutes les propriétés de l'élément parent uniquement si ces
propriétés s'héritent car l'héritage ne fonctionne pas non plus sur toutes les propriétés css (margin,
padding et autres propriétés de bloc) .
Exercice
A partir de la page HTML de la page suivante, on vous demande de définir le style par défaut du texte de la
page (quelques soient les balises qui l'encadre) de la façon suivante :
- taille des caractères 10 pixels
- couleur #9c9c9c
- police de caractère Arial
body {
fontsize:10px ;
fontfamily : Arial ;
color:#9c9c9c ;
}
4.4-Définition de la descendance
Nous venons de voir la notion d'héritage, c'est à dire l'application d'un style d'un sélecteur à toute sa
descendance. Il arrive parfois où nous souhaitons que certains sélecteurs soient affectés par un style
particulier.
Imaginons un instant que nous avons une page avec du texte décrit en paragraphe avec <p> et certains
d'entre eux sont créés avec une autre balise : <span> qui peut éventuellement afficher une remarque par
exemple. Les deux sélecteurs sont systématiquement intégrés dans un <div> :
<body>
….
<div>
<p> ...parapaghe1...</p>
<p> ...paragraphe2...</p>
<span> ...remarque1...</span>
<p> ...paragraphe3 … </p>
</div>
…
</body>
body {
style du texte par défaut
}
Tous le texte est affecté par ce style car on utilise la balise <body>.
On veut que les remarques dispose d'un style qui leur est propre.
1ère solution :
body {
style du texte par défaut
}
span {
style des remarques
}
Ici tous les spans seront affectés par le style. Mais on veut que seuls les spans inclus dans la page et les
divs soient affectés par ce style.
2ème solution :
body {
style du texte par défaut
}
div span {
style des remarques
}
Remarques:
-La balise ancêtre ou parente est toujours signalée en premier.
-Un span qui n'est pas dans un div ne sera pas affecté par le style
Exercice :
A partir de la page HTML donnée page 4 et toujours dans la continuité de l'exercice précédent, donnez le
style CSS pour le texte dans le corps du tableau :
-taille 8px
-couleur bleue
-police ubuntu
tbody td {
fontsize:8px ;
fontfamily:ubuntu ;
color:#0000ff ;
}
Remarque :
Si des règles, pour des sélecteurs différents mais affectés par la hiérarchie, ont des propriétés communes,
ce seront les dernières définies qui seront prises en compte. Ici les propriétés de td seront prédominantes
sur celle de body.
Lorsque deux règles différentes ciblent le même sélecteur, c'est la dernière déclarée qui est prise en
compte.
Exemple :
sélecteur lambda {
règle 1 ;
}
sélecteur lambda {
règle 2 ;
}
4.6-Combinaisons de sélecteurs
Il arrive parfois que différentes balises ont une même définition de style. Il est possible de définir les
sélecteurs correspondants de la même façon en les regroupant :
Exemple :
div,p,span,a,h1 {
color : #ca45a8 ;
fontsize : 10px ;
fontweight : 100 ;
}
Le sélecteur d'enfant s'applique, comme son nom l'indique, à l'enfant ou aux enfants d'un élément
désigné :
E1 > E2 {
propriétés : valeurs ;
}
Remarque :
A la différence avec la descendance (§4.4 page 5) le sélecteur d'enfant n'a aucune action si un Élément
existe hiérarchiquement entre E1 et E2.
L'adjacence s'applique aux sélecteurs d'éléments frères. Le style peut alors s'appliquer si et seulement si
l'élément est précédé par celui désigné par l'adjacence :
E1 + E2 {
propriétés : valeurs ;
}
Ici E1 précède E2 .
Exemple :
HTML
<h1>Chapitre 1 – HTML</h1>
<p> Présentation et mise en forme avec HTML</p>
<p> Ce cours présente le formalisme, les balises ...</p>
CSS
h1 + p {
fontstyle: italic ;
fontsize : 8px ;
color : grey ;
}
Seul le premier paragraphe (en gras) est défini par ce sélecteur.
Exercices
Ex1 :
1.1-A partir de la définition donnée ci-dessous, écrire le sélecteur permettant de définir le style du texte
contenu dans un paragraphe tel que :
- la police soit Arial
- en italique
- de couleur grise
- de taille 10px
CSS à compléter :
body {
textalign : justify ;
fontstyle : normal ;
fontsize : 10px ;
color: black ;
fontfamily : Arial, Ubuntu ;
}
p {
color : grey ;
fontstyle : italic ;
}
L'héritage, car certaines propriétés CSS sont communes comme la taille et la police de caractère.
Body étant la balise englobante, p hérite de ses propriétés y compris de la justification.
La priorité pour les propriétés qui diffèrent mais qui sont définies pour les deux sélecteurs comme
fontstyle et color.
Ex2 :
Le code HTML ci-dessous représente ( schématiquement) la présentation des articles sur la page d'accueil
d'un site d'informations. Chaque article est résumé et pour en lire le contenu, il faut cliquer sur son titre.
Chaque div contient un article tronqué, le titre est défini avec p, le résumé dans le paragraphe situé juste
sous le titre et enfin un second paragraphe pour la date de publication et le nom de l'auteur.
<div>
<p><a href="url de l'article complet">...titre...</a></p>
<p>...résumé du texte...</p>
<p>...date et nom de l'auteur de l'article...</p>
</div>
div {
color : white ;
backgroundcolor : #121212 ;
fontfamily : Ubuntu ;
fontsize : 10px ;
fontstyle : normal ;
height : 100px ;
width : 350px ;
borderstyle : dotted ;
bordercolor : yellow ;
textalign : justify ;
}
div a {
color : yellow ;
fontweight : bold ;
}
div > p {
color : red ;
textalign : center ;
}
div > p + p {
color : #c0c0c0 ;
fontstyle : italic ;
}
div> p + p + p {
backgroundcolor : white ;
color : black ;
fontsize : 8px ;
}
Les classes permettent de créer des sélecteurs personnalisés et applicables à différentes balises à
condition que les propriétés soient compatibles. Elles sont complètement indépendantes des balises sur la
page HTML et peuvent être nommées comme on le souhaite (en respectant le formatage et la syntaxe
css/html).
Formalisme
en CSS
.nom_de_la_classe {
propriétés : valeurs ;
}
relation sur la page HTML
<balise class="nom_de_la_classe">
Exemple
Sur la page HTML :
<div class="classe1">
…
</div>
<canvas class="classe2"></canvas>
<fieldset class="classe1"></fieldset>
<div>
…
</div>
Exercice
En reprenant l'exercice 2 de la page 8, nous souhaitons mettre en avant le dernier article publier. Celui-ci
sera le premier affiché sur la page d'accueil ( ordre chronologique inverse). Il est constitué de la même
façon que les autres d'un point de vue HTML avec des différences sur le style. Le bloc sera encadré par un
trait avec effet gravure ( « groove »), le trait de bordure aura une épaisseur de 4 pixels et la couleur du
fond sera #787878). Écrire le code HTML du bloc ainsi que son style, on nommera la classe
« dernierArticle ».
HTML
<div classe="dernierArticle"> ...</div>
CSS
.dernierArticle {
backgroundcolor : #787878 ;
borderstyle : groove ;
borderwidth : 4px ;
}
Les identificateurs reposent sur le même principe que les classes à la différences qu'il ne peut y avoir
qu'un seul « ID » sur une page HTML, une classe pouvant être applicable autant de fois que l'on souhaite.
Formalisme
HTML
<balise id="nom_de_l'id">...</balise>
CSS
#nom_de_l'id {
propriétés : valeurs ;
}
Exemple
HTML
<img id="logo" src="image">
CSS
#logo {
height : 200 ;
witdh : 150 ;
}
Sur la page il n'y a qu'une seule image identifiée par « logo » qui sera affectée par ce style.
Exercice
A quoi correspondent les sélecteurs suivants :
Sélecteurs Correspondances
Classe grasEtRouge
.grasEtRouge { ...}
div .titre { … }
Synthèse :
Que ce soit pour les classes comme pour les identificateurs :
• On peut les nommer comme on le souhaite (en respectant les règles de syntaxe)
• l'héritage s'applique
5.2-Pseudo-classes et pseudo-éléments
Ils permettent d'affiner le style appliqué à un certain nombre de balises en définissant une réaction à un
événement ou bien à la position relative de la balise au sein des autres balises. Contrairement aux classes,
le nom est prédéfini, il n'est donc pas possible de créer ses propres pseudo-classes/éléments.
Les pseudo-classes dynamiques permettent de modifier le style d'une balise en fonction d'un
événement (mouvement de la souris, clic, ou bien appui sur une touche du clavier).
Il en existe quatre :
• La pseudo-classe :hover permet d'affecter un style à la balise sélectionnée lors d'un survol par le
curseur de la souris : a:hover {fontdecoration: underline;}
• La pseudo-classe :focus permet de définir un style à la balise sélectionnée lorsque le focus
(sélection) lui est donné (par exemple lors de la sélection dans un élément de formulaire) :
textarea:focus {color: #FF0000;}
• La pseudo-classe :active permet de définir un style à la balise sélectionnée lorsque l'utilisateur
clique sur l'élément (entre le moment où l'utilisateur clique sur le bouton de la souris et celui où il
le relâche) : a:active {color: #FF0000;}
• La pseudo-classe :visited permet de définir un style pour un objet déjà visité comme un lien par
exemple : a:visited {fontdecoration : overline;}
Remarque :
:focus concerne principalement les balises acceptant l'attribut HTML « tabindex » (qui définit l'ordre de
sélection avec la touche TABulation). Sont concernées :
<a> , <area> , <button> , <input> , <object> , <select> et <textarea>
Exercices
1-On souhaite que les liens soient définis en CSS de la façon suivante :
-Couleur par défaut, qu'ils soient déjà visités ou non, actifs → #FFFF00
-En petite majuscule → attribut fontvariant valeur smallcaps
-Les liens ne sont pas soulignés par défaut
-Quand on passe la souris sur un lien, celui-ci est souligné et surligné et les caractères apparaissent en gras
-Au clic le lien devient blanc – reste en gras et le fond de celui-ci est jaune foncé ( #444400)
-La police par défaut est « courrier »
a {
color: #FFFF00 ;
fontvariant : smallcaps ;
fontfamily : courier ;
textdecoration : none ;
}
a:hover {
fontweight: bold ;
textdecoration : overline underline ;
}
a:active{
color: #FFFFFF ;
backgroundcolor : #444400 ;
}
2-On souhaite que les liens pointant vers « wikipédia » soient affectés par le style proposé précédemment
et que les autres disposent d'un autre style. Proposez une solution en réécrivant uniquement les
sélecteurs.
a.wiki {
…
}
a.wiki:hover{
...
}
a.wiki:active{
...
}
3-Quand on passe la souris sur une vignette ( image de taille réduite ) , on souhaite zoomer l'image. Ecrire
le code CSS pour toutes les images en supposant que les vignettes aient une taille de 150x100 ( largeur x
hauteur ) et le zoom 300x200.
img {
height: 100px ;
width : 150px ;
}
img:hover{
height : 200px ;
width : 300px ;
}
Nous avons déjà vu la notion de descendance (§4.7 page 7) qui permet d'affecter un style à tous les
descendants directs d'un sélecteur parent.
La pseudo-classe descendante :firstchild diffère sur un point, elle concerne le premier enfant d'un
sélecteur même si celui-ci dispose de sélecteurs frères.
En reprenant l'exercice 2 de la page 8, nous avions les articles d'une page HTML décrit de la façon
suivante:
HTML Schématiquement
<div> <div> parent
<p>...Le titre...</p> <p>
<p>...le texte...</p> <p> Enfants directs
<p>...date et auteur</p> <p>
</div>
div > p:firstchild {
…
}
Exercice
On souhaite formater la première cellule de la première ligne d'un tableau de la façon suivante :
- police de caractère « Arial », taille 18 pixels, couleur blanc et en gras
- le fond de cette cellule sera en noir
Les autres cellules de la première ligne seront définies comme suit :
- police de caractère « Arial », taille 16 pixels, couleur noir
- le fond des cellules en gris clair
Le reste du tableau en fond blanc, police de caractère « courier », taille 14px et couleur gris foncé
Le tableau compte 3 lignes et 4 colonnes avec fusion des cellules de la première colonne. La bordure des
cellules du tableau sera en pointillés et de couleur rouge.
Capture du tableau
2-Créez les styles à appliquer au tableau, on n'utilisera pas les classes ni les identificateurs.
td {
borderstyle: dashed;
bordercolor: #ff0000;
borderwidth: 1px;
fontfamily: courier;
fontsize: 14px;
color: #333333;
backgroundcolor: white;
}
table tr:firstchild > td{
backgroundcolor: #cccccc;
fontfamily: arial;
fontsize: 16px;
color: black;
}
table tr:firstchild > td:firstchild{
backgroundcolor: black;
fontfamily: arial;
fontsize: 18px;
color: white;
fontweight: bold;
}
3-Complétez le style précédent de façon à ce que le fond des cellules et la couleur du texte inclus
changent que la souris les survole. Couleur du texte en rouge et le fond en jaune. Le curseur de la souris
doit être une croix.
td:hover {
color : red;
backgroundcolor: yellow;
cursor: crosshair;
}
5.5-Les pseudo-éléments
Ces pseudos éléments permettent de rajouter du texte, un image et des caractères avant et après un
sélecteur donné. Ils sont associés à une propriété spécifique – « content » .
selecteur:before {
content : valeur ;
}
selecteur:after {
content : valeur ;
}
Exemple
On souhaite que chaque citation soit encadrée par « et » . On utilise <blockquote> pour le texte
cité :
blockquote:before {
content : "«" ;
}
blockquote:after {
content :"»" ;
}
Exercice
A partir du code HTML ci-dessous ( et de la capture) créez le style de ce tableau de façon à ce que le
caractère « € » soit rajouté après le prix.
<table>
<tr>
<td>Menus</td><td>Prix</td>
</tr>
<tr class="choix">
<td>Déjeuner</td><td>10</td>
</tr>
<tr class="choix">
<td>Entrée+Déjeuner</td><td>13</td>
</tr>
<tr class="choix">
<td>Déjeuner+dessert</td><td>13</td>
</tr>
<tr class="choix">
<td>Entrée+Déjeuner+dessert</td><td>16</td>
</tr>
</table>
Remarque :
Le style global du tableau correspond à celui de l'exercice précédent.
Code CSS :
tr.choix td+td:after{
content: "€";
}
Ils permettent d'appliquer un style à une partie du texte délimitée par les balises auxquelles ils
s'appliquent. Ainsi les pseudo-classes de texte s'utilisent généralement conjointement avec la balise de
paragraphe (<p>), de bloc <span> etc. .
Exercice
Codez le style afin que le premier caractère de chaque paragraphe débute par une lettrine. La taille de
celle-ci sera toujours 3 fois plus grande que celle du texte et elle sera incrustée dans le paragraphe. La
police retenue sera « Arial », elle sera en gras et italique. Enfin pour marquer sa présence, on ajoutera un
effet d'ombrage (CSS3).
Syntaxe ombrage
.titre {
text-shadow : 2px 3px 4px #404040 ;
}
La première valeur indique le décalage vers la droite de l'ombre ( ici 2 pixels)
La deuxième valeur indique la décalage vers le bas ( 3 pixels)
La troisième valeur indique la « force » du dégradé d'ombre ( ici 4 pixels entre la couleur du fond et
la couleur de l'ombre)
La dernière valeur correspond à la couleur de l'ombre.
p:firstletter {
fontsize: 300%;
float: left;
fontweight: bold;
fontstyle: italic;
fontfamily: Arial;
textshadow: 2px 2px 4px #999; /*CSS3*/
}
Cette pseudo classe fait partie de ce que l'on appelle les règle -at (règle @). Elles sont nombreuses mais il
en existe 3 qui se distinguent des autres à savoir :
-@import qui permet d'inclure un fichier css à partir d'un autre
-@media qui définit le périphérique pour lequel on affecte des rêgles CSS
-@page qui permet de définir le style pour l'impression
5.6-a @import
Pour inclure un fichier CSS à partir d'un autre, on utilise @import en la plaçant en tête de fichier.
Exemple
@import url(style/mapage.css)
style → répertoire
5.6-b @media
On définit que des styles uniquement pour les écrans et les imprimantes par exemple :
@media screen{
… style …
}
@media print{
...style...
}
5.6-c @page
Le sélecteur @page permet de modifier les définitions de mise en page d'une page HTML (taille, marge,
etc.) à l'impression, telles que les marges (margin-left, margin-top, margin- right, margin-bottom), la taille
(size). Il faut alors imaginer la page web comme un ensemble de pages constituant un ouvrage papier.
Les pseudo-classes de page permettent ainsi de sélectionner la page, les pages de gauche, de droite ou
bien la première page d'un document.
6.Les unités
Grâce aux feuilles de style il est possible de définir des valeurs numériques pour les propriétés de style de
plusieurs façons :
• de façon absolue, c'est-à-dire dans une unité indépendante du format de sortie (en centimètres
par exemple)
• de façon relative, c'est-à-dire dans une unité relative à un élément
Les valeurs des feuilles de style sont soit des nombres entiers, soit des nombres réels, c'est-à-dire des
chiffres ayant une partie entière et une partie décimale.
D'une manière générale il est à noter l'utilisation du point (« . ») dans les notations décimales en lieu et
place de la virgule (8.5 cm et non 8,5 cm).
Les valeurs peuvent par ailleurs dans certains cas être négatives (précédées du signe « - »). Certaines
propriétés peuvent néanmoins accepter un intervalle restreint de valeurs.
7.Les couleurs
Cette solution est simple mais peu précise car on ne peut utiliser que 16 couleurs.
h1 { color : red ;}
Chapitre 5
CSS & Techniques avancées
Dans ce chapitre nous aborderons des parties importantes et qui sont souvent mal comprises. Cela va du
positionnement à l'optimisation.
1.Dimensionnement en CSS
1.1-Notion de boite
Selon le W3C est considéré comme une boite, tout élément structuré par une balise HTML et définit de la
façon suivante :
• avec le contenu caractérisé par une largeur et une hauteur ( width et height)
• avec une bordure, espace qui encadre la boite ( border)
• avec des marges interne (padding) et externe (margin)
Marge interne :
Marge entre la bordure et le contenu de la boite
Marge externe :
Marge entre la boite et ses voisines, affecte le positionnement de la boite
En résumé
border
width
margin
height
Contenu
padding
1.2-Dimensionnement
On imagine, à tort, que la dimension d'une boite est définie suivant les valeurs de width et height.
p{
width : 100px ;
height : 50px ;
padding : 10px ;
border : 1px solid #C0C0C0 ;
background : #F2CA16 ;
}
Width/Largeurx100 = 81 %
height/hauteurx100= 70 %
Quelles sont les conséquences si on utilise des % pour définir width ou height ?
Par défaut le contenu occupe 100 % de leur espace, si on ajoute des marges internes, la longueur
utile étant inchangée, la boite chevauche alors les voisines ou son contenu sort de celle-ci. En
conclusion on ne définit pas la taille des boites en %.
1.3-Minima et maxima
Pour éviter les problèmes vus précédemment, il est d'usage de définir des variations de tailles, une forme
de tolérance entre des valeurs minimum et maximum.
Propriétés
– la largeur minwidth et maxwidth
– la hauteur minheight et maxheight
Exercice
Définir le CSS de body si on veut que celui occupe toujours 80 % de la résolution de l'écran avec une
largeur minimum de 800 pixels et maximum de 1200 pixels.
Body {
width : 80 %;
minwidth : 800px ;
maxwidth : 1200px ;
}
Quelle est la plage de résolution (minimum et maximum) avec ce réglage si on considère les écrans sont en
formats paysage 16/9 ? En déduire la hauteur de body.
Si la résolution de l'écran est de 1920x1080, quelle sera la taille de body ( hauteur et largeur) ?
La fusion des marges est un mécanisme trop souvent méconnu et rarement prit en compte dans la mise en
page verticale des éléments. Elle influe uniquement sur les marges externes margintop et margin
bottom.
Les marges des éléments adjacents ( frères ou imbriqués) se combinent pour en former qu'une ( en règle
générale, la plus grande des deux).
1er Exemple
CSS
p{
backgroundcolor: grey;
marginbottom: 20px;
height: 20px;
color: white;
}
p+p{
margintop: 40px;
}
HTML
<p>Premier paragraphe avec une marge inférieure à 20px</p>
<p>Second paragraphe avec une marge supérieure de 40px</p>
Seule la marge du 2nd paragraphe est prise en compte ( 40px). La fusion des marges correspond à
la prise en compte de la plus grande des deux.
2ème Exemple
Cette fois on place le 2nd paragraphe dans un div dont on fixe la hauteur à 100 pixels.
CSS
p{
backgroundcolor: grey;
marginbottom: 20px;
height: 20px;
color: white;
}
div {
backgroundcolor: red; HTML
color: black; <p>Premier paragraphe avec une marge inférieure à 20px</p>
height: 100px;
} <div>
div p{ <p>Second paragraphe dans un div avec une marge
margintop: 40px; supérieure de 40px</p>
width: 560px; Div contenant le paragraphe d'une hauteur de 100px
} </div>
Le div n'a pas de margin-top définit donc par défaut elle vaut 0, on pourrait donc imaginer la
séparation entre celui-ci et le 1er paragraphe serait de 20px. Ce n'est pas le cas, la marge du 2nd
paragraphe étant supérieure à celle du parent (div) est prise en compte et fusionnée avec celle du 1er
paragraphe, on se retrouve alors dans le cas de l'exemple précédent.
Pour résumer : Seule la marge verticale la plus grande entre éléments adjacents ( y compris entre
parent/enfant) est prise en compte.
2.1-Rendu - display
La représentation des éléments est assurée par le norme HTML ainsi que leur imbrication respective mais
aussi avec CSS à travers la propriété « display » qui confère les caractéristiques suivantes :
• un rendu général sous forme de « boîte »
• une disposition par défaut ( verticale, cote à cote etc.)
• marges interne et/ou externe
• dimensionnement
« display » accepte au total 17 valeurs :
Nous verrons dans la suite du cours, l'influence de display dans le mode d'affichage d'un élément
HTML.
2.2-Le flux
L'ordre dans lequel apparaissent les balises (code HTML) est celui dans lequel les boîtes sont affichées et
se positionnent dans le document, on parle alors de flux courant.
On dit alors que la mise en page des éléments s'effectue par défaut selon le flux courant.
Exercice
En vous appuyant sur la capture ci-contre, donnez,
pour chaque balise le type de rendu par
défaut :
a et img → inline
3.1-Positionnement Absolu
Définition d'un élément en position absolue :
#element {
position : absolute ;
}
Caractéristiques du positionnement absolu :
• L'élément se retrouve sur un autre plan que le flux courant, autrement dit il n'est plus dépendant
de son environnement direct, un peu à la manière d'un calque dans un logiciel de retouche d'image
• Les éléments restants se réorganisent entre eux dans le flux courant sans prendre compte celui en
positionnement absolu
Capture 1 Capture 2
#p3{
height: 50px;
backgroundcolor: #880000;
position: absolute;
top: 0;
Comment le repositionner par rapport à div left: 0;
(exemple capture 3)? }
On positionne div en relatif « position : relative ». Il est toujours hors du flux car il n'est pas positionné
après le paragraphe 2.
Capture 3
Règle à retenir :
Un élément positionné en absolu se place par rapport à son premier ancêtre positionné.
• La boite est dimensionnable quel que soit le rendu initial. Cela signifie qu'un élément HTML de
rendu « inline » peut bénéficier des propriétés width,height etc. ce qui n'est pas possible dans le
flux
• L'élément occupe exactement la largeur de son contenu (taille en fonction du nombre de mots par
exemple)
• Les marges externes ne sont plus sujettes à la fusion
En position absolue, les éléments sont supposés se superposer aux autres et par conséquents masquer
leur contenu. Il est possible de définir un ordre de superposition avec la propriété « z-index » :
Exercice
L'effet « stretching » permet d'étendre le contenu d'un élément ( et seulement son contenu §1.2 page 2).
Cherchez une solution en CSS qui permettrait à une image d'occuper tout l'espace du div article au
passage de la souris sur la vignette. Complétez le CSS fourni. On considère que la vignette doit faire 50 %
de sa taille et qu'elle est alignée à gauche du texte.
HTML
<div id="article">
<p class="titre">...</p>
<p class="corps"><img src="photo.png">....</p>
</div>
CSS
div {
position : relative ;
backgroundcolor : #e0aa14 ;
width : 800px ;
height : 600px ;
}
p{
backgroundcolor : #e0e0e0 ;
fontsize : 20px ;
color : blue ;
}
img{
position : relative ;
height : 50 %;
width : 50 %;
float : left ;
}
img:hover{
position : absolute ;
left : 0 ;
right : 0 ;
top : 0 ;
bottom : 0 ;
}
3.2-Positionnement fixé
On peut donc considéré qu'un élément fixé est positionné par rapport à la partie visible de la fenêtre quel
que soit son ancêtre d'origine.
Exercice
Créez un bandeau bas qui se superpose à la page (et son contenu) pour afficher une alerte. Le fond de ce
bloc sera en noir, il sera placé à 15 % de la gauche, d'une largeur de 500px et de 50px de haut. La bordure
sera en rouge, trait plein de 3 pixels d'épaisseur.
Code CSS :
div#alerte{
margin: 0;
bottom: 0;
left: 15%;
position: fixed;
zindex: 10;
background: black;
color: white;
height: 50px;
textalign: center;
width: 500px;
border: 3px solid red;
}
3.3-Positionnement relatif
Un élément relatif se place par rapport à sa position initiale dans le flux et être ensuite décalé avec les
propriétés top – right – left et bottom.
<p>Paragraphe 2 hauteur <span>100px</span> span{
margin 10px</p> top: 10px;
position: relative;
fontweight: bold;
background: #880000;
}
Remarques :
L'élément positionné en relatif est toujours dans le flux et interagit avec ses voisins.
Enfin pour finir, l'élément est dit positionné car définit en relatif, il devient donc référent dans le flux et
utile pour un positionnement absolu d'autres éléments.
3.4-Positionnement flottant
Un élément flottant est considéré hors du flux et positionné à l'extrême gauche ou droite de son
conteneur d'origine tout en demeurant sur sa ligne initiale du flux.
Remarque :
Lorsqu'un élément flottant est poussé dans la même direction qu'un autre élément flottant, il demeure
sur le même plan et se positionne à ses cotés. Cela permet de créer des menus horizontaux par exemple.
CSS de la capture :
div {
backgroundcolor: #CCCC00;
}
p {
border: thin solid;
backgroundcolor: #440000;
color: white;
margin: 10px;
height: 150px;
float: left;
zindex: 10;
}
Exercice
La capture ci-contre correspond à un menu déroulant, qui au passage de la souris
dévoile les liens associés.
La meilleure technique pour concevoir les menus consiste à utiliser des balises
imbriquées et complémentaires. Dans le cas présent nous allons employé <dl>
(definition list), <dt> ( définition text) et <dd> (definition data). L'association des balises est définie de la
façon suivante :
<dl> dl contient les balises dt HTML
<dt> et dd, elle est assimilable <dl>
à un div.
<dt>titre</dt>
<dd> dt contient le texte <dd>texte</dd>
affiché en haut de block. <dd>texte</dd>
<dd>
...
dd contient les textes qui
<dd> sont affichés dans la liste </dl>
1-Créer la page HTML correspondante à la capture en supposant qu'il y a 3 liens pour chaque menu.
<dl>
<dt>Menu 1</dt>
<dd>Lien 1</dd>
<dd>Lien 2</dd>
<dd>Lien 3</dd>
</dl>
<dl>
<dt>Menu 2</dt>
<dd>Lien 1</dd>
<dd>Lien 2</dd>
<dd>Lien 3</dd>
</dl>
<dl>
<dt>Menu 3</dt>
<dd>Lien 1</dd>
<dd>Lien 2</dd>
<dd>Lien 3</dd>
<dd>Lien 4</dd>
</dl>
2-Coder le CSS pour que le menu se déroule au passage de la souris. On s'appuiera sur <dl>.
dl {
border: thin solid;
backgroundcolor: white;
color: black;
margin: 0px;
float: left;
top: 50;
}
dt{
fontweight: bold;
fontvariant: smallcaps;
}
dd{
display: none;
zindex: 10;
color: grey;
border: solid 1px;
marginright: auto;
marginleft: auto;
}
dl:hover dd {
display: block;
}
3-Le passage de la souris sur les liens déroulants est contrasté par un fond gris, un texte en blanc et le
pointeur de souris. Modifier en conséquence le CSS.
dd:hover{
backgroundcolor: grey;
color: white;
cursor: pointer;
}
Priorités
Certaines règles sont contradictoires, par exemple placer un élément en float:left avec
position:absolute et right:0.
Pour palier à ce problème, CSS propose une convention de priorité entre les propriétés « display »,
« float » et « position » :
1. Si « display:none » est appliqué alors l'élément ne créé par de boite en conséquence « float »
et « position » sont inactives
2. Sinon si une propriété « position » est appliquée avec une valeur « absolute » ou « fixed »,
« float » est forcée à « none » et l'élément est placé en fonction de « top », « left », « bottom »
et « right ».
3. Sinon si « float » est fixée à « right » ou « left » ce sont ces valeurs qui sont prises en compte
4. Sinon l'élément est positionné suivant son mode de rendu par défaut via la propriété « display »
( valeurs : inline, block etc.)
Block et inline
Nous avons vu que les modes block et inline ne peuvent être employés en même temps, pour rappel :
• block oblige les éléments à se positionner les uns au dessus des autres et autorise l'utilisation des
propriétés «width » et « height »
• inline permet le positionnement côte à côte mais interdit l'utilisation des propriétés citées
précédemment.Le navigateur calcule l'espace utilisé à partir du contenu de l'élément ( longueur
du texte par exemple) afin de placer les éléments suivants
L'hybridation entre « inline » et « block » est possible grâce à « inline-block ». Cette valeur de
« display:inline-block » autorise le rendu côte à côte et la définition de la taille de l'élément avec « width »
et « height ».
Exercice
Imaginons un menu à onglet dont les parties actives sont des liens. Par défaut, un élément « a » est de
type « inline » et si on souhaite des onglets de tailles identiques le « display:inlineblock » est
obligatoire :
Partie HTML
<a href="intro.html" target="cadre">Introduction</a>
<a href="projets.html" target="cadre">Projets</a>
<a href="arduino.html" target="cadre">Arduino</a>
<a href="bbb.html" target="cadre">BeagleBone Black</a>
<div>
<iframe src="intro.html" name="cadre" frameborder="0">
</div>
3.6-Alignement vertical
Le rendu « inline-block » force les éléments à se positionner sur la ligne de texte ( « baseline ») :
baseline
La propriété « vertical-align », réservée aux éléments de contenu ou aux cellules de tableau, modifie
l'alignement vertical. Appliquée avec un rendu « inline-block », elle aligne l'élément au sein de son parent :
Conclusion :
Nous n'avons pas abordé de façon exhaustive le positionnement avec CSS, la notion de template,
grilles, les rendus tableaux etc. l'objectif de ce cours est d'aborder la notion de positionnement et les
règles générales y attenant. Vous pouvez toutefois approfondir la question sur les sites comme
w3school ( http://www.w3schools.com/cssref/default.asp).
4.Les Frameworks
Les frameworks sont des « collections » d'outils permettant de mettre en œuvre rapidement des
fonctions, programmes etc.
Dans le cadre du CSS, les frameworks fonctionnent pratiquement tous de la même façon en fournissant
des classes CSS prédéfinies. On peut ainsi générer des boutons, cadres, menus et disposer d'un rendu
personnalisable.
Dans tous les cas, cela ne vous affranchit pas d'apprendre le fonctionnement du framework, de
décortiquer la documentation et de respecter scrupuleusement les recommandations. Si cela peut
apporter un gain de temps certains pendant la conception, il est parfois nécessaire de ne plus les utiliser
en phase de production afin d'optimiser les performances du site web.
Quels frameworks ?
Parmis les frameworks CSS disponibles sur internet, certains se distinguent nettement des autres par leurs
possibilités et performances. On peut citer:
• « Bootstrap - http://getbootstrap.com/» de twitter, complètement « responsive design » et
probablement le plus utilisé aujourd'hui
• « foundation - http://foundation.zurb.com/ » lui aussi complètement « responsive design »
• « blueprint - http://www.blueprintcss.org/ » le plus ancien
• « gumby -http://gumbyframework.com/ » « responsive design »
Le choix du framework est plus une question d'affinité et du contexte dans lequel sera conçu le projet.
Chapitre 6 – JavaScript
Chapitre 7 – DOM
Annexes
Chapitre 6
JavaScript
Le langage HTML, même associé au langage CSS, est statique. Il ne peut effectuer de
modification sur la page, interagir avec l’internaute, vérifier la validité des données échangées
etc.
Pour palier à cela, il a été introduit, dans les navigateurs, des interpréteurs de langages plus
évolués qui ne nécessitent pas de compilation. Le plus couramment employé est « JavaScript ».
1.Présentation de JavaScript
JavaScript est un langage inventé en 1995 par Netscape et ajouté au navigateur éponyme puis à tous ceux
qui en sont issus.
C'est un langage interprété par le navigateur et par conséquent exécuté coté client uniquement. En
général, il est employé pour dynamiser les pages HTML et effectuer des tâches de prétraitement (validité
d’une adresse mail par exemple) avant envoi vers le serveur.
Il ne faut pas le confondre avec le Java qui est beaucoup plus puissant et évolué, en effet JavaScript est
encapsulé dans l’environnement du navigateur (aucune action avec les fichiers par exemple).
Il existe deux grandes familles de langages, les « compilés » et les « interprétés ». Les premiers nécessitent
un programme nommé compilateur pour les convertir en langage binaire ( langage machine) et les rendre
exécutables. Les plus connus sont le C, C++, Pascal et l'assembleur.
En revanche les langages « interprétés » ne sont pas convertis en langage machine, ils sont directement
exécutés par l'intermédiaire d'un interpréteur comme PHP, PERL ou JavaScript. Il existe des langages
hybrides ( entre interprété et compilé) qui sont convertis en « byte code » puis interprétés à l'aide d'une
machine virtuelle comme Java ou Python.
2.Caractéristiques de JavaScript
C'est un langage objet à prototype, cela signifie que les objets ne sont pas instanciés à partir de classe
mais dispose d'un constructeur avec lequel sont crées dynamiquement méthodes et propriétés.
Note : Le paradigme « objet » sera abordé en génie logiciel.
Il va permettre de manipuler/créer les objets de la page HTML ( correspondant aux balises HTML) par
l'intermédiaire du DOM (Document Object Model – cours C7 ). Il est possible de modifier le comportement
de la page ou des éléments qui la constitue y compris les styles.
Modes d'exécution
Du fait qu'il soit interprété à partir du navigateur, on peut distinguer deux modes d'exécution :
• au chargement de la page HTML, le code est donc interprété qu'une fois.
• en fonction des événements détectés par le gestionnaire ( mouvement ou clic à la souris, appui
sur le clavier etc.) de « call-backs ». Le code est exécuté autant de fois que nécessaire.
* Recommandations HTML5
En programmation on parle de « call-back » à propos d'une fonction ou méthode qui est exécutée à la suite
d'un événement ou action particulière sans que cela soit anticipé. En règle général , la fonction « call-
back » est lancée à partir d'une autre fonction.
Avec JavaScript la boucle est bouclée, en effet nous ajoutons la 3ème et dernière brique qui constitue
HTML5.
Pour insérer du code JavaScript il faut donc s'appuyer sur HTML. Comme CSS il y a trois méthodes :
• Associé à une balise – principe utilisé avec la détection d'événement – aussi valable au
chargement de la page
Exemple : <body onload="//code JavaScript">
onload est un événement associé à <body>, dans le cas présent, le code JS sera exécuté pendant
le chargement de body ( de son contenu).
• Dans la page HTML – exécuté pendant le chargement de la page HTML et/ou prise en compte des
fonctions déclarées – utilisation des balises <script></script>
Exemple : <script> //code javascript </script>
Remarque : Par habitude on place <script> dans l'en-tête mais il est possible de l'utiliser partout
dans la page HTML
• Dans un fichier externe, la plus courante. Comme CSS, le code JavaScript peut être placer dans un
fichier dédié à l'aide de balise <script>. Ce fichier ne doit pas contenir d'instruction HTML ou CSS.
Exemple : <script src="chemin/fichier.js" type="text/javascript"></script>
L'extension js n'est pas obligatoire mais très fortement conseillée.
La liste des événements pris en charge avec l'API HTML5 est donnée en annexe – source w3school1.
L'interaction consiste, à partir du gestionnaire d'événements, d'exécuter un traitement, une fonction etc.
<textarea onfocus="//code js"></textarea>
2-Soit le bouton HTML donné ci-dessous, on vous demande d'ajouter l'événement de détection de click sur
celui-ci et de lancer la fonction JavaScript « alert('Bouton cliqué') ; » (fonction qui affiche un
message dans la fenêtre – le message est écrit entre parenthèses).
Code HTML du bouton à modifier : <input type="button" value="test">
<input type="button" value="test" onclick="alert('Bouton cliqué') ;">
3-Il est possible d'associer les événements pour un même objet. On vous demande de modifier le code ci-
dessous d'un lecteur vidéo HTML5 en détectant les événements de lecture ( marche et arrêt) qui
exécutent respectivement les fonctions videoMarche() et videoArret().
Code HTML à modifier
<video id="maVideo" width="720" height="480">
<source src="videos/algore.ogv">
</video>
<video id="maVideo" width="720" height="480" onplay="videoMarche();"
onstop="videoArret();">
<source src="videos/algore.ogv">
</video>
1 w w w.w3schools.com/jsref/dom_obj_event.asp
En résumé :
Un gestionnaire d'événements permet d'exécuter des actions programmées en fonction des
événements interceptés ( action de l'utilisateur, temporisation …).
4.Le langage
Avant même de se jeter sur un clavier, il faut d'abord procéder à la résolution méthodique du problème
posé par le programme, d'utiliser les outils de modélisation qui y concourent comme l'algorithmie, l' UML2
etc.. et le développement web n'échappe pas à la règle.
Une fois l'étude terminée, on peut alors passer au code. Les langages permettant de programmer des
applications reposent sur le même paradigme à savoir « la programmation orientée objet ».
C'est la manière dont on programme à partir d'un langage donné. Il existe de nombreux paradigmes, les plus
connus sont « la programmation impérative » dont le C fait partie et « la programmation orientée objet » avec
le C++, Java, Python, PHP et JavaScript entre autres.
4.1-Principes de base
Premier programme
Pour aborder le fonctionnement et la syntaxe du langage d'un point de vue global, nous allons écrire un
programme qui permet d'afficher une fenêtre au chargement de la page HTML. Le programme est
directement inséré :
<!doctype html>
<html>
<head>
<title>Alerte!</title>
<meta charset="utf8">
<style>
body{
fontfamily: ubuntu;
fontsize: 30px;
color: #ff0000;
}
h1{
position: fixed;
}
h1#tete{
top: 0;
}
h1#pied{
bottom: 0;
}
</style>
</head>
<body>
<h1 id="tete">En tête de la page HTML</h1>
<script>
alert("Fenêtre JavaScript");
</script>
<h1 id="pied">Pied de la page</h1>
</body>
</html>
2 http://fr.wikipedia.org/wiki/UML_%28informatique%29
Est affiché :
• le titre h1 d'en tête
• la fenêtre JavaScript
Le navigateur a bloqué le chargement il attend la validation « ok ».
En conséquence le titre h1 du pied de page ne sera affiché qu'après avoir validé.
A la volée comme HTML et CSS, c'est à dire dès que le navigateur lit l'instruction.
4-Si on écrit le code JS dans un fichier externe, a t-on le même fonctionnement ? (2.html)
La ligne se termine toujours d'un « ; ». alert() est une fonction prédéfinie qui affiche le texte
entre parenthèses dans une fenêtre. On remarque aussi que le texte est délimité par des
guillemets.
Une fonction en JS est nommée et toujours suffixée par des ().
Remarque :Cette fonction est souvent utilisée pour afficher des valeurs en phase de
développement.
Second programme
Nous allons afficher un contenu HTML sans balise HTML à partir de JavaScript:
<!doctype html>
<html>
<head>
<title>Alerte!</title>
<meta charset="utf8">
<style>
body{
fontfamily: ubuntu;
fontsize: 30px;
color: #ff0000;
}
h1{
position: fixed;
top: 50%;
}
h1#tete{
top: 0;
}
h1#pied{
top: auto;
bottom: 0;
}
</style>
</head>
<body>
<h1 id="tete">En tête de la page HTML</h1>
<script>
document.write("<h1>Titre h1 généré à partir de JavaScript</h1>") ;
</script>
<h1 id="pied">Pied de la page</h1>
</body>
</html>
2-La ligne JS permet d'écrire une chaîne de caractères dans la page courante. Que représentent
respectivement « document » et « write » ?
« document » caractérise la page en cours d'utilisation sur laquelle on applique la méthode qui succède.
JavaScript considère « document » comme un « objet » avec lequel on dispose de « propriétés » et de
« méthodes ».
« write » est la méthode qui va agir sur « document » et son rôle consiste à écrire une chaîne dans la page.
3-D'un point de vue syntaxique, qu'est-ce qui assure lien entre « l'objet » et « méthode » ?
On peut en faire de même avec les propriétés, par exemple le titre de la page HTML en modifiant le script :
<script language="javascript">
1 : document.write("<h1>titre h1 généré à partir de JavaScript</h1>") ;
2 : alert("Avant modification : Le titre de la page est 'Alerte!' Affiché dans l'onglet");
3 : document.title="Nouveau Titre";
4 : alert("Après modification : l'onglet affiche 'Nouveau Titre'");
</script>
4-La ligne 3 permet de modifier la propriété « title » qui contient la chaîne correspondant au titre de la
page HTML ( équivalent de la balise <title>). Quelles différences y a t-il entre une propriété et une
méthode ? (4.html)
La propriété contient une valeur qu'il peut être possible de modifier, dans le cas présent avec « = »
qui est considéré comme un opérateur d'affectation.
Alors qu'une méthode effectue une action, write() permet d'écrire. De plus au niveau syntaxe, la
propriété n'est pas suivie de parenthèses.
Les exemples précédents font appel au paradigme « programmation orientée objet », en effet on
remarque que les méthodes et les propriétés sont toujours associées à un élément que l'on désigne par le
terme d'objet.
En développement web, cela correspondant souvent à un élément HTML mais pas seulement (nous
verrons des exemples par la suite).
Syntaxe objet
On peut considérer que les attributs HTML relatif à une balise sont aussi des propriétés JavaScript.
Exercice :
1-Écrire en JavaScript l'équivalent de la balise <img>3 décrite ci-dessous en vous appuyant sur la syntaxe
JS.
En HTML :
<img name="objetImage" src="monImage.png" width="800" height="600" alt="texte flottant">
On souhaite appliquer la méthode « zoom() » à cette même image.
En JavaScript:
document.objetImage.src="monImage.png" ;
document.objetImage.width=800; Sens d'exécution des
document.objetImage.height=600; instructions
document.objetImage.alt="texte flottant" ;
document .objetImage.zoom() ;
2-De part la structure des lignes JS, que remarquez-vous ? Pourquoi est-ce écrit de la sorte ?
(1) Les lignes sont toutes préfixées par document. En effet l'image est incluse dans <body> et son
équivalent est « document » en JS, cela signifie que JavaScript respecte la hiérarchie entre les
éléments au même titre que HTML. On parle alors de hiérarchie entre les objets.
(2) L'image est nommée en HTML et c'est ce nom que l'on utilise en JS pour la désigner.
L'accès aux propriétés ou l'application des méthodes d'un objet va dépendre de sa position dans la
hiérarchie d'une part, deuxièmement le nommage des objets doit être unique sinon il y a un risque
certains de confusion.
Elles sont typées dans le sens ou JS distingue un nombre d'une chaîne de caractères grâce aux
guillemets. Il existe d'autres types que nous verrons par la suite.
3 http://www.w3schools.com/jsref/dom_obj_image.asp – liste des propriétés de l'objet img ( à consulter pour tous les objets)
Comme nous l'avons vu précédemment, les objets sont hiérarchisés en fonction de leur « position » dans la
page HTML. Attention, on rappelle que certains objets n'ont pas d'équivalent HTML comme « Date » ou
«Math». Liste ci-dessous n'est pas exhaustive, il manque un certains nombre d'objets issus d'HTML5.
window
window Document
Document Form
Form Button
Button
Location
Location Link
Link Submit
Submit
L'objet window caractérise la
fenêtre du navigateur.
Pour accéder à l'historique de
navigation ou à l'URL de la page
visitée, il est nécessaire d'y faire History
History Image
Image Reset
Reset
référence.
Applet
Applet Text
Text
TextArea
TextArea
Password
Password
Exercice
Soit le formulaire (code HTML page suivante), en vous appuyant sur la hiérarchie des
objets JS, on vous demande : (5.html)
1- de donner les objets faisant partie du formulaire : FileUpload
FileUpload
input[type="button"] permet de spécifier la nature de l'input (ici le bouton). Cette syntaxe CSS
permet de sélectionner suivant un attribut HTML.
3-On souhaite insérer du code JavaScript dans la page HTML, sachant que l'on va manipuler des objets du
formulaire, à partir de quelle ligne peut-on insérer ce code ? Écrire en HTML alors la déclaration de cette
zone de script.
Compte tenu que nous devons accéder au formulaire, il faut que celui-ci soit connu du navigateur
quand on exécutera la code JS, donc deux possibilités :
• soit on place le code après la ligne 58
• soit dans l'en-tête mais uniquement avec des fonctions JS ( partie traitée plus loin)
58 </form>
59 <script language="javascript">
… code JS …
?? </script>
4-La chaîne de caractères saisie en tant que login est accessible via la propriété « value », écrire en
JavaScript et en une ligne , la récupération du login dans une variable « log » :
var log = document.formulaire.login.value ;
5-Modifiez la ligne HTML du bouton « bntCx » pour que celui lance la fonction javascript « affiche() »
dès qu'on l'actionne.
<input type="button" value="Valider" name="btnCx" onclick="affiche();">
6-A partir des 2 questions précédentes, on souhaite que le login soit affiché dans une fenêtre d'alerte
quand on clique sur le bouton, complétez en conséquence la fonction JavaScript « affiche() » :
function affiche(){
var log=document.formulaire.login.value ;
alert(log) ;
}
function affiche(){
alert(document.formulaire.login.value) ;
}
La saisie se fait après le chargement de la page donc pour récupérer la saisie, il faut passer par le
gestionnaire d'événement ( action de l'utilisateur dans ce cas ) et une fonction qui sera exécutée
qu'à ce moment précis.
Les variables sont des objets permettant de mémoriser des informations afin de faire des traitements.
Dans la plupart des langages, les variables sont typées, c'est à dire qu'il est nécessaire de leur donner un
type à la déclaration ( comme le C/C++/Java etc.).
En langage C:
int c ; //déclaration de c en tant qu'entier
…
c=1200 ; //affectation de valeur
var c ; // « c » est déclarée mais non typée
c=1200 ; // « c » est un nombre à l'affectation
Les noms donnés aux variables doivent respecter quelques contraintes comme :
-Toujours commencer par une lettre ou le caractère « _ »
-Pas d’espaces, lettres et chiffres autorisés (si ce n'est pas le premier caractère)
-Un certains nombre de mots sont réservés il est donc impossible de les utiliser pour nommer une
variable
-Respecter la casse, JavaScript tient compte des minuscules et Majuscules.
-Toujours précédée de l'opérateur « var » au moment de la déclaration
Les types natifs (parfois appelés primitifs) sont des « pseudo-objets » qui disposent de propriétés et de
méthodes.
Attention : Les booléens ( Boolean) sont déclarés à l'aide des valeurs « true » et « false », ce sont des
mots clés utilisés par JavaScript.
Objet référencé:
C'est un type défini par le développeur, il est associé à un espace mémoire et sont stockés dans le tas
( heap).
Seules les références à ces valeurs sont stockées dans la pile d’exécution (stack). Ce mécanisme permet
d’utiliser deux variables pointant sur une même adresse et donc la même instance.
En JavaScript, tous les objets suivent ce principe, comme l’illustre le code suivant :
var monObj1 = new Object() ;
var monObj2 = monObj1 ;
L'opérateur « new 4» crée un objet à partir d'une fonction « constructeur » qui va ainsi initialiser l'objet ( la
variable).
Détermination de type
Il est parfois nécessaire de connaître le type de la variable pour effectuer un traitement adapté, la
méthode typeof remplit ce rôle.
Exercice
A partir du tableau page 11, donnez les valeurs attendues pour chaque cas ci-dessous :
var variable1;
alert(" type de variable1 : "+(typeof variable1));
// variable1 est de type undefined
var variable2 = null;
alert(" type de variable2 : "+(typeof variable2));
// variable2 est de type object
var variable3 = 12.3;
alert(" type de variable3 : "+(typeof variable3));
// variable3 est de type number
var variable4 = "Monsieur Dupont";
alert(" type de variable4 : "+(typeof variable4));
// variable4 est de type string
var variable5 = true;
alert(" type de variable5 : "+(typeof variable5));
// variable5 est de type boolean
4 https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Op%C3%A9rateurs/L_op%C3%A9rateur_new
Conversion de type
La manipulation des variables n'est pas toujours possible sans avoir fait au préalable une conversion de
type. Pour cela on utilise les méthodes suivantes :
variable.toString() ; // convertit la variable en chaîne de caractères
parseInt(variable) ; // convertit en entier
parseFloat(variable) ; // convertit en flottant
Attention à la syntaxe.
Exercice (6.html)
JS
function add(){
var nombre1=document.formulaire.nbr1.value ;
var nombre2=document.formulaire.nbr2.value ;
var resultat1 = nombre1 + nombre2 ;
var resultat2 =.parseFloat(nombre1) +.parseFloat(nombre2) ;
alert("resultat 1 =" + resultat1 + " resultat 2 =" + resultat2) ;
}
Un formulaire renvoi une chaîne de caractères, nombre1 et nombre2 sont donc considérées comme des
variables de type « String ». « resultat1 » contient deux chaînes concaténées ( avec + ).
Les opérateurs permettent de lier des variables ou/et des expressions entre elles.
Opérateurs d’affectation
Opérateurs Arithmétiques
Opérateurs de comparaison
Opérateurs logiques
Exercice
Écrire sous une autre forme :
maVar = maVar + 150 ; → maVar += 150 ;
maVar = maVar 1 ; → maVar ;
Il suffit de diviser par 2 et d'en récupérer le reste, s'il est nul c'est un nombre pair sinon nombre
impair.
var parite = nombre%2 ;
Le langage JavaScript définit plusieurs structures de contrôle afin de réaliser des conditions et des boucles
et de mettre en œuvre des renvois.
Ces structures classiques sont présentes dans la plupart des langages de programmation.
Comme nous allons le voir, elles sont aisément utilisables.
a-Conditions « if » , « else » et « else if »
Les tests conditionnels sont les plus couramment utilisés, ils permettent d'effectuer des actions en à l'aide
aux opérateurs logiques et de comparaison ( voir page précédente).
Syntaxes
Chaque bloc d'action est encadré par « {} » sauf si une seule action est définie. Les conditions sont à
mettre systèmatiquement entre « ( ) ».
Exercice (7.html)
En reprenant l'exercice précédent, écrire le script permettant d'afficher dans une fenêtre d'alerte si le
nombre saisi dans un formulaire est pair ou impair. Les conditions à tester sont :
• On cherche la parité si le nombre est entier et non nul
( peut être négatif)
• On affiche une erreur texte adaptée si rien a été saisi,
si c'est un nombre à virgule, si nombre 0 et si c'est une
chaîne de caractère qui a été saisie
Dans un premier temps faire l’algorithme sous forme d'organigramme :
HTML +JS
Variables à
déclarer :
« nombre » : contient la valeur saisie par formulaire
« message » : contient le texte à afficher dans la fenêtre d'alerte.
<body>
<form name="formulaire">
<fieldset><legend>Pair ou Impair</legend>
<label>Nombre entier à tester :</label>
<input type="text" name="nbr" size="5">
<input type="button" value="+" name="btnCx" onclick="tester();">
</fieldset>
</form>
<script language="javascript">
function tester(){
var nombre = document.formulaire.nbr.value;
if(nombre==""){
reponse = " Veuillez saisir un nombre";
}else{
if(isNaN(parseFloat(nombre))){
var reponse = "Saisie incorrecte, il faut un nombre";
}else{
if(parseFloat(nombre) == parseInt(nombre)){
nombre=parseInt(nombre);
if(nombre % 2 == 0 && nombre != 0){
var reponse = nombre +" est pair";
}else if(nombre % 2 > 0){
var reponse = nombre +" est impair";
}else{
var reponse = "0 est ni pair ni impair!";
}
}else{
var reponse = nombre +" doit etre une valeur entière";
}
}
}
alert(reponse);
}
</script>
</body>
b-structure switch case
Cette structure de contrôle permet de procéder aux tests de valeurs possibles pour une variable.
Syntaxe
switch(variable){
case valeur1 : Cette structure impose de délimiter les actions
//actions produites pour une valeur par l'instruction break
break ; sauf pour les actions définies par défaut ( default)
case valeur2 : qui correspond à tout autre valeur que celles
//actions testées.
break ;
…
case default :
//actions
}
Cette structure ne permet de tester qu'une seule variable mais il est possible de combiner des switch
case pour du « multi-test ».
Exercice
Écrire un script qui renvoie un message en fonction de la variable « systeme » :
Code :
switch(systeme){
case "Linux" :
message="Choix judicieux" ;
break ;
case "Windows" :
message="Comme quoi vitrier mène à tout !" ;
break ;
case "OSX" :
message="Je n'ai jamais vraiment apprécier les pommes" ;
break ;
case default :
message="RAS" ;
}
alert(message) ;
a-Boucle for
La première s’appuie sur le mot-clé for afin de spécifier à la fois les traitements d’initialisation réalisés à
l’entrée de la boucle, la condition de sortie et les traitements à réaliser après chaque itération. Tant que la
condition de sortie est vraie, l’itération continue.
Syntaxe :
for(valeur de départ;valeur de fin de boucle; valeur à chaque itération){
//actions
}
Exercices
1-Écrire un script qui permet de répéter 1000 fois la même chose.
for(var i=0;i<1000;i++){
//action
}
C'est la variable i qui est testée. Elle est déclarée dans la boucle en tant que variable locale afin de
ne pas impacter le programme.
3-Modifiez la boucle pour que celle-ci n'affiche que les nombre pairs ( en partant de 0 pour aller jusqu'à
1000).
for (var i=2;i<1002;i+=2) {
//action
}
4-On souhaite créer un tableau HTML avec les balises <tr> et <td>. Il compte 10 lignes de 5 cellules
chacune. Le tableau sera généré sous forme de chaine de caractères et stocké dans la variable
« tableau » qui sera ensuite affiché à l'aide de « document.write()». On affichera dans chaque cellule,
le numéro de ligne et le numéro de colonne (séparés par une « , »). (8.html)
<script>
var tableau="<table border='1'>";
for(var i=0;i<10;i++){
tableau+="<tr>";
for(var j=0;j<5;j++){
tableau+="<td>"+(i+1)+","+(j+1)+"</td>";
}
tableau+="</tr>";
}
tableau+="<table>";
document.write(tableau);
</script>
Remarque : La condition de fin ne doit jamais être testée avec le signe « = » seul, soit « < », soit « > »,
soit « >= » et « <= ».
b-boucle for in
La boucle for...in est une variante de la précédente qui se sert du mot-clé for conjointement avec le
mot-clé in, ce dernier permettant de spécifier la variable à utiliser.
Cette boucle permet de parcourir tous les éléments des tableaux indexés ou des objets, comme nous les
verrons par la suite.
for( variable in structure ) {
//action
}
La boucle while permet de spécifier la condition de fin. Aussi longtemps que cette condition est vraie, les
traitements sont répétés.
2-Quelle est la variable testée ? Comment est-elle déclarée et pourquoi ? Que se passe t'il sans
incrémentation , comment se comporte le navigateur ?
La variable testée est i, elle doit être initialisée avant while car on ne spécifie que la condition de
fin. Sans incrémentation, i n'atteindra jamais 1000, on reste bloqué dans la boucle et le navigateur
est bloqué lui aussi.
C'est le problème majeur du while, la boucle sans fin est un système utilisé pour programmer des
serveurs mais avec un contrôle sur les variables d'état.
3-Modifiez la boucle pour que celle-ci n'affiche que les nombre pairs ( en partant de 0 pour aller jusqu'à
1000). Y a t'il une particularité à propos de la condition de fin ?
var i=0 ;
while(i<1000){
//action
i+=2 ;
}
Oui on ne met pas de « = » en test, cas typique ici avec une condition de test jamais validé i = 1001.
On reste alors dans la boucle, c'est pourquoi on ne met jamais de signe « = » seul ( comme for).
La dernière boucle do...while est une variante de la précédente, qui permet d’effectuer le bloc avant la
première condition.
La syntaxe de cette boucle est la suivante :
do {
//action
} while( condition de fin );
Les tableaux en JavaScript sont instanciés, en effet c’est à partir de la classe Array (avec un A majuscule).
Les tableaux sont des séries de valeurs regroupées sous un même nom.
a-Tableaux indicés
La déclaration d’un tableau de type Array se fait avec l’opérateur new5. L’indice numérique varie de 0 à n
(0 étant le premier indice).
var fruits = new Array() ;
fruits[0]= pomme ;
fruits[1]= citron ;
fruits[2]= raisin ;
fruits[3]= fraise ;
5 Voir page 12
Pour accéder à une valeur du tableau il suffit d’utiliser le nom de celui suivi de « [] » comprenant l’indice
de la valeur :
var fruits = new Array("de la pomme","du citron","du raisin","des fraises");
var x=Math.round(3*Math.random());
resultat.value="Le hasard a voulu qu'on mange "+fruits[x];
Dans cet exemple, la valeur recherchée dans le tableau fruits[x], x étant une variable aléatoire générée par
Math.random() .
L'intérêt de for...in
A supposer que le tableau suivant soit déclaré comme suit :
(10.html)
var tab = new Array() ;
tab[0]="pomme" ;
tab[1]="fraise" ;
tab[3]="citron" ;
tab[4]="raisin" ;
Écrire avec la boucle for puis avec for in, un script permettant de lire
le tableau :
for(var i=0;i<tab.length;i++){
document.write(tab[i]) ;
}
for(var i in tab){
document.write(tab[i]) ;
}
Le cellule d'indice 2 n'existe pas, avec une boucle « for » il faut vérifier l'existence de la cellule
alors qu'avec « for...in » ce n'est pas nécessaire.
b-Tableaux associatifs
Les indices sont remplacés par des mots appelés « clés », la méthode de déclaration est identique que
celle des tableaux indicés avec new et Array():
var fruits = new Array("automne","exotique","été","printemps");
fruits["automne"]= pomme ;
fruits["exotique"]= citron ;
fruits["été"]= raisin ;
fruits["printemps"]= fraise ;
Affichage des valeurs avec un tableau associatif :
document.write(fruits["automne"]) ; //affiche la valeur pomme ;
document.write(fruits[2]) ; // affiche la clé été ;
Résumé : Le tableau associatif permet de définir des clés au lieu des indices.
tableau[clé] = valeur ; tableau[indice] = clé ;
c-Tableaux multidimensionnels
Dans les paragraphes vu précédemment, les données contenues dans un tableau n’avaient qu’une seule
valeur. Il possible d’affecter plusieurs valeurs à une donnée grâce aux tableaux multidimensionnels.
Supposons que l’on souhaite créer un tableau 2 dimensions contenant 8 valeurs qui pourrait être
représenté comme suit :
//Déclaration standard
var fruitsEtSaison = new Array([ Fraise , Pêche , Raisin , Pomme] ,[ Printemps
, Eté , Eté , Aut omne]) ;
Pour lire une valeur dans un tableau à plusieurs dimensions, il faut faire référence à sa position dans celui-
ci en colonne et ligne :
var valeur = tableau [colonne][ligne] ;
Exercice (11.html)
Créer le tableau suivant, puis à l'aide de boucle généré un tableau HTML (voir la capture ci-après) :
0 1 2 3
0 Saint Brieuc Quimper Rennes Vannes
1 Lannion Brest Saint Malo Lorient
2 Dinan Morlaix Redon Pontivy
Attention la structure HTML est inversée.
Code JS
var dpt22 = new Array("Saint Brieuc","Lannion","Dinan");
var dpt29 = new Array("Quimper","Brest","Morlaix");
var dpt35 = new Array("Rennes","Saint Malo","Redon");
var dpt56 = new Array("Vannes","Lorient","Pontivy");
var dptBZH = new Array(dpt22,dpt29,dpt35,dpt56);
document.write("<table border='1'>");
document.write("<tr><td> </td><td>0</td><td>1</td><td>2</td></tr>");
for(var i in dptBZH){
document.write("<tr><td>"+i+"</td>");
for(var j in dptBZH[i]){
document.write("<td>Cellule ("+i+","+j+") = "+ dptBZH[i][j]+"</td>");
}
document.write("</tr>");
}
document.write("</table>");
d.Tableaux « objet »
Générer des tableaux objet permet de définir une classe générique applicable ensuite à tout moment, cela
donne de la souplesse de programmation.
On souhaite créer un tableau qui enregistre les Rendez-vous avec la date, le nom de la personne et le
motif du RV.
Il faut dans un premier temps définir le constructeur :
function rendezVous(_dateRV,_nomRV,_motifRV) {
this.dateRV=_dateRV ;
this.nomRV=_nomRV ;
this.motifRV=_motifRV;
}
La fonction rendezVous() est un constructeur et permet de d’associer des paramètres.
Il suffit ensuite d’instancier :
var rvLundi = new rendezVous("31/05","M.Dupont","Achats");
var rvMardi = new rendezVous( 01/06 , Mme.Martin , Repas ) ;
Pour accéder aux valeurs, il suffit d’appeler la propriété correspondante :
document.write(rvLundi.motifRV) ; //Affiche le motif du Lundi soit Achats
Remarque :
L’opérateur this prend en considération l’objet actif à l’instant voulu dans l’exemple ci-dessus
rvLundi. Il est donc nécessaire d’utiliser cet opérateur quand l’objet est non spécifié.
Exemple (12.html)
1. for(var i=0;i<10;i++){
2. document.write("Rayon :"+i+"m , surface ="+calculSurface(i)+"m²<br>");
3. }
4. function calculSurface(rayon){
5. var surface = Math.round(2*Math.PI*Math.pow(rayon,2));
6. return surface;
7. }
Dans l'exemple ci-dessous, a est déclarée hors fonction et hors boucle, elle est donc globale.
testPortee() peut y accéder :
var a = 10;
testPortee();
function testPortee(){
document.write("a="+a);
}
Ici a est déclarée dans la fonction varLocale(), testPortee() ne peut y accéder d'où l'erreur dans
firebug.
b-appel de fonction
Le navigateur n'exécute jamais une fonction si celle n'est pas appelée (cela ne signifie pas qu'il n'en
connaît pas l'existence). Elles peuvent être placées dans l'en-tête de la page HTML sans que cela génère
des erreurs du type objet inexistant ( instructions y faisant référence avant que la page HTML ne soit
chargée).
L’appel d’une fonction se fait en utilisant le nom employé dans la déclaration et en plaçant ou non des
paramètres entre parenthèses.
Soit la fonction :
function faireQuelqueChose(parametre1,parametre2){
// code de la fonction
return valeur ;
}
- la fonction s'exécute avec deux paramètres puis renvoie une valeur grâce à return, valRetour récupère
cette valeur
var valRetour = faireQuelqueChose(valeur1,valeur2) ;
La valeur de retour est directement testée, elle peut être de type booléen ( ici true) ou numérique/chaîne
de caractères (avec des " si la chaîne est directement testée) :
if(faireQuelqueChose(valeur1,valeur2)) { …}
if(faireQuelqueChose(valeur1,valeur2)==valeurTest) {…}
Exercice :(14.html)
On souhaite créer une fonction qui permet de tracer un tableau à partir de 2 paramètres colonne et ligne.
La saisie du nombre de colonne et de ligne se fait à partir d'un formulaire, le tableau est généré dans un
bloc div spécifique après avoir cliqué sur le bouton. Avant de dessiner, on testera la validité de la saisie
( valeur positive entière uniquement). La valeur de retour de la fonction attestera de la validité ( true =
ok, false = erreur affichée dans une fenêtre d'alerte).
creerTab() dessine()
2-A partir du code HTML ci-dessous, créer le script JS qui comprendra les deux fonctions :
<body>
<form name="formulaire">
<fieldset><legend>Dessine moi un tableau</legend>
<label>Nb Colonne :</label><input type="text" name="col" size="5">
<label>Nb Ligne :</label><input type="text" name="lgn" size="5">
<input type="button" value="Dessine un Tableau" onclick="dessine();">
</fieldset>
</form>
<div id="zone"></div>
<script>
function creerTab(colonne,ligne){
if(isNaN(parseFloat(colonne)) || isNaN(parseFloat(ligne))){
return false;
}else if(parseInt(colonne) > 0 && parseInt(ligne) > 0){
colonne=parseInt(colonne);
ligne=parseInt(ligne);
document.getElementById("zone").innerHTML="";
var tab = "<table border='1'>";
for(var i=0;i<ligne;i++){
tab+="<tr>";
for(var j=0;j<colonne;j++){
tab+="<td>"+i+","+j+"</td>";
}
tab+="</tr>";
}
tab+="</table>";
document.getElementById("zone").innerHTML=tab;
}else{
return false;
}
return true;
}
function dessine(){
var c=document.formulaire.col.value;
var l=document.formulaire.lgn.value;
if(!creerTab(c,l)){
alert("Erreur, impossible de tracer un tableau");
}
}
</script>
</body>
Chapitre 7
JavaScript – DOM
Le DOM (Document Object Model) est une interface de programmation pour tous les documents HTML et
XML1. Elle est définie par le W3C ( http://www.w3.org/DOM/). Il s'agit d'une structure représentant les
documents tels qu'ils sont interprétés par le navigateur en mémoire. Il est alors possible de modifier sa
structure (HTML et CSS) via les méthodes de l'API2 JavaScript.
1.Principe du DOM
Au chargement du document HTML, la page est définie comme un arbre respectant la hiérarchie et
l'encapsulation des balises. Chaque élément (balises entre autres) est vu comme un objet et est associé à
un nœud. Par analogie avec l'arbre biologique, un nœud peut être assimilé à une jonction entre des
branches.
Les nœuds se distinguent alors par leur lien de parenté ( relation parent/enfant/frère et orphelin), il est
alors possible d'accéder aux propriétés et méthodes de chacun, d'ajouter ou supprimer des nœuds etc. .
<!doctype html>
<html> html
<head>
<title>Structures DOM</title>
<meta charset="utf8">
<style rel="stylesheet" href="style.css">
<script src="script.js"> head body
document.onload=init() ;
</script>
</head>
<body>
<div id="tete"></div> div
title meta style script div
<div> #tete
<span><h1>Blog TECH</h1></span>
<table> 1er enfant dernier enfant
…
</table>
<img src="partenaires.png"> span table img
</div>
</body>
</html>
h1
Remarque :
La représentation sous forme d'arbre DOM est possible avec Firefox grâce au module « DOM
Inspector ».
1 http://fr.wikipedia.org/wiki/Extensible_Markup_Language
2 Application Programming Interface (en) – Interface de programmation d'application (fr)
2.Terminologie
• Un arbre est la structure hiérarchique qui relie les nœuds entre eux. Sa « racine » correspond au
document et son « tronc » à la page HTML. Les nœuds constituent les « branches » du réseau
d’éléments.
• Un nœud (node) correspond au composant de base de l’arbre. Il existe plusieurs types de nœuds,
les principaux sont : élément (type 1), attribut (type 2) ou texte (type 3).
• Le parent (parentNode) d’un nœud est toujours unique. C’est celui dont est issu le nœud courant.
• Les enfants (childNodes) sont les nœuds issus du nœud courant. Parmi les nœuds enfants on
distingue le « premier enfant » (firstChild Node) et le dernier enfant (lastChild Node) cas
d’une liste déroulante par exemple avec les différentes <option>.
• Les nœuds Frères (sibling nodes) sont les nœuds qui ont le même parent que le nœud courant.
On distingue ceux placés juste avant (previousSibling) et juste après (nextSibling) du nœud
courant .
Exercices
A partir de l'exemple précédent :
1-On se positionne sur le node « head » donnez :
Rel (stylesheet)
Style href ( style.css)
Meta(PS),title,script(NS)
src
Script (script.js)
Document.onload=init() Title,style(PS),meta
Span h1 table(NS)
La manipulation du DOM repose principalement sur l'accès au nœud (node). L'API permet de balayer
l'arbre et de retrouver l'élément à partir de critères précis. Il suffit ensuite de l'associer à un objet
JavaScript pour le manipuler.
a-l'identifiant « id »
Nous avons utilisé précédemment, l'attribut « id » en HTML pour associer des propriétés CSS. Il s'avère que
l'id sert aussi à pointer le nœud à partir de la méthode DOM « getElementById("id") ». C'est une
méthode de l'objet « document ».
HTML
<img id="monImage" src="image.png">
JSDOM
var image = document.getElementById("monImage") ;
image est une variable JavaScript que l'on associé à l'objet HTML dont l'id est « monImage », il est alors
possible de manipuler ce nœud via sa variable :
alert(image.src) ; // renvoie la valeur de src c'est à dire « image.png ».
image.src="autreImage.png" // on change l'image directement via le DOM
Exercice (1dom.html)
Soit la page HTML ci-dessous. On souhaite afficher par alternance deux images :
- Par défaut, c'est image1.png
- au passage de la souris c'est image2.jpg
Modifiez le code ci-dessous :
<!doctype html>
<html>
<head>
<title>Exemples DOM 1</title>
<meta charset="utf8">
</head>
<body>
<img id="monImage" src="images/image1.png" onmouseover="change(true)"
onmouseout="change(false)">
<script>
function change(action){
var image = document.getElementById("monImage");
if(action){
image.src="images/image2.jpg";
}else{
image.src="images/image1.png";
}
}
</script>
</body>
</html>
L'arbre DOM est construit à partir de nœud correspondant aux balises de la page HTML. Il est possible de
pointer sur une balise en particulier en faisant référence à son type grâce à la méthode
« getElementsByTagName() ». Elle aussi est associée à l'objet « document ».
var image = document.getElementsByTagName("img") ;
Exercice
Même chose que précédemment, mais avec en plus deux images que l'on inverse l'une par rapport à
l'autre.
<!doctype html>
<html>
<head>
<title>Exemples DOM 1</title>
<meta charset="utf8">
</head>
<body>
<img src="images/image1.png" onmouseover="change(true)"
onmouseout="change(false)">
<img src="images/image2.jpg" onmouseover="change(true)"
onmouseout="change(false)">
<script>
function change(action){
var image = document.getElementsByTagName("img");
if(action){
image[0].src="images/image2.jpg";
image[1].src="images/image1.png";
}else{
image[0].src="images/image1.png";
image[1].src="images/image2.jpg";
}
}
</script>
</body>
</html>
La classe CSS est aussi un critère de sélection d'un nœud du DOM et pour cela on utilise
« getElementsByClassName() » . Elle aussi est associée à l'objet « document » et renvoie une
« nodeList » dans un tableau :
var image = document.getElementsByClassName("classe") ;
On y accède :
image[x] ou image.item(x) ;
Exemple
var objHTML = document.querySelector(" div a ") ;
Le nœud pointé est le premier lien dans le premier div
var objHTML = document.querySelector("div a") ;
Tableau de nœuds correspondant à tous les liens des tous les div
3.2-Propriétés du DOM
Attention à ne pas confondre avec les propriétés des nœuds ( comme src pour img par exemple), ici les
propriétés sont relatives à la manipulation du DOM, accès à un nœud frère par exemple, déterminer le
nœud parent etc.
Propriétés Description
innerHTML Contenu d'un élément HTML
outerHTML Contenu HTML et l'élément lui même
textContent ou Contenu texte simple
innerText
style Ensemble des propriétés CSS d'un élément
style.* * correspond à une propriété CSS, attention elles ne s'écrivent pas de la même façon
en JavaScript. Voir correspondance CSS-JavaScript3.
tabindex Index de tabulation
id Valeur de l'attribut id
lang Valeur de l'attribut lang
title Valeur de l'attribut title
tagName Nom de la balise
className Nom de la classe CSS
classList Enumération des classes
childNodes Liste des nodes enfants d'un élément
firstChild Premier enfant d'un élément
lastChild Dernier enfant d'un élément
parentNode Noeud parent
nextSibling Noeud frère suivant
prevSibling Noeud frère précédant
attributes Liste des attributs d'un noeud
3 http://www.w3schools.com/jsref/dom_obj_style.asp
Modification
Liste des méthodes permettant de créer/supprimer ou modifier des attributs d'un nœud du DOM:
Propriétés Description
getAttribute("attr") Renvoie la valeur de l'attribut attr
setAttribute("attr", Modifie la valeur de l'attribut attr avec la valeur val
val)
removeAttribute("att Supprime l'attribut attr
r")
focus() Donne le focus à un élément
Blur() Retire le focus
Création et suppression
Liste des méthodes permettant de créer et supprimer des nœuds dans le DOM :
• createElement(), crée dynamiquement un nœud DOM :
var element = document.createElement("div") ;
var enfant = document.createElement("img") ;
document.parent.appendChild(enfant) ;
var enfant = document.querySelector("div#box>a") ;
document.getElementById("box").removeChild(enfant) ;
var newLi = document.createElement("li") ;
var listeParente = document.getElementsByTagName("ul") ;
listeParente[0].insertBefore(newLi,listeParente[0].lastChild) ;
HTML :
Avant Après
<ul> <ul>
<li>premier li</li> <li>premier li</li>
<li>deuxième li</li> <li>deuxième li</li>
… ...
<li>Dernier li</li> <li>Nouvel li créé</li>
</ul> <li>Dernier li</li>
</ul>
var texte = document.createTextNode("Node texte de type 3") ;
document.querySelector("body").appendChild(texte) ;
Exercice
On souhaite réaliser une banque de lien, l'utilisateur saisie l'URL et le texte associé pour créer le lien. Pour
cela on utilise la méthode prompt(). Elle permet d'afficher une fenêtre de saisie et de la récupérer dans
une variable :
var reponse = window.prompt("Phrase ou question","valeur par défaut") ;
Chaque lien sera affiché les uns en dessous des autres, les erreurs de saisie doivent signifiées ( champs
vides ou url = http:// ) :
<!doctype html>
<html>
<head>
<title>Exemples DOM 3</title>
<meta charset="utf8">
</head>
<body>
Banque de Liens
<div id="banque">
</div>
<input type="button" value="Création de Liens" id="btn">
<script>
var bouton = document.getElementById("btn");
bouton.onclick=function(e){
var box = document.getElementById("banque");
var url=window.prompt("Saisir URL:","http://");
if(url=="" || url=="http://"){
alert("Saisie incorrecte!");
}else{
var lien = window.prompt("Texte du lien","Lien");
if(lien==""){
alert("Erreur de saisie");
}else{
var newA = document.createElement("a");
newA.setAttribute("href",url);
newA.setAttribute("target","_blank");
var texte=document.createTextNode(lien);
newA.appendChild(texte);
box.appendChild(newA);
box.innerHTML+="<br>";
}
}
}
</script>
</body>
</html>
4.Gestionnaire d'événements
Nous avons vu au chapitre 6 qu'un gestionnaire d'événements permet d'ajouter de l'interactivité dans les
applications web (C6 - §3.2 page 3)
Le DOM ne déroge pas à la règle, il offre la possibilité de gérer les événements ( liste des événements pris
en charge en annexe).
Rappel
<img id="monImage" src="image.png" onclick="fonction JavaScript">
Événement « onclick » lance la fonction JS au « click » sur l'image.
Avec DOM :
var image = document.getElementById("monImage") ;
monImage.onclick=function(e){
… // code de la fonction exécutée dès la détection de l'événement
}
On remarque :
• que la fonction n'est pas nommée
• que la valeur passée en paramètre (e) est associée à l'événement, certains événements disposent
d'attributs comme la position du curseur de la souris pour « onmousemove ».
• qu'il n'est plus nécessaire d'écrire l'événement dans la balise
Exercice
Écrire la version DOM du gestionnaire d'événements donné ci-dessous :
HTML
<img id="monImage" src="image.png" onclick="change(1)" onmouseover="change(2)">
DOM JS
var image = document.getElementById("monImage") ;
image.onclick=function(e){
change(1) ;
}
image.onmouseover=function(e){
change(2) ;
}
Chapitre 9 – SGBD
Chapitre 10 - SQL
Chapitre 9
Introduction aux bases de données
L’accès rapide à l’information via les réseaux intra et internet a nécessité la création de systèmes
d’organisation des données. Si l’on souhaite rechercher des personnes portant le même nom dans un
département avec un annuaire, on peut aisément imaginer que cela prendrait beaucoup de temps.
Face à de tels problèmes l’informatisation du stockage des données est devenue obligatoire.
1.Base de données
Une base de données est un ensemble d’informations stockées sur un support et doté d’une certaine
organisation.
2.1-Les entités
On appelle entité une représentation d’un ensemble d’objets réels ou abstraits qui ont des
caractéristiques communes.
On distingue deux sortes d’entités :
• les entités fortes, qui ne dépendent pas de l’existence d’une autre entité
• les entités faibles, qui dépendent d’une autre entité.
2.2-Les attributs
Cela représente des caractéristiques particulières comme le nom, le prénom,
l’adresse email de l’entité utilisateur par exemple. utilisateur
Chaque entité dispose d’au moins un attribut appelé identifiant qui permet de
la distinguer des autres, il doit être unique. Des utilisateurs peuvent avoir le ID
même le nom et cela pourrait plus compliquer à les différencier. En règle Nom
générale, la clé primaire correspond à un identifiant numérique et unique pour
chaque entité. Prenom
Email
2.3-Les associations
Le concept d’association permet de représenter le lien existant entre deux ou plusieurs entités. Une
association entre deux entités est dite « binaire ». Au-delà on dit qu’une association est « n-aire ».
Il est fortement conseillé de créer des associations binaires et à décomposer celles qui seraient ternaires.
Une association est généralement désignée par un verbe d’action, si on prend par exemple
«Utilisateur lit un message », « lit » est l’association entre deux entités « utilisateur » et
«message ».
Elle est modélisée graphiquement par une ellipse dans laquelle on spécifie son nom et ses attributs :
utilisateur Message
Lire
ID MID
Nom Date
Titre
Prenom Texte
Email Auteur
Exercice
On cherche à modéliser les locations de chambre dans un hôtel.
1-On vous demande de modéliser l'association des entités client ↔ chambre. Vous rechercherez les
attributs des deux entités et l'association (éventuellement ses propres attributs).
Client Chambre
ID Louer NumID
Nom Nombre de place
Prenom Date début Tarif
Email Nbr Jours
Réserver
Date début
Nbr Jours
2.4-Cardinalités
La cardinalité mesure le nombre de « liens » qu’il est possible d’avoir entre deux entités.
Par exemple, un Utilisateur peut lire un seul et unique Message en même temps, alors qu’un Message peut
être lu en même temps par plusieurs Utilisateurs.
On peut donc considérer que la cardinalité n’est pas forcément la même suivant le sens de l’association.
utilisateur Message
Cardinalités caractéristiques :
• Association entre la brosse à dent et son propriétaire, elle est de type « 1,1 », on parle alors de
cardinalité « un à un »
• Association entre livre et auteur, elle est de type « 1,n », « un à plusieurs »
• Une personne est célibataire ou mariée à une autre personne, de type « 0,1 », on parle alors
« optionnel »
• Entre un appartement et locataire, de type « 0,n », « 0 à plusieurs »
Exercices :
Client Chambre
ID Louer NumID
Nom 1,N 0,N Nombre de place
Prenom Date début Tarif
Email 1,N Nbr Jours 0,N
Réserver
Date début
Nbr Jours
Ex2- Un ministère comprend plusieurs services. Chaque service est dirigé par une seule personne. Pour
tenir compte des changements de directeur, l’association « diriger » doit prendre en compte la date de
nomination du directeur. De plus on a besoin de connaître le nom et l’ID du directeur, de même que l’on
doit enregistrer le nom du service et son id. Représenter les entités, associations et déterminer le
nombre de cardinalités.
Directeur Service
Ex3-Soit le même ministère qu’à l’exercice 2 mais en reprenant l’association entre tous les employés du
ministère et les services dans lesquels ils travaillent.
Employé Service
Un employé travaille dans un 1 service ( il ne peut pas ne pas faire partie d'un service), un service compte
au moins 1 employé.
Ex4-Pour suivre l’évolution des prix, on recense un nombre de produits vendus dans un ensemble de
magasins. Recherchez cardinalités, attributs ainsi que l'association entre magasin et produit.
Magasin Produit
Ex5-On souhaite modéliser un garage de voiture et mettre en évidence l'association « vendre » entre les
clients, les vendeurs et les véhicules.
Tracez la représentation graphique du modèle entités/associations, donnez toutes les entités, les attributs
ainsi que les cardinalités.
Client Véhicule
0,N
Vendeur
ID
Nom
Tel
Un vendeur peut vendre aucune ou plusieurs véhicule à aucun ou plusieurs clients. Les véhicules sont ou
ne sont pas vendus.
C'est une association ternaire, mettant en évidence l'association de plus de 2 entités. Elle ne peut se lire
que dans un sens (lié à l'association).
3.Modèle Relationnel
Ce modèle s'appuie sur le MCD pour être employé dans les SGBDR ( Système de Gestion de Base de
Données Relationnels). On retrouve une structure similaire au niveau des entités, en revanche les
associations sont elles aussi caractérisées en tant qu'entité. Elles sont alors considérées comme des
relations.
Les dénominations changent :
• une entité devient une table
• les attributs d'une entité deviennent des colonnes de la table
• l'identifiant unique d'une entité devient une clé primaire ( clé de table)
• Pour une association binaire ayant des cardinalités max 1.1, une des tables reçoit comme attribut
supplémentaire une copie de la clé primaire (Voir fig 1 page suivante)
• Pour une association binaire ayant des cardinalités maximales 1.N (relation 1.1 – 1.N par exemple),
la table représentant l’entité de cardinalité 1.1 reçoit la clé de l’autre entité (voir fig2)
• Pour une association binaire N.M (1N-1N ou 0N-1N par exemple), l’association est toujours traduite
par une table. La clé primaire de cette nouvelle table est la concaténation des clés primaires des
entités reliées par cette association (voir fig3)
Directeur Service
ID 1,1 1,1
SID SID
Nom NomDuService
figure 1
Employé Service
ID 1,1 1,N
SID SID
Nom NomDuService
figure 2
ID 1,N PID
1,N 1,N 0,N
Enseigne PID* Nom
Adresse ID* Fabricant
Directeur Nombre Type
Prix
figure 3
Exercices
Ex1-Faire le modèle relationnel entre les articles publiés sur un site et leurs auteurs respectifs. Vous
indiquerez les tables, colonnes ainsi que les cardinalités.
Articles
Auteur
AID
1,N 1,1
ID ID
Nom Titre
Prenom Texte
Mail Date
1,1
0,N
Vendeur
VID
Nom
Tel
Location
ID
Client NumID Chambre
1,1 Date début 1,N
Nbr Jour
ID NumID
Nom 1,N 0,N Nombre de place
Prenom Tarif
Email 1,N 0,N
Réservation
1,1 1,N
ID
NumID
Date début
Nbr Jour
Chapitre 10
SQL
Créé par IBM en 1970, le SQL (Structured Query Language) est le langage de manipulation de données
devenu standard dans la plupart des Systèmes de Gestion de Bases de Données Relationnelles (SGBDR).
Ce langage a fait l’objet de normalisations successives de la part de l’ANSI (American National Standards
Institute). Toutefois chaque SGDB adapte SQL en utilisant certaines de ses fonctionnalités et en ajoutant
d’autres non standards.
1.Principe
SQL n’est pas un langage procédural, il n’intègre pas de structure de contrôle (if, for, while etc.) en
revanche il manipule les ensembles.
Les instructions SQL sont dissociables en 4 familles :
• Manipulation des données et des tables avec les commandes SELECT, INSERT, DELETE et UPDATE
• Création et définition des tables, organisation des données, index etc.
• Définition des droits et permissions des utilisateurs
• Définition de début et fin de transaction et compatibilité avec d’autres langages comme le C/C+
+,JAVA ou PHP par exemple
Les champs doit avoir un typage prédéfini, en revanche la valeur par défaut n’est pas obligatoire et de fait
ils sont positionnés à la valeur NULL.
Tracez le modèle relationnel de cette base :
La clause WHERE accepte des expressions logiques comme AND,OR mais aussi des opérateurs de
comparaison numériques comme < et > par exemple.
SELECT vld FROM Clients WHERE vendeur=’dupont’ AND anneeAchat=’2009’;
SELECT Modele FROM vehicule WHERE annee >2009 ;
L’équivalent pour comparer des chaines nécessite l’emploi des instructions Between ... AND
SELECT vld FROM Clients WHERE anneeAchat Between ’2009’ AND ‘2010’;
Recherche dans une table à partir d’un groupe de valeur avec l’opérateur IN:
SELECT Nom FROM Clients WHERE anneeAchat IN(2005,2007,2008) ;
Recherche d’un motif dans une chaine de caractères avec LIKE %motif% :
SELECT * FROM Clients WHERE nom LIKE D% ;
SELECT * FROM Clients WHERE nom LIKE D_pont ;
le _ masque un caractère dans le motif.
SELECT * FROM Clients WHERE nom LIKE [DG]% ;
Sélectionne tous les noms dont la première lettre est comprise entre D et G.
Il est aussi possible de faire une recherche avec plusieurs critères , les modèles avec prix croissant et
marque décroissant, dans ce cas si le prix est le même entre deux modèles le tri portera sur la marque :
SELECT Modele FROM Vehicule ORDER BY Prix ASC, Marque DESC;
3.4-Les jointures
Les requêtes avec multi -relations ou jointures permet de relier des champs de différentes tables entre
eux. Il est impératif que les champs liés soient de même type.
Si on souhaite connaître les noms des clients qui ont acheté un modèle particulier, on constate que
«modele » et « nom » ne sont pas dans les mêmes tables. Il faut donc utiliser des champs (ici vId) :
SELECT Nom FROM Clients,Vehicule WHERE Clients.vId=Vehicule.vId ORDER BY Nom
ASC;
On peut aussi utiliser des alias pour les tables dans le cas précédent :
SELECT Nom FROM Clients C,Vehicule V WHERE C.vId=V.vId ORDER BY Nom DESC;
4-Fonctions Agrégats
Les fonctions Agrégats permettent de compter, moyenner, déterminer un maximum ou un minimum.
Fonctions :
• AVG , calcule la moyenne des valeurs retournées par une requête
• COUNT, compte les valeurs retournées par une requête
• SUM, additionne les valeurs d’une requête
• MIN et MAX, déterminent les minimums et maximum des valeurs retournées par une requête
On souhaite compter les réparations par mécanicien dont on veut connaître le nom ainsi que le
temps moyen des réparations :
SELECT AVG(R.Temps),COUNT(M.rId),nomMeca FROM Mecanicien M, Reparations R
WHERE M.mId=R.mId;
Ce qui donnerait :
6-Requêtes Imbriquées
Cela consiste à effectuer une requête dans une autre requête en règle générale dans une clause WHERE.
Ce qui revient à utiliser le résultat de la requête incluse dans une autre requête.
7-Requêtes quantifiées
Une requête imbriquée renvoie des valeurs qui peuvent être filtrées. On parle alors de requêtes
quantifiées en filtrant ces valeurs à l’aide d’opérateurs.
On souhaite connaître les temps des réparations dont le montant est supérieur à toutes interventions de
type « Révision » :
SELECT temps FROM Reparation WHERE montant > All(SELECT montant FROM
Reparation WHERE motif=”Révision”;);
Dans le cadre SQL cela correspond à des opérations effectuées entre deux requêtes.
On cherche les clients qui ont comme vendeur « Dupont » et l’année d’achat était 2009 :
SELECT Nom FROM Clients WHERE vendeur=”Dupont”
INTERSECT
SELECT Nom FROM Clients WHERE anneeAchat=”2009”;
9.Insertion de lignes
La commande INSERT into associée à VALUES permet d’ajouter une ligne dans une table. Par exemple
Ajout d’un nouveau mécanicien dans la table :
INSERT into Mecanicien VALUES(‘\N’,’Dubois’) ;
\N correspond à une clé primaire avec auto-incrément nécessaire pour définir un id différent pour chaque
entrée.
Il est important de donner une valeur à chaque champ et si la valeur est inconnue on utilise ‘NULL’.
Il est possible de rentrer des valeurs à partir d’une autre table, pour cela on utilise la clause SELECT.
INSERT into conges VALUES(‘12/10/10’,’14’,mId) SELECT mId FROM Mecanicien
WHERE nomMeca=’Dubois’ ;
Avant même d’enregistrer des données dans la base, il faut bien évidemment que celle-ci existe :
CREATE DATABASE ‘nomBase’ ;
Et la suppression de celle-ci :
DROP DATABASE ‘nomBase’ ;
12.Administration de la base
Il est impératif d’avoir un compte pour accéder au serveur de base de données. Par défaut ce compte est
dépendant du serveur, il est possible de demander une authentification par un autre dispositif (exemple
annuaire LDAP).
Certains serveurs de base de données, ne demande pas de mot de passe pour le compte administrateur
pendant l’installation (cas de MySQL). Il est donc important de lui en fournir un et de créer un autre
compte qui permet de faire des opérations sur les bases mais avec des droits plus limités voire même pour
une base particulière.
Pour créer un utilisateur :
CREATE USER ‘test’@ ‘localhost ou IP’ IDENTIFIED BY ‘motdePasse’
GRANT (Définitions des droits sur les tables)//pour toutes
INSERT , UPDATE, DELETE, ALTER (etc.) //les bases
GRANT ALL PRIVILEGES ON ‘base’ //cas particulier pour une base
Exemple :
CREATE USER 'test'@'localhost' IDENTIFIED BY '***';GRANT SELECT, INSERT, UPDATE, DELETE, CREATE,
DROP ON *.* TO 'test'@'localhost' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;GRANT ALL PRIVILEGES ON
`asterisk`.* TO 'test'@'localhost';
13.Création de tables
Pour créer une table on utilise la commande CREATE TABLE.
Il y a des règles à respecter :
• Chaque table de la base possède un nom unique
• Une table est composée d’au moins un champ
• Chaque champ au sein d’une table possède un nom unique
• Il est possible de mettre des contraintes sur les champs lors de la création de la table
On définit avec la table, tous les champs qu’elle contient ainsi que leur typage :
• Modele est de type chaine (VARCHAR) et contient au plus 30 caractères.
• prix est de type entier (INT)
• Annee est une date (DATE)
• vId est une clé primaire en auto-incrément
Remarque : ENGINE est une instruction qui spécifie le type du moteur de sauvegarde employé (ici =>
innoDB).
14.Champs de table
Le champ permet d’enregistrer la donnée, l’ensemble des champs d’une table constitue une ligne et à
chaque fois qu’on enregistre de nouvelles informations cela revient à insérer une nouvelle ligne.
On constate qu’il faut définir un nom par champ et un type à minima.
Les données disposent d’une valeur par défaut qui peut être fixée (optionnel) par la clause DEFAULT. Cela
permet, dans certains cas, d’être certains que les champs ne seront pas vides pendant leur création.
Sur l’exemple page précédente, la création d’une clé primaire avec l’option AUTO_INCREMENT qui permet
à chaque entrée dans la colonne une incrémentation automatique et on interdit toutes valeurs NULL :
`vId` INT NOT NULL AUTO_INCREMENT PRIMARY KEY
14.4-Contraintes de tables
Lors de la création des tables il est important de définir des contraintes. Comme nous l’avons vu
précédemment, la nécessité des clés primaires pour assurer une bonne cardinalité dans un schéma «
Entités/Associations » vu en cours (chap9).
Mais il y a aussi la possibilité de faire les références et en particulier avec les clés étrangères qui, rappelons
le, permet d’inclure des clés primaires dans d’autres tables. De fait ces clés sont mises à jour
automatiquement si la clé primaire change. On évite ainsi les corruptions de bases.
On insère une clé étrangère dans la table Conges (mId) qui est déjà une clé primaire dans la table
Mecaniciens (appelée également mId) :
CREATE TABLE `Garage`.`Mecaniciens` (
`mId` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nomMeca` VARCHAR( 40 ) NOT NULL
) ENGINE = InnoDB;
CREATE TABLE `Garage`.`Conges` (
`date` DATE NOT NULL ,
`duree` TIMESTAMP NOT NULL ,
FOREIGN KEY `mId` INT NOT NULL REFERENCES
`Garage`.`Mecaniciens`(mId)
) ENGINE = InnoDB;
Il faut aussi pouvoir définir les triggers pour les clés étrangères. En effet si on supprime une clé primaire
ou si on modifie il faut pouvoir garder l’intégrité de la table.
Pour cela on emploie les mots clés suivants lors de la création de la table :
CREATE TABLE `Garage`.`Conges` (
`date` DATE NOT NULL ,
`duree` TIMESTAMP NOT NULL ,
ON DELETE CASCADE,
ON UPDATE CASCADE,
FOREIGN KEY `mId` INT NOT NULL REFERENCES
`Garage`.`Mecaniciens`(mId)
) ENGINE = InnoDB;
15.Assertions
Les assertions sont des conditions ou expressions qui doivent être satisfaites lors d’une modification de
données pour que celles-ci puissent être réalisées.
On définit une assertion de la façon suivante :
CREATE ASSERTION nom_assertion CHECK ( expressions / conditions)
D’un point de vue SQL , une assertion est l’équivalent d’une table dont le contenu changera grâce
aux expressions.
16.Les Vues
Les vues sont des « tables virtuelles » dans lesquelles sont placées des données venant de tables
physiques. L’intérêt d’une vue vient du fait que les données sont regroupées dans une même entité et de
sélectionner les données à afficher.
Pour créer une vue on emploie la clause :
CREATE VIEW nom (colonnes) AS requete.
Pour effacer une vue on utilise la clause :
DROP VIEW nom
CREATE VIEW voiture (col1,col2,col3) AS
SELECT modele, marque, prix FROM Vehicules WHERE annee=’2010’;
Chapitre 11 – Généralités
Chapitre 12 – Chaînes et Tableaux
Chapitre 13 - PDO
Chapitre 11
PHP – Généralités
1.Introduction
PHP permet de générer des pages interactives, qui permet aux visiteurs de saisir des informations par le
biais de formulaire, de les traiter coté serveur (Stockées dans une base de données, un fichier, envoyer un
flux etc). L’avènement de PHP était inévitable et il est aujourd’hui le langage « coté serveur » le plus
déployé sur internet.
Depuis 1994 (date de sa première version) PHP a suivi une évolution riche tout en prenant en compte des
besoins toujours plus grands des développeurs Web. A ce jour, les serveurs sont pour la plupart dotés de la
version 5+, on notera que le passage 4.0->5.0 a permis à PHP de devenir un véritable langage orienté
objet.
La version 6 a été définitivement abandonnée au profit de la version 7 en cours de test et de
développement.
2.Présentation de PHP
PHP repose sur des modules (ou extensions) dont le principal, le module standard qui permet d’accéder
aux instructions élémentaires, aux différents types de données et à un grand nombre de fonctions.
A cela viennent s’ajouter un grand nombre de modules spécialisés comme l’accès aux différentes bases de
données.
La liste des modules référencés est disponible à l’adresse http://www.php.net qui est aussi le site officiel
du langage. (http://www.php.net/manual/fr/funcref.php)
Synoptique séquentiel
Client http
Interpréteur Index.php
PHP
UC
7-Le serveur renvoi le flux HTML au client en guise de réponse http (HTTP 200)
Le code PHP n'est pas renvoyé au client HTTP (synoptique précédent), il doit produire du code HTML qui
sera émis alors dans le flux. Pour cela on délimite les portions de code PHP de la façon suivante :
//code HTML
<?php
// code PHP
?>
//code HTML
<!doctype html>
<html>
<head>
…
</head>
<body>
<h1>...</h1>
<?php
echo "<p>Flux HTML Généré en PHP</p>" ;
?>
<div>...</div>
</body>
</html>
Dans ce cas les fichiers sont externes et leurs codes respectifs sont inclus à l'endroit où
l'instruction include est exécutée. Les scripts sont ensuite exécutés.
Remarque :
Il y a deux autres fonctions qui permettent aussi d’inclure des fichiers mais elles ne sont pas
exécutées qu’une seule fois :
-include_once "fichier" ;
-require_once "fichier" ;
3.Variables et constantes
Comme tout langage, PHP manipule des données. Elles sont typées sous forme de texte, de nombres
entier ou décimaux, valeurs booléennes, de types composés comme les tableaux, objets etc.
3.1-Variables standards
Les règles de création de variable sont les suivantes :
• Chaque variable possède un identifiant particulier toujours précédé du caractère $
• Le nom commence toujours par un caractère alphabétique ou par _ (pas de car. Accentué ni de
ponctuation)
• La longueur du nom n’est pas limitée
• La déclaration n’est pas obligatoire tout comme l’initialisation, la variable prend le type dès sa
première utilisation
• Les noms de variables sont sensibles à la casse $mavar=/=$MaVar
//Affectation par référence
1 :$maVar1= Brest ;
2 :$maVar2=&$maVar1 ;
3 :$maVar1= Rennes ;
Que vaut ?
Ligne 2 : $maVar2= Brest
Ligne 3 : $maVar2= Rennes
L'affectation par référence consiste à prendre en compte l'adresse mémoire d'une variable (équivalent des
pointeurs en C).
3.2-Variables prédéfinies
PHP dispose d’un grand nombre de variables prédéfinies, qui contiennent des informations sur le serveur,
sur toutes les données qui transitent entre le client et le serveur.
Depuis la version 4.1, les variables sont disponibles sous forme de tableaux « superglobaux ».
Elles permettent, entre autre, de récupérer les données envoyées par un formulaire.
1. <!doctype html>
2. <html>
3. <head>
4. <meta charset="utf8">
5. <title>Formulaire d'envoi de données</title>
6. </head>
7. <body>
8. <form action="reponse1.php" method="get">
9. Nom:<input type="text" name="nom"><br>
10. Prénom:<input type="text" name="prenom"><br>
11. <input type="submit" name="Envoyer">
12. </form>
13. </body>
14. </html>
Définit le formulaire, la méthode d'envoi – ici GET – et le script appelé pour recevoir les données –
ici reponse1.php.
http://localhost/coursPHP/reponse1.php?nom=Durant&prenom=Jean&Envoyer=Envoyer
Script reponse1.php :
1. <?php
2. include 'genere_entete.php';
3. ?>
4. <body>
5. <h1>Données reçues par le serveur :</h1>
6. <?php
7. echo "Flux HTML généré par PHP:<br>";
8. echo "Nom envoyé :<b>".$_GET["nom"]."</b>";
9. echo "<br>";
10. echo "Prénom envoyé : <b>".$_GET["prenom"]."</b>";
11. ?>
12. <br>
13. <a href="index3.php">retour au formulaire</a>
14. </body>
15. </html>
Lignes 2, 7 à 10
echo "Nom envoyé :<b>".$_GET["nom"]."</b>";
echo "Prénom envoyé : <b>".$_GET["prenom"]."</b>";
Les données sont stockées dans un tableaux dont la clé de la cellule est le nom du champs HTML.
echo "Nom envoyé :<b>".$_POST["nom"]."</b>";
echo "Prénom envoyé : <b>".$_POST["prenom"]."</b>";
1. <!doctype html>
2. <html>
3. <head>
4. <title>
5. Cours PHP
6. </title>
7. <meta charset="utf8">
8. </head>
9. <body>
10. <h1>Données reçues par le serveur :</h1>
11. Flux HTML généré par PHP:<br>Nom envoyé :<b>Durant</b><br>Prénom envoyé :
<b>Jean</b><br>
12. <a href="index3.php">retour au formulaire</a>
13. </body>
14. </html>
lignes 1 à 8
Quelle partie du code HTML de <body> a été générée par du code PHP ?
La ligne 11
3.3-Les constantes
Il arrive parfois où nous sommes amenés à utiliser de manière répétitive des informations devant rester
constantes dans toutes les pages d’un site. Pour ne pas risquer l’écrasement accidentel, l’emploi des
constantes est indispensable.
define( PI ,3.141592,true) ;
define( Planck ,6.6E34,false);
« true » insensible à la casse et « false » sensible à la casse, dans l’exemple ci-dessus pi = PI alors
que Planck=/=PLANCK =/=planck etc.
define() est de type booléen, elle retourne « true » en cas de succès ou « false » en cas d’échec.
Exercice
On souhaite écrire un fichier « ctes.inc.php » qui contient les paramètres de connexion à une base de
données. Ce fichier est appelé par « index.php » systématiquement.
On suppose que les deux fichiers se trouvent dans le sous-répertoire.
2-Pour se connecter à une base de données, il faut indiquer l'adresse du serveur SGBD, le nom de la base,
le login et le mot de passe. Ces données ne doivent pas être modifiées par du code malsain c'est pour
cette raison que nous déclarerons en tant que constantes. Elles doivent être stockées dans le fichier
ctes.inc.php.
On vous demande d'écrire ce script qui ne fait que déclarer les constantes en vous appuyant sur le tableau
ci-dessous. La casse caractère doit être respectée :
<?php
define('_SERVEUR_','localhost',' false') ;
define('_BASE_','maBase',' false') ;
define('_USER_','felix',' false') ;
define('_MDP_','felix22',' false') ;
?>
Avant de manipuler les variables, il est parfois utile d’en connaître le type, cela permet de s’assurer que le
résultat attendu est conforme, incrémenter une variable de type chaîne alors qu’on pensait travailler avec
un nombre par exemple.
$typedemaVar=gettype($maVar) ; //renvoi le type de $maVar
Les fonctions de vérification de type renvoient toujours un résultat de type booléen d’où la nécessité de
tester. Voir le site officiel => http://php.net/manual/fr/book.var.php
$maVar=(type désiré) $laVariable ;
Comme ce sont des fonctions booléennes, il faut les employer avec des instructions de contrôle de type if,
while etc.
$maVar ; //$maVar est de type NULL
$maVar= "" ; //même si elle ne contient pas de chaine $maVar est de type string
4.1-Opérateur ?
L’opérateur ? permet de remplacer avantageusement une instruction if...else en évaluant une
expression et en attribuant à une variable une première valeur si la condition est vraie ou une autre valeur
si elle est fausse.
$maVar= (expression) ? valeur1 : valeur2 ;
//équivaut à
if(expression) {$maVar=valeur1 ;}else{$maVar=valeur2 ;}
Exercice
Écrire avec l'opérateur ?, le test de la variable $age qui retourne dans la variable $message soit « Majeur »
soit « Mineur » .
$message=($age<18) ? 'Mineur' : 'Majeur' ;
Exemple :
function division(){
$a=100/0 ; // une division par 0 provoque le message d’erreur suivant
}
Sur la page web :
Warning: Division by zero in index.php on line 3
try {
if(erreur prévue){
throw new Exception() ;
}else{
//Action normale
}
} catch(Exception $except){
//Gestion de l’erreur
}
Try...catch est un dispositif qui permet d'isoler la portion de code sensible, ainsi on peut poursuivre
l'exécution du script même en cas d'erreur fatale. L'instruction sensible est évaluée avant d'être exécutée.
Exercice
On vous demande d'écrire la gestion d'erreur pour la division. On suppose que $division = $a/$b.
Si $b est nulle on signale l'erreur fatale à l'aide de la méthode getMessage() :
try {
if($b==0){
throw new Exception() ;
}else{
$division=$a/$b ;
}
}catch(Exception $except){
echo Erreur dans la division: .$except>getMessage() ;
}
Chapitre 12
PHP – Chaînes et Tableaux
Les chaînes et les tableaux sont des éléments essentiels dans le traitement de données par PHP. Que ce
soit dans un formulaire ou dans la programmation client/serveur, les données émises au niveau applicatif
sont pour la grande majorité au format texte.
A cela s'ajoute l'API que fournit PHP et reposant sur de nombreux tableaux super-globaux permettant de
récupérer les requêtes http, de gérer les sessions etc.
PHP dispose d’un certains nombre de fonction pour assurer l’affichage standard ou formaté de chaînes.
1.1-echo
Exemples :
1. echo "Hello World" ;
2. echo "Bonjour Monsieur $nom" ;
3. echo "Bonjeur Monsieur ".$_GET["nom"] ;
- Dans tous les cas la fonction echo nécessite l'utilisation des " ou ' suivant le contenu
- Une variable peut être insérer dans les " sans avoir besoin de faire de la concaténation
- Contrairement à une variable un tableau ne peut pas être insérer dans une chaîne sans concaténation
(« . »)
Plus généralement on parle de flux standards en informatique, cela correspond à des canaux gérés par le
système d'exploitation et par lesquels les données transitent entre les programmes.
L'entrée standard « stdin » correspond au flux de données entrant dans un programme, la sortie standard
« stdout » correspond au flux de sortie des données provenant du programme.
clavier Ecran
réseau réseau
Programme
Bus Série
Bus Série
Fichier
1.3-print_r()
La fonction print_r() affiche la structure et les informations contenues dans un tableau. On utilise cette
fonction uniquement en phase de programmation. Elle redirige le flux standard vers « stdout ».
Exemples:
>print_r($_POST) ;
Array ( [NOM] => Dupont [PRENOM] => Michel [EMAIL] => mdurant@gmail.com [PSEUDO] => jdupont [MDP1]
=> [DDNJ] => 01 [DDNM] => Janvier [DDNA] => 2015 [genre] => Homme [CI] => Array ( [0] => ELN [1] =>
DIY ) )
>print_r($_FILES) ;
Array ( [avatar] => Array ( [name] => linux.jpg [type] => image/jpeg [tmp_name] => /tmp/phpiDsZfZ
[error] => 0 [size] => 22755 ) )
Les autres fonctions usuelles sur le traitement des chaînes de caractères sont décrites sur le site officiel :
http://php.net/manual/fr/ref.strings.php
2.1-Injection de code
Supposons que l'on ait le formulaire suivant( Exemple → http://localhost/coursPHP/chap12/index1.html ) :
<!doctype html>
<html>
<head>
<title>Chap12 Test injectionS HTML</title>
<meta charset="utf8">
</head>
<body>
<form method="get" action="index1.php">
Saisie : <input type="text" name="saisie"><br>
<input type="submit" value="Envoyer">
</form>
</body>
</html>
Écrire le programme PHP permettant d'afficher la saisie. On utilisera les scripts header.php et
footer.php pour l'en-tête et le bas de page HTML. index1.php affichera le corps.
<?php
require "header.php";
echo "Valeur reçue non sécurisée:".$_GET["saisie"];
require "footer.php";
?>
Cas typique d'envoi d'une chaîne avec du HTML – URL avec la méthode POST ::
http://localhost/coursPHP/chap12/index1.php?saisie=%3Ca+href%3D%22http%3A%2F%2Fwww.google.fr
%22%3EJean+Dupont%3C%2Fa%3E
Retrouvez la signification des codes en gras et retrouvez la chaîne qui a été saisie :
<a href="http://www.google.fr">Jean Dupont</a>
<!doctype html>
<html>
<head>
<title>Chap 12 réponse</title>
<meta charset="utf8">
</head>
<body>
Valeur reçue non sécurisée:<a href="http://www.google.fr">Jean Dupont</a>
</body>
</html>
2.2-Mesures de protection
Pour éviter du détournement de code ou de l'injection HTML, il faut que PHP génère une page HTML avec
une conversion de la chaîne saisie en texte.
Fonction htmlentities()
Elle convertit les caractères éligibles à HTML en caractère texte ( comme <, >, " etc. liste sur wikipedia :
http://fr.wikipedia.org/wiki/Aide:Liste_de_caractères_spéciaux)
Exemple :
$chaineTexte = htmlentities($chaine_à_convertir) ;
<?php
require "header.php";
echo "Valeur reçue et traitée avec htmlentities():".htmlentities($_GET["saisie"]);
require "footer.php";
?>
Valeur reçue et traitée avec htmlentities():<a href="http://www.google.fr">Jean
Dupont</a>
</body>
</html>
La fonction htmlspecialchars est très proche mais elle ne convertit que les caractères équivalent
HTML.
Il existe aussi la fonction strip_tags() qui élimine les balises HTML dans une chaine de caractère, elle est
dépendante de la version HTML, en général on autorise certaines balises avec cette fonction.
$chaine=strip_tags($chaine,balises_autorisées) ;
Exemples :
$chaine = "<span>M. Jean Dupont, adresse <a mailto ="jdupont@jdupont@bzh"> Email</a></span>" ;
$chaine1=strip_tags($chaine) ; // élimine toutes les balises
$chaine2=strip_tags($chaine,"<span><a>" ); //n'élimine pas <span> et <a>
XSS – Cross Site Scripting - est un procédé qui permet d'injecter du code malicieux dans une requête
HTML. Ce type d'attaque a permis par le passé de propager des virus comme Samy, de faire du fishing ou
pire encore d'exploiter des failles coté serveur ( spams sur les forums sans authentification par exemple).
PHP fournit une collection de fonctions permettant d'exploiter les expressions régulières. Cette famille
appartient aux PRCE ( http://php.net/manual/fr/ref.pcre.php ).
Les plus usités sont preg_match, preg_split, preg_replace et preg_grep. Dans tous les cas il faut se
familiariser avec les expressions régulières.
3.1-Rappel
L'expression régulière correspond à la définition d'un motif à partir duquel il est possible de faire des
comparaison, des tests de validités ou des recherches sur des chaînes de caractères.
Le principe a été abordé en cours, la documentation officielle PHP reprend les bases:
http://php.net/manual/fr/reference.pcre.pattern.syntax.php
Exercices :
1-Donnez le motif pour vérifier si le nom commence par une majuscule :
^[A-Z][a-z]+$#
2-Donnez le motif pour rechercher une date de naissance écrite sous la forme JJ/MM/AAAA si J, M et A
sont des nombres, JJ ∈ [1-31] pas de 0 pour [1-9], MM ∈ [1-12] pas de 0 [1-9] et AAAA ∈ [19XX-20XX]
^([1-2][0-9]|[1-9]|3[0-1])\/(1[0-2]|[1-9])\/19|20[0-9]{2}$
3.2-Utilisations en PHP
Exemple
if(preg_match($motif,$chaine)){
//Si la chaine respecte le motif
}
Cette fonction extrait d'une chaîne des sous-chaînes à partir d'un caractère ou un motif de séparation.
Elle renvoie les sous-chaînes dans un tableau.
$tab = preg_split($motif,$chaine) ;
Exercice
Un fichier CSV contient les nom, prénom et les adresses email des utilisateurs d'un forum. On lit le fichier
et chaque ligne est récupérée dans une variable $chaine.
1- On vous demande de traiter la chaîne en récupérant chaque champs dans une cellule d'un tableau.
2- Même chose avec la fonction list() et les variables $nom,$prenom et $email.
list() :
La fonction list() transfère les valeurs d'un tableau dans des variables suivant l'ordre dans lequel elles
sont passées en paramètres.
$chaine="Jean;Dupont;jdupont@jdupont.fr" ;
1 preg_split()
$tableau=preg_split(" ;",$chaine) ;
4.Les tableaux
Ces notions ont été déjà vues avec JavaScript, on rappelle le principe :
$tabIndice = Array("Brest","Rennes","Lorient","Lannion") ;
echo $tabIndice[2] ; // affiche Lorient
$tabAsso = Array("Dpt29" => "Brest","Dpt35" => "Rennes","Dtp56" => "Lorient","Dpt22" =>
"Lannion") ;
echo $tabAsso["Dtp29"] ; // affiche Brest
Une chaîne de caractères est vue aussi comme un tableau indicé. Proposez un programme qui permet
d'afficher une chaîne de caractères dont chacun d'entre eux serait séparé par un « - » :
$chaine="Le PHP est un langage de script coté serveur";
Résultat dans le navigateur :
L-e- -P-H-P- -e-s-t- -u-n- -l-a-n-g-a-g-e- -d-e- -s-c-r-i-p-t- -c-o-t-é- -s-e-r-v-e-u-r-
<?php
require 'header.php';
$chaine="Le PHP est un langage de script côté serveur";
for($i=0;$i<strlen($chaine);$i++){
echo utf8_encode($chaine[$i]."");
}
require 'footer.php';
?>
Remarque : strlen() permet de compter le nombre de caractères d'une chaîne et count() le nombre de
cellules d'un tableau ( déclaré avec array()).
4.2-Tableaux multidimensionnels
Exercice :
Soit le tableau ci-dessous :
$villeBzh = Array (
Array("Saint Brieuc","Dinan","Lannion") ;
Array("Quimper","Brest","Morlaix") ;
Array("Rennes","SaintMalo","Redon") ;
Array("Lorient","Vannes","Pontivy") ;
) ;
Qu'est-ce qu'affiche ?
echo $villeBzh[1][2] ;
→ Morlaix
echo $villeBzh[3][1] ;
→ Lorient
echo $villeBzh[4][2] ;
Si on rajoute Guingamp aux villes Costarmoricaines, écrire la ligne permettant de l'afficher avec echo :
→ echo $villeBzh[0][3] ;
D’une manière générale on utilise les structures de boucles comme for, while etc. mais certaines sont à
utiliser avec précaution.
$tabVille[0]="Lannion" ;
$tabVille[1]="Guingamp" ;
$tabVille[3]="Morlaix" ;
$tabVille[4]="Brest" ;
for($i=0;$i<count($tabVille);$i++){
echo $tabVille[$i] ;
}
Recherchez une solution toujours avec for,while etc. pour afficher le tableau complet même si les cellules
ne sont pas contiguës :
<?php
require 'header.php';
$tabVille[0] = "Lannion";
$tabVille[1] = "Guingamp";
$tabVille[3] = "Morlaix";
$tabVille[4] = "Brest";
$tabVille[10]= "Rennes";
$j=0;
for($i=0;$i<count($tabVille);$i++){
while(!isset($tabVille[$j])){
$j++;
}
echo $tabVille[$j]."<br>";
$j++;
}
require 'footer.php';
?>
Boucle :
foreach
Cette boucle permet de régler le problème de l'exercice précédent (même si la solution proposée permet
aussi de palier au problème).
La syntaxe de cette boucle est différente si on utilise un tableau indicé ou associatif :
//Cas de tableau indicé
foreach($tableau as $valeur){
// instructions
}
$valeur contient la valeur de la cellule, attention cette valeur est écrasée à la prochaine itération.
//Cas d'un tableau associatif
foreach($tableau as $clef => $valeur){
//Instructions
}
$clef contient le « nom » de la cellule $tableau[$cle] = $valeur
Même remarque que précédemment avec $valeur.
Exercices
foreach($tabVille as $valeur){
echo $valeur ;
}
<form method="post" action="index.php">
Nom :<input type="text" name="nom"><br>
Prénom :<input type="text" name="prenom"><br>
signature:<textarea name="signature"></textarea><br>
Langue:<input type="radio" name="lg" value="fr">fr
<input type="radio" name="lg" value="en">en<br>
<input type="submit" value="Envoyer">
</form>
Écrire la boucle d'index.php qui affichera la saisie complète en indiquant les champs et leur valeurs :
foreach($_POST as $cle => $valeur){
echo "$cle : $valeur <br>" ;
}
5-Tableaux super-globaux
PHP fournit un certains nombre de tableaux super-globaux ( vu au chapitre 11) tel que $_GET ou $_POST.
Nous allons nous intéresser à 3 d'entre eux pour ce chapitre.
5.1-$_SERVER
Tableau contenant les informations relatives aux en-têtes HTTP. Il est ainsi possible de connaître l'adresse
IP du client, le script PHP exécuté, la nature du client HTTP (firefox, chrome etc.), le système etc. Il est très
utile de le consulter en particulier si on souhaite enregistrer les visites sur le site.
Le descriptif du tableau est donné → http://php.net/manual/fr/reserved.variables.server.php
Exemples :
echo $_SERVER['REMOTE_ADDR'] ; // Affiche l'adresse IP du client
$_SERVER['PHP_SELF'] ; //Contient le nom du script ciblé par le paramètre action
//d'un formulaire
5.2-$_FILES
Tableau qui contient les informations relatives aux fichiers envoyés par un formulaire. On peut ainsi
récupérer le nom d'origine du fichier, son nom dans /tmp du serveur, sa taille, son type (si reconnu) etc.
Configuration PHP :
L'envoi de fichier est limité par la taille du fichier à envoyer ainsi que par la taille des données envoyées par
formulaire. La configuration se fait au niveau du fichier php.ini situé dans le répertoire
/etc/php5/apache2/ :
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
; http://php.net/fileuploads
file_uploads = On
...
; Maximum allowed size for uploaded files.
; http://php.net/uploadmaxfilesize
upload_max_filesize = 10M
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/postmaxsize
post_max_size = 12M
Précautions à prendre
Le fichier est placé dans le répertoire /tmp du serveur sous un nom qui ne correspond pas à celui d'origine.
De plus il est supprimé à la fin d'exécution du script qui est censé le traiter coté serveur. Le déplacement
de celui-ci est assuré par la fonction move_uploaded_file().
5.3-$_SESSION
Avec HTTP, les données ne sont pas persistantes entre deux requêtes (pour un même site) y compris dans
le cas où on utilise le même script. Les données sont supprimées à la fin du script.
Il devient donc compliquer les connexions, le suivi des utilisateurs etc. .
Le tableau $_SESSION permet de compenser ce problème en mémorisant les données définies par le
développeur du site.
On peut y stocker tout ce qui servira au dispatcher ainsi que dans la gestion de la connexion.
Le système de session repose sur les cookies et sur les variables d'environnement de PHP, à chaque
exécution du script, qui gère les sessions, il y a un contrôle du cookie et une association à $_SESSION.
Notion de Dispatcher
Le Dispatcher et les sessions seront abordés au TP12.
Un dispatcher est un algorithme permettant d'afficher des contenus dynamiques et différents tout en
appelant toujours le même script.
Début
Récupération
de l'URL
Suivant
Les valeurs
Fin
Chapitre 13
PHP & PDO
Les applications utilisent massivement les Systèmes de Gestion de Bases de Données (SGBD) et les sites
internet en particulier.
PDO1 est une couche d'abstraction logicielle permettant de faire des requêtes vers un SGBD à partir d'un
script PHP et donc très utile pour les sites internet.
Un SGBD est un moteur d'analyse et de traitement des requêtes transmises par un client compatible. Il
décode la demande, puis l'exécute en recherchant, ajoutant, mettant à jour ou supprimant des données.
Le client s'appuie très souvent sur un langage spécifique pour effectuer une requête (SQL par exemple –
voir chapitre 10).
La connexion avec le SGBD se fait avec des « sockets » ( programmation client/serveur) et le flux de
données transitant entre le script et le serveur est en général en binaire. Il faut donc utiliser l'API de
développement fourni par le concepteur du SGBD.
La librairie PDO permet ainsi d'envoyer des requêtes au format SQL et de recevoir des données au
format texte.
La première solution est moins souple en cas de migration vers un autre SGBD, PDO est une couche
d'abstraction et dans ce cas il est très facile de migrer.
1 http://php.net/manual/fr/book.pdo.php
2 http://php.net/manual/fr/book.mysqli.php
3 http://php.net/manual/fr/book.pgsql.php
4 http://php.net/manual/fr/book.sqlite3.php
3.Accès séquentiel
PDO nous oblige, au même titre que les autres méthodes, de respecter un ordre séquentiel pour utiliser
un SGBD.
3 – On émet la requête ( méthodes différentes entre une requête de type recherche ou de type
modification)
5* – On transforme les données reçues en format texte et bien souvent dans un tableau
7 – On clôt la connexion
Pour la connexion, PDO s'appuie sur la classe PDO ( via un appel du constructeur __construct() ) :
Elle attend :
- le driver appelé sous-entendu le type de SGDB , mysql – sqlite3 – pgsql etc.
- le serveur SGDB ( adresse IP ou nom)
- le nom de la base de données
- le compte utilisateur et son mot de passe
Toutes ces valeurs sont des chaînes de caractères qui peuvent être contenues dans des variables ou
constantes ( on préférera des constantes).
Syntaxe :
objet = PDO( "driver:host=adresse_serveur;dbname=base_de_données","compte","mot_de_passe")
Il faut anticiper les problèmes éventuels liés aux erreurs de connexion, pour cela on utilise le gestionnaire
d'exception. Il est utilisé avec toutes les extensions objet de php comme PDO.
Cela consiste à « tenter » une connexion et en cas d'erreur, on intercepte l'exception pour la gérer par la
suite. Cela permet de contrôler toutes les phases d'exécution du script, il n'y a pas de place à un mode de
fonctionnement aléatoire.
try{
//tentative de connexion au SGBD
$connexion = … ;
catch(PDOException $except){
//Gestion de l'exception en récupérant le message d'erreur par exemple :
echo "Message d'erreur : ".$except>getMessage() ;
}
La classe PDOException fournit les méthodes nécessaires pour gérer l'exception. Dans l'exemple ci-
dessus, l'objet $except (instance de la classe) dispose de toutes les méthodes et propriétés ( voir la liste
→ http://php.net/manual/fr/class.pdoexception.php ).
Remarque
En P.O.O avec PHP, la syntaxe objet/methode et objet/propriété est :
objet>methode() ;
objet>propriete ;
Le symbole > assure la liaison entre les éléments. Comme dans l'exemple ci-dessus
$except>getMessage() ;
Exercice :
Fichiers :
<?php
require "ctes.inc.php" ;
require "connexion.php" ;
$temp="";
if(!($connexion=connexionBDD()){
include "afficheMessage.php" ;
die() ;
}
include "body.php" ;
?>
<?php
define("_HOTE_","localhost") ;
define("_BASE_","maBase") ;
define("_USER_","felix") ;
define("_MDP_","felix22") ;
?>
4.2-Émission de requêtes
PDO distingue ces deux types en utilisant deux méthodes différentes à savoir exec() et query().
1. <?php
2. require "ctes.inc.php" ;
3. require "connexion.php" ;
4. $temp="";
5. if(!($connexion=connexionBDD()){
6. include "afficheMessage.php" ;
7. die() ;
8. }
9. $requete = "update utilisateur set adresseEmail='$mail' where id='$uid'" ;
10. if(($nb=$connexion>exec($requete))===false){
11. include "afficheMessage.php" ;
12. die() ;
13. }
14. echo "Nombre de champs modifié : $nb" ;
15. ?>
La ligne 9, la requête est une chaîne de caractère dans laquelle on peut insérer des valeurs de variables.
On notera la présence des apostrophes encadrant les valeurs utilisées en SQL.
Ligne 10, la requête est transmise au SGBD avec exec() , le test de la valeur de retour permet de
s'assurer que cela s'est bien passé ou non. On notera les 3 = qui s'assurent de la valeur et du type ( booléen
& false ). $nb contient le nombre de champs affectés par la requête ( ici ce sera 1).
La communication avec un SGBD se fait via des sockets, système de dialogue entre client/serveur. Cela
permet d'établir logiciellement des connexions à partir des protocoles réseaux usuels ( TCP/UDP) ou
même à partir d'un protocole spécifique hors datagramme réseau comme MySQL ( raw sockets – sockets
brutes).
Les requêtes/données émises sont au format binaire et encapsulées, PDO fournit les méthodes qui
assurent l'extraction et la conversion texte ↔ binaire.
En reprenant l'exemple 2 :
D'un point de vue programmation, il faut récupérer les 4 champs dans un tableau. Et si on balaye la totalité
de la table, chacun de ces tableaux ( pour chaque enregistrement) pourrait être stocké dans un tableau
global. Cela signifie que la requête doit générer un tableau à 2 dimensions, chaque ligne de celui-ci serait
un tableau.
Ligne 6, $resultat est un tableau indicé qui ne contient que le premier enregistrement :
$resultat[0] → contient l'id = 1
$resultat[1] → le nom = Dupont
$resultat[2] → le prenom = Jean
$resultat[3] → l'email = jdupont@dupont.fr
Exercice
En reprenant le code ci-dessous (cf exemple 2), modifiez le de façon à ce que l'on affiche la totalité des
résultats en s'appyuant sur un tableau associatif pour chaque lecture :
<?php
require "ctes.inc.php" ;
require "connexion.php" ;
$temp="";
if(!($connexion=connexionBDD()){
include "afficheMessage.php" ;
die() ;
}
$requete = "select * from utilisateur order by nom asc;" ;
if(!($envoi=$connexion>query($requete)){
include "afficheMessage.php" ;
die() ;
}
while($ligne=$envoi>fetch(PDO::FETCH_ASSOC)){
foreach($ligne as $cle => $valeur){
echo "$cle : $valeur ;" ;
}
echo "<hr>" ;
}
...
Remarque
L'écriture PDO:: permet de définir l'espace de nom auquel appartient la méthode ou la propriété. Cela
évite d'avoir des effets de bords sur des nommages.
Il faut libérer la ressource pour l'exécution d'une nouvelle requête, pour cela on utilise closeCursor().
$envoi>closeCursor() ;
Une seconde requête pourra être exécutée. Attention cette méthode est exigible suivant les drivers
utilisés.
Les erreurs peuvent être interceptées pendant toute la phase de traitement. L'objet identifié par la
connexion dispose de la méthode errorInfo(). Elle crée un tableau stockant les erreurs renvoyées par le
SGBD.
$erreur = $connexion>errorInfo() ;
Le formalisme des requêtes nous impose une syntaxe particulière pour l'ajout de variable dans la requête.
D'un point de vue SQL, une valeur doit toujours être comprise entre des apostrophes (exemple 1 page 5).
Il faut s'assurer que le format est respecté avec une protection de la chaîne (requête) :
$requete = $connexion->quote($requete);
PDO fournit la méthode « rowCount() » permettant de compter le nombre de résultats trouvés à partir
d'une requête de type « SELECT » :
$nbReponses = $envoi>rowCount();
5.1-Procédures stockées
Les procédures stockées sont l'équivalent de fonctions crées en SQL. On procède à sa déclaration en lui
donnant un nom puis on lui associe un « programme » en SQL. L'intérêt est de définir sous un nom, un
ensemble d'instructions plus ou moins complexe qui peuvent être appelées autant de fois que possible.
Exemple
coté SQL :
DELIMITER |
CREATE PROCEDURE listeUtilisateur()
BEGIN
select * from utilisateur order by nom asc ;
END |
$envoi=$connexion>prepare("CALL listeUtilisateur()") ;
$envoi>bindParam(1,$utilisateurs,PDO::PARAM_STR) ;
$envoi>execute() ;
bindParam(), associe des variables PHP stockant soit des critères dynamiques soit des valeurs de
retours de requête. Les paramètres seront expliqués au paragraphe suivant.
execute(), comme son nom l'indique, exécute la requête ou l'appel de la procédure stockée.
Remarque
Il faut respecter l'ordre des appels des différentes méthodes, 1 → prepare() , 2 → bindParam()
puis 3-> execute().
5.2-Requêtes préparées
Les requêtes préparées permettent de créer des requêtes SQL qui ne sont pas directement utilisables
mais qui contiennent des paramètres auxquels il est possible de donner des valeurs différentes en
fonction des besoins comme des appels répétitifs par exemple.
Elles sont compilées et utilisées à la façon d'une procédure stockées, on retrouve les méthodes
présentées précédemment.
Les phases 2 & 3 sont alors répétées autant de fois que possible.
Exemple
1. $requete="update utilisateur set utilisateur.droit =:nvxdroit where utilisateur.nom=:nom" ;
2. $envoi>prepare($requete) ;
3. $envoi>bindParam(":nvxdroit","admin",PDO::PARAM_STR) ;
4. $envoi>bindParam(":nom","jean",PDO::PARAM_STR) ;
5. $envoi>execute() ;
6. $envoi>bindParam(":nvxdroit","user",PDO::PARAM_STR) ;
7. $envoi>bindParam(":nom","marie",PDO::PARAM_STR) ;
8. $envoi>execute() ;
9. $envoi>bindParam(":nvxdroit","webmaster",PDO::PARAM_STR) ;
10. $envoi>bindParam(":nom","morgane",PDO::PARAM_STR) ;
11. $envoi>execute() ;
ligne 2, la requête est envoyée au SGBD, elle va être vérifiée puis compilée
lignes 3-4, 6-7,9-10, association variables → valeurs, le dernier paramètre permet de typer la valeur
transmise soit PDO::PARAM_STR = chaîne de caractère ( Les autres types
->http://php.net/manual/fr/pdo.constants.php )
lignes 5,8 et 11, la requête est exécutée avec les valeurs transmises par bindParam().
Exercice
Supposons que l'on souhaite transférer des utilisateurs inscrits dans un fichier dans la table utilisateur.
Le fichier est de type CSV, sa structure est « nom;prenom;adresse_email » pour chaque
enregistrement.
La table est définie page 6, il ne sera pas nécessaire de prendre en charge l'id, cela se fait
automatiquement en Auto-Incrément par le SGBD. La requête SQL est de type « insert into ».
On vous demande d'écrire le programme permettant de faire ce transfert automatiquement en vous
appuyant sur les requêtes préparées.
$tabUtilisateur=preg_split(";",file("utilisateurs.txt")) ;
$requete="insert into utilisateur(nom,prenom,email) value(:nomU,:prenomU,:emailU)" ;
$envoi=$connexion>prepare($requete) ; //phase 1
foreach($tabUtilisateur as $cle=>$valeur){
$envoi>bindParam(":nomU", $tabUtilisateur[$cle][0],PDO::PARAM_STR); //phase 2
$envoi>bindParam(":prenomU",$tabUtilisateur[$cle][1],PDO::PARAM_STR);
$envoi>bindParam(":emailU", $tabUtilisateur[$cle][2],PDO::PARAM_STR);
$envoi>execute(); //phase 3
}
6.Les transactions
A supposer que sur un site marchand, un client effectue un achat et il faut, d’un point de vue
développement, réaliser simultanément deux insertions dans deux tables différentes. Si pour une raison
quelconque, un problème survient et que la seconde insertion ne se fait pas alors que la première l’est
déjà. La base contient alors une incohérence.
Les transactions permettent de gérer ce genre de problème en effectuant des commandes tout ou rien :
soit aucune des deux soit toutes les deux.
Le langage SQL possède les commandes pour le faire mais PDO nous fournit des méthodes qui permettent
de gérer les transactions sans y faire appel.
Une transaction doit commencer par la méthode beginTransaction() de l’objet PDO qui désactive le
mode « autocommit » de MySQL ( chaque modification effectuée est immédiatement enregistrée par
défaut).
L’envoi des requêtes est toujours effectué par les méthodes exec() et query(), après avoir vérifié que
les requêtes ont bien été exécutées, il suffit de valider l’ensemble avec la méthode commit().
Dans le cas contraire, les requêtes sont annulées avec la méthode rollBack().
Exemple
1. //début de la transaction
2. $connexion>beginTransaction();
3. //définition des deux requêtes
4. $requeteA="INSERT INTO utilisateur(uid,nom,prenom,email)
VALUES(‘/N’,’".$nom."’,’".$prenom."’,’".$email."’)";
5. $requeteB="INSERT INTO listeDiffusion(mail) VALUES(‘".$email."’)";
6. //Insertion des données
7. $envoi=$connexion>exec($requeteA);
8. $envoi+=$connexion>exec($requeteB);
9. if($envoi==2){
10. $connexion>commit(); //validation des requêtes
11. echo "Requêtes réussies : $envoi";
12. }else{
13. $connexion>rollBack();
14. $erreur=$connexion>errorInfo();
15. echo "Opérations annulées, erreur ".$erreur[2];
16. }