Académique Documents
Professionnel Documents
Culture Documents
EXEMPLE: COMPTEUR DE VISITE SYNTAXE 5.1. VARIABLE 5.2. STRUCTURES 5.2.1. Exemple de tableau 5.3. COMMENTAIRE 5.4. OPRATEURS 5.5. INSTRUCTION CONDITIONNELLE 5.6. BOUCLE 5.6.1. Exemple de boucles
1. CGI
Common Gateway Interface Permet au client (navigateur) d'accder des applications o Qui rsident sur le serveur Web o Qui peuvent produire des documents XHTML (mais peut produire dautres types de documents, des images par exemple). C'est ce qu'on appelle du contenu dynamique (ce qui est diffrent du XHTML dynamique). Les applications se trouvent sur le serveur et sont excutes par le serveur o Cest pourquoi le serveur doit tre configur pour accepter les CGI o Dans le cas d'un langage de programmation compil, les programmes doivent tre compils pour lenvironnement du serveur o On retrouve le plus souvent ces applications dans des langages interprts (Shell ou Perl), c'est pourquoi on parle habituellement de script.
Introduction aux CGI et Php o Les scripts peuvent lire et crire des donnes sur lordinateur serveur. CGI est une interface : o Un rpertoire dsign (habituellement cgi-bin) contient des programmes CGI. a veut dire que quand le serveur reoit une requte pour un fichier qui se trouve dans ce rpertoire, il ne retourne pas ce fichier : il va faire excuter le fichier et retourner le rsultat de cette excution. o Une srie de donnes que le serveur sauvegarde et qui sont accessibles au programme CGI : les variables denvironnement CGI. L'avantage d'un script CGI par rapport un script excut par le navigateur: o Ne dpend pas de la configuration du navigateur o Donne accs la puissance du serveur o Possibilit d'crire dans des fichiers o Accs aux bases de donnes Dsavantages o Lent o Plus complexe programmer que Javascript o Problme de scurit. La prsence de script CGI prsente des risques pour le serveur. Un script CGI est en fait une "fentre" sur le serveur. Si le logiciel serveur a des erreurs qui introduisent de "trous" dans la scurit, il est possible que des usagers malveillants exploitent ces trous pour accder des donnes non autorises ou mme dtruire des donnes. Il est ncessaire de prendre des prcautions.
1.1. Exemple
Voici le fichier dateXHTML.cgi
#!/bin/sh tmp=`/bin/date` cat << EndFile Content-type: application/xhtml+xml; charset=UTF-8 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta name="Author" content="Hlne Desaulniers"/> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8"/> <title> Simple script sh</title> </head> <body> <h1>La date courante sur le serveur est:</h1> <p>$tmp</p> </body> </html> EndFile
Introduction aux CGI et Php Interaction du client vers le serveur: 1. Si on entre lURL http://www.uqtr.ca/~helene/cgi-bin/dateXHTML.cgi dans la barre dadresse du navigateur o Le navigateur envoie une requte HTTP pour le document date.cgi dans le rpertoire cgi-bin de lusager helene Interaction du serveur vers le client: 2. Le serveur reoit la requte et fait sexcuter le programme dateXHTML.cgi . Il attend la rponse du script par l'intermdiaire de la sortie standard o Le programme dateXHTML.cgi sexcute. o Le principal travail que fait le script est de crer un document texte. Le script va simplement crire du texte sur la sortie standard. La premire ligne dans ce document est la dclaration du type de contenu: Content-type: application/xhtml+xml La deuxime ligne doit ncessairement tre une ligne vide Le reste du script va crire un document XHTML sur la sortie standard. Cette sortie standard sera redirige au serveur par l'intermdiaire de l'interface CGI Le script accs aux commandes du shell (ici date qui retourne la date courante) 3. Le serveur rpond la requte du navigateur en lui envoyant le document XHTML 4. Le navigateur affiche ce document XHTML Ce script est crit en shell; directement excutable sur une machine UNIX (il doit avoir des permissions en consquence)
2. Perl et CGI
Le langage de programmation Perl est un des langages les plus utiliss pour crire des script CGI. Pratical Extraction and Report Language Cr en 1987 par Larry Wall Langage interprt Possde plusieurs fonctions puissantes pour manipuler du texte (et souvent un script CGI doit produire un document HTML donc du texte) Largement disponible en freeware Plusieurs modules permettent d'ajouter des fonctionnalits. Facile installer localement
les instructions. Il est souhaitable de tester localement un script CGI avant de l'installer sur le serveur.
Mais first.pl n'est pas un script CGI. o Si on appelle ce programme par un navigateur on a une erreur. o Essayez http://linux04.uqtr.ca/~helene/cgi-bin/first.pl o C'est parce que le serveur ne reconnat pas le fichier produit comme un document xhtml. Il manque la ligne qui dclare le type de contenu. Instructions spars par ; Commentaires avec # Premire instruction: #!/usr/bin/perl o Le "shebang" (she pour sharp # et bang pour !) o C'est un commentaire qui indique au serveur o se trouve l'interprteur de Perl. o Pour les systmes "Unix" Le caractre "\n" indique un changement de ligne On aurait pu crire ( la place de print "hello, World!\n") o print ("Hello, World\n"); o print "Hello, ","World\n"; C'est que la fonction print s'attend recevoir comme argument une liste. La liste peut tre ou non entre parenthses. Si la liste contient plus d'un lment, ils sont spars par une virgule.
o o print "Hello, "; print "World\n"; print 'Hello, '; print "World\n";
Pour ce dernier exemple il faut prciser que l'usage de ' la place de " pour dlimiter une chane de caractres n'est pas exactement quivalent. Dans une chane de caractres dlimite par ' le caractre d'chappement \ n'est pas interprt. Ce qui fait que print 'World\n'; ne produira pas l'effet recherch:
Les mots rservs sont sensibles la casse: print est diffrent de Print.
#!/usr/bin/perl -wT use strict; print "Content-type: application/xhtml+xml; charset=UTF-8 \n\n"; print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n " ; print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fr\">\n"; print "<head>\n"; print "<title>Page test</title>\n"; print "</head>\n"; print "<body>\n"; print "<h2>Hello world!</h2>\n\n"; print "<p><a href=\"http://www.uqtr.ca/~helene/INF1001\">Site du cours </a></p>\n"; print "</body></html>\n";
L'instruction /usr/bin/perl wT donne en commentaire sert indiquer: o Le chemin pour accder l'interprteur Perl. Ici /usr/bin/perl o L'option w pour que le compilateur crive les messages d'avertissement o L'option T indique au compilateur de considrer risque toutes les donnes provenant de l'extrieur. L'instruction use strict va faire en sorte que le compilateur va empcher certaines constructions de code non scuritaires. On peut voir que le programme fait simplement une srie d'instructions d'criture. o Il crit du code XHTML qui sera envoy au serveur la fin de l'excution du programme. o La premire instruction d'criture est essentielle pour tout script CGI. Elle permet d'crire l'entte de la transaction http. Cet entte comporte la ligne Content-type: application/xhtml+xml; charset=UTF-8 suivi d'une ligne vide. Ce qui se traduit par l'instruction
print " Content-type: application/xhtml+xml; charset=UTF-8\n\n";
tant donn que le guillemet est le dlimiteur de chane de caractres pour Perl et qu'il est aussi le dlimiteur de chane pour les valeurs d'attributs en XHTML, il est ncessaire d'utiliser le caractre d'chappement \ pour utiliser un guillemet l'intrieur d'une chane de caractres de Perl. C'est pourquoi on retrouve:
Les caractres \n servent gnrer un changement de ligne dans le code XHTML. Essayez http://linux04.uqtr.ca/~helene/cgi-bin/firstCGIXHTML.pl Si vous regardez le source du document affich vous obtenez:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>Page test</title> </head> <body> <h2>Hello world!</h2> <p><a href="http://www.uqtr.ca/~helene/INF1001">Site du cours </a></p> </body></html>
C'est un code plus simple crire : pas de guillemets donc pas ncessaires d'ajouter des caractres dchappement pour les guillemets: Print "<a href =\"http://..\"> Site du cours</a>" devient simplement
<a href = "http://.. ">Site du cours</a>
\n
Essayez http://linux04.uqtr.ca/~helene/cgi-bin/secondCGIXHTML.pl L'instruction indiquant la fin du bloc doit ncessairement commencer au dbut de la ligne et ne pas avoir de ;
Si on entre lURL: http://linux04.uqtr.ca/~helene/cgi-bin/envValideXHTML.pl dans la barre dadresse du navigateur Le programme va simplement afficher les variables denvironnement CGI
o Remarquez que la mthode pour la requte est GET Si vous entrez une chane de caractres avec la requte, par exemple http://linux04.uqtr.ca/~helene/cgi-bin/envValideXHTML.pl?chane , o Observez la valeur de la variable d'environnement QUERY_STRING o Observez galement la valeur de la variable d'environnement QUERY_STRING dans le cas o vous entrez "une chaine" la place de "chaine". Le navigateur a remplac le caractre "espace" par %20 qui est la valeur en ASCII du caractre espace, prcd du signe % Si je fais excuter le programme partir de linvite de commande jai dautres variables denvironnement. (Ce n'est plus l'environnement CGI, c'est l'environnement du systme.)
Cocher la permission Excution pour chaque catgorie d'usager (Attention, seul l'usager propritaire doit avoir la permission Ecriture.) o Avec SmartFtp, Slectionner le fichier dont vous voulez modifier les permissions Avec le menu contextuel, slectionnez la commande
Properties/CHMOD
Cocher la permission execute pour chaque catgorie d'usager (Attention, seul l'usager user doit avoir la permission write.) Le fichier doit tre un fichier texte o Quand vous transfrez le fichier sur le serveur avec un client ftp, assurezvous que le transfert se fait en mode texte. o Habituellement les clients FTP offrent 2 types de transfert: ASCII, pour du texte Binaire, pour du code. o Il est possible aussi de faire en sorte que le client FTP dtecte le type de transfert (texte ou binaire) selon l'extension du fichier, le transfert se fait alors en mode Auto. Pour un script Perl: o Premire ligne : #!/usr/bin/perl (retour aprs cette ligne) o Extension pl
Introduction aux CGI et Php o Engin de recherche o Panier d'achat Plusieurs versions. o Ici versions 4.3.2 Mlange de C et de Perl Avantage par rapport un CGI o Plus rapide parce que le traitement est habituellement intgr au serveur Web o Le code peut tre directement dans le document HTML o Compatible avec de nombreux gestionnaires de bases de donnes Rfrence: http://www.php.net/manual/fr/index.php
3.1. Fonctionnement
Quand le serveur reoit une requte pour un fichier avec l'extension php le processeur php traite le fichier pour produire un document xhtml o le document ressemble du xhtml sauf qu'il contient du code php. le processeur traite le code php et garde intact tout le reste (le xhtml) le serveur envoie le document xhtml produit par le processeur php
Extension php Fichier texte Selon la configuration du serveur, un script php est excut comme un script CGI ou il est interprt directement par le serveur. Sur linux04, les scripts sont interprts directement par le serveur Il y a plusieurs faons d'introduire du code php dans un document HTML, le plus recommand est de placer le code entre <?php et ?>
10
Introduction aux CGI et Php o <?php indique le dbut du code php au prprocesseur php
echo
o Affiche une chane de caractres o Fonctionne avec et sans les parenthses Les instructions sont spares par ";" Voir http://linux04.uqtr.ca/~helene/Php/exemple1XHTML.php . Consultez le code source du document affich par le navigateur et faites le lien avec le code php!
La fonction date retourne une chane de caractres reprsentant la date du jour o Prend en paramtre une chane de caractres indiquant le format de la date: o l pour jour de la semaine en version longue o F pour le mois en version longue o d pour le jour du mois avec 2 chiffres o Y pour l'anne avec 4 chiffres o Voir http://ca.php.net/manual/fr/function.date.php $date est une variable o Le type de la variable est dtermin par le contexte. Ici c'est une variable de type chane de caractres La fonction print est comme echo sauf que a retourne une valeur o Voir http://ca.php.net/manual/fr/function.print.php o Comme argument print, $date n'est pas entre guillemets parce que ce n'est pas un chane de caractres. Voir http://linux04.uqtr.ca/~helene/Php/exemple2XHTML.php On peut intercaler le php et le html:
<?php $date = date("l F d, Y"); print "<p> Nous sommes le: <strong> $date </strong> </p>"; ?>
Voir http://linux04.uqtr.ca/~helene/Php/exemple2aXHTML.php Ici, l'argument print est une chane de caractres qui contient la fois des caractres et une variable. Au moment de l'valuation de l'argument print, la variable est remplace par sa valeur.
11
Introduction aux CGI et Php Si la chane de caractres de print n'est pas entre guillemets mais entre apostrophes, print 'Nous sommes le: <strong> $date </strong>'; alors les valeurs des variables l'intrieur de la chane ne sont pas substitues. o Voir http://linux04.uqtr.ca/~helene/Php/exemple2bXHTML.php
<p> <?php $nomFichier = "/home/helene/public_html/Php/compteur.txt"; if (file_exists($nomFichier)){ $fichier = fopen("/home/helene/public_html/Php/compteur.txt", "r"); $nbVisite = fgets($fichier);//fgets retourne une chaine de caractres }else{ $fichier = fopen("/home/helene/public_html/Php/compteur.txt", "x"); $nbVisite = 1; } echo "Ce document a t visit $nbVisite fois"; fclose($fichier); //Le fermeture va permettre d'ouvrir en dbut de fichier $fichier = fopen("/home/helene/public_html/Php/compteur.txt", "w"); $nbVisite++; //la chane nbVisite sera automatiquement //transforme en entier avant de faire l'incrmentation fputs($fichier,$nbVisite); fclose($fichier); ?> </p>
La premire fois que le document est charg, le fichier compteur.txt n'existe pas et la fonction file_exists() va retourner false. Dans ce cas le fichier sera ouvert en cration.
12
Introduction aux CGI et Php o Il faut cependant que le rpertoire contenant le fichier crer (ici le rpertoire Php) ait les permissions d'criture. o Voir http://linux04.uqtr.ca/~helene/Php/exemple3XHTML.php Attention, une utilisation de fichier pour mmoriser un compteur d'accs peut prsenter des anomalies dans le cas par exemple o il y aurait 2 accs simultans au fichier. D'une faon gnrale, il vaut mieux garder ce genre d'information dans une base de donnes. Le gestionnaire de base de donnes va grer les problmes d'accs.
5. Syntaxe
5.1. Variable
Identifie par $ o Commence par une lettre ou du caractre _ o Suivi d'une lettre, un chiffre ou du caractre _ Un caractre majuscule est diffrent du caractre en minuscule Diffrents types o Chane de caractres (string) o Entier (integer) base dcimale, (15) base hexadcimale (0xf) base octale (017) o Nombre virgule flottante (double) 1.234 1.2e2 o Boolen (valeur TRUE ou FALSE)
5.2. Structures
Tableau o Introduit par le mot rserv array o La cl des lments d'un tableau peut aussi bien tre une chane de caractres qu'un entier. tant donn que la cl des lments d'un tableau peut aussi bien tre une chane de caractres qu'un entier, la notion de tableau de Php englobe la notion de liste associative. o Par dfaut la cl est de type entier. 5.2.1. Exemple de tableau
<p> <?php $aujourdhui = getDate(); $leJour = $aujourdhui['wday']; $leMois = $aujourdhui['mon'] -1; $jours= array('dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'); $mois = array('janvier', 'fvrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'aot', 'septembre' ,'octobre', 'novembre', 'dcembre'); print "Nous sommes aujourd'hui le $jours[$leJour] $aujourdhui[mday] $mois[$leMois]" ; ?> </p>
13
o La fonction getDate() retourne la date du jour dans une liste associative. Voir http://ca.php.net/manual/fr/function.getdate.php o $aujourdhui['wday'] contient la reprsentation numrique du jour de la semaine courante; 0 (pour Dimanche) 6 (pour Samedi) o $aujourdhui['mon'] contient la reprsentation numrique du mois (de 1 12) o $ ['mday'] contient la reprsentation numrique du jour du mois courant (de 1 31) o Remarquez que dans $aujourdhui[mday], la cl mday n'est pas entre guillemets (ou apostrophe) tant donn que la valeur du tableau associatif sera interpol (entre guillemets). o Voir http://linux04.uqtr.ca/~helene/Php/exempleDateFrXHTML.php Objet o Cr par la commande new Ressources o Type de donne spcial faisant rfrence une ressource externe (fichier ouvert, connexion une base de donnes,)
5.3. Commentaire
Commentaire sur plusieurs lignes: /* */ Commentaire sur une ligne // ou #
5.4. Oprateurs
Affectation: = Concatnation de chanes: . Oprateurs arithmtiques: +, -, *, /, % Oprateurs logiques: !, and, &&, or, || Oprateurs de comparaison: <, >,<=, >=, = =, !=
5.6. Boucle
for o for(exp1,exp2,exp3){traitement}
14
o Fonctionne comme en Perl 5.6.1. Exemple de boucles Nous pouvons utiliser les instructions rptions en php pour gnrer plusieurs contrles d'un formulaire:
<p>Navigateur(s) utilis(s)<br /> <?php $listeNav = array('IE6', 'IE5.5', 'N7', 'Moz', 'FFX'); $navDefaut = 'FFX'; foreach ($listeNav as $leNav){ print "<input type='checkbox' name='" . $leNav . "' value='".$leNav ."'"; if ($leNav == $navDefaut){print " checked ='checked'"; } print "/> $leNav \n"; } ?> </p>
Remarquez l'utilisation de l'oprateur de concatnation pour concatner une chane de caractres une variable. Voir http://linux04.uqtr.ca/~helene/Php/exempleBoucleXHTML.php
15