Les scripts CGI - Laboratoire d`Informatique de Paris 6

Transcription

Les scripts CGI - Laboratoire d`Informatique de Paris 6
DEUST 2
Développement Internet
O. Auzende
2010-2011
Développement Internet
O. Auzende
Table des matières
TABLE DES MATIERES ....................................................................................................................................... 2
INTRODUCTION ................................................................................................................................................... 3
LES SCRIPTS CGI ................................................................................................................................................. 3
1. INTRODUCTION. .................................................................................................................................................. 3
2. RESULTAT D’UN SCRIPT CGI............................................................................................................................... 3
3. TESTER DES SCRIPTS CGI.................................................................................................................................... 4
4. UN EXEMPLE DE SCRIPTS..................................................................................................................................... 4
5. PERL ET LE MODULE CGI.PM ............................................................................................................................. 5
6. COMMUNICATION DU NAVIGATEUR CLIENT VERS LE SCRIPT CGI ....................................................................... 7
7. PERL ET LES BASES DE DONNEES TEXTE............................................................................................................. 8
8. EXERCICE : REPONSE A UN FORMULAIRE............................................................................................................. 9
MICROSOFT ACTIVE SERVER PAGES (ASP) .............................................................................................. 10
1. EXEMPLES D'INCLUSION DE FICHIERS ET DE FONCTIONS ................................................................................... 10
2. UTILISATION DE FONCTIONS GENERALES .......................................................................................................... 11
3. UTILISATION DE L’OBJET REQUEST ................................................................................................................... 11
4. UTILISATION DE L’OBJET RESPONSE ................................................................................................................. 13
5. UTILISATION DE L’OBJET APPLICATION ............................................................................................................ 14
6. UTILISATION DE L’OBJET SESSION .................................................................................................................... 15
7. CONNEXION AUX BASES DE DONNEES ACCESS .................................................................................................. 15
BASES DE DONNEES MYSQL .......................................................................................................................... 18
1. LANCEMENT DU SERVEUR MYSQL ................................................................................................................... 18
2. CREATION D’UNE BASE DE DONNEES ................................................................................................................ 18
3. MYSQL EN MODE INTERACTIF .......................................................................................................................... 18
4. ARRET DE EASYPHP ......................................................................................................................................... 20
SERVLETS JAVA, JAVA SERVER PAGES ET JAVA BEANS ..................................................................... 21
1. PRINCIPE ........................................................................................................................................................... 21
2. TESTS DE SERVLETS ET DE PAGES JSP ............................................................................................................... 21
3. DIRECTIVES D'INSERTION .................................................................................................................................. 21
4. UTILISATION DE L’OBJET REQUEST : RECUPERATION D’ELEMENTS DE FORMULAIRE ......................................... 22
5. UTILISATION DE VARIABLES ET DE CLASSES JAVA ............................................................................................ 23
6. CONNEXION AUX BASES DE DONNEES ACCESS ET MYSQL................................................................................ 24
PHP ......................................................................................................................................................................... 29
1. LOCALISATION ET IDENTIFICATION DES FICHIERS ............................................................................................. 29
2. BALISES PHP .................................................................................................................................................... 29
3. LES VARIABLES DU LANGAGE PHP ................................................................................................................... 29
4. STRUCTURES DE CONTROLE .............................................................................................................................. 31
5. FONCTIONS PHP ............................................................................................................................................... 32
6. VARIABLES PROVENANT D'UN FORMULAIRE ..................................................................................................... 32
7. CLASSES PHP ................................................................................................................................................... 33
8. PHP ET LES FICHIERS TEXTE ............................................................................................................................. 34
9. PHP ET LES FONCTIONS SYSTEMES ................................................................................................................... 34
10. LES SESSIONS .................................................................................................................................................. 34
11. CONNEXION AUX BASES DE DONNEES MYSQL ................................................................................................ 36
12. CREATION ET UTILISATION D’UN PANIER ........................................................................................................ 39
2
Développement Internet
O. Auzende
Introduction
Lors d’une connexion à Internet, lorsqu’un utilisateur (client) demande au serveur auquel il est connecté
d’effectuer un traitement (interrogation d’une base de données en réponse à une demande effectuée avec un
formulaire), un programme s’exécute en temps réel sur le serveur et renvoie le résultat (généralement une page
HTML) au navigateur client. La page renvoyée est appelée une page dynamique, car elle n’était pas stockée telle
quelle sur le serveur mais a été générée lors de la demande.
Plusieurs technologies permettent de générer des pages dynamiquement. La technologie choisie dépend du
système d’exploitation de la machine utilisée comme serveur (Windows, Unix, Linux…) et du logiciel serveur
lui-même (Apache, MIIS, Netscape server …).
Ce cours a pour but de présenter chacune des technologies coexistant actuellement : CGI, ASP, JSP et PHP. Pour
chacune, on étudiera l’interfaçage avec des bases de données (bases de données texte, Access, MySQL).
Les scripts CGI
1. Introduction.
La programmation CGI (Common Gateway Interface) permet de construire dynamiquement des documents par
un serveur HTTP. Elle est associée au serveur Apache, généralement sous Unix et Linux mais éventuellement
aussi sous Windows. Les programmes CGI (appelés généralement scripts CGI) sont placés dans un répertoire
spécifique de l'arborescence du serveur, nommé /cgi-bin, contrôlé par l'administrateur du serveur qui vérifie leur
sécurité avant de les rendre accessibles au public.
Un programme CGI peut être écrit dans de nombreux langages, mais le langage choisi :
• doit pouvoir être exécuté sur une ligne de commande sans faire appel à un autre programme
• doit avoir accès aux variables d'environnement du serveur
• doit permettre d'écrire sur la sortie standard
On utilise :
• sous UNIX, les langages PERL, C, C++, Fortran, Pascal, TCL, sh, csh, ksh ou n'importe quel autre shell
• sous Windows, le C, le C++, le Visual Basic
• sur MAC-OS, essentiellement AppleScript.
S’ils sont écrits dans un langage de programmation qui demande à être compilé (C, C++, Fortran, Pascal…), les
fichiers compilés sont dans le répertoire /cgi-bin. Si les scripts sont écrits dans un langage de programmation
interprété (PERL, TCL, shell Unix, Applescript…), ils doivent se trouver dans le répertoire /cgi-bin. Dans tous
les cas, il faut vérifier que les fichiers possèdent bien les droits d'exécution.
2. Résultat d’un script CGI
Un script CGI peut renvoyer une image, un document HTML, un clip audio, des références vers d’autres
documents, etc. Comme le navigateur client doit savoir quel type de document lui est renvoyé afin de pouvoir le
traiter correctement, le résultat de l’exécution d’un script CGI doit comporter un en-tête (header) qui précise la
nature du document renvoyé. Exemple de résultat généré par un script CGI :
Content-type:text/html
l’en-tête
ligne blanche de séparation obligatoire
corps
<html>
<head>
<title>resultat du script CGI</title>
</head>
<body>
...
</body>
</html>
de la page HTML
générée par
le script CGI
3
Développement Internet
O. Auzende
La syntaxe utilisée pour indiquer le type de données MIME est Content-type: type/subtype. Quelques types :
Type MIME
Extension du fichier et nature du fichier
pdf (format de fichier d’Acrobat Reader)
ai eps ps (format lisible par Ghostview)
rtf (format RTF classique des traitements de texte
tex (fichier en LaTex)
gif (fichier image format GIF)
jpeg (fichier image format JPEG)
html htm (page HTML)
txt (page en format TXT)
rtx (page en format RTX)
mpeg mpg mpe (fichiers video MPEG)
application/pdf
application/postscript
application/rtf
application/x-tex
image/gif
image/jpeg
text/html
text/plain
text/richtext
video/mpeg
3. Tester des scripts CGI
On teste des scripts CGI :
1) en mode ligne de commande :
- perl –cw nomscript.cgi
- perl nomscript.cgi
2)
-
permet de vérifier la syntaxe d’un script
permet de le faire exécuter
avec un serveur Apache, utilisable en hôte local. Dans ce cas,
les fichiers HTML se trouvent dans un répertoire spécifique, ici /var/www/htdocs
les scripts CGI se trouvent dans un autre répertoire spécifique, ici /var/www/cgi-bin
l’interpréteur PERL se trouve dans le répertoire /usr/bin/perl.
L’adresse fournie au navigateur pour l’affichage d’une page HTML est http://localhost/page.html
Si cette page HTML contient un formulaire, l’appel au script CGI devant traiter ce formulaire se fait par :
<form action="/cgi-bin/nomscript.cgi" method="…" >
L’adresse pour l'exécution directe d'un script CGI sans page HTML associée est :
http://localhost/cgi-bin/nomscript.cgi
4. Un exemple de scripts
Ouvrir un terminal et aller dans /var/www/cgi-bin.Taper emacs page1.cgi et entrer le script suivant :
Script page1.cgi
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print
print
print
print
print
print
"<html><head><title>Page cr&eacute;&eacute;e par script CGI</title>" ;
"</head>\n";
"<body><h2>Page cr&eacute;&eacute;e par script CGI</h2>\n";
"On cr&eacute;e une page HTML compl&egrave;te par script CGI<br>\n";
"Celle-ci en est un exemple<br>\n" ;
"</body></html>\n";
L’enregistrer, lui donner des droits d’exécution par : chmod +x page1.cgi.
Vérifier sa syntaxe par perl –cw page1.cgi
Exécution en ligne de commande
Le faire exécuter en ligne de commande par : perl page1.cgi.
Vérifier sur l'écran la qualité du code HTML résultant.
Exécution avec Apache
Faire exécuter le script CGI par Apache en donnant au navigateur l’adresse : http://localhost/cgi-bin/page1.cgi
puisqu’il s’agit d’un scipt CGI sans page HTML associée.
4
Développement Internet
O. Auzende
5. PERL et le module CGI.pm
Le module CGI.pm, généralement installé avec Apache, automatise le décodage des données provenant d’un
formulaire.
Module CGI utilisé en mode objet
La disquette contient un répertoire htdocs et un répertoire cgi-bin. On doit recopier le contenu du répertoire htdocs
dans /var/www/htdocs et le contenu du répertoire cgi-bin dans /var/www/cgi-bin.
Pour recopier :
o Poste de travail  double-clic sur disquette  icône sur le bureau. Double-clic sur l’icône pour faire
apparaître de contenu de la dk.
o Applications Outils système  Navigateur de fichiers : remonter jusqu’à var, puis descendre dans
www (on ira d’abord dans htdocs, puis dans cgi-bin)
o Faire glisser les fichiers des deux répertoires de la dk vers les répertoires correspondant de /var/www
o Ensuite faire un clic droit sur l’icône de la disquette pour démonter le floppy avant de retirer la disquette.
Donner ensuite aux scripts cgi les droits d’exécution et au fichier base.txt les droits de lecture.
Soit la page HTML suivante figurant dans www/htdocs :
Page voter.html
<html> <head><title>Pouvez-vous voter ?</title></head>
<body>
<h2>Avez-vous l'&acirc;ge de voter ?</h2>
<form method="get" action="/cgi-bin/voter.cgi">
Quel est votre &acirc;ge ?
<input type="text" name="age" size=3><br>
<input type="submit" value="OK">
</form>
</body>
</html>
Cette page contient un formulaire demandant l’âge du client ; l’action associée au bouton submit est l’appel du
script cgi suivant, de nom voter.cgi placé dans le répertoire www/cgi-bin :
Script voter.cgi
#!/usr/bin/perl
(emplacement de l'interpréteur perl)
use CGI;
(module CGI.pm associé à l'interpréteur)
(objet créé par le module)
$query=new CGI;
if ($query->param('age')>=18) {
(récupération de la valeur de la variable age)
$voter='oui';
}
else
{
$voter='non';
}
print $query->header;
(impression automatique de l'en-tête)
print "<html><head><title>Pouvez-vous voter ?</title></head>\n";
print "<body><h2>Avez-vous l'&acirc;ge de voter ?</h2>\n";
if ($voter eq 'oui') {
print "<P>Vous &ecirc;tes majeur, donc vous pouvez voter.</P>\n";
}
else
{
print "<P>Vous &ecirc;tes encore trop jeune pour voter...</P>\n";
}
print "</body></html>\n";
Faites exécuter le fichier HTML par Apache avec l’adresse http://localhost/voter.html En validant
le formulaire, le script CGI est automatiquement exécuté.
5
Développement Internet
O. Auzende
Module CGI utilisé en mode standard
Soit le fichier suivant, figurant dans /var/www/htdocs :
Page decode1.html
<html>
<head><title>Decode2</title></head>
<body>
Test de decodage des parametres d'un formulaire
<form method="get" action="cgi-bin/decode1.cgi">
<p>Nom : <input type="text" name="nom"><BR>
Prenom : <input type="text" name="prenom"><BR>
Age : <input type="text" name="age"><BR>
</p>
<input type="submit" value="ok">
</form>
</body>
</html>
Le script decode1.cgi, dans /var/www/cgi-bin, effectue le décodage des paramètres :
Script decode1.cgi
#!/usr/bin/perl
use CGI qw(:standard);
print header();
print "<html><head><title>Les parametres d'un formulaire</title></head>\n";
print "<body>\n";
print "<H2>Les parametres d'un formulaire</h2>\n";
if (param()) {
print "Nom : ", param('nom'),"<BR>\n";
print "Prenom : ",param('prenom'),"<BR>\n";
print "Age : ",param('age'),"<BR>\n";
}
else
{
print "<P>Aucun formulaire n'est soumis</P>\n";
}
print "</body></html>\n";
On utilise ici le module CGI en mode standard et pas en mode objet. Les paramètres sont alors accessibles dans
le script CGI par $n = param('nom'); alors qu’en mode objet, ils le sont par : $n=$query->param('nom');
Exécution avec Apache
Faire exécuter le fichier HTML par http://localhost/decode1.html
Récupération des couples variables - valeurs
Soit le fichier suivant, figurant dans /var/www/htdocs :
Page decode2.html
<html>
<head><title>Decode2</title></head>
<body>
Test de decodage des parametres d'un formulaire
<form method="get"/"post" action="cgi-bin/decode2.cgi">
<p>
Nom : <input type="text" name="nom"><br>
Prenom : <input type="text" name="prenom"><br>
Age : <input type="text" name="age"><br>
</p>
<input type="submit" value="ok">
</form>
</body>
</html>
Le script decode2.cgi, dans /var/www/cgi-bin, effectue le décodage des paramètres (variables et valeurs) :
6
Développement Internet
O. Auzende
Script decode2.cgi
#!/usr/bin/perl
use CGI qw(:standard);
(interface standard, non objet ; $query=new CGI; est alors inutile
et on écrira param('nom') au lieu de $query->param('nom') )
print header();
print "<html><head><title>Les parametres d'un formulaire</title></head>\n";
print "<body>\n";
print "<h2>Les parametres d'un formulaire</h2>\n";
if (param()) {
@keys = param();
(@keys est un tableau)
foreach $key (@keys) {
print $key, " : ", param($key), "<br>\n";
}
}
else
{
print "<p>Aucun formulaire n'est soumis</p>\n";
}
print "</body></html>\n";
Exécution avec Apache
Faire exécuter le fichier HTML par http://localhost/decode2.html
6. Communication du navigateur client vers le script CGI
Pour transmettre les paramètres d’un formulaire au script CGI, la norme CGI prévoit d’utiliser les variables
d’environnement du serveur HTTP. Les principales variables utilisées sont :
Variable
Valeur
Taille en octets du corps de la requête
Données transmises après le ? dans l'URL
POST ou GET
CONTENT_LENGTH
QUERY_STRING
REQUEST_METHOD
Exemple avec GET
Soit le formulaire suivant :
<form
method="get" action="/cgi-bin/machin.cgi">
Nom : <input type="text" name="nom">
Pr&eacute ;nom : <input type="text" name="prenom">
Age : <input type="text" name="age">
<input type="submit" value="OK">
</form>
Au moment où l’utilisateur clique sur le bouton submit, la ligne de l’URL affiche :
http://site/cgi-bin/machin.cgi?nom=dupont&prenom=antoine&age=25
Tout ce qui suit le ? correspond aux différents couples variable=valeur provenant du formulaire.
Lorsque le formulaire de la page HTML comporte l’instruction method="get" (ou ne comporte pas d’instruction
METHOD) alors la variable REQUEST_METHOD prend la valeur get (par défaut) et la variable
QUERY_STRING prend comme valeur tout ce qui suit le ? dans l’URL demandée par le formulaire.
QUERY_STRING prend donc ici la valeur nom=dupont&prenom=antoine&age=25. Si l’utilisateur a tapé des
espaces, ils sont remplacés par des +.
Exemple avec POST
Soit le formulaire suivant :
<form
method="post" action="/cgi-bin/machin.cgi">
Nom : <input type="text" name="nom">
Pr&eacute ;nom : <input type="text" name="prenom">
Age : <input type="text" name="age">
<input type="submit" value="OK">
</form>
7
Développement Internet
O. Auzende
Au moment où l’utilisateur clique sur le bouton submit, la ligne de l’URL affiche seulement :
http://site/cgi-bin/machin.cgi
Lorsque le formulaire comporte l’instruction method="post", alors la variable REQUEST_METHOD prend la
valeur post et le serveur reçoit, sur son entrée standard, d’abord la demande d’exécution du CGI, ensuite le
codage des paramètres. La variable CONTENT_LENGTH permet de déterminer la longueur des données à lire.
CONTENT-LENGTH
recevra donc ici la valeur 32 (nombre de caractères de la chaîne :
nom=dupont&prenom=antoine&age=25) puis le serveur recevra sur son entrée standard la chaîne elle-même.
Choix entre GET et POST
On emploie post si les valeurs des variables ne doivent pas être visibles (mot de passe, par exemple), si les
données sont longues, s'il y a un fichier joint. On emploie get dans la plupart des autres cas.
7. PERL et les bases de données texte
Le fichier suivant comporte une base de données texte qui est une sorte de carnet d'adresses (le séparateur sur
chaque ligne est en fait une tabulation) :
Fichier base.txt
dupont [email protected] explorer
francois
[email protected]
explorer
philippe
[email protected]
opera
anne
[email protected]
explorer
anne
[email protected]
opera
Lecture de la base
La page suivante demande un nom pour interroger la base de données.
Page lecture.html
<html>
<head><title>Interrogation de la base</title></head>
<body>
<h1>Recherche d'enregistrements</h1><br>
<form method="get" action="/cgi-bin/lecture.cgi">
Nom : <input type="text" name="nom"><br>
<input type="submit" value="OK">
</form>
</body>
</html>
Cette page fait appel au script CGI suivant :
Script lecture.cgi
#!/usr/bin/perl
use CGI;
$query = new CGI;
$fichier="base.txt";
&print_page_start;
if ($query->param()) {
$search_name = $query->param('nom');
eval {
open (GUESTS, "< $fichier") or
die "Impossible d'ouvrir $fichier : $!";
while (<GUESTS>) {
($name, $email, $browser)=split /\t/;
if ($name =~ /$search_name/i) {
print "$name<br>\n$email<br>\n$browser<br>\n<hr>\n";
}
}
}
}
&print_page_end;
8
Développement Internet
O. Auzende
sub print_page_start {
print $query->header;
print "<html>\n<head>\n<title>Interrogation de la base</title>\n";
print "</head>\n<body>\n";
print "<h1>Recherche d'enregistrements</h1>\n<br>";
}
sub print_page_end {
print "</body>\n</html>\n";
}
Exécution avec Apache
Faire exécuter la page HTML via l’adresse http://localhost/lecture.html
8. Exercice : réponse à un formulaire
1) Visualisez avec Netscape le fichier formulaire.html qui se trouve
dans le répertoire /var/www/htdocs.
On veut écrire en PERL le script CGI chargé, sur le serveur, de
répondre à ce formulaire. Exemple ci-contre de formulaire rempli :
2) Ouvrez avec emacs le fichier formulaire.html et notez les
renseignements dont vous aurez besoin dans le script CGI. Il ne faut
pas modifier le fichier formulaire.html.
3) Dans le répertoire /var/www/cgi-bin écrivez en PERL le script CGI qui génère, en réponse au formulaire, la
page HTML présentée ci-dessous. La page doit être adaptée aux renseignements fournis par le client (sexe,
prénom, nom, choix du pays) et la phrase « N’oubliez pas que nous proposons… » ne doit apparaître que pour les
utilisateurs âgés effectivement de moins de 25 ans.
4) Testez la syntaxe de ce script CGI. Donnez-lui les droits d’exécution puis faites exécuter formulaire.html par
Apache et vérifiez que le script CGI répond correctement à la demande de l’utilisateur.
9
Développement Internet
O. Auzende
Microsoft Active Server Pages (ASP)
La technologie ASP de Microsoft est dédiée aux serveurs Microsoft Internet Information Server (MIIS) fourni
avec Windows XP Pro. Elle propose un cadre de développement associant du HTML, des scripts incorporés dans
les pages de suffixe .ASP et des composants (ou contrôles) ActiveX.
Les scripts sont généralement écrits en VBScript ou en Jscript (version de JavaScript modifiée par Microsoft). La
première fois qu'une page ASP est appelée, les scripts de la page sont "compilés". Le code généré est conservé par
le serveur tant qu'il n'est pas modifié. Les scripts compilés sont ensuite exécutés et les résultats sont retournés au
client sous forme d'une page HTML.
Recopier le dossier pages fourni sur la disquette dans C:\inetpub\wwwroot
L’icône IIS figure sur le bureau. Effectuer un double-clic sur elle. Choisir ensuite « Site Web par défaut » et faire
un double-clic sur le triangle tourné vers la droite pour lancer le serveur.
L’appel des pages se fait par http://localhost/pages/date.asp
Mettre la base de données PAYS1 en écriture pour les utilisateurs Web :
Cliquer sur la base, bouton droit, menu Propriétés  Sécurité  Compte invité Internet : autoriser lecture &
exécution, lecture, écriture.
1. Exemples d'inclusion de fichiers et de fonctions
La première page est incluse dans la seconde :
Page world.asp
<%@ LANGUAGE="VBSCRIPT"%>
<%Response.Write("Hello, World")
%>
Page inclusion.asp
<HTML>
<HEAD><TITLE>Exemple d'inclusion de page ASP</TITLE></HEAD>
<BODY>
<p>La ligne suivante :<br>
&lt;!--#include file="world.asp"--&gt;<br>
permet d'inclure dans la page courante le fichier "world.asp"<br>
dont voici le r&eacute;sultat :</p>
<!--#include file="world.asp"-->
</BODY>
</HTML>
La première page contenant une fonction est incluse dans la seconde page, qui fait appel à la fonction :
Page Carre.asp
<%
function Carre(num)
Carre = num* num
end function
function Cube(num)
Cube = num * num * num
end function
%>
Page utilisation.asp
<%@ LANGUAGE="VBSCRIPT"%>
<!--#include file="Carre.asp"-->
<%
Dim Age
Age=CInt(10)
%>
<HTML>
<HEAD><TITLE>Exemple d'inclusion de fonction</TITLE></HEAD>
<BODY>
Ce meuble a <%=Age%> ans et en paraît <%=Carre(Age)%>. <br>
La maison a le m&ecirc;me &acirc;ge et en para&icirc;t <%=Cube(Age)%> !
</BODY>
</HTML>
10
Développement Internet
O. Auzende
2. Utilisation de fonctions générales
Exemple d'utilisation de fonctions de date et heure :
Page salut.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD><TITLE>Exemple de page ASP</TITLE></HEAD>
<BODY>
Aujourd'hui, nous sommes le <%=Now%> <br>
<%Dim strgreeting
If Hour(Now)<12 Then
strgreeting="Bonne matin&eacute;e !"
ElseIf Hour(Now)<16 Then
strgreeting="Bonne apr&egrave;s-midi !"
Else
strgreeting="Bonne soir&eacute;e !"
End If
%>
<center><H3><%=strgreeting%></H3></center>
</BODY>
</HTML>
Si la page ASP est appelée l’après-midi, le serveur générera le code HTML suivant :
<HTML>
<HEAD><TITLE>Exemple de page ASP</TITLE></HEAD>
<BODY>
<H1>Bonne soir&eacute;e !</H1>
</BODY>
</HTML>
Exercice
En vous inspirant des deux fichiers Carre.asp et utilisation.asp qui se trouvent
dans le dossier pages, créez un fichier table.asp affichant le résultat ci-contre :
Vous initialiserez un entier i à la valeur 1, puis vous utiliserez une boucle :
Do While i<= 20 %>
…
<% Loop %>
pour faire afficher les lignes successives du tableau.
3. Utilisation de l’objet Request
L'objet Request permet de traiter les requêtes provenant de formulaires.
Passage des valeurs d’un formulaire (méthode POST)
La page suivante comporte un formulaire faisant appel à la méthode POST :
Page form1.html
<HTML>
<HEAD><TITLE>Formulaire</TITLE></HEAD>
<BODY>
<FORM METHOD="post" ACTION="rep1.asp"></P>
<TABLE>
<TR>
<TD>Pr&eacute;nom :</TD>
<TD><INPUT TYPE="text" NAME="prenom"></TD>
</TR>
<TR>
<TD>Nom : </TD>
<TD><INPUT TYPE="text" NAME="nom"></TD>
</TR>
11
Développement Internet
O. Auzende
<TR>
<TD>Type d'ordinateur : </TD>
<TD>
<INPUT TYPE="Checkbox" NAME="type" VALUE="PC">PC
<INPUT TYPE="Checkbox" NAME="type" VALUE="MAC">Mac
</TD>
</TR>
</TABLE>
<P><INPUT TYPE="submit" VALUE="OK"></P>
</FORM>
</BODY>
</HTML>
La page ASP générant la réponse est :
Page rep1.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD><TITLE>Réponse formulaire</TITLE></HEAD>
<BODY>
<P>Voici les &eacute;l&eacute;ments que vous avez donn&eacute;s : </P>
<TABLE>
<TR>
<TD>Votre pr&eacute;nom est : </TD>
<TD><%=Request.Form("prenom")%></TD>
</TR>
<TR>
<TD>Votre nom est : </TD>
<TD><%=Request.Form("nom")%></TD>
</TR>
<TR>
<TD>Votre type d'ordinateur est : </TD>
<TD><%=Request.Form("type")%></TD>
</TR>
</TABLE>
</BODY>
</HTML>
Récupération de la valeur d’une variable passée dans l’URL de la page (méthode GET)
La page suivante comporte le même formulaire faisant cette fois appel à la méthode GET :
Page form2.html
<HTML>
<HEAD><TITLE>Formulaire</TITLE></HEAD>
<BODY>
<FORM METHOD="get" ACTION="rep2.asp"></P>
<TABLE>
<TR>
<TD>Pr&eacute;nom : </TD>
<TD><INPUT TYPE="text" NAME="prenom"></TD>
</TR>
<TR>
<TD>Nom : </TD>
<TD><INPUT TYPE="text" NAME="nom"></TD>
</TR>
<TR>
<TD>Type d'ordinateur : </TD>
<TD>
<INPUT TYPE="Checkbox" NAME="type" VALUE="PC">PC
<INPUT TYPE="Checkbox" NAME="type" VALUE="MAC">Mac
</TD>
</TR>
</TABLE>
<P><INPUT TYPE="submit" VALUE="OK"></P>
</FORM>
</BODY>
</HTML>
12
Développement Internet
O. Auzende
La page ASP générant la réponse fait maintenant appel à la méthode QueryString de la variable Request :
Page rep2.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML><HEAD><TITLE>Réponse</TITLE></HEAD>
<BODY>
<TABLE> <TR><TD>La variable pr&eacute;nom contient : </TD>
<TD><%=Request.QueryString("prenom")%></TD></TR>
<TR><TD>La variable nom contient : </TD>
<TD><%=Request.QueryString("nom")%></TD></TR>
<TR><TD>La variable type contient : </TD>
<TD><%=Request.QueryString("type")%></TD></TR>
</TABLE>
</BODY>
</HTML>
Informations sur le navigateur Web
L'objet Request a accès aux variables d'environnement du serveur :
Page nav.asp
<HTML>
<HEAD><TITLE>Navigateur</TITLE></HEAD>
<BODY>
<P><B>Consultation de variable du serveur</B></P>
<P>&lt;%=Request.ServerVariables("HTTP_USER_AGENT")%&gt;
<br>permet de r&eacute;cup&eacute;rer les renseignements sur le
navigateur client.<br>
Le r&eacute;sultat est ici :</P>
<%=Request.ServerVariables("HTTP_USER_AGENT")%>
</BODY>
</HTML>
4. Utilisation de l’objet Response
Ecriture sur la page HTML générée
<%=Request.ServerVariables("HTTP_USER_AGENT")%> est en fait une
<%Response.Write Request.ServerVariables("HTTP_USER_AGENT")%>
abréviation
Ecriture et lecture de cookies
Page cookie1.asp
<html>
<head><title>formulaire</title></head>
<body>
Merci de remplir ce formulaire
<form method="get" action="validation.asp">
<table>
<tr>
<td>Nom</td>
<td><input type="text" name="Nom" size="20"></td>
</tr>
<tr>
<td>Nationalit&eacute;</td>
<td><input type="text" name="Nationalite" size="20"></td>
</tr>
</table>
<input type="submit" value="Envoyer" name="B1">
</form>
</body>
</html>
Page validation.asp
<% 'on récupère les informations relatives à l'utilisateur
Response.Cookies("Nom")=Request.QueryString("Nom")
Response.Cookies("Nom").Expires=Date+365
Response.Cookies("Nationalite")=Request.QueryString("Nationalite")
Response.Cookies("Nationalite").Expires=Date+365%>
13
de
Développement Internet
O. Auzende
<html>
<head>
<title>validation</title>
</head>
<body>
Mme ou M. <%=Request.Cookies("Nom")%>,
votre nationalité est <%=Request.Cookies("Nationalite")%>
</body>
</html>
On peut tester, avant de demander les renseignements à l'utilisateur, si le cookie n'existe pas déjà :
Page cookie2.asp
<html>
<head><title>formulaire</title></head>
<body>
<%If Request.Cookies("Nom")= "" Then ' test
<%' il n'y a pas de cookie alors :%>
Merci de remplir ce formulaire
<form method="GET" action="validation.asp">
<table>
<tr>
<td>Nom</td>
<td><input type="text" name="Nom" size="20"></td>
</tr>
<tr>
<td>Nationalit&eacute;</td>
<td><input type="text" name="Nationalite" size="20"></td>
</tr>
</table>
<input type="submit" value="Envoyer" name="B1">
</form>
<%Else%>
Bienvenue sur notre site et merci de votre fidélité,
Mme ou M. <%=Request.Cookies("Nom")%>,
votre nationalité est <%=Request.Cookies("Nationalite")%>
<%End If%>
</body>
</html>
La récupération des cookies existant se fait par :
Page cookie3.asp
<html>
<head>
<title>Recuperation de tous les cookies</title>
</head>
<body>
<% For Each cookie in Request.Cookies %>
<%="Cookie : "+ cookie +" : " + Request.Cookies(cookie)%><BR>
<% Next %>
</body>
</html>
5. Utilisation de l’objet Application
Un objet Application démarre à la première demande d’une page .asp spécifique à un serveur et se termine quand
on arrête le serveur. Cet objet peut être utilisé pour stocker des valeurs de variables. Exemple :
Page date.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD><TITLE>Date</TITLE></HEAD>
<BODY BGCOLOR="FFFFFF">
<p>Cette page a été visitée pour la dernière fois le :
<%=Application("Dateheure")%></p>
<p>Si rien ne s'est affich&eacute;, c'est que la page a &eacute;t&eacute; ouverte
pour la premi&egrave;re fois depuis le lancement du serveur.</p>
<p>La date va &ecirc;tre mise &agrave; jour par :<br>
&lt;%Application.Lock%&gt;<br>
&lt;%Application("Dateheure")=Now%&gt;<br>
&lt;%Application.Unlock%&gt;</p>
14
Développement Internet
O. Auzende
<%Application.Lock%>
<%Application("Dateheure")=Now%>
<%Application.Unlock%>
<p>Il suffit maintenant de recharger la page pour que la derni&egrave;re date
de chargement de la page s'affiche.</p>
</BODY>
</HTML>
6. Utilisation de l’objet Session
Les variables de type Session stockent des informations sur le serveur le temps d’une session, sont associées à un
visiteur et peuvent être utilisées indifféremment sur toutes les pages .asp d’un site Web. Exemple d'utilisation :
Page session.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD><TITLE>Lecture des paramètres de la session</TITLE></HEAD>
<BODY>
<P>Identificateur de la session : <%=Session.SessionID%></P>
<%Session("compteur")=Session("compteur")+1%>
<P>Vous avez visité cette page <%=Session("compteur")%> fois dans cette
session</P>
</BODY>
</HTML>
7. Connexion aux bases de données Access
Les pages ASP s'interfacent avec les composants ActiveX, qui sont des morceaux de logiciels jouant un rôle
spécifique. Les composants ActiveX peuvent être écrits en C++, Java, Visual Basic, Cobol... Une bibliothèque de
composants est disponible.
Un composant ActiveX permet l’accès à une base de données relationnelle. Un objet composant est créé dans la
page par la méthode CreateObject de l’objet Server. On peut ensuite accéder à ses propriétés et méthodes pour
exécuter des fonctions.
Lorsque la connexion est établie, un objet de type RecordSet permet de récupérer le résultat des requêtes sur la
base de données.
La base de données Access PAYS1.MDB contient une table Pays ayant un champ NOM et un champ CAPITALE.
La source de données et le pilote doivent être déclarés via l’option ODBC 32 bits du panneau de configuration
de Windows.
Lecture de la base de données
La page suivante lit le contenu de la table pays de la base PAYS1 via une requête SQL :
Page lecture1.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD><TITLE>Lecture d'une base de données Access</TITLE></HEAD>
<BODY>
<TABLE BORDER=1>
<TR><TD><B>Nom du pays</B></TD><TD><B>Capitale</B></TD></TR>
<%
' crée un objet de type Connection
Set objConnection=Server.CreateObject("ADODB.Connection")
' ouverture connexion : base, utilisateur, mot de passe
objConnection.Open "Driver={Microsoft Access Driver (*.mdb)};
DBQ=" & Server.MapPath("/pages") & "\pays1.mdb"
' crée un objet de type RecordSet
Set objRecord=Server.CreateObject("ADODB.Recordset")
' le remplit avec le résultat d’une requête
objRecord.Open "SELECT * FROM pays", objConnection
15
Développement Internet
O. Auzende
' fait afficher le résultat ligne à ligne
Do While Not objRecord.EOF
%>
<TR>
<TD><%=objRecord("nom")%></TD><TD><%=objRecord("capitale")%></TD>
</TR>
<%objRecord.MoveNext
Loop
objRecord.Close
' fermeture de la connexion
objConnection.Close
Set objRecord = Nothing
Set objConnection = Nothing
%>
</TABLE>
</BODY>
</HTML>
Création d’un nouvel enregistrement
La page creation1.html demande dans un formulaire le nom du pays correspondant à l’enregistrement à créer ; la
création effective est effectuée par la page creation1.asp.
Page creation1.html
<HTML>
<HEAD><TITLE>Creation</TITLE></HEAD>
<BODY>
<FORM METHOD=POST ACTION="creation1.asp"></P>
<P>Pays : <INPUT TYPE="text" NAME="nom"></P>
<P>Capitale : <INPUT TYPE="text" NAME="ville"></P>
<P><INPUT TYPE="submit" VALUE="Envoi"></P>
</FORM>
</BODY>
</HTML>
Page creation1.asp
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD>
<TITLE>Création d'un enregistrement</TITLE>
</HEAD>
<BODY>
<%
pays=Request.Form("nom")
capitale=Request.Form("ville")
Set objConnection=Server.CreateObject("ADODB.Connection")
objConnection.Open "Driver={Microsoft Access Driver (*.mdb)};
DBQ=" & Server.MapPath("/pages") & "\pays1.mdb"
Set objRecord=Server.CreateObject("ADODB.Recordset")
%>
<%objRecord.Open "INSERT INTO pays (nom,capitale)
VALUES('"&pays&"','"&capitale&"')", objConnection
%>
<p>Enregistrement ajout&eacute; &agrave; la base. Nouveau contenu : </p>
<TABLE BORDER=1>
<TR><TD><B>Nom du pays</B></TD><TD><B>Capitale</B></TD></TR>
<%objRecord.Open "SELECT * FROM pays", objConnection
Do While Not objRecord.EOF
%>
<TR><TD><%=objRecord("nom")%></TD>
<TD><%=objRecord("capitale")%></TD></TR>
<%objRecord.MoveNext
Loop%>
</table>
<%objRecord.Close
objConnection.Close
Set objRecord = Nothing
Set objConnection = Nothing
%>
</BODY>
</HTML>
16
Développement Internet
O. Auzende
Exercice : suppression d’un enregistrement
La page suppression1.html demande dans un formulaire le nom du pays correspondant à l’enregistrement à
supprimer ; la suppression effective doit être effectuée par la page suppression1.asp.
Page suppression1.html
<HTML>
<HEAD>
<TITLE>Suppression</TITLE>
/HEAD>
<BODY>
<FORM METHOD=POST ACTION="suppression1.asp"></P>
<P>Pays : <INPUT TYPE="text" NAME="nom"></P>
<P><INPUT TYPE="submit" VALUE="Envoi"></P>
</FORM>
</BODY>
</HTML>
Page suppression1.asp réalisant la suppression effective
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<HEAD><TITLE>Suppression d'un enregistrement</TITLE></HEAD>
<BODY>
<%
nom=Request.Form("nom")
Set objConnection=Server.CreateObject("ADODB.Connection")
objConnection.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" &
Server.MapPath("/pages") & "\pays1.mdb"
Set objRecord=Server.CreateObject("ADODB.Recordset")
objRecord.Open "DELETE FROM pays WHERE nom='"&nom&"'", objConnection
%>
<p>Enregistrement supprim&eacute; de la base. Nouveau contenu :</p>
<table border="1">
<TR><TD><B>Nom du pays</B></TD><TD><B>Capitale</B></TD></TR>
<%objRecord.Open "SELECT * FROM pays", objConnection
Do While Not objRecord.EOF
%>
<TR><TD><%=objRecord("nom")%></TD>
<TD><%=objRecord("capitale")%></TD></TR>
<%objRecord.MoveNext
Loop%>
</table>
<%objRecord.Close
objConnection.Close
Set objRecord = Nothing
Set objConnection = Nothing
%>
</BODY>
</HTML>
Exercice
Faites exécuter le fichier question.asp qui propose le
formulaire ci-contre :
Puis écrivez la page asp qui répond à ce formulaire.
Exemple :
17
Développement Internet
O. Auzende
Bases de données MySQL
1. Lancement du serveur mySQL
La distribution mySQL est généralement utilisée sous le système d’exploitation Linux, où le moteur mySQL est
couplé avec Apache. Sous Linux, les bases mySQL sont stockées dans /var/lib/mysql.
Mais elle existe aussi, dans une optique de développement, sous Windows via easyPHP.
Cliquer sur l’icône easyPHP sur le bureau.
easyPHP lance en même temps un serveur Apache pour Windows et le serveur de bases de données mySQL. Dès
que easyPHP est lancé, son icône apparaît dans la barre des tâches et clignote. Sous Windows, les bases mySQL
sont stockées dans C:\Program files\easyPHP…\mysql\data.
2. Création d’une base de données
Recopiez les fichiers PRODUITS.DUMP et PRIX.DUMP dans C:\Program files\easyPHP…\mysql\bin. En
suivant les instructions, créez la base de données PRODUITS et remplissez-la à l’aide du fichier
PRODUITS.DUMP suivant :
CREATE TABLE fournisseurs (num tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT, nom varchar(30),
adresse varchar(100), PRIMARY KEY(num), UNIQUE id(num));
INSERT INTO fournisseurs VALUES(1, 'Dupuis SA', '13 rue de la Convention 75015 Paris');
INSERT INTO fournisseurs VALUES(2, 'Meubles en gros', '18 place de la Bastille 75012 Paris');
INSERT INTO fournisseurs VALUES(3, 'Fabricat', '120 rue du faubourg Montmartre 75009 Paris');
CREATE TABLE produits (num tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT, nom varchar(30),
fournisseur tinyint(4), PRIMARY KEY(num), UNIQUE id(num));
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
produits
produits
produits
produits
produits
produits
VALUES(1,
VALUES(2,
VALUES(3,
VALUES(4,
VALUES(5,
VALUES(6,
'table Louis XV', 1);
'chaise Renaissance', 1);
'lit Empire',2);
'commode Renaissance',3);
'table de chevet',2);
'canape Empire',3);
CREATE TABLE prix (numproduit tinyint(4) DEFAULT '0' NOT NULL
PRIMARY KEY(numproduit), UNIQUE id(numproduit));
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
prix
prix
prix
prix
prix
prix
VALUES(1,
VALUES(2,
VALUES(3,
VALUES(4,
VALUES(5,
VALUES(6,
AUTO_INCREMENT, prix int(4),
850);
150);
950);
920);
100);
1050);
3. mySQL en mode interactif
Ajout d’occurrences
L’insertion d’une occurrence dans une relation se fait par INSERT. Insérez dans la base de données PRODUITS
un produit ‘canape Empire’ provenant du fournisseur n°3 et de prix 1100 € (deux commandes INSERT sont
nécessaires). Pour vérifier, tapez une requête faisant afficher le nom de chaque produit et son prix. Le produit qui
vient d’être inséré doit apparaître.
Modification de la structure de la base
On peut modifier la structure de la base par l’instruction ALTER.
Tapez la commande :
alter table Fournisseurs modify adresse char(200);
qui passe la taille de l’attribut adresse de Fournisseurs de 100 à 200 caractères, et regardez le message renvoyé par
le SGBD.
Tapez ensuite la commande :
alter table Fournisseurs add (telephone char(10));
qui ajoute un attribut à la relation Fournisseurs.
Tapez :
select * from fournisseurs;
pour voir le résultat.
18
Développement Internet
O. Auzende
Modification d’occurrences
La modification d’occurrences se fait par l’instruction UPDATE.
Tapez successivement les trois lignes :
update Fournisseurs set telephone = '0123564785' where num= 1;
update Fournisseurs set telephone = '0123548789' where num= 2;
update Fournisseurs set telephone = '0143667821' where num= 3;
Tapez
select * from fournisseurs;
pour voir le résultat.
Exécution de requêtes
Faites exécuter les requêtes suivantes et notez-en le texte :
- nom des fournisseurs dont le numéro de téléphone commence par 0123.
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
- nom des produits de prix inférieur à 1000
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
- nom des fournisseurs proposant des produits de prix compris entre 500 et 1000
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
- nombre de fournisseurs habitant le 12ème arrondissement de Paris
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
- nom de chaque fournisseur et nombre de produits proposés par ce fournisseur
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
Suppression de table
La suppression de table se fait par DROP TABLE … Supprimez la table PRIX de la base de données
PRODUITS.
Réinitialisation
Le fichier PRIX.DUMP a le contenu suivant :
CREATE TABLE prix (numproduit tinyint(4) DEFAULT '0' NOT NULL
PRIMARY KEY(numproduit), UNIQUE id(numproduit));
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
prix
prix
prix
prix
prix
prix
prix
VALUES(1,
VALUES(2,
VALUES(3,
VALUES(4,
VALUES(5,
VALUES(6,
VALUES(7,
950);
250);
1050);
940);
120);
1100);
1250);
19
AUTO_INCREMENT, prix int(5),
Développement Internet
O. Auzende
Les prix peuvent à présent s’exprimer avec 5 chiffres. Recréez la table prix dans la base PRODUITS en faisant
effectuer les requêtes du fichier PRIX.DUMP.
Exécution de requêtes (suite)
Effectuez les requêtes suivantes :
- nom des produits de prix supérieur à 1000
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
- nom de chaque fournisseur et somme des prix des produits proposés par ce fournisseur
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
……………………………………………………………………………………………………………………….
4. Arrêt de easyPHP
Cliquez avec le bouton droit de la souris sur l’icône easyPHP dans la barre des tâches, choisissez Arrêter puis
Quitter.
20
Développement Internet
O. Auzende
Servlets Java, Java Server Pages et Java Beans
Un servlet est un petit morceau de code Java qui étend les fonctionnalités d'un serveur Web. Sun a développé un
serveur entièrement en Java, le Java Web Server, qui fonctionne à base de servlets et est disponible pour les
plates-formes Windows et Solaris, et développe en parallèle des supports de servlets (moteurs Java) pour les autres
serveurs (dont Apache, MIIS et Netscape). Les Java Server Pages d’extension .JSP sont construites par-dessus les
servlets. Le moteur Java transforme les fichiers .JSP en servlets (étape de traduction) puis exécute le servlet
résultant qui génère la page HTML (étape de requête).
1. Principe
2. Tests de servlets et de pages JSP
Le serveur Tomcat, issu du projet jakarta-tomcat et libre de droits, est téléchargeable sur Internet. Il nécessite
un JDK et peut être utilisé seul ou être couplé à Apache.
L’icône TOMCAT5 figure sur le bureau. Effectuer un double-clic sur l’icône ouvre une fenêtre de dialogue. Un
clic sur le bouton Start lance le serveur.
Le dossier pages de la disquette doit être recopié dans le dossier C:\Program Files\Apache Software
Foundation\Tomcat5.5\webapps, à côté de ROOT L’appel des pages via le serveur se fait alors par
http://localhost:8080/pages/
L’arrêt de Tomcat se fait en appyant sur le bouton Stop.
3. Directives d'insertion
Comme les SSI, les pages JSP peuvent contenir des directives d'inclusion qui sont traitées au moment de la
traduction. Exemple à exécuter par http://localhost:8080 /pages/ :
Page page1.jsp
<HTML>
<HEAD>
<TITLE>Exemple d'inclusion</TITLE>
</HEAD>
<BODY>
<%@include file="entete.jsp"%>
L'en-t&ecirc;te (ci-dessus) est faite par l'inclusion du fichier "entete.jsp".
<P>Corps de la page : on entre ici ce que l'on souhaite mettre dans la page.</P>
Le sommaire (ci-dessous) est aussi fait par inclusion du fichier "sommaire.jsp" :
<%@include file="sommaire.jsp"%>
</BODY>
</HTML>
21
Développement Internet
O. Auzende
Page entete.jsp
Page sommaire.jsp
<%-- Entete --%>
<H1>Titre g&eacute;n&eacute;ral</H1>
<H2>Titre de chapitre</H2>
<hr>
<%-- Fin entete--%>
<%-- Sommaire --%>
<hr>
<TABLE>
<tr>
<td width=100>Accueil</td>
<td width=100>Nouvelles</td>
<td width=100>Editorial</td>
</tr>
</table>
<%-- Fin sommaire --%>
4. Utilisation de l’objet request : récupération d’éléments de formulaire
L'objet request permet de récupérer les valeurs des champs des formulaires.
Exemple 1
Page formulaire.jsp
<HTML>
<HEAD><TITLE>Un formulaire</TITLE></HEAD>
<BODY>
<FORM METHOD="get" ACTION="requete.jsp">
<P>Exemple de formulaire</P>
<TABLE>
<TR>
<TD>Nom :</TD>
<TD><INPUT TYPE="text" NAME="nom"></TD>
</TR>
<TR>
<TD>Pr&eacute;nom :</TD>
<TD><INPUT TYPE="text" NAME="prenom"></TD>
</TR>
<TR>
<TD>Ordinateur : </TD>
<TD><INPUT TYPE="RADIO" NAME="supp" VALUE="mac" CHECKED>Mac
<INPUT TYPE="RADIO" NAME="supp" VALUE="pc"> PC
</TD>
</TR>
<TR>
<TD>Syst&egrave;me d'exploitation : </TD>
<TD>
<SELECT NAME="sys">
<OPTION VALUE="win">Windows
<OPTION VALUE="linux">Linux
<OPTION VALUE="macos">Mac-OS
</SELECT>
</TD>
</TR>
</TABLE>
<P><INPUT TYPE="SUBMIT" VALUE="Confirmer"></P>
</FORM>
</BODY>
</HTML>
Page requete.jsp
<HTML>
<BODY>
<P>Vous avez repondu : </P>
<TABLE>
<TR><TD>Nom : </TD><TD> <%= request.getParameter("nom") %></TD></TR>
<TR><TD>Pr&eacute;nom : </TD>
<TD> <%= request.getParameter("prenom") %></TD></TR>
<TR><TD>Ordinateur : </TD>
<TD> <%= request.getParameter("supp") %></TD></TR>
<TR><TD>Syst&egrave;me d'exploitation : </TD>
<TD> <%= request.getParameter("sys") %></TD></TR>
</TABLE>
</BODY>
</HTML>
Remarque : le formulaire peut être employé également avec la méthode POST sans rien changer au fichier
requete.jsp. L’analyse des paramètres se fait à l’aide des mêmes fonctions.
22
Développement Internet
O. Auzende
Exemple 2
Récupération d’éléments de formulaire et calculs à l’aide de ces éléments :
Page calculatrice.jsp
<HTML>
<HEAD><TITLE>Calculatrice</TITLE></HEAD>
<BODY>
<P>Les pages JSP peuvent effectuer des calculs.</P>
<P>Exemple : entrez deux nombres entiers et cliquez ensuite sur le bouton
Calculs</P>
<FORM METHOD="GET" ACTION="calcul.jsp">
<TABLE>
<TR><TD>Premier nombre </TD>
<TD><INPUT TYPE="TEXT" NAME="val1" SIZE=4></TD></TR>
<TR><TD>Deuxi&egrave;me nombre </TD>
<TD><INPUT TYPE="TEXT" NAME="val2" SIZE=4></TD></TR>
</TABLE>
<P><INPUT TYPE="SUBMIT" VALUE="Calculs"></P>
</FORM>
</BODY>
</HTML>
Page calcul.jsp
<HTML>
<HEAD><TITLE>Resultat</TITLE></HEAD>
<BODY>
<P>Les nombres que vous avez donn&eacute;s sont
<%int n1=Integer.parseInt(request.getParameter("val1"));%>
<%=n1%> et
<%int n2=Integer.parseInt(request.getParameter("val2"));%>
<%=n2%>
</P>
<P>
Leur somme est
<%= n1 + n2 %> et leur produit est
<%= n1 * n2 %>
</P>
</BODY>
</HTML>
5. Utilisation de variables et de classes java
La page suivante utilise des variables de type int et double et fait appel au constructeur et aux méthodes de la
classe Date de java.util :
Page variables.jsp
<HTML>
<HEAD><TITLE>Utilisation de variables</TITLE></HEAD>
<BODY>
<p>On déclare trois variables pi, a et b : </p>
<%! double pi = java.lang.Math.PI ; %>
<P>pi vaut <%= pi %>.</P>
<%! int a = 5; %>
<P>a vaut <%= a %>.</P>
<%! int b = 7; %>
<P>b vaut <%= b %>.</P>
<P>L'aire du cercle de rayon a (formule : pi * a * a) vaut
<%= pi * a * a %>.</P>
<P>Le p&eacute;rim&egrave;tre du cercle de rayon a (formule : 2 * pi * a) vaut
<%= 2 * pi * a %>.</P>
<P>L'aire du cercle de rayon b vaut <%= pi * b * b %>.</P>
<P>Le p&eacute;rim&egrave;tre du cercle de rayon b vaut <%= 2 * pi * b %>.</P>
<hr>
<%! java.util.Date maintenant = new java.util.Date(); %>
<P>La date du jour : on est le <%= maintenant.getDate() %>/
<%= maintenant.getMonth() +1 %>/<%= maintenant.getYear() +1900 %>
</P>
</BODY>
</HTML>
23
Développement Internet
O. Auzende
La page suivante définit une variable de type int, incrémentée et testée :
Page compteur1.jsp
<%! int count =0; %>
<HTML>
<HEAD>
<TITLE>Un compteur</TITLE>
</HEAD>
<BODY>
<% count = count + 1; %>
<P>Cette page a été visitée <%= count %> fois.</P>
<% if (count == 1) {
out.print("<P>Premier visiteur !</P>");
} %>
</BODY>
</HTML>
6. Connexion aux bases de données Access et mySQL
L’API JDBC permet d’accéder aux bases de données depuis Java via le package java.sql. C'est la couche la plus
externe pour développer des applications. Les couches inférieures sont destinées à l’implantation des pilotes pour
les bases de données, réalisée par des sociétés tierces ayant passé des licences avec les éditeurs de SGBD. Chaque
pilote doit, pour donner accès à la base de données concernée, fournir une implémentation des interfaces et fournir
une classe qui implémente l’interface java.sql.Driver utilisée par la classe générique java.sql.DriverManager.
DriverManager gère la liste des Drivers chargés et crée les connexions TCP (Connection).
Connection crée un canal de communication TCP vers une BD dont l’URL est connue. Un objet de type
Connection a pour attributs username et password, crée les Statements (requêtes SQL) et gère les transactions.
Statement gère les requêtes SQL simples, avec les méthodes executeQuery admettant une chaîne SQL en
paramètre et retournant un objet ResultSet, et executeUpdate() permettant la mise à jour et renvoyant le nombre de
rangées modifiées.
Enfin, un objet de type ResultSet contient une rangée de données extraite de la base par une requête SQL. La
méthode next() permet d’accéder à la rangée suivante.
Connexion à une base de données Access
La base de données CATALOGUE.MDB contient une table Films ayant deux champs TITRE et REALISATEUR.
La source de données et le pilote doivent être déclarés :
Démarrer  Paramètres  Panneau de configuration  Outils d’administration  Sources de données
ODBC. Choisir Sources de données Système, spécifier le type de la base (Access, fichiers de type mdb) et le
chemin vers la base de données.
Lecture de la base
Page lecture.jsp
<% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %>
<% java.sql.Connection con=java.sql.DriverManager.getConnection("jdbc:odbc:catalogue","","");%>
<% java.sql.Statement statement = con.createStatement(); %>
<% java.sql.ResultSet rs; %>
<HTML>
<HEAD>
<TITLE>Requete</TITLE>
</HEAD>
<BODY>
<H2>Base de données CATALOGUE</h2>
<H3>Contenu de la table FILMS</h3>
<P>
<% rs = statement.executeQuery("SELECT * FROM Films");
<table border=1>
<tr>
<td><b>Titre</b></td>
<td><b>R&eacute;alisateur</b></td>
</tr>
24
%>
Développement Internet
O. Auzende
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString("titre") %></td>
<td><%= rs.getString("realisateur") %></td>
</tr>
<% } %>
</table>
</P>
</BODY>
</HTML>
<% rs.close(); %>
<% statement.close(); %>
<% con.close(); %>
Ecriture dans la base
Un formulaire demande le film à insérer dans la base.
Page insertion.jsp
<HTML>
<HEAD><TITLE>Insertion d'un film</TITLE></HEAD>
<BODY>
<FORM ACTION="ecriture1.jsp" METHOD="GET">
Titre : <INPUT TYPE="text" NAME="titre"><br>
Realisateur : <INPUT TYPE="text" NAME="realisateur"><br>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="OK">
</FORM>
</BODY>
</HTML>
La page ecriture1.jsp suivante effectue l’insertion (l’écriture doit être autorisée dans la base) :
Page ecriture1.jsp
<%
<%
<%
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %>
java.sql.Connection con=java.sql.DriverManager.getConnection("jdbc:odbc:catalogue","","");%>
java.sql.Statement statement = con.createStatement(); %>
java.sql.ResultSet rs; %>
<HTML>
<HEAD>
<TITLE>Requete</TITLE>
</HEAD>
<BODY>
<h2>Insertion d'un enregistrement</h2>
<%String s=request.getParameter("titre");%>
<%String t=request.getParameter("realisateur");%>
<%String requete="INSERT into Films VALUES('"+s+"','"+t+"')";%>
<% statement.executeUpdate(requete); %>
<h3>Nouveau contenu : </h3>
<table border=1>
<tr>
<td><center><B>Titre</b></center></td>
<td><center><B>Realisateur</b></center></td>
</tr>
<% rs = statement.executeQuery("SELECT * FROM Films"); %>
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString("titre") %></td>
<td><%= rs.getString("realisateur") %></td>
</tr>
<% } %>
</table>
</BODY>
</HTML>
<% rs.close(); %>
<% statement.close(); %>
<% con.close(); %>
25
Développement Internet
O. Auzende
Suppression d'enregistrement de la base
Un formulaire demande le film à supprimer de la base. Le fichier suppression1.jsp le supprime ffectivement.
Page enleve.jsp
<% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %>
<% java.sql.Connection con =
java.sql.DriverManager.getConnection("jdbc:odbc:catalogue","","");%>
<% java.sql.Statement statement = con.createStatement(); %>
<% java.sql.ResultSet rs; %>
<HTML>
<HEAD>
<TITLE>Suppression d'un film</TITLE>
</HEAD>
<BODY>
<FORM ACTION="suppression1.jsp" METHOD="GET">
Titre :
<select name="titre">
<% rs=statement.executeQuery("SELECT * FROM Films");
<% while (rs.next()) {
out.print("<option>");%>
<%=rs.getString("titre")%>
<%out.print("</option>");%>
<% } %>
</select>
<INPUT TYPE="SUBMIT" NAME="ok" VALUE="OK">
</FORM>
%>
</BODY>
</HTML>
<% rs.close(); %>
<% statement.close(); %>
<% con.close(); %>
Page suppression1.jsp
<% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %>
<%java.sql.Connection con= java.sql.DriverManager.getConnection("jdbc:odbc:catalogue","","");%>
<% java.sql.Statement statement = con.createStatement(); %>
<% java.sql.ResultSet rs; %>
<HTML>
<HEAD>
<TITLE>Requete</TITLE>
</HEAD>
<BODY>
<h2>Suppression d'un enregistrement</h2>
<%String s=request.getParameter("titre");%>
<%String requete="DELETE from Films WHERE titre ='"+s+"'";%>
<% statement.executeUpdate(requete); %>
<h3>Nouveau contenu : </h3>
<table border=1>
<tr>
<td><center><B>Titre</b></center></td>
<td><center><B>Realisateur</b></center></td>
</tr>
<% rs = statement.executeQuery("SELECT * FROM Films"); %>
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString("titre") %></td>
<td><%= rs.getString("realisateur") %></td>
</tr>
<% } %>
</table>
</BODY>
</HTML>
<% rs.close(); %>
<% statement.close(); %>
<% con.close(); %>
26
Développement Internet
O. Auzende
Connexion à une base de données mySQL
Lancer easyPHP sous Windows. Si ce n’est pas déjà fait, créer et remplir la base de données produits.
Pour pouvoir l’interroger via JDBC (Java Data Base Connectivity), il faut l’enregistrer comme sources de données
ODBC : Démarrer  Paramètres  Panneau de configuration  Outils d’administration  Sources de
données ODBC. A noter : il faut déclarer les bases de données mySQL en Sources de données Système :
- Ajouter une nouvelle source de données
- choisir le driver MySQL ODBC 3.51 Driver
- valider
Dans la nouvelle fenêtre (voir ci-contre), préciser :
- Data Source Name : produits
- Description : ne pas remplir
- Server : localhost
- User : root
- Password : aucun
- Database : mydb
Pour l’exécution des pages interrogeant des bases de données mySQL, il faut que les deux serveurs (easyPHP et
JSWDK) soient actifs.
Fichier lectureproduits.jsp
<% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %>
<% java.sql.Connection con =
java.sql.DriverManager.getConnection("jdbc:odbc:produits","","");%>
<% java.sql.Statement statement = con.createStatement(); %>
<% java.sql.ResultSet rs; %>
<HTML>
<HEAD><TITLE>Requete</TITLE></HEAD>
<BODY>
<H3>Lecture de la base de donn&eacute;es mySQL produits par une page JSP</h3>
<p><b>Lecture de la table Fournisseurs</b></p>
<table border=1>
<tr><td><b>Num&eacute;ro</b></td><td><b>Nom</b></td>
<td><b>Adresse</b></td></tr>
<% rs = statement.executeQuery("SELECT * FROM fournisseurs"); %>
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString("num") %></td>
<td><%= rs.getString("nom") %></td>
<td><%= rs.getString("adresse") %></td>
</tr>
<% } %>
</table>
<p><b>Lecture de la table Produits</b></p>
<table border=1>
<tr><td><b>Num&eacute;ro</b></td><td><b>D&eacute;signation</b></td>
<td><b>Fournisseur</b></td></tr>
<% rs = statement.executeQuery("SELECT * FROM produits"); %>
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString("num") %></td>
<td><%= rs.getString("nom") %></td>
<td><%= rs.getString("fournisseur") %></td>
</tr>
<% } %>
</table>
<p><b>Lecture de la table Prix</b></p>
<table border=1>
<tr><td><b>Num&eacute;ro du produit</b></td><td><b>Prix</b></td></tr>
<% rs = statement.executeQuery("SELECT * FROM prix"); %>
<% while (rs.next()) { %>
<tr>
<td><%= rs.getString("numproduit") %></td>
<td><%= rs.getString("prix") %></td>
</tr>
<% } %>
</table>
</BODY>
</HTML>
27
Développement Internet
O. Auzende
<% rs.close(); %>
<% statement.close(); %>
<% con.close(); %>
Exercice
Ecrire une page lectureproduits1.jsp faisant afficher, dans une table, les désignations des différents produits et
leurs prix. On utilisera les tables produits et prix de la base de données Produits.
Exemple de résultat attendu :
28
Développement Internet
O. Auzende
PHP
PHP est un langage de scripts destiné à l’écriture d’applications Web. L’API PHP permet d’intégrer du code
exécutable dans une page Web. Ce code est exécuté à chaque affichage de la page et peut générer dynamiquement
un certain contenu qui sera incorporé au résultat renvoyé au navigateur Web du client.
1. Localisation et identification des fichiers
Sous Linux, les pages PHP se mettent dans le dossier www/htdocs où se trouvent déjà les pages HTML et sont
exécutées par le serveur Apache. L’appel se fait par http://localhost/page.php.
Sous Windows, on utilise le serveur easyPHP : cliquer sur l’icône correspondante sur le bureau. Le dossier des
pages PHP est placé dans le dossier C:\Program Files\easyPHP1-8\www. L’appel se fait, comme sous Linux, par
http://localhost/page.php. Pour arrêter easyPHP, cliquer avec le bouton droit de la souris sur l’icône easyPHP qui
clignote dans la barre des tâches, choisir d’abord Arrêter (le serveur) puis Quitter.
Les noms de fichiers attribués aux fichiers contenant des scripts PHP ont pour extension .php qui permet à
l’interpréteur PHP de les reconnaître automatiquement et de les exécuter immédiatement. D’autres extensions sont
également utilisables : .php3 et .phtml. L’utilisation d’une extension plutôt qu’une autre dépend de la
configuration du serveur.
On peut invoquer des scripts PHP autonomes, c’est-à-dire des fichiers de commandes chargés à partir du disque de
la machine locale comme avec un script shell standard. Mais la philosophie de PHP part plutôt de l’hypothèse que
le script sera appelé et exécuté par un serveur Web pour générer une page Web dynamique sur un poste client.
2. Balises PHP
Le code PHP est encadré par des balises PHP. Il y a quatre styles de balise PHP :
o Les balises par défaut :
<?php
... Code PHP ... ?>
<?
... Code PHP ... ?>
o Les balises d’ouverture courtes 1 :
<%
... Code PHP ... %>
o Les balises compatibles ASP 2 :
o Les balises <script>:
<SCRIPT LANGUAGE="php">...Code PHP ...</SCRIPT>
Exemple :
<?php print("Hello World !\n"); ?>
Quand l’interpréteur PHP rencontre la balise d’ouverture, il interprète tous les caractères rencontrés jusqu’à ce
qu’il trouve la balise de fermeture. Le script est alors exécuté et remplacé par le résultat qu’il produit.
On peut générer une page HTML entière par un script PHP :
Page page.php
<?php
echo "<html>\n";
echo "<head>\n";
echo "<title>Page html g&eacute;n&eacute;r&eacute;e en PHP</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "Voici une page HTML g&eacute;n&eacute;r&eacute;e par PHP\n";
echo "</body>\n";
echo "</html>\n";
?>
3. Les variables du langage PHP
o
Les variables du langage sont représentées par un identificateur précédé du signe $, quel que soit le type de la
variable : nombre (valeur numérique), chaîne de caractères, tableau, objet composite.
o
Pour créer des variables avec PHP, il suffit d’en faire usage. Il n’est nullement besoin de les déclarer.
1
2
A éviter si le serveur Apache n’est pas configuré pour les balises courtes.
N’est utilisé que très rarement
29
Développement Internet
O. Auzende
o
Si la variable $x représente un tableau avec un index numérique, on accède aux éléments individuels par la
spécification $x[0], $x[1], etc.
o
Si la variable $x représente un tableau avec un index associatif (un type énuméré tel que ("lundi", "mardi",
"mercredi", etc.), on accède aux éléments individuels par la spécification $x["lundi"], $x["mardi"], etc.
o
Les tableaux PHP peuvent avoir un index mixte (associatif et numérique). En d’autres termes, les éléments
$x["lundi"] et $x[1] peuvent appartenir au même tableau.
Page var.php
<html>
<head><title>Premier exemple en PHP</title></head>
<body> Affichage de variables : nom="Dupont", prenom="Denis", age=25
<script language="php">
$nom="Dupont";
$prenom="Denis";
$age=25;
echo $prenom ;
echo " ";
echo $nom ;
echo " a ";
echo $age ;
echo " ans.";
</script>
</body>
</html>
Page tableau.php
<html>
<head><title>Tableau en PHP</title></head>
<body>
<p>On d&eacute;finit un tableau comportant les jours de la semaine.</p>
<?php
$tab[1]="lundi";
$tab[2]="mardi";
$tab[3]="mercredi";
$tab[4]="jeudi";
$tab[5]="vendredi";
$tab[6]="samedi";
$tab[7]="dimanche";
?>
<p>Affichage du 3me &eacute;l&eacute;ment : </p>
<?php
$i=3;
echo $tab[$i];
echo "\n" ;
?>
<p>Affichage de tous les &eacute;l&eacute;ments : </p>
<?php
for ($i = 1; $i < 8 ; $i++) {
echo $tab[$i];
echo "<br>" ;
}
?>
</body>
</html>
Variante : Page array.php
<html>
<head><title>Tableau en PHP</title></head>
<body>
<p>On d&eacute;finit un tableau comportant les jours de la semaine.</p>
<?php
$tab = array("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi",
"dimanche");
?>
<p>Affichage de tous les &eacute;l&eacute;ments : </p>
<?php
foreach ($tab as $v) {
echo $v, "<br>";
}
?>
</body>
</html>
30
Développement Internet
O. Auzende
4. Structures de contrôle
Page hasard.php
<html>
<head>
<title>Nombre aleatoire</title>
</head>
<body>
<p>Je tire un entier au hasard entre 1 et 100.<p>
<?php
srand((double)microtime()*1000000);
$randval = rand(1,100);
?>
<p>Ce nombre est
<?php
if ($randval > 50) {
?>
<b>plus grand que 50</b>.
<?php
}
else
{
?>
<b>plus petit que 50</b>.
<?php
}
?>
</p>
</body>
</html>
Page boucles.php
<html>
<head>
<title>tests et boucles</title>
</head>
<body>
<p>Boucle while :</p>
<script language="php">
echo "test de boucle while\n";
$n=10;
while ($n<=20)
{
echo ($n);
echo "-->";
$n++;
}
echo "\n\n";
</script>
<p>Boucle do... while</p>
<script language="php">
echo "test de boucle do ... while\n";
do
{
echo ($n);
echo "<--";
$n--;
}
while ($n >=10);
echo "\n\n";
</script>
<p>Boucle for : </p>
<script language="php">
echo "test de boucle for\n";
for ($n=10;$n<=20;$n++)
{
echo $n;
echo "--";
}
echo "\n" ;
</script>
</body>
</html>
31
Développement Internet
O. Auzende
5. Fonctions PHP
Page fonctions.php
<html>
<head>
<title>fonctions</title>
</head>
<body>
<?php
function carre ($num) {
return $num * $num;
}
function cube($num) {
return $num * $num * $num ;
}
?>
<p>Carr&eacute; et cube des nombres entiers de 1 &agrave; 10</p>
<?php
for ($i=1;$i<=10;$i++)
{
echo $i;
echo "-->";
echo carre ($i);
echo "-->";
echo cube ($i);
echo "<br>" ;
}
?>
</body>
</html>
Les fonctions peuvent figurer dans la page ou dans un fichier PHP extérieur, que l’on inclut ensuite dans la page
PHP (voir plus loin).
Exercice
Présenter les entiers de 1 à 20, leur carré et leur cube sous forme d’un tableau. Enregistrer la page sous le nom
fonctions1.php.
6. Variables provenant d'un formulaire
Si un formulaire fait appel à une page PHP, les paramètres du formulaire sont transmis à la page PHP.
Les paramètres sont récupérés par :
$nom=$_GET["nom"]
ou
$nom=$_POST["nom"] selon la méthode (GET ou POST) employée.
Page form.html
<html>
<head><title>Variables de formulaire</title></head>
<body>
<form action="resultat.php" method="get">
<table>
<tr><td>Nom :</td><td><input type="text" name="nom"></td></tr>
<tr><td>Prenom : </td><td><input type="text" name="prenom"></td></tr>
<tr>
<td>Ordinateur : </td>
<td><select name="ordinateur">
<option value="pc">PC</option>
<option value="mac">MAC</option>
<option value="sun">Station Sun</option>
<option value="autre">Autre</option>
</select></td>
</tr>
</table>
<input type="submit" value="Valider">
</form>
</body>
</html>
32
Développement Internet
O. Auzende
Page resultat.php
<html>
<head>
<title>R&eacute;cup&eacute;ration des valeurs des variables</title>
</head>
<body>
<p>Vous avez donn&eacute; comme renseignements :</p>
<p>Nom :
<?php echo $_GET['nom'] ; ?>
</p>
<p>Pr&eacute;om :
<?php echo $_GET['prenom'] ; ?>
</p>
<p>Ordinateur :
<?php echo $_GET['ordinateur'];?>
</p>
</body>
</html>
7. Classes PHP
Une classe est une collection de variables (attributs) et de fonctions (méthodes).
Exemple :
Page classes.php
<html>
<head>
<?php
class Panier {
var $articles;
// éléments du panier
// fonction d'ajout de $nb articles de type $art au panier
function ajoute($art, $nb) {
$this->articles[$art]+=$nb;
}
// Suppression de $nb articles de type $art du panier
function enleve($art, $nb) {
if ($this->articles[$art] > $nb) {
$this->articles[$art] -= $nb;
return TRUE;
}
else
{
return FALSE;
}
}
}
?>
</head>
<body>
<?php
$p=new Panier; $p->articles["lait"]=2; ?>
<p>Le panier comprend :
<?php echo $p->articles["lait"]; echo " litres de lait."; ?>
</p>
<?php $p->ajoute("lait",3); ?>
<p>Le panier comprend :
<?php echo $p->articles["lait"]; echo " litres de lait."; ?>
</p>
<?php $p->enleve("lait",1); ?>
<p>Le panier comprend :
<?php echo $p->articles["lait"]; echo " litres de lait."; ?>
</p>
</body>
</html>
33
Développement Internet
O. Auzende
8. PHP et les fichiers texte
Ecriture dans un fichier texte
Pour écrire dans le fichier texte annuaire.txt, on ouvre ce fichier en mode écriture (w+) :
Page fichtexte.php
<html>
<head><title>Ecriture</title></head>
<body>
<?php
$fich=fopen("annuaire.txt", "w+");
fputs($fich, "dominique [email protected]\n");
fputs($fich, "antoine [email protected]\n");
fputs($fich, "patricia [email protected]\n");
fputs($fich, "michel [email protected]\n");
fputs($fich, "lucie [email protected]\n");
fputs($fich, "lise [email protected]\n");
fclose($fich);
echo "Enregistrements effectu&eacute;s\n";
?>
</body>
</html>
Lecture d'un fichier texte
Page lecturetexte.php
<html>
<head><title>Ouverture de fichier</title></head>
<body>
<?php
$fich=fopen("annuaire.txt", "r");
while (!feof($fich))
{
$texte=fgets($fich, 1024);
echo $texte ;
echo "<br>" ;
}
?>
</body>
</html>
9. PHP et les fonctions systèmes
Lecture du contenu d'un répertoire
Page systeme.php
<html>
<head><title>Ouverture de fichier</title></head>
<body>
<?php
$fich=opendir('/');
while ($nom=readdir($fich))
{
echo "$nom<br>" ;
}
?>
</body>
</html>
10. Les sessions
Une session permet de suivre un utilisateur pendant la durée de sa connexion à un site. La variable $_SESSION est
stockée sur le serveur pendant environ 30 minutes et permet de mémoriser des renseignements concernant le
visiteur.
34
Développement Internet
O. Auzende
Exemple : page indexsession.html de connexion à un site demandant des renseignements à un visiteur :
Page indexsession.html
<html>
<head>
<title>Connexion au site</title>
</head>
<body>
<form method="post" action="creeSession.php">
<table border="0" width="400" align="center">
<tr><td width="200"><b>Votre pseudo<b></td>
<td width="200"><input type="text" name="pseudo"></td></tr>
<tr><td width="200"><b>Votre mail<b></td>
<td width="200"><input type="text" name="email"></td></tr>
<tr><td width="200"><b>Votre mot de passe<b></td>
<td width="200"><input type="password" name="mdp"></td></tr>
<tr><td colspan="2"><input type="submit" value="Entrer"></td></tr>
</table>
</form>
</body>
</html>
La page creeSession.php initialise la session et y mémorise le pseudo et le mail :
Page creeSession.php
<?php
// On active la session
session_start();
// On vérifie que les informations ont été effectivement données
if ( isset($_POST) && (!empty($_POST['pseudo'])) && (!empty($_POST['mdp'])) &&
(!empty($_POST['email'])) ) {
$pseudo=$_POST["pseudo"];
$email=$_POST["email"];
$mdp=$_POST["mdp"];
//
//
//
//
ces trois lignes peuvent être remplacées
par une seule qui est alors :
extract($_POST);
elle conserve les noms provenant du formulaire
$_SESSION['pseudo'] = $pseudo;
$_SESSION['email'] = $email;
$_SESSION['mdp'] = $mdp;
echo "Vous &ecirc;tes &agrave; pr&eacute;sent connect&eacute; au site";
}
?>
<form method="post" action="retrouve.php">
<input type="submit" value="Voir votre profil">
</form>
La page retrouve.php permet, dans une autre page, de retrouver les informations à partir de la session :
Page retrouve.php
<?php
// On active la session
session_start();
// On affiche une phrase résumant les infos sur l'utilisateur courant
echo "Pseudo : "; echo $_SESSION['pseudo']; echo "<br />";
echo "Email : "; echo $_SESSION['email']; echo "<br />";
echo "Mot de passe : "; echo $_SESSION['mdp']; echo "<br />";
?>
<form method="post" action="deconnect.php">
<input type="submit" value="Se d&eacute;connecter">
</form>
La page deconnect.php permet de vider l’objet $_SESSION sur le serveur :
Page deconnect.php
<?php
// On active la session
session_start();
35
Développement Internet
O. Auzende
// On écrase le tableau de session
$_SESSION = array();
// On détruit la session
session_destroy();
?>
Fin de connexion.
11. Connexion aux bases de données mySQL
Fonctions PHP d’accès aux bases de données mySQL
Les fonctions PHP mysql_pconnect() et mysql_connect() reçoivent toutes deux en argument le nom d’une
machine hôte, le nom d’un utilisateur et son mot de passe. Leur rôle est d’établir la connexion vers la machine
hôte. Elles renvoient un identificateur de lien si la connexion a pu être établie et FALSE si une erreur s’est
produite.
La fonction mysql_pconnect() établit une liaison permanente en cas de succès, alors que mysql_connect() établit
une liaison non permanente.
La fonction mysql_select_db() permet de sélectionner une base de données particulière sur la machine hôte à
laquelle on est connecté.
La fonction mysql_query() transmet une requête SQL au serveur pour qu’il l’exécute. En cas de succès, elle
renvoie l’identificateur d’un ensemble résultat, en l’occurrence une sous-table (virtuelle).
Parmi les fonctions disponibles :
mysql_close :
mysql_connect :
mysql_create_db :
mysql_drop_db :
mysql_fetch_array :
mysql_fetch_row :
mysql_num_fields :
mysql_num_rows :
mysql_query :
mysql_result :
mysql_select_db :
mysql_insert_id() :
Ferme la connexion MySQL.
Ouvre une connexion à un serveur MySQL.
Crée une base de données MySQL.
Efface une base de données MySQL.
Retourne une ligne de résultat sous la forme d'un tableau associatif.
Retourne une ligne de résultat sous la forme d'un tableau.
Retourne le nombre de champs d'un résultat.
Retourne le nombre de ligne d'un résultat.
Envoie une requête SQL à un serveur MySQL.
Retourne un champ d'un résultat.
Sélectionne une base de données MySQL.
Ramène le dernier identificateur attribué.
Lecture de la base de données mydb
Créez la base de données mySQL mydb et remplissez-la à l’aide du fichier MYDB.DUMP suivant :
CREATE TABLE employes (id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT, prenom varchar(20),
nom varchar(20), adresse varchar(100), service varchar(30), PRIMARY KEY (id), UNIQUE id (id));
INSERT
INTO
employes
VALUES(1,'Luc','Dupuis','128
place
de
la
Bastille,
75012
Paris','comptabilite');
INSERT INTO employes VALUES(2,'Alice','Dupont','55 rue Gambetta, 75012 Paris','marketing');
INSERT
INTO
employes
VALUES(3,'Michel','Martin','19
rue
des
Galets,
75011
Paris','comptabilite');
INSERT INTO employes VALUES(4,'Simon','Laurent','1 place de la Nation, 75011 Paris','R&D');
CREATE TABLE services (id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT,
varchar(20), adresseservice varchar(100), PRIMARY KEY(id), UNIQUE id(id));
INSERT INTO services VALUES(1,'comptabilite','125 rue de la Bourse, 75004 Paris');
INSERT INTO services VALUES(2,'marketing','225 rue du 11 septembre, 75004 Paris');
INSERT INTO services VALUES(3,'R&D','10 rue du Louvre, 75001 Paris');
L’interfaçage entrePHP et mySQL est natif.
L’étape d’enregistrement des sources de données ODBC n’est donc pas nécessaire.
36
nomservice
Développement Internet
O. Auzende
Fichier lecture1.php : lecture de tous les enregistrements et présentation en tableau
<html>
<body>
<?php
$db=mysql_connect("localhost","root");
mysql_select_db("mydb",$db);
$result=mysql_query("SELECT * FROM employes",$db);
echo "<table border=1>\n";
echo "<tr><td>Prenom</td><td>Nom</td><td>Adresse</td>
<td>Service</td></tr>\n";
while ($lignes=mysql_fetch_row($result)) {
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
$lignes[1],$lignes[2],$lignes[3],$lignes[4]);
}
echo "</table>\n";
?>
</body>
</html>
Fichier lecture2.php : test préalable si résultat vide
<html>
<body>
<?php
$db=mysql_connect("localhost","root");
mysql_select_db("mydb",$db);
$result=mysql_query("SELECT * FROM employes",$db);
if ($lignes=mysql_fetch_array($result)) {
echo "<table border=1>\n";
echo "<tr><td>Prenom</td><td>Nom</td><td>Adresse</td>
<td>Service</td></tr>\n";
do
{
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td>
</tr>\n",$lignes["prenom"],$lignes["nom"],
$lignes["adresse"],$lignes["service"]);
}
while ($lignes=mysql_fetch_array($result));
echo "</table>\n";
}
else
{echo "table vide";}
?>
</body>
</html>
Fichier lecture4.php : lecture avec deux tables
<html>
<body>
<?php
$db=mysql_connect("localhost","root");
mysql_select_db("mydb",$db);
$result=mysql_query("SELECT * FROM employes, services WHERE
employes.service=services.nomservice",$db);
if ($lignes=mysql_fetch_array($result)) {
echo "<table border=1>\n";
echo "<tr><td>Prenom</td><td>Nom</td><td>Adresse</td>
<td>Service</td><td>Adresse du service</td></tr>\n";
do
{
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>
%s</td><td>%s</td></tr>\n",$lignes["prenom"],
$lignes["nom"],$lignes["adresse"],$lignes["service"],
$lignes["adresseservice"]);
}
while ($lignes=mysql_fetch_array($result));
echo "</table>\n";
}
else
{echo "table vide"; }
?>
</body>
</html>
Fichier interrogation.html : lecture ciblée
<html>
<body>
<form method="post" action="lecture3.php">
Numero du salarie : <input type="text" name="id">
<input type="submit" value="OK">
</form>
</body>
</html>
37
Développement Internet
O. Auzende
Fichier lecture3.php : réponse
<html>
<body>
<?php
$db=mysql_connect("localhost","root");
mysql_select_db("mydb",$db);
$id=$_POST["id"];
if ($id) {
$result=mysql_query("SELECT * FROM employes WHERE id=$id",$db);
$lignes=mysql_fetch_array($result);
printf("Prenom : %s<br>",$lignes["prenom"]);
printf("Nom : %s<br>",$lignes["nom"]);
}
else
{ echo "pas de reponse"; }
?>
</body>
</html>
Ecriture dans la base de données mydb
Fichier ecriture.html : formulaire de demande d’insertion
<html>
<body>
<form method="get" action="ecriture1.php">
<table>
<tr><td>Nom :</td><td><input type="text" name="nom"></td></tr>
<tr><td>Prenom :</td><td><input type="text" name="prenom"></td></tr>
<tr><td>Adresse :</td><td><input type="text" name="adresse"></td></tr>
<tr><td>Service :</td><td><input type="text" name="service"></td></tr>
</table>
<input type="submit" name="submit" value="OK">
</form>
</body>
</html>
Fichier ecriture1.php : réponse (insertion effective)
<html> <body>
<?php
$submit=$_GET["submit"];
if ($submit) {
$db=mysql_connect("localhost","root");
mysql_select_db("mydb",$db);
$prenom=$_GET["prenom"];
$nom=$_GET["nom"];
$adresse=$_GET["adresse"];
$service=$_GET["service"];
$sql="INSERT INTO employes (prenom, nom, adresse, service)
VALUES ('$prenom','$nom','$adresse','$service')";
$result=mysql_query($sql);
echo "enregistrement effectue";
}
?>
</body>
</html>
Insérez un nouvel employé dans la base et vérifiez que l’insertion est effectivement faite par la page lecture2.php.
Suppression dans la base de données mydb
La page suppression.html demande le numéro de l'employé à supprimer, puis la page suppression.php supprime
effectivement cet employé dans la base mydb.
Fichier suppression.html : formulaire de demande de suppression
<html>
<body>
<form method="get" action="suppression.php">
Numero du salarie a supprimer : <input type="text" name="id">
<input type="submit" value="OK">
</form>
</body>
</html>
38
Développement Internet
O. Auzende
Fichier suppression.php : réponse (suppression effective)
<html>
<body>
<?php
$id=$_GET["id"];
if ($id) {
$db=mysql_connect("localhost","root");
mysql_select_db("mydb",$db);
$sql="DELETE FROM employes WHERE id=$id";
$result=mysql_query($sql);
echo "Employe supprime";
}
else
{echo "pas d'employe avec ce numero";}
?>
</body>
</html>
Supprimez l’employé entré précédemment dans la base et vérifiez la suppression avec la page lecture2.php.
Exercices
Ecrivez le fichier suivant et enregistrez-le sous le nom connexion.php dans le dossier contenant vos pages PHP :
Fichier connexion.php
<?php
$host="localhost";
$login="root";
$base="mydb";
?>
Dans toutes les pages PHP suivantes, vous commencerez le <body> par les lignes :
<?php
include "connexion.php";
?>
<?php
$db=mysql_connect($host,$login);
mysql_select_db($base,$db);
?>
réalisant la connexion à la base de données dont les références sont cette fois à l’extérieur des pages PHP.
- Ecrire une page question1.php proposant dans une liste de sélection les noms des services, puis la page
reponse1.php répondant en affichant la liste des employés du service sélectionné (prénom, nom, adresse).
- Ecrire une page question2.php proposant dans une liste de sélection les noms des services, puis la page
reponse2.php répondant en donnant le nombre d'employés du service sélectionné.
- Ecrire une page question3.php donnant le nom et le nombre d'employés de chaque service.
- Ecrire une page question4.html demandant un prénom, puis la page question4.php répondant en donnant la liste
des employés ayant ce prénom.
- Ecrire une page question5.html demandant une lettre, puis la page question5.php répondant en donnant la liste
des employés dont le prénom commence par cette lettre.
12. Création et utilisation d’un panier
Un panier est stocké dans une variable de la SESSION.
Les fonctions de base sont en général définies dans un fichier externe :
39
Développement Internet
O. Auzende
Fichier fonctions-panier.php
<?php
function creationPanier(){
$_SESSION['panier']=array();
$_SESSION['panier']['designation'] = array();
$_SESSION['panier']['quantite'] = array();
$_SESSION['panier']['prix'] = array();
}
function ajouterArticle($libelle,$qte,$prix){
$position = array_search($libelle, $_SESSION['panier']['designation']);
if ($position !== false) {
$_SESSION['panier']['quantite'][$position] += $qte ;
}
else {
array_push($_SESSION['panier']['designation'],$libelle);
array_push($_SESSION['panier']['quantite'],$qte);
array_push($_SESSION['panier']['prix'],$prix);
}
}
?>
Fichier panier.php
<?php
// On active la session pour accéder au panier
session_start();
?>
<?php
include "fonctions-panier.php";
?>
// inclusion des fonctions du panier
<html>
<head><title>Panier en PHP</title></head>
<body>
<p>On crée le panier.</p>
<?php
creationPanier() ;
?>
<p>On ajoute successivement 5 litres de lait, 2 kg de sucre, 3 plaquettes de
beurre, 1 paquet de farine et à nouveau 3 litres de lait.
<?php
ajouterArticle("lait",5,2);
ajouterArticle("sucre",2,4);
ajouterArticle("beurre",3,3);
ajouterArticle("farine",1,5);
ajouterArticle("lait",3,2);
?>
<p>On récapitule ensuite le contenu du panier : </p>
<table border='1'>
<tr align="center"> <td>Désignation</td> <td>Quantité</td> <td>Prix Unitaire</td>
</tr>
<?php
$nbArticles=count($_SESSION['panier']['designation']);
if ($nbArticles > 0) {
for ($i=0 ;$i < $nbArticles ; $i++) {
echo "<tr align='center'><td>";
echo $_SESSION['panier']['designation'][$i]."</ td>";
echo "<td>".$_SESSION['panier']['quantite'][$i]."</td>";
echo "<td>".$_SESSION['panier']['prix'][$i]."</td>";
echo "</tr>";
}
}
?>
</body>
</html>
A noter : une fois qu’un panier est créé, toutes les pages qui peuvent être visitées doivent impérativement
commencer par :
<?php session_start(); ?>
sous peine de risquer de perdre les variables de la SESSION, et comporter la ligne :
<?php include "fonctions-panier.php"; ?> pour disposer des functions d’accès au panier.
40

Documents pareils