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éée par script CGI</title>" ; "</head>\n"; "<body><h2>Page créée par script CGI</h2>\n"; "On crée une page HTML complè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'âge de voter ?</h2> <form method="get" action="/cgi-bin/voter.cgi"> Quel est votre â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'âge de voter ?</h2>\n"; if ($voter eq 'oui') { print "<P>Vous êtes majeur, donc vous pouvez voter.</P>\n"; } else { print "<P>Vous ê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é ;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é ;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> <!--#include file="world.asp"--><br> permet d'inclure dans la page courante le fichier "world.asp"<br> dont voici le ré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ême âge et en paraî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ée !" ElseIf Hour(Now)<16 Then strgreeting="Bonne après-midi !" Else strgreeting="Bonne soiré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é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é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 éléments que vous avez donnés : </P> <TABLE> <TR> <TD>Votre pré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é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é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><%=Request.ServerVariables("HTTP_USER_AGENT")%> <br>permet de récupérer les renseignements sur le navigateur client.<br> Le ré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é</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é</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é, c'est que la page a été ouverte pour la première fois depuis le lancement du serveur.</p> <p>La date va être mise à jour par :<br> <%Application.Lock%><br> <%Application("Dateheure")=Now%><br> <%Application.Unlock%></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è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é à 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é 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ê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éné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é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è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énom : </TD> <TD> <%= request.getParameter("prenom") %></TD></TR> <TR><TD>Ordinateur : </TD> <TD> <%= request.getParameter("supp") %></TD></TR> <TR><TD>Systè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è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é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érimè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érimè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é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ées mySQL produits par une page JSP</h3> <p><b>Lecture de la table Fournisseurs</b></p> <table border=1> <tr><td><b>Numé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éro</b></td><td><b>Dé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é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énérée en PHP</title>\n"; echo "</head>\n"; echo "<body>\n"; echo "Voici une page HTML généré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é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 élément : </p> <?php $i=3; echo $tab[$i]; echo "\n" ; ?> <p>Affichage de tous les élé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é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 élé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é et cube des nombres entiers de 1 à 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écupération des valeurs des variables</title> </head> <body> <p>Vous avez donné comme renseignements :</p> <p>Nom : <?php echo $_GET['nom'] ; ?> </p> <p>Pré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é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 êtes à présent connecté 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é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