PHP : Personal Home Page
(P. Torguet / Ph. Truillet – UPS)
15 Octobre 2001 – v. 1.04
PHP est né avec le site de Rasmus Lerdof en 1994 : une page personnelle qui permettait de conserver une trace de passage des utilisateurs.
A la suite de la demande de la mise à disposition de cet outil par de nombreux utilisateurs, Lerdof a décidé de mettre en ligne la version 1.0 de PHP (Personal Home Page). A la surprise de son auteur, PHP est devenu rapidement très populaire et il a fallu ajouter de nouvelles fonctionnalités telles que boucles, structures conditionnelles, etc.
La version 2.0 permettra ainsi au développeur d’intégrer des instructions de programmation puissantes directement dans du code HTML. Un script PHP peut ainsi analyser les données soumises par un formulaire HTML, communiquer avec des bases de données et effectuer des calculs complexes à la volée. Et l’exécution de tels scripts est très rapide, car le code source du langage est directement compilé dans le serveur web. Ainsi, les instructions PHP sont exécutées à l’intérieur même du serveur, sans aucune ressource supplémentaire, contrairement aux CGI (Common Gateway Interface).
La correction d’erreurs d’analyse et le soutien d’autres développeurs a permis la sortie de nouvelles versions de PHP : la version 3 (encore très utilisée) et la version 4. depuis mi-2000.
Contrairement à ce que certains disent, l’acronyme PHP ne signifie pas "People Hate Perl", mais “Personal Home Page”, nom hérité de la première version. Aujourd’hui, par consensus, PHP signifie “PHP is an Hypertext PreProcessor”.
PHP est un langage de script qui s’inclut dans le langage HTML et est traité par le serveur web. La syntaxe du langage PHP provient des langages C, Java et Perl, avec un petit nombre de fonctions inédites par rapport à ces langages.
Le but du langage PHP est de permettre aux développeurs de site web d’écrire rapidement des pages web dynamiques. PHP permet de construire dynamiquement des pages HTML contenant les résultats de calculs ou de requêtes SQL adressées à un système de gestion de bases de données (SGBD). Il ne demande pas de connaissances importantes de la machine sur laquelle on travaille, et permet de faire fonctionner les scripts sur n’importe quel système d’exploitation (Unix, Mac, Windows).
Grâce à de nombreuses extensions, PHP3 peut générer des fichiers PDF, s’interfacer avec des serveurs de messagerie ou encore générer des images et graphiques GIF à la volée.
En outre, PHP3 peut s’interfacer à la quasi totalité des SGBD du marché.
Son objectif consiste à produire des pages HTML côté serveur moyennant des traitements permettant d’enrichir ces pages par l’insertion des données en provenance de bases de données.
Enfin, PHP est distribué librement et gratuitement sous la licence GNU GPL.
Reprenant une syntaxe claire très proche de celle du langage C, PHP est un langage dont la prise en main est généralement rapide.
C’est donc un langage qui conviendra autant au débutant désireux de se familiariser “sans douleur” avec les techniques du web dynamique, qu’au professionnel cherchant une solution simple mais toutefois puissante et fiable pour des sites de taille moyenne.
Pourquoi devrais-je apprendre le langage PHP ? Le temps des sites web statiques développés avec des pages HTML et quelques scripts CGI sera bientôt révolu. Désormais, les catalogues de produits des entreprises doivent pouvoir être convertis en moins de 24 heures pour être consultables en ligne, à travers l’interface d’une boutique électronique par exemple.
v PHP est librement modifiable et il a été conçu pour intégrer de multiples extensions. Cela n’est pas étonnant, car il est programmé en C. De plus, PHP propose une API (Application Programming Interface) très stable. Les développeurs expérimentés pourront ainsi aisément ajouter de nouvelles fonctions.
v PHP est uniquement dédié au développement de pages web dynamiques, contrairement à des langages généraux (Perl, C et Java, entre autres), qui représentent d’excellents outils de programmation, mais restent très difficiles à manier pour le web. Les applications PHP sont rapides à mettre en place et faciles à créer, car leur code est directement intégré dans les pages HTML.
v Enfin, PHP est un langage très populaire. Plusieurs fournisseurs d’accès ou hébergeurs de sites l’ont d’ores et déjà adopté, autorisant ainsi les utilisateurs à développer leurs propres applications web sans exposer leur serveur aux risques des CGI.
Voici pour commencer la célèbre adaptation du programme “Hello World” en PHP :
<html><body>
<?php
echo "Hello
World<P>";
?>
</body></html>
Simplissime, non ?
Le code PHP est placé directement dans le code source HTML, il est encadré par deux balises spéciales (<?php et ?>) qui sont destinées à être reconnues par l’interpréteur PHP. On aurait pu tout aussi bien utiliser les balises <script language="php"> et </script> comme on le fait pour du JavaScript.
La syntaxe de PHP n’a vraiment rien de déroutante puisqu’elle est très proche de celle du langage C. On place généralement une instruction par ligne. Une instruction est terminée par un point-virgule en fin de ligne.
Les types de données standards en PHP sont :
v integer (entiers)
v double (réels représentés par des valeurs à virgule flottante)
v string (chaînes de caractères)
v array (tableaux)
v object (objets cf. la programmation par objet)
PHP n’est pas un langage fortement typé. C’est PHP qui décide à l’exécution, en fonction de son contenu, quel type sera le plus indiqué pour la variable.
Note : les variables en PHP commencent toutes par le caractère “$”. Par exemple : $var, $toto, $i…
Quand vous utilisez une variable, vous n’avez pas besoin de la déclarer au préalable.
Attention, une variable peut changer de type en fonction de son contenu. Nous allons voir comment jongler avec les différents types de variables.
$foo = "0"; // $foo est une chaîne de caractères : string "0" (code ASCII 48)
$foo++; // $foo est une chaîne de caractères : string "1" (ASCII 49)
$foo += 1; // $foo est maintenant un entier : integer (2)
$foo = $foo + 1.3; // $foo est maintenant un réel : double (3.3)
$foo = 5 + "10 Little Piggies"; // $foo est maintenant un entier (15)
$foo = 5 + "10 Small Pigs"; // $foo est maintenant un entier (15)
Conclusion ? Eh bien, si l’interpréteur PHP s’en sort plutôt bien, ce genre de construction ne devrait jamais être utilisé en pratique, à moins que vous ne soyez le seul à maintenir votre code PHP et encore !
Quelques exemples valent souvent mieux qu’un long discours...
v $a + $b Addition Somme de $a et $b.
v $a - $b Soustraction Reste de la différence de $b et $a.
v $a * $b Multiplication Produit de $a par $b.
v $a / $b Division Dividende de $a par $b.
v $a % $b Modulo Reste de la division entière de $a par $b.
Il n’existe qu’un seul opérateur en PHP3 sur les chaînes,
c’est l’opérateur de concaténation “.”.
$a = "Hello ";
$b = $a . "World!"; // $b contient
"Hello World!"
Il est à noter que vous pouvez spécifier une chaîne en l’encadrant entre des simples ou des doubles quotes (guillemets simples ou doubles). Les double quotes permettent le remplacement des variables par leur valeur.
$val=‘Pengo’;
echo ‘Hello $val’; // Affiche Hello
$val
echo "Hello $val"; // Affiche Hello
Pengo
Il s’agit des opérateurs binaires dits “bit à bit”, et non pas des opérateurs logiques booléens.
v $a & $b Et Les bits qui sont à 1 dans $a ET dans $b sont mis à 1.
v $a | $b Ou Les bits qui sont à 1 dans $a OU dans $b sont mis à 1.
v ~ $a Non Les bits sont inversés.
Chose originale avec PHP, il existe deux versions des opérateurs logiques ET et OU, avec des précédences différentes.
v $a and $b Et Résultat vrai si $a ET $b sont vrais
v $a or $b Ou Résultat vrai si $a OU $b est vrai (ou les deux)
v $a xor $b Ou Exclusif Résultat vrai si $a OU $b est vrai, mais pas si les deux sont vrais
v ! $a Résultat vrai si $a est faux, et réciproquement
v $a && $b Et Résultat vrai si $a ET $b sont vrais
v $a || $b Ou Résultat vrai si $a OU $b est vrai (ou les deux)
Encore du classique. Sans surprise pour les habitués de la syntaxe C.
v $a == $b Egal Résultat vrai si $a est égal à $b
v $a != $b Différent Résultat vrai si $a est différent de $b
v $a < $b Inférieur Résultat vrai si $a est strictement inférieur à $b
v $a > $b Supérieur Résultat vrai si $a est strictement supérieur à $b
v $a <= $b Inf ou égal Résultat vrai si $a est inférieur ou égal à $b
v $a >= $b Sup ou égal Résultat vrai si $a est supérieur ou égal à $b
Les structures de contrôle If, If…else, If…else…elseif ainsi que les instructions de boucle do…while, for, break, continue et switch sont disponibles avec PHP.
v
if (ressemble au C)
if ($expr) {
echo "$expr est vrai" ;
}
elseif ($expr2) {
echo "$expr2 est vrai" ;
}
else {
echo "tout est faux" ;
}
v
switch (comme en C)
switch ($i) {
case 0:
print "i égale 0";
break;
case 1:
print "i égale 1";
break;
case 2:
print "i égale 2";
break;
default :
print "autre chose"
}
v do…while, for, while, (ressemblent à ceux du C, à part que les variables sont non typées)
Exemple de for :
for($i
= 0; $i < 10; $i++) {
echo $i;
}
Pourquoi les tableaux sont-ils si importants en PHP ? Parce les fonctions qui retournent plusieurs valeurs le font généralement sous la forme de tableaux. C’est la cas des fonctions liées aux bases de données. Il est donc particulièrement intéressant de bien maîtriser les tableaux en PHP.
Il existe en PHP deux types de tableaux :
v Premier
type : les tableaux que l’on pourrait nommer "Classiques"
dans lesquels on se déplace en utilisant l’indice de l’élément, comme en
langage C. Le premier élément porte comme en C l’indice zéro.
On peut remplir un tableau en adressant chaque élément un par un, ou d’un coup
en fournissant toutes les valeurs :
$tab[0] = "P";
$tab[1] = "H";
$tab[2] = "P";
// Equivalent à
$tab = array("P","H","P");
v Et un deuxième type : les tableaux “associatifs”, c’est à dire les tableaux qui contiennent pour chaque élément une valeur associée qui sert de clé d’accès.
Voici un exemple avec un indice de type chaîne de caractères :
$villes["toulouse"] = 370000 ;
$villes["paris"] = 2200000 ;
$villes["lyon"] = 420000 ;
Pour définir des fonctions en PHP on utilise le mot-clef function. La syntaxe est la suivante :
function
nomFonction($arg1, $arg2, ..., $argn) {
instructions ;
}
Passage de paramètres :
· $arg : par valeur
· &$arg : par référence
Les derniers paramètres peuvent avoir des valeurs par défaut (ex. $arg3=1)
Pour que la fonction retourne une valeur on utilisera comme en C : return $val ;
Les variables créées dans la fonction sont par défaut locales.
On peut les déclarer globales (peu recommandé) en écrivant global lors de la première initialisation.
Exemple : global $var = 10 ;
Une variable locale peut être mémorisée d’un appel à l’autre de la fonction en utilisant le mot-clé static comme en C.
On peut écrire des bibliothèques de fonctions qu’on pourra ensuite inclure avec l’instructions : require.
Exemple :
require("ma_bibliotheque.php") ;
Note : il y a aussi une instruction include qui s’utilise de la même façon mais elle ne provoque pas d’erreur si le fichier n’est pas trouvé. Le fichier est donc optionnel.
Les fonctions qui gèrent les E/S fichiers en PHP ressemblent beaucoup aux fonctions du langage C.
v fopen
permet d'ouvrir un fichier en lecture, écriture ou ajout en fin de fichier.
Exemples :
$fich = fopen("fich.txt", "r"); /* ouvre un fichier en
lecture */
$fich = fopen("fich.txt", "w"); /* ouvre un fichier en
écriture */
$fich = fopen("fich.txt", "a"); /* ouvre un fichier en
ajout en fin de fichier */
v fgets permet de lire un certain nombre de caractères dans un fichier (ouvert en lecture).
Exemple :
$chaine = fgets($fich, 1024); /* lit au maximum 1024 caractères et les place dans la chaîne $chaine */
v feof permet de savoir si on est arrivé à la fin du fichier.
Exemple :
if (feof($fich)) print("fin du fichier atteinte");
v fputs
permet d'écrire une chaîne de caractères dans un fichier (ouvert en écriture ou
en ajout).
Exemple :
fputs($fich, $chaine); /* écrit la chaîne $chaine dans le fichier */
v fclose ferme un fichier.
Exemple :
fclose($fich); /* ferme le fichier - à ne pas oublier */
v file_exists teste l’existence d’un fichier (retourne TRUE si le fichier existe, et FALSE sinon)
Exemple :
if (file_exists("fich.txt")) print("le fichier existe");
La récupération des paramètres de formulaires en PHP est assez simple mais dépends de la méthode utilisée par le formulaire.
Si on utilise method="get" on devra utiliser le tableau associatif $_GET en précisant comme « indice » le nom du champ. Si on utilise method="post" le nom du tableau sera $_POST.
Attention, la syntaxe de PHP a changé
depuis la version 4.2. Auparavant, pour récupérer la valeur d'un champ d'un
formulaire envoyé par la méthode HTTP GET, et dénommé id
, on écrivait $id
. Il faut maintenant écrire $_GET['id']
. Il existe une
option de compatibilité avec l'ancienne syntaxe (register_globals on), mais
elle n'est pas activée, car l'ancienne syntaxe est à l'origine d'un trou de
sécurité grave. Si vous récupérez un script utilisant l'ancienne syntaxe, il ne
marchera pas.
Voici un petit exemple pour bien comprendre :
<form action="TraiteFormulaire.php"
method="post">
Votre nom : <input type=text name=nom><br>
Votre âge : <input type=text name=age><br>
<input type=submit name="Ok">
</form
Lorsqu’on clique sur le bouton Ok de la page web contenant le formulaire précédent, la page TraiteFormulaire.php est appelée. Cette dernière contient des ordres PHP :
...
Bonjour <?php echo $_POST[‘nom’]; ?>, <p>
vous avez bien <?php echo $_POST[‘age’]; ?> ans <br>
cette année ?
...
On peut aussi si on veut récupérer les valeurs dans un tableau à deux dimensions.
C’est cette fonctionnalité qui est utilisée pour récupérer
les valeurs d'un choix multiple. Exemple :
<form action="tableau.php"
method="post">
Nom : <input type="text" name="personnel[nom]"><br>
Email : <input type="text" name="personnel[email]"><br>
Vins préférés : <br>
<input type=checkbox name="vin[]" value="medoc">Médoc<br>
<input type=checkbox
name="vin[]"
value="madiran">Madiran<br>
<input type=checkbox
name="vin[]"
value="chablis">Chablis<br>
<input type=checkbox
name="vin[]"
value="riesling">Riesling<br>
<input type="submit">
</form>
Le fichier PHP suivant fait le traitement :
...
Bonjour <?php echo $_POST[‘personnel’][‘nom’]; ?>, <p>
Votre adresse est <?php echo $_POST[‘personnel’][‘email’]; ?> <p>
Vos vins préférés sont : <br>
<?php
for($i
= 0 ; $i < count($_POST[‘vin’]); $i++) {
echo $_POST[‘vin’] [$i];
echo “, <br>";
}
echo
"<p>";
?>
Note : la fonction count qui prend un tableau en paramètre compte le nombre de valeurs de ce tableau.
Pour envoyer un cookie au navigateur on utilise la fonction :
int setcookie
(string name, string value , int expire
, string path , string domain , int secure
)
setcookie()
définit un cookie qui sera envoyé avec le reste des en-têtes. Les cookies
doivent passer avant toute autre en-tête (c'est une restriction des cookies,
pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise
<HTML> ou <HEAD>.
Tous les arguments sauf name (nom) sont optionnels. Si seul le nom est présent, le cookie portant ce nom sera supprimé du navigateur de l'internaute. Vous pouvez aussi utiliser une chaîne vide comme valeur, pour ignorer un argument. Le paramètre expire est une estampille temporelle UNIX (nombre de secondes depuis le 1er janvier 1970 00:00:00 GMT). Le paramètre secure indique que le cookie doit être uniquement transmis à travers une connexion HTTPS sécurisée.
Erreurs communes :
· Les cookies ne seront accessibles qu'au chargement de la prochaine page, ou au rechargement de la page courante.
· Les cookies doivent être effacés avec les mêmes paramètres que ceux utilisés lors de leur création.
En PHP 3, les appels multiples à setcookie()
dans le même script seront effectués dans l'ordre inverse. Si vous essayez
d'effacer un cookie avant d'insérer une nouvelle valeur, vous devez placer
l'insertion avant l'effacement.
En PHP 4, les appels multiples à setcookie() sont effectués dan un ordre naturel.
Exemples avec setcookie()
<?php
setcookie("TestCookie","Valeur de test");
setcookie("TestCookie",$value, time()+3600); /* expire dans une heure */
setcookie("TestCookie",$value, time()+3600,"/~sid/",".ups-tlse.fr",1);
/* cookie valable pour toutes les pages dont le chemin commence par /~sid/ sur toutes les machines serveur dont le nom finit par .ups-tlse.fr */
?>
Pour voir le résultat, essayez le script suivant :
<?php
echo $_COOKIE["TestCookie"];
?>
Pour d'autres informations sur les cookies, jetez un oeil sur :
http://www.netscape.com/newsref/std/cookie_spec.html.
PHP peut s’interfacer avec de nombreuses bases de données mais celle qui est la plus utilisée est MySQL. Ses avantages sont : gratuité (pour les utilisations non commerciales), portabilité (Linux, Solaris, MacOsX, Windows…), gestion de plusieurs utilisateurs simultanés, rapidité, facilité d’utilisation…
Nous n’allons ici présenter que les bases de l’utilisation de MySQL depuis PHP pour plus de détail se reporter à la documentation en ligne sur http://www.php.net/ .
Avant d’utiliser une base de données il convient de se connecter à MySQL et de choisir la base de données.
Ceci est fait simplement en utilisant deux fonctions (mysql_connect et mysql_select_db) voici un exemple d’utilisation :
//
connexion a mysql
$lien
= mysql_connect("localhost", "login",
"mot_de_passe");
if
($lien ==0)
exit("impossible d'etablir la
connexion");
//
selection de la base de nom "etudiants"
if(mysql_select_db("etudiants",
$lien) == 0)
exit("impossible de se connecter a la
base etudiants");
NB :
les paramètres de l’appel à mysql_connect sont en général précisés par
l’administrateur du serveur web.
Au CICT on
peut consulter les pages suivantes :
http://www.cict.fr/WWW/instructions.html,
http://www.cict.fr/WWW/php.html
et
http://www.cict.fr/app/mysql.html
Pour interroger une base de données on utilise typiquement l’instruction select du langage SQL de la façon suivante (on suppose que la base de données contient une table appelée etat_civil qui contient au minimum les champs nom et prenom) :
//
requete sur la table etat_civil
$requete="select
nom, prenom from etat_civil ORDER BY nom";
$result =
mysql_query($requete);
if($result
== 0)
exit("impossible d'effectuer la
requete <BR>$requete");
if
(mysql_num_rows($result)==0)
exit("désolé
nous n'avons aucune information");
//
il y a des etudiants, on les affiche dans un tableau
print("\n<TABLE>\n");
print("<TR><TH>Nom</TH><TH>Prénom</TH></TR>\n");
while($ligne =
mysql_fetch_row($result))
{
$nom = $ligne[0];
$prenom = $ligne[1];
print("\n<TR>\n");
print("\t<TD>$nom</TD>\n");
print("\t<TD>$prenom</TD>\n");
print("</TR>\n");
}
print("\n</TABLE>");
NB : les résultats de la requête sont obtenu ligne par ligne grâce à la fonction mysql_fetch_row et sont rangés dans un tableau à une dimension dans l’ordre indiqué lors du select. Ici $ligne[0] contiendra donc le nom et $ligne[1] le prénom. La requête peut évidemment être beaucoup plus complexe et travailler sur plusieurs tables.
Pour modifier une base de données le principe est le même en utilisant les instructions SQL insert, update et delete. Voilà trois exemples :
// effacement :
$requete =
"delete from etudiants where nom ='$nom'";
if(mysql_query($requete)
== 0)
exit("impossible
de supprimer la ligne");
else
print("l’étudiant : $nom est
supprimé");
//
mise à jour :
$requete = "update etudiants set ";
$requete
.= " prenom='$prenom', adresse='$adresse' ";
$requete
.= "where nom='$nom'";
if(mysql_query($requete)
== 0)
exit
("impossible de modifier la ligne<BR>");
else
print("l’étudiant : $nom est
modifié");
//
insertion :
$requete = "insert into etudiants (nom, prenom,
adresse)";
$requete
.= "values ('$nom', '$prenom', '$adresse')";
if(mysql_query($requete)
== 0)
exit("impossible d'ajouter la
ligne");
else
print("<BR> l’étudiant : $nom
a été ajouté");
Il ne faut pas oublier de fermer la connexion à la base MySQL :
if (mysql_close()==false)
exit("Fermeture impossible de la base");
v http://dev.nexen.net/docs/php/annotee/manuel_toc.php (Manuel de PHP en ligne)
- But du TP : Ecrire des pages HTML et PHP et les tester.
Recopiez la page suivante dans le fichier ~/web/test.php
<HTML>
<HEAD>
<TITLE>Test de PHP</TITLE>
<BODY>
<?php
echo "<H1><center>Test de
PHP</center></H1>";
echo "Si cette page s'affiche correctement, PHP fonctionne sur votre compte.";
?>
</BODY>
</HTML>
Changez les
droits d'accès : chmod o+rx
~/web/test.php
Dans netscape tapez l'URL : http://marine.edu.ups-tlse.fr/~login/test.php
Ecrivez
une page HTML php1.html contenant le formulaire suivant :
Ecrivez
un programme PHP qui récupère les différents paramètres, calcule l'âge, vérifie
qu'il est raisonnable (compris entre 1 et 120) et affiche une page de ce
type :
Si l'âge est correct |
Si l'âge n'est pas correct |
Bonjour Pierre Dupond. Vous êtes né en 1979. Nous sommes en 2000. Vous avez donc environ 21
ans. La page a été visitée 10 fois depuis sa création. |
Bonjour Pierre Dupond. Vous êtes né en 2000. Nous sommes en 2000. Votre âge : 0 ne me
semble pas très correct. La page a été visitée 11 fois depuis sa création. |
Pour
programmer cette page PHP on utilisera les fonction de gestion des fichiers
pour gérer le nombre de visite et la fonction date qui permet d'obtenir
la date courante.
Exemple
:
$annee
= date("Y"); /* renvoie simplement l'année actuelle*/
$date_complete
= date("d/m/Y"); /* renvoie une chaîne de caractère de ce type :
7/12/2000 */
Le but de cet ensemble de programmes PHP est de gérer un carnet d'adresse
(qui sera sauvegardé dans une base de donnée MySQL).
La première page (en HTML) a écrire permettra de choisir entre :
-
l'ajout d'une
entrée dans le carnet
-
la recherche dans
le carnet
-
l'affichage de tout
le carnet
Un couple de pages (une en HTML l'autre en PHP) permettra l'ajout d'une
entrée au carnet :
|
L'entrée : Nom : Dupond Prénom : Jean Adresse : 118 route de Narbonne Code postal et ville : 31062 Toulouse Tél : 05 61 55 66 11 A été ajoutée au carnet d'adresse. Retourner au sommaire du carnet |
Page d'ajout 1 |
Page d'ajout 2 |
Un couple de pages (une en HTML l'autre en PHP) permettra la recherche
d'une entrée en tapant un nom :
|
Entrée trouvée : Nom : Dupond Prénom : Jean Adresse : 118 route de Narbonne Code postal et ville : 31062 Toulouse Tél : 05 61 55 66 11 Retourner au sommaire du carnet |
Page d'ajout 1 |
Page d'ajout 2 |
La dernière page (en PHP) permettra l'affichage complet du carnet.
Javascript
(P. Torguet – UPS)
17 Novembre 2003 – v. 1.00
Le langage JavaScript a été créé par la société Netscape pour la version 2.0 de son navigateur Web. Comme PHP il s’agit d’un langage qui permet de créer des programmes embarqués dans des pages Web mais à l’inverse de PHP les programmes sont ici en général exécutés par le navigateur.
On utilise beaucoup JavaScript pour créer des pages dynamiques comportant des menus, des fenêtres filles (les fameux pop-ups tant décriés), des permutations d’images lorsque le pointeur de la souris passe au dessus (on appelle cela des « roll-over ») et pour vérifier des formulaires avant leur émission.
Il existe de nombreuses versions de JavaScript (appelé également JScript par Microsfot) qui ne sont malheureusement pas compatibles entre elles. Il conviendra donc pour une utilisation professionnelle de tester les pages avec plusieurs navigateurs comme Netscape 4, Mozilla et Internet Explorer par exemple.
Le langage a néanmoins été standardisé en 1997 par l'European Computer Manufacturers Association (ECMA) sous le nom d’ECMAScript (ECMA-262). Cette version correspond à la version 1.4 de JavaScript et à la version 4.0 de Jscript.
Pour intégrer du
JavaScript dans du code HTML il faut utiliser la balise SCRIPT
:
<SCRIPT language=JavaScript>
< !--
code JavaScript...
-->
</SCRIPT>
Le code compris entre <SCRIPT> et </SCRIPT> n'est pas affiché,
il est interprété par le navigateur. Comme il existe encore des navigateurs qui
ignorent les scripts, il est recommandé de mettre le contenu du script sous
forme de commentaire HTML :
<SCRIPT language=JavaScript>
<!--
code JavaScript
//-->
</SCRIPT>
Ainsi le script sera simplement ignoré au lieu de placer n’importe quoi sur la page.
Le code se met sous la forme :
javascript:code
Exemple : pour exécuter du code JavaScript il est possible d'utiliser :
<A href="JavaScript:code">texte</A>
Quand on clique sur le texte le code s'exécute (le plus souvent c'est un appel de fonction).
NB : dans href
,
si on écrit "JavaScript:void(0)"
cela empêche le navigateur de faire un chargement quand on clique sur le lien.
On peut insérer du code JavaScript pour indiquer les actions
à effectuer en réaction à un événement provoqué par l'utilisateur (souvent ce
code inséré se contente d'appeler une fonction déclarée plus haut dans le
document au sein d'un élément SCRIPT
).
Pour réagir à un événement provoqué par le client :
<BALISE onEvenement="code">
Attributs
d'événements existants |
||
nom |
événement |
s'applique à |
onAbort |
interruption de chargement |
image |
onBlur |
perte du focus |
champs de saisie des
formulaires ou à une fenêtre |
onFocus |
attribution du focus |
|
onClick |
clic sur un objet |
button, checkbox,
radio, reset, submit, lien |
onChange |
changement de champ de saisie |
fileupload, password, select, text, textarea |
onDblClick |
double clic |
lien, image,
bouton(JS1.2) |
onError |
erreur JS ou de chargement d'une image |
image, fenêtre |
onKeyDown |
touche enfoncée |
document, image, lien,
text |
onKeyPress |
l'utilisateur a appuyé sur une touche |
|
onKeyUp |
touche relâchée |
|
onLoad |
chargement |
image, window |
onMouseDown |
un bouton de la souris est enfoncé |
document, lien, image,
button |
onMouseUp |
le bouton de la souris est relâché |
|
onMouseMove |
déplacement de la souris |
|
onMouseOut |
la souris vient de quitter une zone |
lien, image, layer |
onMouseOver |
la souris entre sur une zone |
|
onReset |
annulation des données saisies |
formulaire ; retourne false
pour annuler, ex : |
onSubmit |
soumission du formulaire |
|
onSelect |
sélection d'un champ de texte |
champs de saisie |
onUnload |
déchargement d'un document |
image, fenêtre |
Les types de données standards en JavaScript sont :
v number (entiers et réels représentés par des valeurs à virgule flottante avec éventuellement une partie exposant : 3.4e12)
v string (chaînes de caractères)
v boolean (booléens – valeurs true ou false)
v Array (tableaux)
v object (objets cf. la programmation par objet)
La déclaration des variables n’est pas obligatoire (bien que fortement conseillée).
Elle est réalisée de la façon suivante :
var i = 10 ;
var j = 3.4e12;
var s = "chaine";
Quelques exemples valent souvent mieux qu’un long discours...
v a + b Addition Somme de a et b.
v a - b Soustraction Reste de la différence de b et a.
v a * b Multiplication Produit de a par b.
v a / b Division Dividende de a par b.
v a % b Modulo Reste de la division entière de a par b.
Il n’existe qu’un seul opérateur sur les chaînes, c’est
l’opérateur de concaténation “+”.
a = "Hello ";
b = a + "World!"; // b contient
"Hello World!"
Il est à noter que vous pouvez spécifier une chaîne en l’encadrant entre des simples ou des doubles quotes (guillemets simples ou doubles).
Il s’agit des opérateurs binaires dits “bit à bit”, et non pas des opérateurs logiques booléens.
v a & b Et Les bits qui sont à 1 dans a ET dans b sont mis à 1.
v a | b Ou Les bits qui sont à 1 dans a OU dans b sont mis à 1.
v ~ a Non Les bits sont inversés.
v ! a Non Résultat vrai si a est faux, et réciproquement
v a && b Et Résultat vrai si a ET b sont vrais
v a || b Ou Résultat vrai si a OU b est vrai (ou les deux)
Encore du classique. Sans surprise pour les habitués de la syntaxe C.
v a == b Egal Résultat vrai si a est égal à b
v a != b Différent Résultat vrai si a est différent de b
v a < b Inférieur Résultat vrai si a est strictement inférieur à b
v a > b Supérieur Résultat vrai si a est strictement supérieur à b
v a <= b Inf ou égal Résultat vrai si a est inférieur ou égal à b
v a >= b Sup ou égal Résultat vrai si a est supérieur ou égal à b
Les structures de contrôle if, If…else, ainsi que les instructions de boucle do…while, for, break, continue et switch sont disponibles en JavaScript et sont identiques au C (ici aussi il ne faut pas oublier les break lors des switch !).
Exemple de for :
for(i=0 ; i<5; i++)
{
document.writeln(i);
}
En JavaScript on peut définir des fonctions un peu comme en
C mais on ne précisera pas le type des arguments ou de la valeur retournée. Les
passages de paramètres se font par valeur (les modifications réalisées dans la
fonction ne sont pas effective en dehors de celle-ci sauf pour les objets et
les tableaux – cf. plus loin)
function nom_fonction(arg1,...,argN){
instruction1;
...
instructionM;
return val; // optionnel
}
Appel :
variable = nom_fonction(arg1, ..., argN);
Le langage JavaScript est un langage orienté objet. Ce concept sera présenté en détail plus tard dans votre cursus. Néanmoins nous le présenterons ici très simplement.
Les objets peuvent être vus simplement comme une collection de variables (appelées ici attributs ou propriétés) et de fonctions (appelées ici méthodes) liés entre eux par un nom qui s’utilise comme une variable et qu’on appelle une référence.
Pour bien comprendre le concept, prenons un exemple : la fenêtre du navigateur qui exécute le script. Cet objet informatique est défini par une variable référence nommée window.
Pour accéder aux propriétés de cet objet on écrira (ici pour
connaître la hauteur de la fenêtre) :
hauteur = window.innerHeight;
De même pour utiliser une méthode de l’objet on écrira (ici pour redimensionner la fenêtre ) :
window.resizeTo(500, 500);
On peut aussi affecter des valeurs aux propriétés (ainsi pour redimensionner la fenêtre on peut aussi écrire) :
window.innerHeight = 500;
window.innerWidth = 500;
Enfin, on peut créer de nouveaux objets en utilisant le mot clé new. Par exemple pour créer une image on écrira :
var mon_image = new Image();
Image() est une méthode un peu particulière qu’on appelle un constructeur. Les constructeurs peuvent avoir des paramètres. Enfin, il peut y avoir plusieurs paramètres pour un même type d’objet.
Pour éviter de réécrire le nom d’un objet on peut utiliser le mot clé with. Exemple :
with (window) {
innerHeight = 500;
innerWidth = 500;
}
Les tableaux en JavaScript sont en fait des objets un peu particuliers.
On peut les créer de deux façons différentes :
En utilisant les constructeurs Array :
var mon_tableau = new Array();
var mon_tableau = new Array(taille);
var mon_tableau = new Array(el1, el2, ..., elN);
En utilisant une construction spécifique (depuis JavaScript 1.2) :
var mon_tableau = [el1, el2, ..., elN]
Un tableau peut comme en PHP contenir des éléments de types différents :
var tab = new Array(3, 'chaine', 4.5);
var tab = [3, 'chaine', 4.5];
mon_tableau.length -> taille du tableau
i = tab.length;
mon_tableau[0]
mon_tableau[1]
...
mon_tableau[N-1]
NB : pour le parcours du tableau on peut utiliser une boucle for un peu spéciale :
for (i in
mon_tableau) {
document.writeln(mon_tableau[i]);
}
join(separateur) |
concatène les cases du tableau avec le separateur
(JavaScript 1.1, ECMA) |
pop() |
dépile et retourne le dernier élément du tableau
(Navigator 4) |
push(val,...) |
ajoute des éléments au tableau (Navigator 4) |
reverse() |
renverse le tableau (JavaScript 1.1, ECMA) |
shift() |
supprime et retourne le 1er élément (Navigator 4) |
slice(deb, fin) |
retourne une portion du tableau (JavaScript 1.2) |
sort() |
tri des éléments (JavaScript 1.1, ECMA) |
splice(deb, nbel, val, ...) |
retire des éléments du tableau (Navigator 4) |
toString() |
conversion du tableau en chaîne (JavaScript 1.1, ECMA) |
unshift(val,...) |
insère des éléments (Navigator 4) |
L’interaction avec le navigateur passe par l’objet window et ses sous-objets. Il existe un objet window pour chaque zone du navigateur (fenêtre ou frame).
closed |
pour savoir si la fenêtre a été fermée ou non |
defaultStatus |
texte à afficher par défaut dans la barre d'état en bas |
document |
accès à toutes les informations de la zone |
frames[] |
tableau d'objets pour les frames de la zone |
window.frames.length |
|
history |
pour naviguer |
length |
nombre de cadres dans la fenêtre |
location |
informations sur l'URL de la zone |
name |
nom de la zone |
navigator |
informations sur le navigateur utilisé |
opener |
fenêtre à partir de laquelle a été créée la zone |
parent |
document contenant <FRAME> associé au frame |
screen |
propriétés de l’écran qui affiche le navigateur |
status |
texte à afficher dans la barre d'état |
Note : on peut utiliser directement document au lieu de window.document.
Exemple :
document.writeln("Hello
World !") ;
Propriétés de
window.document |
|
bgColor |
couleur de fond |
fgColor |
couleur du texte par défaut |
alinkColor |
couleur des liens activés |
linkColor |
couleur des liens non visités |
vlinkColor |
couleur des liens visités |
anchors[num] |
cible d'un lien hypertexte |
window.document.anchors.length = nombre d'ancres |
|
cookie |
cookies du document |
forms[num] |
formulaires du document |
images[num] |
images du document |
links[] |
tableau pour les liens du document |
window.document.links.length |
|
lastModified |
date de modification du document |
title |
titre du document |
URL |
URL du document |
Méthodes de document
Propriétés de history
Méthodes de history
Exemples :
<INPUT type="button" value="back" onClick="window.history.back()">
<INPUT type="button" value="back2" onClick="window.history.go(-2)">
<INPUT type="button" value="forward" onClick="window.history.forward()">
Propriétés de location
<INPUT type="button" value="recharger" onClick="window.location.reload()">
<INPUT type="button" value="remplacer" onClick="window.location.replace('../Navigator.html')">
propriétés
de l'objet Screen |
||
height |
hauteur de l'écran en pixels |
|
width |
largeur de l'écran en pixels |
|
availHeight |
hauteur moins les barres de menu ou de tâches |
|
availWidth |
largeur disponible |
|
colorDepth |
nombre de bits pour coder un pixel dans le navigateur |
propriétés
de l'objet Navigator |
|
appName |
nom d'application du navigateur (Netscape, Internet
Explorer) |
appVersion |
plate-forme et version du navigateur (4.5 [fr] (Macintosh;
I; PPC)) |
language |
langage du navigateur (fr, en) sous Navigator 4 |
platform |
système d'exploitation (MacPPC) |
Pour accèder au nom d'application du navigateur il suffit donc d'écrire : navigator.appName
.
open(arguments) |
ouvrir une nouvelle fenêtre |
close() |
fermer une fenêtre |
alert(texte) |
ouvre une fenêtre d'alerte contenant le texte |
prompt(txt,
val) |
ouvre une fenêtre avec un message txt et un champ de texte
contenant au départ la valeur val, retourne le texte tapé par l’utilisateur à
la place de val |
confirm(texte) |
fenêtre de confirmation qui retourne un booléen |
back() |
bouton
back du navigateur |
find() |
recherche dans le document |
forward() |
bouton forward
du navigateur |
home() |
bouton accueil du navigateur |
stop() |
bouton stop du navigateur |
moveBy(x,y) |
déplace la fenêtre (zone, couche) de x pixels horizontaux
et y verticaux |
moveTo(x,y) |
déplace le coin gauche en (x,y) |
resizeBy(l,h) |
pour retrécir ou agrandir la fenêtre |
resizeTo(l,h) |
largeur et hauteur de la fenêtre à agrandir ou réduire |
scrollBy(x,y) |
déplacement horizontal et vertical du document dans la
fenêtre (ascenseurs) |
scrollTo(x,y) |
déplacement du coin x,y du document en haut de la fenêtre |
La méthode open(URL, nom, options) prend comme paramètres :
· URL : URL du document à afficher dans la fenêtre (optionnel)
· nom : nom de la fenêtre (target pour les autres documents HTML)
· option :
o height : hauteur initiale
o width : largeur initiale
o left : distance bord gauche fenêtre - bord gauche écran
o location = yes / no : barre de localisation
o menubar = yes / no : barre de menus
o resizable = yes / no : autorisation de redimensionnement
o scrollbars = yes / no : barres de défilement
o
status
= yes / no : barre de statut
o
toolbars
= yes / no : barre d'outils
Pour plus d’informations vous pouvez consulter la page suivante :
http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/
Les éléments de formulaire concernés sont :
INPUT type="text"
)TEXTAREA
)INPUT
type="password"
)INPUT
type="file"
)INPUT type="hidden"
)window.document.nom_formulaire.nom_champ.value
window.document.nom_formulaire.nom_champ.value
= texte;
NB : le champ contiendra le texte affecté à l'élément, ce texte remplacera celui qui était affiché.
Lorsqu'on définit les éléments de formulaires textuels il
est possible de donner un texte par défaut qui s'affiche lorsque le formulaire
est chargé (par exemple un nombre de personnes à 4
ou une adresse à n'oubliez pas de donner l'étage
).
Pour obtenir dans un script le texte qui est affiché au chargement, il
suffit d'écrire :
window.document.nom_formulaire.nom_champ.defaultValue
Les éléments de formulaire concernés sont :
INPUT type="checkbox"
)INPUT type="radio"
)window.document.nom_formulaire.nom_champ[num_case].checked
(retourne une valeur true/false)
window.document.nom_formulaire.nom_champ[num_case].value
(retourne le nom donné à la boîte)
window.document.nom_formulaire.nom_champ[num_case].checked
= true/false
window.document.nom_formulaire.nom_champ[num_case].defaultChecked
L'élément de formulaire concerné est SELECT
window.document.nom_formulaire.nom_champ.options[num_case].selected
(retourne une valeur true/false)
window.document.nom_formulaire.nom_champ.options[num_case].value
(retourne le nom donné au choix)
window.document.nom_formulaire.nom_champ.length
(retourne le nombre de choix possibles dans la liste)
window.document.nom_formulaire.nom_champ.options[num_case].text
(retourne le texte HTML associé)
NB : pour les listes à choix unique il est possible d'obtenir directement
quel est le choix sélectionné avec :
window.document.nom_formulaire.nom_champ.selectedIndex
window.document.nom_formulaire.nom_champ.options[num_case].selected
= true/false
Dans l'exemple ci-dessous nous supposons qu'on peut choisir plusieurs plats (attribut multiple dans SELECT)
Les éléments de formulaire concernés sont :
INPUT type="submit"
)INPUT
type="image"
)INPUT type="reset"
)INPUT type="button"
)window.document.nom_formulaire.nom_boutton.value
Lorsque le client clique
dans le formulaire, modifie des champs, coche des boutons radio..., il est
possible d'exécuter du code JavaScript. Ce code sert généralement à :
Les événements se placent dans l'élément de formulaire comme des attributs, ils sont de la forme nom_evenement = "code JavaScript", le code JavaScript étant la plupart du temps un appel à une fonction JavaScript définie plus haut dans la page.
ex :
<INPUT type="button"
value="Informations" name="binfo"
onClick="Info()">
Les évènements suivants sont utiles :
· onClick (clic sur un élément). Balises concernées :
o
cases à cocher (INPUT
type="checkbox"
)
o
boutons radio (INPUT
type="radio"
)
o
boutons de soumission (INPUT type="submit"
) (on devra utiliser
une instruction JavaScript return pour indiquer si la soumission doit être
réalisée)
o
boutons de soumission avec image (INPUT type="image"
)
o
boutons d'annulation (INPUT type="reset"
)
o
boutons simples (INPUT
type="button"
)
· onChange (modification dans l'élément). Balises concernées :
o
boîtes de saisie de texte (INPUT type="text"
)
o
saisie de textes sur plusieurs lignes (TEXTAREA
)
o
boîtes de saisie masquées (INPUT type="password"
)
o
boîtes de soumission de fichier (INPUT type="file"
)
o
listes (SELECT
)
· onFocus, onBlur (attribution, perte du focus). Balises concernées :
o
boîtes de saisie de texte (INPUT type="text"
)
o
saisie de textes sur plusieurs lignes (TEXTAREA
)
o
boîtes de saisie masquées (INPUT type="password"
)
o
boîtes de soumission de fichier (INPUT type="file"
)
o
listes (SELECT
)
· onSelect (sélection dans un champ). Balises concernées :
o
boîtes de saisie de texte (INPUT type="text"
)
o
saisie de textes sur plusieurs lignes (TEXTAREA
)
o
boîtes de saisie masquées (INPUT type="password"
)
o
boîtes de soumission de fichier (INPUT type="file"
)
Lorsque le formulaire est soumis en appuyant sur le bouton de soumission il est possible d'appeler un événement onSubmit (pour vérifier par exemple la validité des données avant d'envoyer le formulaire ou pour demander la confirmation de la soumission). Le script devra renvoyer soit true soit false (avec une instruction JavaScript return) pour indiquer si on doit soumettre ou non le formulaire.
L'événement reset est appelé lorsqu'on a cliqué sur le bouton annuler.
nom |
rôle |
blur() |
enlève le focus d'un champ du formulaire |
click() |
simule un clic de souris sur le champ du formulaire |
focus() |
attribue le focus à un champ du formulaire |
select() |
sélectionne le contenu d'un champ du formulaire |
Exemple :
window.document.nom_form.nom_champ.focus()
Il existe également les méthodes submit() et reset() sur le formulaire.
<form name=commande action="traitement.php"
method="post" onSubmit=”return Verif();”>
Nom : <input type="text"
name="nom"><br>
Email : <input type="text"
name="email"><br>
Vin choisi :
<br>
<input type=radio name="vin"
value="medoc">Médoc<br>
<input type=radio name="vin"
value="madiran">Madiran<br>
<input type=radio name="vin"
value="chablis">Chablis<br>
<input type=radio name="vin"
value="riesling">Riesling<br>
Quantité :
<input type=text
name="quantite" onFocus="window.status='Entrez
le nombre de caisses'">
<br>
<input type="submit"
onClick="return Confirmer()">
</form>
Voici les fonctions JavaScript qu’on peut placer par exemple dans l’entête du document :
<SCRIPT
language="JavaScript">
<!--
// fonction qui
vérifie si « chaine » est une chaîne composée de chiffres
// elle affiche le
message d’erreur « message_d_erreur » dans le cas contraire
function
VerifNb(chaine, message_d_erreur)
{
var chiffre = true;
// si la chaîne est vide elle n’est pas
correcte
// les chaînes comme les tableaux ont la
propriété length
if (chaine.length == 0) {
window.alert(message_d_erreur);
return false;
}
// si on trouve un caractère non compris
entre 0 et 9 c’est incorrect
for(i=0 ; i < chaine.length; i++)
// la méthode charAt permet de récupérer
le I-ème caractère
if(chaine.charAt(i)<'0'||chaine.charAt(i)>'9')
{
chiffre=false;
}
if(!chiffre)
{
window.alert(message_d_erreur);
return false;
}
else {
return
true;
}
}
// fonction qui
vérifie le formulaire
function Verif()
{
with(window.document.commande) // pour
éviter de répéter le nom du formulaire
{
// on vérifie que le nom et l’adresse
e-mail ont été saisis
if(nom.value.length == 0)
{
alert("veuillez entrer votre
nom");
return false;
}
if(email.value.length == 0)
{
alert("veuillez entrer une adresse
email");
return false;
}
// on regarde si un vin a été choisi
var choix = false;
for(i=0;
i<vin.length; i++) {
if(vin[i].checked) choix = true;
}
if(!choix) {
alert("veuillez choisir un
vin");
return false;
}
// on vérifie la quantité avec la fonction
ci-dessus
if(!VerifNb(quantite.value, "veuillez
écrire le nombre de caisses en chiffres"))
{
// si ce n’est pas bon on sélectionne
le contenu du champ quantité
// pour que l’utilisateur n’est plus
qu’a corriger
quantite.focus();
quantite.select();
return false;
}
}
// si on renvoie true le formulaire sera
soumis
return true;
}
// fonction qui
demande à l’utilisateur s’il veut vraiment soumettre le form
function Confirmer()
{
return window.confirm("Voulez-vous
vraiment soumettre ?");
}
//-->
</SCRIPT>
v http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/
v http://magali.contensin.free.fr/html/InternetLicPro.html (cours sur le web dont est tiré celui-ci)
v http://www.editeurjavascript.com/cours/index.php
Modifiez le carnet d’adresse de façon à vous assurer que les
entrées ajoutées sont correctes.