Vous êtes sur la page 1sur 42

support de cours

Web Dynamique Web Mapping

cours n3 Web dynamique Gnrer une page web en PHP

Emmanuel Fritsch octobre 2008

Web Dynamique v1.1

1/42

1 Introduction 1.1 Objectif


Le document La page web sur le poste client nous a appris crire des pages HTML. Nous savons que le code HTML peut tre dcrit sous forme dobjets, quon peut lui associer des styles au moyen des feuilles de style et que les objets du code HTML peuvent tre manipuls au moyen de javascript. Les pages HTML ainsi dcrites sont purement locales. Pour atteindre les capacits du web dynamique, nous devons maintenant grer linteraction entre le poste client et le serveur. Nous allons tudier PHP, un langage qui permet dcrire du code HTML. Le programme en PHP tourne sur le serveur Lobjectif de ce cours est de vous donner les bases vous permettant de comprendre et de pratiquer la programmation dun site web dynamique simple.

1.2 prrequis
Pour faire une page dynamique, il faut mettre en uvre des notions de programmation informatique. Lutilisation du prsent cours nest possible que si vous possdez dj ces bases de programmation. Vous devez au minimum savoir ce quest une variable, une fonction, et tre capable de programmer une procdure comportant une boucle. Pour aller plus loin, vous devrez avoir des notions dorient objet. PHP est un langage de programmation procdurale classique, trs proche de C ou de Java. Si vous ntes pas familier avec C ou Java, vous vous reporterez lun des nombreux tutoriaux sur PHP que lon trouve sur internet.

1.3 Mthode
Une des difficults du web dynamique rside dans la multiplicit des langages quil impose daborder. Outre les langages HTML, CSS et javascript, utiliss sur le post client, vous devez maintenant aborder PHP et SQL. PHP, en particulier, prsente une syntaxe trs proche de celle de Javascript. Mais ces deux langages ne servent pas du tout faire la mme chose, ainsi que nous lavons vu dans le document Introduction au fonctionnement du web .

Pour tirer le meilleur profit de ce cours, il est souhaitable que vous excutiez les exemples et que vous ralisiez les exercices
Comme HTML et Javascript, PHP et SQL sont des technologies trs utilises, par des communauts ayant un sens fort du partage. Vous trouverez un grand nombre de ressources, tutoriel, et documentation techniques sur internet.

Face une difficult, nhsitez pas utuiliser votre moteur de recherche sur internet. Au fil de vos recherches, slectionner vos deux ou trois sites favoris sur lesquels vous irez chercher vos renseignements en priorit.

Web Dynamique v1.1

2/42

1.4 Matriel
Pour tester les exemples du cours et faire les exercices, vous devez les faire tourner sur un serveur web muni de PHP et MySQL. Vous pouvez utiliser pour cela des services dun FAI comme free et freesurf, mais le plus simple est dinstaller un serveur local, sur votre machine. Dans ce cas, le plus simple est dutiliser easyPHP. Tous les exercices du cours sont conus pour fonctionner sur un serveur local. Vous aurez besoin aussi dun diteur de texte et dun navigateur pour tester les exemples.

Web Dynamique v1.1

3/42

2 Premiers pas en PHP


Avant de voir comment on va utiliser PHP pour produire des pages HTML dynamiques, nous allons dcrire rapidement les bases du langage.

2.1 Laffichage en PHP


PHP est un langage de script ct serveur, qui sert essentiellement produire du code HTML.
Nous avons vu dans lintroduction au web que PHP produit du code HTML au moyen de linstruction echo. Voici le fonctionnement dune page PHP lmentaire : Requte HTTP
www.bidule.fr/truc.php

1 4 5
Bonjour Agathe. Et bonne dcouverte de PHP !

2
Fichier PHP

Affichage lcran

PHP

3
Fichier HTML

figure 1 de droite gauche, du fichier sur le serveur jusqu laffichage chez le client, transformation dune page dynamique.

La variable $nom ne sert pas grand-chose, car sa valeur ne peut pas tre modifie pour le moment. PHP naura de lintrt que si nous sommes capables dintgrer dans notre programme des valeurs qui viennent de lextrieur. De fait, PHP permet dintgrer des informations issues : - dun formulaire, rempli par lutilisateur - dune base de donnes - dautres sources de donnes (cookie envoy par le navigateur, variables de session, fichier sur le serveur, connexion internet, heures du systme, etc.) Dans ce cours , nous allons examiner successivement comment on manipule : - les informations mises depuis un formulaire - les interactions avec une base de donnes. - les donnes rcupres avec un cookie ou au moyen dune session Web Dynamique v1.1 4/42

Mais dans un premier temps, nous allons passer en revue les bases du langage PHP. Dans le schma prcdent, nous avons reprsent un navigateur envoyant une requte vers un serveur distant : la distance entre les deux est reprsente par la ligne en tirets verticale. Dans le cadre de ce cours, nous vous conseillons dutiliser un serveur local. Dans ce cas, le serveur et le navigateur sont sur la mme machine, mais le fonctionnement de leur communication sera le mme : il reposera sur HTTP. Pour tester une page en PHP, il faudra la faire passer par le serveur, pour que le code PHP soit excut par le moteur PHP.

2.2 Les bases du langage


Nous allons lister ici quelques particularits de PHP : PHP dans HTML Nous avons vu dans le premier cours que le code PHP est insr dans du code HTML :
<?php $nom="Victor Hugo" ; ?> <p>Bonjour <?php echo $nom ; ?>, je suis heureux de vous voir </p>

exercice 1 : a. Si vous ne comprenez pas le code prcdent, relisez le premier cours. b. Trouvez le fichier httpd.conf : cest le fichier de configuration dApache. c. Dans ce fichier, identifiez la ligne dterminant le rpertoire racine (cf. le cours n1). d. Dans le rpertoire racine, crez votre propre rpertoire (par exemple cours3/) e. Recopiez le code dans un fichier exo1.php dans le rpertoire cours3. f. Testez ce code ladresse : http://localhost/cours3/exo1.php Les variables Toutes les variables commencent par $, et tout mot ce qui commence par $ est une variable. Substitution de variable Une chane de caractre doit tre encadre par des guillemets simples ou par des guillemets doubles. Ces guillemets ne sont pas quivalents, car les guillemets doubles permettent de faire de la substitution de variable :
$prenom = "Agathe" ; echo "Bonjour $prenom ! <br>" ; echo 'Bonjour $prenom ! <br>' ;

Le rsultat de ces instructions sera : Bonjour Agathe ! Bonjour $prenom ! Avec les guillemets doubles, la variable est remplace par sa valeur. Les oprateurs de base Les oprateurs arithmtiques sont les mmes quen C, en java et en javascript. Voir plus haut. Web Dynamique v1.1 5/42

Concatnation En PHP, le point est loprateur de concatnation de chane.


echo "Bonjour " . $prenom . "! <br>" ;

Cette instruction donne le mme rsultat quavec la substitution de variable : Bonjour Agathe ! Egalit et affectation Il ne faut pas confondre loprateur dgalit avec linstruction daffectation. Nous lavons dit pour javascript, rptons le pour PHP : - Pour affecter une valeur une variable, on utilise loprateur = - Pour tester une galit, on utilise loprateur ==
if ($prenom=="Agathe") $message="Cest un trs beau prnom" ;

Les tableaux PHP prsente plusieurs manires de dfinir un tableau :


$auteurs[0] = "Victor Hugo"; $auteurs[1] = "Jean de La Bruyre"; $auteurs[2] = "Blaise Pascal";

ou bien :
$auteurs = array( 0 => "Victor Hugo"; 1 => "Jean de La Bruyre"; 2 => "Blaise Pascal" ) ;

Si lindice nest pas prcis, la numrotation est automatique. Les deux critures suivantes sont quivalentes aux deux prcdentes :
$auteurs[] = "Victor Hugo"; $auteurs[] = "Jean de La Bruyre"; $auteurs[] = "Blaise Pascal";

ou bien :

$auteurs=array("Victor Hugo","Jean de La Bruyre","Blaise Pascal");

Tableaux associatifs Dans un tableau classique, les objets sont indexs par des entiers positifs. Un tableau associatif accepte comme indice nimporte quel type alphanumrique.
$tabFruits["la fraise"] = "rouge"; $tabFruits["la banane"] = "jaune"; $tabFruits["la courgette"] = "verte"; echo $tabFruits["la fraise"] ;

Le rsultat du code prcdent est : rouge. La substitution de variable fonctionne :


$fruit="la fraise" ; echo "jaime $fruit quand elle est bien $tabFruits[$fruit]" ;

Exercice 2 : -

en recopiant le code ci-dessus, faire le test de la substitution de variable avec des tableaux. 6/42

Web Dynamique v1.1

Attention aux conflits de guillemets :


echo "la fraise est $tabFruits["la fraise"]" ; echo "la fraise est $tabFruits['la fraise']" ;

La premire ligne provoque une erreur. Cest le conflit de guillemet. La seconde ligne ne fonctionne pas non plus. Cest d au fonctionnement interne de PHP : la lecture dune constante est interprte comme Les structures On peut construire des objets qui contiennent plusieurs valeurs :
$fruit->nom="fraise" ; $fruit->article="la" ; $fruit->couleur="rouge" ;

Et la substitution de variable ici aussi fonctionne parfaitement :


echo "$fruit->article $fruit->nom est $fruit->couleur" ;

Les boucles PHP connat les boucles classiques : - la boucle while :

$a=1 ; while ($a<1000) { echo "--

$a

" ; $a=$a*2 ;}

rsultat: -- 1 -- 2 -- 4 -- 8 -- 16 -- 32 -- 64 -- 128 -- 256 -- 512 - la boucle for : rsultat : 6x0=0 6x1=6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24


Si on ne met pas les parenthses, PHP prend les oprations dans lordre : il concatne la chaine avec $i, puis il essaye de multiplier le rsultat avec 6, ce qui dclenche une erreur. for ($i=0; $i<5 ; $i++) echo "6 x $i = " . ($i*6) . "<br>";

La boucle foreach La boucle foreach permet de parcourir un tableau, sans soccuper du compteur :
$tabFruits["la fraise"] = "rouge"; $tabFruits["la banane"] = "jaune"; $tabFruits["la courgette"] = "verte"; foreach ($tabFruits as $fruit => $couleur ) { echo "$fruit est $couleur <br> ; " }

Web Dynamique v1.1

7/42

A chaque itration de la boucle, les variables $fruit et $couleur reoivent des valeurs tires du tableau : au premier passage, les deux valeurs sont "la fraise" et "rouge". A litration suivante, "la banane" et "jaune", et finalement, "la courgette" et "verte". Ces affectations sont automatiquement effectues par la syntaxe de la boucle foreach

La boucle foreach est extrmement pratique pour parcourir les lments dun tableau. Elle est mme indispensable lorsque le tableau est associatif.
La syntaxe de cette boucle est la suivante :
foreach ($tableau as $clef => $valeur ) { instructions }

Instructions conditionnelles Simple et classique :

if (condition) { instructions si la condition est vraie } else { instructions si la condition est fausse }

On peut enchaner les conditions :


if (condition1) { instructions si condition1 est vraie } else if (condition2) { instructions si condition1 est fausse et condition2 est vraie } else { instructions si les 2 conditions sont fausses }

2.3 PHP et les formulaires HTML


Dans le cours sur HTML, nous avons vu comment construire un formulaire. Nous allons tudier maintenant la faon dont nous allons rcuprer et traiter ces informations dans un script PHP sur le serveur. Nous allons voir successivement : 1- comment le client envoie les valeurs du formulaire vers le serveur 2- comment le programme PHP rcupre ces valeurs dans des variables pour gnrer sur le serveur une page dynamique qui tienne compte de ces valeurs Web Dynamique v1.1 8/42

2.3.1 Le transfert de linformation


Reprenons le formulaire qui nous avait servi dexemple :
<form action="page2.php" method=GET > votre nom : <input type=text name="nom"> <br> votre prnom : <input type=text name="prenom"> <br> <input type=submit value="Clic !"> </form>

Lattribut action de lobjet formulaire form donne le nom de la page qui traite, sur le serveur, les informations postes par le formulaire. Les informations traites sont dfinies par les objets input, textarea et select dfinis lintrieur du formulaire.
Les informations postes par ce formulaire doivent donc tre traits par la page page2.php. Crons donc une page nomm page2.php, qui contient simplement du code HTML :
<html> <head> <title> Ma premire page </title> </head> <body> <p> Bonjour ! </p> </body> </html>

Pour le moment, avec cette page, le serveur ne peut pas traiter les informations du formulaire, puisque la page ne contient pas de code PHP. Mais nous pouvons dj vrifier que les variables sont transmises au serveur, en regardant la barre dadresse de notre navigateur. En effet, si je remplis les champs nom et prenom avec les valeurs Sepoher et Agathe , et que je clique sur le bouton submit, voici ce qui saffiche dans ma barre dadresse :
page2.php?nom=Sepoher&prenom=Agathe

Cest le navigateur qui a construit cette adresse : - page2.php est le nom de la page qui se trouve dans lattribut action du formulaire, - ? : ce point dinterrogation signale le dbut des variables transmises, - les variables sont spares par des perluettes ( &). Chaque champ du formulaire donne une variable. - nom=Sepoher : la variable nom porte la valeur Sepoher. Chaque variable est transmise sous la forme : nomDeVariable=valeurDeLaVariable. - le nom de la variable est fix par lattribut name du champ correspondant, - la valeur correspond celle entre dans le formulaire. Par dfaut, cest lattribut value de chaque champ.

Web Dynamique v1.1

9/42

Le serveur recevant cette adresse va la dcomposer pour reconstituer le nom de la page et la liste des variables. Le nom de la page permet de retrouver celle-ci et de la faire interprter par PHP. La liste des variables est transmise au programme PHP.

2.3.2 Rcupration des variables dans PHP Lorsque la page PHP est interprte par le serveur, les variables transmises par le formulaire sont accessibles dans un tableau associatif nomm $_GET
Nous utilisons maintenant le nom et le prnom envoys par le formulaire pour construire notre premire vraie page dynamique :
<html> <head> <title> Ma premire page </title> </head> <body> <p> Bonjour <?php echo $_GET["prenom"] ?>, </p> <p> vous vous appelez vraiment <?php echo $_GET["nom"] ?> ? Cest un nom trs original ! </p> </body> </html>

Requte HTTP
www.bidule.fr/page2.php?nom=Sepoher&prenom=Agathe

Fichier PHP Bonjour Agathe. Votre nom est vraiment Sepoher ?

Affichage lcran

Fichier HTML

PHP

figure 2 circulation des requtes et des variables lors de lutilisation dun formulaire

Exercice 3 : Web Dynamique v1.1 10/42

a. Utilisez la boucle foreach pour afficher le nom et la valeur de tous les champs du formulaire. Vous pouvez vous appuyer sur le code ci-dessous :
<html> <head> <title> Ma premire page </title> </head>

<body> <p> Le formulaire contient : </p> <?php // ici mettre la boucle "foreach" ?> </body> </html>

Vous trouverez facilement des lments de solutions sur internet. b. Mettez un menu droulant choix multiple dans un formulaire (voir lexercice sur les formulaires dans le cours n2). Si on slectionne plusieurs choix dans ce menu, comment la variable est-elle transmise dans ladresse vers le serveur ? Toutes les variables sont elles transmises PHP (utilisez le programme de 3.a pour rpondre) c. Chercher sur internet une mthode qui permette PHP de rcuprer toutes les valeurs du choix multiple. d. Modifiez le programme du 3.a pour visualiser la transmission de ces variables. Dans certains tutoriaux, dans certains cours sur PHP, $_GET["nom"] et $_GET["prenom"] sont remplacs par $nom et $prenom. Ce fonctionnement, extrmement rpandu, nest pas universel. Il correspond une configuration spciale de PHP, qui est de plus en plus souvent dsactiv, sous des motifs de scurit. Par surcrot, autre avantage, lutilisation du tableau $_GET exprime de manire explicite que la variable est issue dun formulaire : lcriture $_GET doit donc tre prfre aussi pour des raisons de lisibilit. Exercice 4 : Cherchez loption de configuration de PHP qui permet dutiliser directement les variables $nom et $prenom la place de $_GET["nom"] et $_GET["prenom"] (ne passez pas plus de 10 minutes sur cet exercice).

2.3.3 Mthode GET et mthode POST


Il nous reste parler de lattribut method du formulaire. Dans le protocole HTTP, il existe deux mthodes pour envoyer une requte : la mthode POST et la mthode GET. Toutes les requtes HTTP comporte dune part un entte, dautre part un corps. Lentte contient les mta-donnes de la requte, et elle doit rester de petite taille. La mthode POST contient le corps de la requte, et sa taille nest thoriquement pas limite. Dans le protocole HTTP, il existe deux types de requtes pour appeler une page web : la requte POST et la requte GET. Quelle est la diffrence entre ces deux requtes ? En gnral, les requtes HTTP comportent dune part un entte, dautre part un corps. Web Dynamique v1.1 11/42

lentte ne contient que les mta-donnes de la requte, et elle doit rester de petite taille ; le corps de la requte sert faire transiter les informations volumineuses. La taille du corps de la requte nest thoriquement pas limite.

Une requte GET, cest une requte dont le corps est vide, car toute linformation de la requte est condense dans lentte. Par exemple, lorsque vous cliquez sur un lien internet, votre navigateur utilise une requte GET. Une requte POST, cest une requte qui met des donnes dans le corps de la requte. Lorsque les valeurs saisies dans un formulaire sont de petites tailles, ce qui est le cas la plupart du temps, on a donc le choix : - soit on stocke les variables dans ladresse de la page, comme nous venons de le voir au chapitre prcdent, et dans ce cas il ny a pas besoin dun corps de requte : cest la mthode GET ; - soit on les stocke dans le corps de la requte, et on choisit pour cela la mthode POST.
Pour envoyer un mot de passe, par exemple, il vaut mieux utiliser la mthode POST. En effet, les utilisateurs naiment pas du tout voir leur mot de passe apparatre dans la barre dadresse. Ils simaginent que cest plus sr si on ne voit pas le mot de passe. Ils nont pas totalement tort.

Notez que dans HTML, le nom et la valeur de lattribut method ne sont pas sensibles la casse. On peut crire indiffremment method=GET, ou method=get, ou mme mEthoD=gEt (mme si cest affreux). Mais attention, PHP en revanche est sensible la casse et les majuscules sont obligatoires pour le tableau $_GET, ainsi que pour tous les tableaux btis sur le mme modle. Exercice 5 : a. comment sappelle le tableau associatif dans lequel PHP va stocker des variables envoyes avec la mthode POST ? (Question facile !) b. transformer page1.html et page2.php pour transfrer les champs du formulaire en mthode POST. c. Vrifier que la page fonctionne ET que le formulaire est bien pass en mthode POST d. Comment avez-vous vrifi que la requte est bien en mthode POST ?

2.4 Conclusion
Nous avons appris programmer une page simple, et rcuprer de linformation issue dun formulaire post par lutilisateur sur le poste client. Notre deuxime source dinformation pour fabriquer une page web sera la base de donnes. Mais avant dapprendre faire interagir PHP avec une base de donnes, nous allons faire le point sur ce quest une base de donnes.

Web Dynamique v1.1

12/42

3 Premiers pas en SQL


Avertissement : ceci nest pas un cours complet sur SQL ni sur les bases de donnes. Nous allons donner ici les informations qui permettent de mettre en uvre la partie SQL dun projet Web simple.

3.1 Prsentation
3.1.1 Quest-ce que SQL ?
Structured query language (SQL), ou langage structur de requtes, est un pseudo-langage informatique (de type requte) standard et normalis, destin interroger ou manipuler une base de donnes relationnelle (daprs Wikipedia, le 26 juin 2007)

SQL est un langage de requte permettant de manipuler des donnes ranges sous forme de tables selon un modle relationnel. 3.1.2 Les tables Une table permet de stocker les caractristiques dune collection dobjets. Chaque objet sera une ligne dans la table. Chaque colonne reprsentera une caractristique dont la valeur est diffrente pour chaque objet.
Voyons cela avec un exemple ; nous voulons stocker des informations sur les membres dune fdration sportive. Pour chaque membre, nous voulons stocker : le nom le prnom la date de naissance la civilit (Mr / Mme / Mlle) le club auquel il est affili Si nous rangeons nos donnes en tableau, elles vont ressembler ceci : nom Nmar Thiedgut Conda Trieur Menvussa Thimes prnom Jean Justine Anna Alain Grard Vincent civilit Mr Melle Mme Mr Mr Mr n le 12 dc. 1970 5 janv. 1996 12 juin 1946 5 avril 1962 17 fv. 1975 26 sept. 1964 club Les nageurs du Loiret Les Barboteurs de Vesoul Le Plongeon dAjaccio Les Canards du val de Seine Les Canards du val de Seine Les barboteurs de Vesoul

Vous pouvez vous dire que pour obtenir ce rsultat, il suffit dutiliser un tableur comme excel, mais lutilisation dun SGBD va apporter de nombreux avantages : - on va pouvoir contrler les donnes que lon met dans le tableau pour empcher par exemple quon se trompe de colonne, ou que la date soit incomprhensible, ou quun mme objet apparaisse avec deux noms diffrents (ce qui est le cas ici pour les Barboteurs de Vesoul).

Web Dynamique v1.1

13/42

on va pourvoir extraire facilement des morceaux de tableaux, et trouver des rponses des questions complexes (quels sont les adhrents mineurs, quel sont les clubs qui ont moins de 3 adhrents, etc.) on va pouvoir grer rapidement de gros volumes de donnes, ce que les tableurs ne savent pas faire.

Le SGBD assure donc : . la cohrence interne des donnes . lexcution de requtes complexes . la gestion rapide de gros volumes de donnes
Soignons plus prcis : - La cohrence interne est fixe par le modle auquel doivent se conformer les donnes. - Lexcution de requtes complexes est assure par les extractions, et en particulier les jointures. - La rapidit de la manipulation est assure par des index. Nous allons maintenant dtailler ces trois points.

3.2 Modle physique de donnes


Le modle physique de donnes, cest la manire dont vous allez structurer les donnes dans les tables du SGBD.
Normalement, vous devez toujours faire driver votre modle physique de donnes dun modle conceptuel de donnes que vous aurez construit au pralable.

3.2.1 Les identifiants Un identifiant est une colonne dont la valeur est unique pour chaque objet de la table. Il permet de retrouver un objet de manire univoque, donc garantie.
Votre numro de scurit sociale, votre numro de compte bancaire, votre numro de passeport, la numrotation de vos chques, sont autant didentifiants : ils servent identifier, sans quivoque possible, les objets auxquels ils sappliquent. Votre adresse postale, par contre, nest pas un identifiant : plusieurs personnes peuvent habiter la mme adresse. Le code barre dun produit est-il un identifiant ? Ce nest pas un identifiant de chaque objet, puisque tous les produits semblables ont le mme code barre. Par contre, dans un magasin, tous les objets ayant le mme code barre doivent tre du mme type : le code barre est un identifiant de la rfrence produit.

Web Dynamique v1.1

14/42

Dans la base de donnes, un identifiant nest pas obligatoirement un entier. Lavantage des identifiants en nombres entiers, cest quon peut facilement en gnrer de nouveaux, toujours diffrents, par incrmentation du prcdent.

3.2.2 Modle conceptuel de donnes


Il nest pas question de faire ici un cours sur les modles conceptuels de donnes. Limitons nous constater une chose : dans notre exemple, la civilit, le nom, le prnom et la date de naissance sont des informations qui appartiennent en propre chaque membre. Certains membres peuvent avoir la mme date de naissance ou le mme prnom, mais on est ici dans lordre de laccidentel, du fortuit, du contingent. Au contraire, le fait que deux membres aient le mme club nest pas un accident, et le nom du club nappartient pas en propre chaque membre. La bonne mthode, pour reprsenter correctement les donnes, conduit isoler dun ct tous les membres, avec les donnes qui leur sont propres, et de lautre ct les clubs, avec les donnes propres eux. Nous constituons ainsi deux classes dobjets. Entre ces deux classes, nous avons une relation, qui indique pour chaque membre le club auquel il appartient. En UML (le langage graphique ddi ce type de modlisation) nous obtenons :

1..n

appartient

Membre
civilit nom prnom date de naissance

Club
nom adresse code postal

figure 3. diagramme UML deux classes. Un lien (en UML : une association) relit les deux classes pour reprsenter la relation dappartenance dun membre un club. Du ct des membres, la relation est 1-n, car un club contient au moins un membre, et souvent beaucoup plus. Du ct des clubs, la relation est unaire , car un membre appartient un club et un seul.

Web Dynamique v1.1

15/42

3.2.3 Conversion vers le modle physique de donnes


Une classe dans mon modle conceptuel de donnes sera reprsente par une table dans mon SGBD. Nous aurons donc la table des clubs et la table des membres. Les attributs de chacune de mes classes vont apparatre sous forme de colonne dans la table correspondante. Le codage des liens est un peu plus complexe. Comme chaque membre appartient un club (et un seul), le lien peut tre cod de la manire suivante : - on place un identifiant sur la table des clubs - on ajoute un attribut "identifiant de son club" dans la table des membres. On obtient les tables suivantes : nom Nmar Thiedgut Conda Trieur Menvussa Thimes et : id 1 2 3 4 nom Les nageurs du Loiret Les barboteurs de Vesoul Le Plongeon dAjaccio Les Canards du val de Seine Adresse 16 rue de la mare 39 av Weismueller 2 pl. de la 3 rue Hamelin codePostal 45000 70000 20200 75005 prnom Jean Justine Anna Alain Grard Vincent civilit Mr Melle Mme Mr Mr Mr n le 12 dc. 1970 5 janv. 1996 12 juin 1946 5 avril 1962 17 fv. 1975 26 sept. 1964 idClub 1 2 3 4 4 2

Pour retrouver le club dun membre, on regarde la colonne idClub de la table membre, et on cherche le numro correspondant dans la colonne id de la table club. Par exemple : Quel est le nom du club auquel appartient Justine Thiedgut ? On regarde dans la table membre pour voir quelle appartient au club didentifiant 2. On regarde ensuite dans la table club pour voir que le club didentifiant 2 sappelle les barboteurs de Vesoul . Exercice 6 : a. Modifiez le modle conceptuel et le modle physique de donnes pour quon puisse signaler dans la base quun membre est prsident de son club. Pour le modle physique de donnes, il y a au moins deux possibilits : on peut faire un lien entre les deux tables. On peut aussi sen passer en considrant quun prsident doit tre obligatoirement membre du club quil prside. Traiter les deux cas. b. Quelle est la meilleure solution en terme despace occupe ? c. Quelle est la meilleure solution en terme de rapidit des requtes ? (rpondre cette question aprs avoir lu tout le chapitre SQL).
Ici, le codage des liens est simple car un membre appartient au maximum un seul club. Si on considrait quun membre peut tre adhrent plusieurs clubs en mme temps, la reprsentation du lien serait un peu plus complexe. Reportez-vous votre cours de base de donnes pour aller plus loin.

Web Dynamique v1.1

16/42

3.2.4 Cration des tables en SQL


Le langage SQL permet de crer et de modifier des tables avec les commandes CREATE TABLE et ALTER TABLE. Vous vous reporterez la documentation SQL si vous avez besoin de ces commandes, mais pour commencer, vous construirez vos tables avec une interface graphique, comme PhpMyAdmin.

3.3 Manipulation des donnes


3.3.1 Consulter les donnes : la requte SELECT..FROM Une extraction SQL est une opration de slection de certaines donnes dans un tableau.
Attention, extraire une ligne dun tableau ne signifie pas que la ligne a t retire du tableau. Une extraction, en SQL, consiste dfinir dans le tableau un sous-ensemble de donnes quon veut plus spcifiquement tudier. Ce sous-ensemble quon extrait du tableau nest pas dtruit dans le tableau. est linstruction SQL pour lextraction. Lextraction la plus simple consiste prendre le tableau en bloc :
SELECT..FROM SELECT * FROM club

Le langage SQL est assez intuitif interprter. Linstruction prcdente se lit de la manire suivante : SELECT => affiche * => la totalit des colonnes FROM => extraite de club => la table club Pour dfinir des sous-ensembles dans le tableau, nous allons apprendre restreindre lextraction certaines colonnes et certaines lignes.
Attention, le langage SQL est insensible la casse. Dans le cadre de ce cours, pour des raisons de lisibilit, nous mettons systmatiquement en majuscules la syntaxe SQL. Les noms de variable, de colonnes et de tables sont par contre sensibles la casse.

3.3.1.1 Restriction sur les colonnes (projection)


Avec la requte suivante, nous allons restreindre lextraction aux colonnes id, nom et codePostal :
SELECT id,nom,codePostal FROM club

Si une colonne porte un nom avec des caractre spciaux ou un espace, il doit tre crit entre guillemets. Ainsi, si on remplaait la colonne codePostal par une colonne code postal, la requte deviendrait :
SELECT id,nom, 'code postal' FROM club

Web Dynamique v1.1

17/42

Cette rgle sapplique aussi sur les noms de tables, et tous les noms dobjet SQL. Pour viter ces guillemets qui alourdissent la lecture du code, il est recommand dutiliser des noms de colonnes et de tables en un seul mot, sans caractre spciaux.
Extraire la totalit des colonnes est coteux en temps de calcul et en espace mmoire. Pour optimiser, il faut imprativement limiter le nombre de colonne extraite au nombre ncessaire. Si le travail de conception est men correctement, le programmeur doit savoir quelles sont les colonnes quil a rellement besoin dextraire. Lextraction de toutes les colonnes avec la syntaxe SELECT * FROM doit tre vite.

3.3.1.2 Restriction sur les lignes


Plutt que dextraire tous les objets dune table (toutes les lignes), on peut souhaiter nen extraire quune partie. Ici, nous allons extraire les colonnes id, nom et codePostal : Extraire les identifiants et les noms des membres prnomms Anna :
SELECT id,nom FROM membre WHERE prenom="Anna"

Extraire les noms et les identifiants des clubs dont le prsident cumule aussi la fonction de secrtaire
SELECT id,nom FROM club WHERE idPresident=idSecretaire

Remarquez le pige : en SQL, loprateur dgalit est reprsent par '=', alors que pour PHP et javascript, lgalit est cod par '==', et '=' est une affectation de variable. Exercice 7 (difficile) : - Extraire les noms et les ages des membres mineurs. (pour les oprations sur les dates, consultez la documentation sur internet)

3.3.1.3 Alias de colonne


Pour des raisons de commodit, de lisibilit du rsultat, nous pouvons souhaiter que dans le rsultat de la requte la colonne nait pas le mme nom que dans la table. Par exemple pour des raisons de compatibilit avec un programme anglo-saxon, nous souhaitons que la colonne codePostal codePostal sappellen zipCode dans le rsultat. Nous allons utiliser un alias :
SELECT id, nom, codePostal AS zipCode FROM club

Exercice 8 : Corrig :

on veut que nom et prenom sappellent sappellent firstName, lastName dans le rsultat. Ecrire la requte SQL.

SELECT id,nom AS lastName,prenom AS firstName FROM membre

3.3.2 Produit cartsien


Web Dynamique v1.1 18/42

SELECT * FROM club, membres

Cette requte renvoie tous les couples (club,membre) quil est possible de construire : avec 10 membres et 4 clubs, nous aurons donc 40 paires (club,membre) possibles. Ce type de requte est trs peu utile : quoi cela sert-il de construire toutes les combinaisons (club,membre), y compris les combinaisons o le membre na aucun lien avec le club ? Ce qui nous intresse par contre, cest dextraire de lensemble de toutes les paires possible (membre,club), celles pour lesquelles le membre a une relation spciale avec le club. Par exemple : extraire tous les membres avec le nom du club auxquels ils appartiennent. Ou bien extraire tous les clubs avec le nom de leur prsident. Lopration qui permet dextraire ces informations prsentes sur deux tables sappelle la jointure. Pour plus dinformation sur les jointures, cherchez la documentation sur internet. Exercice 9 a. crire la jointure qui permet de trouver tous les membres, avec le nom de leur club b. crire la jointure qui permet de trouver tous les clubs, avec le nom de leur prsident (cherchez sur internet ce que signifie jointure gauche , et utilisez cette technique pour rpondre la question) c. (difficile) normalement, le prsident dun club doit tre membre de ce club. Ecrire la requte SQL qui trouve les noms et identifiants des prsidents inscrits comme membres dun autre club que celui quils prsident. (jointure de trois tables, mais sans auto-jointure) solution de la question c :
SELECT id, membre.nom FROM membre, club as clubM, club as clubP WHERE membre.idClub = clubM.id AND membre.id = clubP.idPresident AND clubM.id <> clubP.id

3.3.3 Insertion, suppression et mise jour


Les instructions dinsertion, de suppression et de mise jour sont respectivement :
INSERT INTO club(nom, codePostal) VALUES ('Les barboteurs de Vesoul',70700) DELETE FROM club WHERE id=1 UPDATE club nom='Les barboteurs de Vesoul' WHERE id=2

Vous vous reporterez la documentation lorsque vous en aurez besoin.

Web Dynamique v1.1

19/42

3.4 Les index


3.4.1 La recherche squentiel
Pour grer rapidement les objets dans une base, il faut pouvoir les retrouver trs vite. Si je cherche retrouver un objet dans un tableur, par exemple si je cherche la date de naissance de Grard Menvussa, je suis oblig de lire chaque ligne, pour regarder si elle correspond la personne que je cherche, pour lire dans la bonne case la date de naissance qui lui correspond. En moyenne, je vais lire environ la moiti du tableau pour chaque requte. Si jai un grand nombre denregistrements, ca peut durer longtemps. Pour faire comprendre avec une image, cest comme si, lorsque je cherche une dfinition dans le dictionnaire, je commenais par le premier mot sur la premire page, puis que je passais au deuxime mot, puis aprs avoir contrl tous les mots de la premire page, je passais la seconde page, puis la troisime, etc. Ceci nest vraiment pas la bonne mthode pour trouver une dfinition. Ce nest pas non plus la bonne mthode pour explorer un gros volume de donnes.

La recherche squentielle nest pas la bonne mthode pour explorer un gros volume de donnes 3.4.2 La recherche indexe
Pour trouver un mot dans le dictionnaire, la bonne mthode consiste couper au milieu, dcider, en fonction de lordre alphabtique, si le mot est gauche ou droite, prendre le ct o lon sait que se trouve ce mot que lon cherche, et recommencer lopration sur cette moiti de dictionnaire. Avec cette mthode, que lon appelle dichotomique, chaque fois que nous lisons un mot, nous supprimons de la recherche la moiti des mots qui restent. Compare la mthode prcdente, notre mthode dichotomique va trs trs vite. Dans une base de donnes, un index est un mcanisme qui permet de faire des recherches rapidement, en imitant la faon dont nous cherchons dans un dictionnaire : couper en deux les donnes, et dterminer de quel ct se trouve les objets que lon cherche. Il nest pas question de dcrire ici le mcanisme des index. De toute faon, lutilisateur dune base de donnes na pas besoin de le connatre. Retenons simplement le principal :

Un index est un mcanisme qui permet dacclrer les recherches dans les bases de donnes. 3.4.3 Index et identifiant : les clefs
Dans une table, on indexe les identifiants en premier lieu, puisque ce sont les informations spcifiquement destines identifier les objets. Mais dautres colonnes peuvent recevoir des index. Par exemple, dans le cas du dictionnaire, chaque mot du dictionnaire nest pas un identifiant, puisque deux mots diffrents peuvent avoir exactement la mme orthographe. De mme, dans Web Dynamique v1.1 20/42

la table des membres, certains membres peuvent avoir le mme nom. Si on demande retrouver tous les gens qui portent ce nom, on en trouvera plusieurs. Par contre, lorsquon cre un identifiant sur un objet, cest prcisment pour retrouver facilement cet objet. Si on cre un identifiant, on doit gnralement lui donner un index. Dans ce cas, notre index sappelle une clef.

Dans un SGBD, on appelle clef un index portant sur un identifiant


Avec SQL, lorsquon a besoin de plusieurs clefs sur une table, il y en a une qui joue un rle particulier, et quon appelle la clef primaire. La clef primaire, cest celle qui donne lordre naturel des donnes. Il y a une seule clef primaire par table, mais on peut mettre ensuite autant de clefs et dindex que lon veut.

3.4.4 O dois-je crer un index ? Il faut mettre des clefs et des index sur les donnes qui en ont besoin, c'est-dire sur les colonnes de mes tables que jutilise souvent dans les clauses WHERE de mes requtes.

3.5 Pour aller plus loin


Ce que nous avons vu jusquici est largement suffisant pour dbuter avec SQL dans un projet web, mais si vous voulez utiliser pleinement la puissance de SQL, vous devez matriser les concepts suivants : - Lautojointure - Les jointures externes, gauche et droite (requtes qui permettent par exemple dextraire tous les clubs avec leur prsident, y compris les clubs qui nont pas de prsident). - Le regroupement de lignes (la syntaxe SELECT GROUP BY permettant de rpondre aux questions du type : trouver, pour chaque club, le nom du membre le plus jeune). - La gestion des droits - Les Schma et les Vues (sous Oracle ou PostGreSQL) - La programmation en PL(sous Oracle ou PostGreSQL) - Les contraintes, les relations et les trigger Pour aller plus loin, je vous conseille les liens suivants : Un point dentre thorique sur SQL : http://fr.wikipedia.org/wiki/SQL Une ressource trs large : http://sql.developpez.com/ - Le SQL de A Z pour une vue complte du langage SQL - Les petits papiers pour toute une srie de trucs techniques trs puissants Sur les jointures, dcouvrez la syntaxe SQL 2.0 recommande : http://sql.developpez.com/sqlaz/jointures/ Web Dynamique v1.1 21/42

Pour en savoir plus sur les index : http://tecfa.unige.ch/guides/mysql/fr-man/manuel_MySQL_indexes.html#MySQL_indexes Optimisation : http://dev.mysql.com/doc/refman/5.0/fr/mysql-optimization.html http://www.trucsweb.com/ASP/trucs.asp?no=104&type=7 Pour les contraintes, les relations et les trigger, une initiation : http://www.commentcamarche.net/sql/sqlcontr.php3 Tous ses liens ont t contrls le 18 septembre 2007.

Web Dynamique v1.1

22/42

4 PHP et MySQL
Nous avons vu comment intgrer dans une page dynamique de linformation issue dun formulaire. Nous allons maintenant grer avec notre page dynamique linformation issue dune base de donnes. Pour cela, nous allons afficher le contenu de la base de donnes que nous avons dfinie dans la section premiers pas en SQL . Auparavant, nous devons apprendre nous connecter depuis PHP sur la base de donnes. Pour les exercices, nous vous recommandons de charger la base de donnes qui se trouve dans le fichier BDexercice.txt.

4.1 Connexion la base de donnes


Avant de lancer une requte vers une base de donnes, nous devons ouvrir une connexion depuis PHP vers cette base. Pour voir comment on accde la base de donnes, regardons ce que contient le fichier connexion.php :
mysql_connect("adresseDuServeur","monLogin","monMotDePasse") or die ("connexion impossible") ; mysql_selectdb("nomDeLaBaseDeDonnes") or die ("base de donnes introuvable") ;

Pour accder ma base de donnes, je vais excuter toujours le mme code. Plutt que de rpter partout ces deux lignes, je les ai mises dans ce fichier connexion.php, et pour lancer la connexion, je naurai besoin que dappeler le fichier.

4.2 Fonction include() et partage de code


Pour appeler le code du fichier connexion.php, jutilise la fonction include() :
include("connexion.php") ;

Comme ma connexion me prend seulement 2 lignes, vous pourriez penser que je me donne bien du mal pour conomiser juste une petite ligne. En ralit, les bnfices de lopration vont bien au-del. En effet, imaginez que je dcide de changer de mot de passe. Si javais mis les deux lignes de connexion dans tous mes fichiers PHP, il faudrait que je change dans tous les fichiers, au risque doublier den supprimer un. Ici, il suffit que je fasse la modification sur un seul fichier pour que toutes mes applications la prennent en compte.
Vous pouvez consulter la documentation de PHP pour comprendre la diffrence entre les fonctions include(), include_once(), require() et require_once(). Ici, on aurait pu utiliser require() la place de include(). Une rfrence lire : http://frederic.bouchery.free.fr/?2004/07/20/7-RequireOuInclude

Web Dynamique v1.1

23/42

4.3 Afficher le contenu de la base


4.3.1 Extraction dune table
On commence trs simple avec laffichage de la table des clubs :
$repClub = mysql_query("SELECT nom,codePostal FROM club") ; while ($club = mysql_fetch_object($repClub) ) echo "$club->nom ($club->codePostal) <br>" ;

La premire ligne envoie la base de donnes une requte SELECT. Le rsultat de cette requte est stocke dans la variable $repClub. Ce rsultat est un tableau qui nest pas directement exploitable, mais que nous allons parcourir au moyen dune boucle while. Comment fonctionne cette boucle while ? Il y a en fait deux instructions condenses dans la mme ligne : 1- la fonction mysql_fetch_object() extrait du tableau un club qui na pas encore t traite. Elle stocke ce club dans la variable $club. Cest lquivalent de linstruction suivante :
$club = mysql_fetch_object($repClub) ;

2- La boucle while vrifie que lobjet $club est un objet bien dfinie. La boucle :
while ($club)

sarrte ds que lobjet $club nest pas un vrai objet. Ainsi, chaque itration de la boucle, $club reoit une nouvelle valeur tire du rsultat de la requte. Lorsque toutes les valeurs ont t sorties de $repClub, $club reoit la valeur NULL, et la boucle sarrte. Cest difficile dcoder lorsquon na jamais vu ce type dinstruction, mais cest extrmement puissant et trs utilis. Relisez bien les trois lignes de code de ce paragraphe, avec les explications, jusqu tre sr de bien avoir compris. Quel est le rsultat final ? Nous avons crit chaque nom de club suivi de son code postal entre parenthse. Les clubs sont spars les uns des autres par la balise <br>, cest--dire par un saut de ligne. A lcran, nous devons avoir quelque chose qui ressemble ceci : Les nageurs du Loiret (45200) Les barboteurs de Vesoul (70000) Le Plongeon dAjaccio (20200) Les Canards du val de Seine (75005)

4.3.2 Restriction sur une table


Maintenant, pour chaque club, nous allons afficher ses membres. Le nom de chaque club apparatra comme un titre, et les membres seront affichs dans un tableau : civilit, nom, prnom, date de naissance.

Web Dynamique v1.1

24/42

Voici le code qui permet cet affichage :

$repClub = mysql_query("SELECT id,nom,codePostal FROM club") ; while ($club = mysql_fetch_object($repClub) ) { echo "<h1 class='nomClub'> $club->nom ($club->codePostal) </h1>" ; echo '<table border=1>' ; $repMembre = mysql_query( "SELECT nom,prenom FROM membre WHERE idClub=$club->id") ; while ($memb = mysql_fetch_object($repMembre) ) echo "<tr><td> $memb->nom </td><td> $memb->prenom </td></tr>" ; echo '</table>' ; }

Nous avons ici deux boucles imbriques. La premire boucle reprend ce que nous avons fait prcdemment : aprs lextraction de la table des clubs, la boucle affiche tous les clubs les uns la suite des autres. Le seul point qui change dans lextraction, cest que notre requte porte aussi sur la colonne id, car cet identifiant va nous permettre de retrouver les membres de chaque club. En effet, pour chacun des clubs dcrits par la boucle externe, on fait une extraction de la table des membres. La clause WHERE entrane une restriction : on ne prend que les membres du club en cours de traitement. Ensuite, la boucle interne affiche les informations de chaque membre. Exercice 10 : a. Relisez bien le code ci-dessus, avec les explications, jusqu tre sr de bien avoir compris. b. Faites le tourner dans une page PHP : il faut ajouter les informations de connexions. c. Ici, nous navons mis que les noms et prnoms de chaque membre. Modifiez le code PHP pour ajouter les civilits en premire colonne, et la date de naissance en dernire colonne.

4.3.3 Extraction dune jointure


Exercice 11 : a. Modifiez le code PHP prcdent pour ajouter, entre le nom du club et la liste des membres, une ligne qui donne le nom du prsident de ce club (aide : il faut modifier la premire requte, en y introduisant une jointure). b. Vous devez observer alors que les clubs qui nont pas de prsident napparaissent pas sur la page. c. Cherchez sur internet comment on fait une jointure externe (syntaxe LEFT JOIN) et quoi elle sert. Appliquez ces informations pour afficher tous les clubs, avec leur prsident, y compris les clubs qui nont pas de prsident. Corrig

Web Dynamique v1.1

25/42

Exercice 11 (suite) : d. Modifiez le code PHP prcdent pour ajouter, avec le nom du prsident, le nom du secrtaire. Faites lexercice avec une jointure interne, puis avec une jointure externe.

4.4 Agir sur les donnes


Pour modifier ma base (introduire de nouveaux lments, mettre jour, supprimer des lments) je vais constituer un outil dadministration. Cet outil dadministration va tre constitu de formulaire. Nous allons crer un formulaire diffrent pour chaque opration possible : - ajouter un club - ajouter un membre dans un club - saisir le prsident dun nouveau club, ou changer le prsident dun club existant. - etc. Pour faire ce travail de saisie, nous allons utiliser deux pages php : - admin.php sera la page avec tous les formulaires - admin2.php sera la page qui traitera les informations issues des formulaires. Pour identifier dans la page admin2.php le formulaire de admin.php qui a post linformation, chaque formulaire va contenir un champ "hidden", qui permettra au serveur didentifier lopration demande par le client.

4.4.1 Ajouter un club


Pour ajouter un club, nous devons entrer : - son nom - son code postal Pour ces deux champs, nous allons utiliser des champs de type text.
Nous nous occuperons de lidentit du prsident plus tard.

Voici le formulaire correspondant, qui va apparatre dans la page admin.php :


<H2>Ajouter un club </h2> <form action="admin2.php" method=POST> <input type=hidden name=operation value="ajout club"> nom du club : <input type=text name=nomClub> code postal : <input type=text name=codePostal> <input type=submit value="Valide ce club"> </form> <hr width=50%>

Trois variables sont transmises au serveur : - les variables nomClub et codePostal portent les valeurs qui ont t saisies par lutilisateur, Web Dynamique v1.1 26/42

la variable nomClub porte la valeur "ajout club". Cette valeur permet de savoir quel est le formulaire qui a t mis en uvre, et donc quelle est lopration dadministration que le serveur doit effectuer. Comme lattribut method du formulaire vaut POST, les variables transmises par le formulaire seront ranges dans le tableau $_POST. Dans la page admin2.php nous aurons donc le traitement de ce formulaire :
$operation = $_POST["operation"] ; if ($operation=="ajout club") { $nomClub = $_POST["nomClub"] ; $codePostal = $_POST["codePostal"] ; $query = "INSERT INTO club(nom,codePostal) VALUES('$nomClub','$codePostal')" ; if ( $nomClub && $codePostal && mysql_query($query) ) $message = "opration russie" ; else $message = "chec" ; } echo $message ;

La condition if ($nomClub && ) illustre le fonctionnement de loprateur &&. Il permet : - de tester successivement si les variables $nomclub et $codePostal existent et ne sont pas vides - dexcuter la requte - de tester si la requte sest bien passe. Si lune des premires tapes choue, la requte nest pas excute. Si la requte est excute, et correctement excute, on affich opration russie . Sinon, on signale lchec.

4.4.2 Ajouter un membre


Lorsque nous ajoutons un membre, outre son nom, son prnom, nous devons spcifier : - sa civilit (Mr/Mme/Mlle) - le club auquel il appartient. Fixer la civilit, cest choisir lune des trois possibilits. Spcifier un club, cest faire un choix dans la liste des clubs. Dans les deux cas, nous allons donc faire un choix dans une liste. Pour cela, nous allons utiliser lobjet <select>.

Attention, il existe un objet <select> en HTML, et une instruction SELECT en SQL. Cest le mme mot, pour deux concepts qui nont absolument rien voir. Prire de ne pas mlanger !
Si la diffrence entre les deux concepts nest pas claire pour vous, prenez un bout de papier et crivez tout ce que vous savez sur lobjet <select> en HTML, et sur linstruction SELECT en SQL. Reprenons. Voici quoi doit ressembler le code du formulaire qui va nous permettre de saisir un nouveau membre :
<H2>Nouveau membre </H2> <form action="admin2.php" method=POST> <input type=hidden name=operation value="ajout membre">

Web Dynamique v1.1

27/42

civilit : <select name=civ> <option value=Mr> Mr <option value=Mme> Mme <option value=Mlle>Mlle </select> nom du membre : <input type=text name=nomMembre> prnom : <input type=text name=prenom> club : <select name=club> <option value=1> Les nageurs du Loiret <option value=2> Les barboteurs de Vesoul <option value=3> Le Plongeon dAjaccio <option value=4> Les Canards du val de Seine </select> <input type=submit value="Valide ce membre"> </form> <hr width=50%>

Le gros problme, avec ce formulaire, cest que la liste des clubs peut bouger. Si je rajoute un club dans ma base de donnes, il devrait apparatre comme nouvelle option dans mon <select>. Faudrait-il alors que je modifie la main mon formulaire ? Hors de question ! Nous allons demander PHP de gnrer automatiquement les options du <select>. Nous allons donc remplacer le <select name=club>...</select> par le code suivant :
<select name=club> <?php $repClub = mysql_query("SELECT id,nom FROM club") ; while ($club = mysql_fetch_object($repClub) ) echo "<option value=$club->id > $club->nom " ; ?> </select>

Le code PHP est un copi/coll du tout premier code que nous avons crit (laffichage du contenu de la table club). Nous introduisons ensuite deux modifications : - au lieu de slectionner le nom du club et son code postal, nous slectionnons son nom et son identifiant. - au lieu dafficher le nom et le code postal du club, nous crivons un objet <option>. Cet objet affichera le nom du club, et pour cette option la valeur poste par le formulaire sera lidentifiant du club.
La liste des civilits, elle, est fixe. Elle na pas besoin dtre gnre par PHP.

Lintgration dans la base de donnes est trs simple. Cest une simple transposition du code utilis pour insrer un nouveau club :
$operation = $_POST["operation"] ; if ($operation=="ajout membre") { $nom = $_POST[" "] ; $prenom = $_POST[" "] ; $civ = $_POST[" "] ; $idClub = $_POST[" "] ; $query = "INSERT INTO membre(nom,prenom,civilite,idClub) VALUES('$nom','$prenom','$civ',$idClub)" ; if ( $idClub && $nom && $prenom && $civ && mysql_query($query) )

Web Dynamique v1.1

28/42

} else if ($operation=="ajout club") { // Ici, on laisse le code dvelopp prcdemment } echo $message ;

$message = "opration russie" ; else $message = "chec" ;

Exercice 12 : - dans le code ci-dessus, les indices du tableau $_POST ont t oublis. Compltez le code. Tester le.

4.4.3 Saisie du prsident


Pour saisir correctement un club, nous devons indiquer aussi qui est son prsident. Dans le formulaire correspondant, nous aurons : - un menu <select> qui permet de choisir le club dont nous sommes en train de saisir le prsident - un menu <select> qui permet de choisir le membre quon veut indiquer comme prsident de ce club - un bouton de validation (input de type submit) Le code que nous voulons avoir sur notre poste client va ressembler ceci :
<h2>Saisir le president dun club : </h2> <form action="admin2.php" method=POST> <input type=hidden name=operation value="saisie prsident"> Nom du club : <select name=club> <option value=""> -- choisir un club -<!-- ici, on met les balises <option>, une pour chaque club, --> </select> <br> Nom du prsident : <select name=membre> <option value=""> -- choisir un membre -<!-- ici, on met les balises <option> une pour chaque membre, --> </select> <br> <input type=submit value="SAISIR"> </form> <hr width=50%>

Les balises options du menu des clubs sont gnres par le mme code que dans le formulaire de saisie des membres :
<?php $repClub = mysql_query("SELECT id,nom FROM club") ; while ($club = mysql_fetch_object($repClub) ) echo "<option value=$club->id > $club->nom " ; ?>

Web Dynamique v1.1

29/42

Pour le menu des membres, on transpose facilement :


<?php $repMemb = mysql_query(" ") ; while ($mb = mysql_fetch_object($repMemb) ) echo "<option value=$mb->id > <b>$mb->nom</b>, $mb->prenom"; ?>

Exercice 13 : a. dans le code prcdent, la requte SQL a t oublie. Ecrivez-la. b. crire le code PHP placer dans admin2.php pour traiter le formulaire de saisie du prsident dun club, selon le modle vu prcdemment :
else if ($operation==" ???? ") { ???? }

Correction : Placer le code PHP suivant dans admin2.php pour traiter le formulaire de saisie du prsident dun club.
else if ($operation=="saisie prsident") { $idClub = $_POST[" "] ; $idPres = $_POST[" "] ; $query = "UPDATE club SET idPresident=$idPres WHERE id=$idClub" ; if ( $idClub && $idPres && mysql_query($query) ) $message = "opration russie" ; else $message = "chec" ; }

4.5 Interaction SQL / PHP / javascript


Dans lexemple prcdent, le formulaire de saisie des prsidents prsente un gros inconvnient : nous avons mis dans un menu slect la totalit des membres de notre fdration. Pour une toute petite association, ce nest pas grave, mais ds que nous atteignons quelques dizaines de membres, le menu des membres devient ingrable. Je veux donc ajouter mon interface une fonctionnalit supplmentaire : le menu des membres ne devrait pas afficher tous les membres, mais seulement ceux du club actuellement slectionn. Si je change le club dans le menu des clubs, toutes les options du menu des membres doivent changer.

4.5.1 Mthode sur le serveur La premire mthode pour faire cela est de faire recalculer la page par le serveur : pour cela, lorsque je change la valeur du menu club, je force le recalcul de la page admin.php.
Web Dynamique v1.1 30/42

Rptons en dcomposant : lorsque je change la valeur du menu club => je vais utiliser un gestionnaire dvnement onChange sur le menu des clubs. je force le recalcul de la page admin.php Jenvoie mon formulaire non pas la page admin2.php, qui intervient sur la base, mais la page admin.php pour quelle calcule un autre menu des membres. On remplace donc la balise <select name=club> par cette version :
<select name=club onChange="changeSelectMembre(this.form)" > <script> function changeSelectMembre(f) { f.action='admin.php'; f.submit() ; } </script>

Lorsquon change la valeur du club slectionn, on active le gestionnaire dvnement onChange, ce qui lance la fonction javascript changeSelectMembre(). Analysons le code de cette fonction : - Nous savons que this est lobjet reprsent par la balise courante, c'est--dire ici le menu des clubs. this.form, le paramtre de la fonction, est le formulaire auquel appartient ce menu des clubs. Dans la fonction, f.action est donc lattribut action de ce formulaire. La premire instruction, f.action='admin.php', change ladresse de destination du formulaire. - La seconde instruction, f.submit() poste le formulaire vers le serveur. Que va faire le serveur ? Il doit afficher le menu des membres en fonction du club slectionn. Si il ny a pas de club slectionn, il naffiche rien dans la liste des membres. Voici donc le code PHP qui permet de gnrer le menu des membres :
Nom du prsident : <select name=membre> <!-- ici, on met les balises <option> une pour chaque membre, --> <?php $idClub=$_POST("club"] ; $query="SELECT id,nom,prenom FROM membre WHERE idClub=$idClub"; $repMemb = mysql_query($query) ; if ($idClub && mysql_num_rows($repMemb)) while ($mb = mysql_fetch_object($repMemb) ) echo "<option value=$mb->id > <b>$mb->nom</b>, $mb->prenom"; else echo '<option disabled> -- choisir un club avant de choisir un membre --' ; ?> </select><br>

Au lieu dafficher dans le menu <select> la totalit des membres, la requte est restreinte aux seuls membres qui appartiennent au club didentifiant $idClub. La valeur de $idClub est transmise par le formulaire, on la rcupre dans $_POST["club"]. Si cette valeur nexiste pas, cela signifie quaucun club nest slectionn : on affiche alors une invitation slectionner un club. Web Dynamique v1.1 31/42

Exercice 14 : a. quoi sert lattribut disabled ? b. Modifiez les fichiers admin.php et admin2.php pour faire fonctionner cet exemple. Observez : lorsquon slectionne un club, les membres du club apparaissent dans le select des membres (cest ce quon voulait). Mais on perd le club quon avait slectionn. c. Modifiez le code PHP qui gnre le select des clubs pour prselectionner le club qui a t transmis par $_POST. Pour prselectionner une option dun slect, on crit :
<option selected value= etc.>

Linconvnient de la mthode prsente ici, cest quelle entrane un rechargement de la page alors que seul un menu <select> va changer. Ce rechargement entrane une consommation de CPU sur le serveur, et surtout un rafrachissement du navigateur fatigant pour lutilisateur si ce dernier doit multiplier lopration.
Si vous testez le script sur votre serveur local, vous ne vous rendrez peut-tre pas compte du cot de ce rechargement. Si vous lessayez sur un serveur distant, en particulier avec un rseau de faible capacit, vous vous convaincrez du problme que cela pose.

4.5.1.1 Mthode en javascript Plutt que de recharger la page, nous allons utiliser javascript pour modifier le menu des membres. Pour cela, les informations sur chaque membre seront ranges comme lment dun tableau javascript. Javascript lira ce tableau pour gnrer un nouveau menu select.
Le tableau ressemblera ceci :

tabM[i][0] : lidentifiant du membre tabM[i][1] : lidentifiant de son club dappartenance tabM[i][2] : nom et prnom du membre
tabM[0]=[1,3, "Conda, Anna"]; tabM[1]=[4,3, "ThiedGut, Justine"]; tabM[2]=[5,5, "Menvussa, Grard"];

Pour changer le menu des membres en javascript, nous allons : - dtruire les options du menu existant - reconstruire les options correspondant au club slectionn Voici le code, tel quil doit se prsenter sur le poste client :
<h2>Saisir le prsident dun club : </h2> <form action="admin2.php" method=POST> <input type=hidden name=operation value="saisie Prsident">

Web Dynamique v1.1

32/42

Nom du club : <script> tabM = new Array() ; tabM[0]=[1,3, "Conda, Anna"]; tabM[1]=[4,3, "Thiedgut, Justine"]; tabM[2]=[5,5, "Menvussa, Grard"]; //etc. function changeSelectMembre(idClub) { //alert(1) ; selMembre = document.getElementById("selMembreSaisiePresident") ; selOpt = selMembre.options ; // selOpt, c'est le tableau qui contient // toutes les options du menu des membres // on vide le select de ses options for (i=selOpt.length-1 ; i>-1 ; i--) selOpt[i]=null ; // et on le remplit de nouveau selOpt[0]= new Option("-- choisir un prsident --",""); for (cpt=0 ; cpt<tabM.length ; cpt++ ) if (tabM[cpt][1]==idClub) { var o=new Option(tabM[cpt][2],tabM[cpt][0]); selOpt[selOpt.length]=o; }

} </script> <select name=club onChange="changeSelectMembre(this.value)" > <option value=""> -- choisir un club -<!-- ici, on met les balises <option>, une pour chaque club, --> <option value="1"> nom du club 1 <option value="2"> nom du club 2 </select> <br> Nom du prsident : <select name=membre id=selMembreSaisiePresident > <option disabled> -- choisir un club avant de choisir un membre -</select> <br> <input type=submit value="SAISIR"> </form>

Que fait ce code ? Dcrivons pas pas son activit : - lorsque la valeur du menu des clubs change, le gestionnaire dvnement onChange lance la fonction changeSelectMembre().Cette fonction porte un paramtre, qui est la valeur de loptions nouvellement slectionne : this.value. Cette valeur, nous savons que cest lidentifiant du club (si vous en doutez, relisez les pages o nous avons construit le menu des clubs). - la fonction changeSelectMembre() commence par rcuprer le menu des membres, puisque cest lui que nous devons modifier. Pour cela, nous avons donn un identifiant (selMembreSaisiePresident) dans le code HTML, et dans la fonction javascript, nous rcuprons lobjet qui porte cet identifiant grce la fonction getElementById(). - Nous allons manipuler les options de ce menu des membres, nous donnons un nom au tableau dans lequel ces options sont ranges : nous lappelons selOpt. Web Dynamique v1.1 33/42

Nous vidons selOpt, au moyen dune boucle en dcrmentation. Nous construisons les nouvelles options, et nous les rangeons dans le tableau. Nous ne construisons une nouvelle option que pour les membres dont lidentifiant du club (tabM[i][1]) est gal lidentifiant du club slectionn dans le menu des clubs (idClub, le paramtre de la fonction, cest dire this.value dans lappel de la fonction).

Exercice 15 : a. identifiez, pour chacun des points de la description ci-dessus, les lignes de code concernes. b. sauvez le fichier et testez-le dans votre navigateur. Naturellement, cela marche, mais nous navons pas tout fait fini : pour le moment, le tableau tabM, o sont ranges les informations sur les diffrents membres de chaque club, est un tableau dexercice. Il est purement statique, et ne contient pas la totalit des membres de la base de donnes. Nous allons donc transformer notre page statique en page dynamique, en remplaant les affectations du tableau :
tabM[0]=[1,3,'Conda, Anna']; tabM[1]=[4,3,'Thiedgut, Justine']; tabM[2]=[5,5,'Menvussa, Grard'];

par un code PHP qui va extraire les informations de la table membre pour les crire sous la forme de tableau javascript. Voici ce code PHP :
<?php include("connexion.php") ; $rep=mysql_query("SELECT FROM membre") ; $i=0 ; while( $mb=mysql_fetch_object( ) ) { $nomEtPrenom = "$mb->nom, $mb->prenom" ; echo "tabM[$i]=[$mb->id,$mb->idClub,'$nomEtPrenom'];" ; $i++; } ?>

Exercice 16 : a. dans le code PHP ci-dessus, remplacer les blancs pour que le programme fonctionne. b. modifier le code pour que le menu des membres ne propose comme prsident que les membres majeurs. c. modifier le code pour que le menu des membres, lorsquil est construit dans la fonction changeSelectMembre(), affiche par dfaut le prsident actuel. Indication : il faut procder en deux temps dune part extraire linformation sur le prsident de chaque club et lintgrer dans la page, dautre part laide de cette information forcer loption du prsident du club apparatre slectionne. Attention, lorsque vous passez du statique au dynamique, noubliez pas de mettre votre fichier PHP dans la racine web de votre serveur, faute de quoi le code PHP ne sera pas interprt par le serveur. Web Dynamique v1.1 34/42

Linconvnient de cette seconde mthode, cest quelle oblige faire une extraction complte de la table membre, et tout transmettre au client. A partir de 1000 items, la page commence devenir lourde pour les navigateurs un peu anciens, et partir de 10.000 items, elle est carrment dangereuse. 4.5.1.2 Mthode en Ajax
Chacune des deux mthodes que nous avons vues prcdemment prsente ses avantages et ses inconvnients : - avec javascript, nous avons un meilleur confort dans la manipulation de la page, puisquon vite le rafrachissement complet de la page. Mais le chargement de tous les objets et leur manipulation dans javascript est dangereux. - avec PHP, nous navons extrait de la base que les objets qui nous intressaient : les membres appartenant au club slectionn. Mais nous avons un rafrachissement de page peu ergonomique. Ajax va permettre de prendre les avantages de chacune des deux mthodes : - avec javascript, nous allons faire une requte HTTP vers un script PHP sur le serveur. Ce script PHP va lire dans la base les informations qui nous intressent (uniquement les membres du club slectionn). - javascript, avec ces informations, va modifier le menu des membres, et seulement ce menu : la page ne subit pas de rafrachissement.

Si vous tes intress par AJAX, reportez vous au TP sur Ajax.

Web Dynamique v1.1

35/42

5 Cookies et sessions
Vous trouverez trs facilement des documentations sur internet qui vous permettront de programmer en PHP lutilisation de cookies et de sessions. Ce que nous allons expliquer ici, ce nest pas comment on fait, mais comment cela fonctionne, pour vous permettre 1- de matriser ce que vous faites. 2- dacclerer votre comprhension Nous commenons avec les cookies. Les sessions sont une ergonomie particulire btie autour dun cookie particulier.

5.1 Les cookies principe de fonctionnement


Nous avons dit dans le cours n1 que les cookies sont des variables qui sont postes du serveur vers le client, et que le client renvoie au serveur chaque nouvelle requte. La figure suivante illustre ce fonctionnement : 2 1
le client demande une page php en gnrant la page PHP, le serveur trouve une instruction crer un cookie . il cre donc un cookie : en mme temps que la page web, il envoie une petite variable vers le client.

le client reoit le cookie. Il le stocke. (et affiche la page, bien-sr)

Un cookie est une variable qui circule entre serveur et client

4
Plus tard, le client renvoie une autre requte vers le mme serveur. Automatiquement, il renvoie une copie du cookie.

5
Le serveur reoit une requte avec un cookie. Ce cookie porte des informations issues de la requte prcdente

figure 4. La circulation du cookie.

A quoi cela sert-il ? Nous devons nous rappeler que toutes les requtes vers un serveur sont indpendantes les unes des autres : le serveur reoit une requte, il y rpond, et lorsquil a finit de rpondre, il passe une autre tche (rpondre la requte dun autre client) en effaant tout ce quil vient de calculer pour le premier. Ainsi, plus tard, lorsque le mme client renverra une nouvelle requte, le serveur ne possdera pas de trace de la premire. Il na pas les moyens de garder cette mmoire. Le seul moyen Web Dynamique v1.1 36/42

pour lui est de faire transiter cette mmoire par le client. Le cookie est cette mmoire des choses importantes que le serveur stocke chez le client pour quelle soit disponible pour toutes les requtes futures (dans la limite de dure de validit du cookie, et sous rserve que le client accepte les cookie). Prenons un exemple : lutilisateur remplit un formulaire avec son login et son mot de passe. Le serveur lui rpond : bravo, votre mot de passe est reconnu, voulez-vous voir vos mail ? . Si lutilisateur cherche voir ses mails, il doit transmettre en mme temps une preuve de son identit. Sinon, nimporte qui pourrait consulter les mails de nimporte qui. Transmettre une preuve de son identit : il vient pourtant de le faire la premire requte, en entrant son login et son mot de passe. Le cookie est donc le moyen pour le navigateur dauthentifier lidentit de lutilisateur sans avoir lui demander son mot de passe chaque chargement de.

5.2 Les cookies dans lorganisation de la page web


Le cookie est vhicul dans lentte de la rponse HTTP, et la page web est vhicule dans le corps de cette rponse. Attention, nous parlons ici de lentte et du corps du message HTTP. Il ne faut pas confondre avec lentte et le corps de la page web. Prire de ne pas mlanger ! la figure suivante illustre cette embotement :

HTTP
les cookies sont placs ici avant la page web dans lentte de la requte HTTP header

HTML
entte

<html> <head> <title> site </title> </head> <body> <H1> mon titre</H1> <p> texte, etc. </p> </body> </html>

body

corps

figure 5. La page web se trouve toute entire dans le corps de la rponse HTTP. Les cookies sont stocks dans lentte de cette rponse.

Quelle est limportance de cette architecture pour la conception dune page PHP ?

Ds que vous commencez crire du texte HTML, vous ne pouvez plus crire un cookie : au moment o vous commencez crire du texte HTML, le serveur ferme lentte et ouvre le corps de la rponse, pour y mettre la page web.
Web Dynamique v1.1 37/42

Cela signifie en particulier que si vous utilisez des cookies, vous ne devez mme pas mettre une ligne blanche ou un espace avant louverture de la balise du code PHP ( <?php). Ceci est une source derreurs frquente et difficile tracer si on ny pense pas. La bonne architecture de la pour mettre en ligne une Mettre en premier lieu tous le code PHP.

Effectuer en premier lieu tous les traitements ncessaires par le calcul de la page, et ne lancer laffichage que quand tout est prt.
Idalement, les calculs sont dans une page php spare, appele par un include() au dbut de la page principale. La page principale est constitue du code HTML, avec quelques insertions PHP appeles par la fonction echo.

5.3 Les sessions principe de fonctionnement


Plus utiles que les cookies, les sessions permettent de stocker un grand nombre dinformations sur le serveur, et de nenvoyer quun seul cookie qui permet de retrouver toutes les informations. La figure suivante illustre ce fonctionnement des sessions. 2 1 Lutilisateur poste
des info personnelles en gnrant la page PHP, le serveur trouve une instruction crer une session . - il envoie un identifiant en cookie au client - il stocke par ailleurs lidentifiant en interne - et il stocke avec les infos du client

le client reoit le cookie. Il le stocke. (et affiche la page, bien-sr)

Une session est un cookie automatiquement gr par le serveur

4
Plus tard, le client renvoie une autre requte vers le mme serveur. Automatiquement, il renvoie une copie du cookie.

Sur la nouvelle page, le serveur trouve linstruction crer session - il regarde si le cookie-identifiant existe - il lutilise pour retrouver toutes les info personnelles du client - il actualise le cookie-identifiant

figure 6. Les sessions permettent de nenvoyer quun seul cookie, un identifiant. Les autres informations sont stockes sur le serveur, et cest lidentifiant qui permet de les rcuprer de manire scurise.

Lutilisation des sessions encapsule totalement la cration du cookie identifiant : lorsquon cre une session, on teste lexistence du cookie, sil existe on rcupre les variables de la session prcdente dans le tableau $_SESSION. Si le cookie nexistait pas, on le cre. rcupre les variables de la session prcdente. Web Dynamique v1.1 38/42

Comme pour les cookies, la cration de la session doit se faire avant lcriture du code HTML. En revanche, une fois que la session est cre, on peut stocker des informations sur le serveur comme on le souhaite Exercice 17 : - sur internet, trouvez une documentation portant sur les sessions en PHP - protgez avec un mot de passe le formulaire dadministration de la base des clubs et des membres, et programmez laccs cette page avec des sessions.
Pour aller plus loin, vous pouvez consulter la page suivante : http://php.developpez.com/cours/sessions/?page=plus#L3 Vous y apprendrez, entre autre, quon peut aussi faire passer lidentifiant de session par la barre dadresse du navigateur (mthode trans_sid) plutt quavec un cookie. Cette opration, un peu plus risque que le cookie en terme de scurit, est dconseille.

Web Dynamique v1.1

39/42

6 Conclusion 6.1 Bilan


A lissue de ce cours, vous devez tre en mesure de coder une application simple mettant en uvre un formulaire pour extraire de linformation dune base de donnes mySQL, en insrer et la modifier. Vous devez tre capable de coder une application mettant en uvre la fois PHP et javascript, en interaction avec une base de donnes. Si lun des points ci-dessus ne vous semble pas acquis : - refaites les exercices - compltez votre information sur les sites spcialiss - posez des questions au professeur

6.2 Divers pour aller plus loin en PHP


Si vous souhaitez aller plus loin, voici quelques pistes explorer : - partir de PHP5, le langage est orient objet. - Outre les outils de manipulation de chane classiques, PHP intgre entre autre les outils bass sur les expressions rgulires.
Exercice 18 : - ajouter loutil dadministration qui permet de supprimer un membre - de supprimer un club (il faut vrifier que le club na plus de membres avant de le supprimer) - de mettre jour un club (modifier son nom et son adresse) - de mettre jour un membre (modifier son club dappartenance, sa date de naissance). A chaque fois, il faut ajouter un formulaire dans la page admin.php, et traiter ce formulaire dans la page admin2.php. Exercice 19 : Programmer un site intranet permettant de faire du co-voiturage les jours de grve. Les fonctions assurer sont : - inscription avec choix de mot de passe, numro de tlphone et adresse mail. - identification (identification avec des sessions) - enregistrement dun trajet en voiture, propos aux autres usagers. On renseigne : date, lieu de dpart (le lieu darrive est le lieu de travail), heure de dpart le matin, heure de retour le soir, et nombre de place dans la voiture. - Rservation dune place : le candidat passager affiche les annonces pour lesquelles il reste des places, et slectionne celle qui lintresse. Dans la base, sa rservation est inscrite. Exercice 20 : Amlioration du site prcdent on ajoute les fonctions suivantes : - Le candidat passager peut slectionner les annonces par date, de manire ergonomique (=> au moyen dun calendrier javascript, rcuprer sur internet). - Le conducteur peut consulter son annonce, rcuprer la liste des passagers dj inscrits, avec leurs emails et leurs numros de tlphone. - Le conducteur peut supprimer son annonce : un mail est automatiquement envoy ceux qui tait dj inscrits.

Web Dynamique v1.1

40/42

7 Sommaire
1 Introduction..............................................................................................................................2 1.1 Objectif..............................................................................................................................2 1.2 prrequis............................................................................................................................2 1.3 Mthode............................................................................................................................2 1.4 Matriel ............................................................................................................................3 2 Premiers pas en PHP ...............................................................................................................4 2.1 Laffichage en PHP...........................................................................................................4 2.2 Les bases du langage.........................................................................................................5 2.3 PHP et les formulaires HTML..........................................................................................8 2.3.1 Le transfert de linformation ....................................................................................9 2.3.2 Rcupration des variables dans PHP....................................................................10 2.3.3 Mthode GET et mthode POST..............................................................................11 2.4 Conclusion......................................................................................................................12 3 Premiers pas en SQL..............................................................................................................13 3.1 Prsentation.....................................................................................................................13 3.1.1 Quest-ce que SQL ? ...............................................................................................13 3.1.2 Les tables.................................................................................................................13 3.2 Modle physique de donnes..........................................................................................14 3.2.1 Les identifiants.........................................................................................................14 3.2.2 Modle conceptuel de donnes................................................................................15 3.2.3 Conversion vers le modle physique de donnes.....................................................16 3.2.4 Cration des tables en SQL.....................................................................................17 3.3 Manipulation des donnes...............................................................................................17 3.3.1 Consulter les donnes : la requte SELECT..FROM..............................................17
3.3.1.1 Restriction sur les colonnes (projection).......................................................................................17 3.3.1.2 Restriction sur les lignes...............................................................................................................18 3.3.1.3 Alias de colonne............................................................................................................................18

3.3.2 Produit cartsien.....................................................................................................18 3.3.3 Insertion, suppression et mise jour.......................................................................19 3.4 Les index.........................................................................................................................20 3.4.1 La recherche squentiel...........................................................................................20 3.4.2 La recherche indexe...............................................................................................20 3.4.3 Index et identifiant : les clefs...................................................................................20 3.4.4 O dois-je crer un index ?.....................................................................................21 3.5 Pour aller plus loin .........................................................................................................21 4 PHP et MySQL......................................................................................................................23 4.1 Connexion la base de donnes .....................................................................................23 4.2 Fonction include() et partage de code.............................................................................23 4.3 Afficher le contenu de la base.........................................................................................24 4.3.1 Extraction dune table.............................................................................................24 4.3.2 Restriction sur une table..........................................................................................24 4.3.3 Extraction dune jointure.........................................................................................25 4.4 Agir sur les donnes .......................................................................................................26 4.4.1 Ajouter un club........................................................................................................26 4.4.2 Ajouter un membre..................................................................................................27 4.4.3 Saisie du prsident ..................................................................................................29 4.5 Interaction SQL / PHP / javascript..................................................................................30 Web Dynamique v1.1 41/42

4.5.1 Mthode sur le serveur............................................................................................30


4.5.1.1 Mthode en javascript...................................................................................................................32 4.5.1.2 Mthode en Ajax...........................................................................................................................35

5 Cookies et sessions.................................................................................................................36 5.1 Les cookies principe de fonctionnement......................................................................36 5.2 Les cookies dans lorganisation de la page web.............................................................37 5.3 Les sessions principe de fonctionnement.....................................................................38 6 Conclusion.............................................................................................................................40 6.1 Bilan................................................................................................................................40 6.2 Divers pour aller plus loin en PHP...............................................................................40 7 Sommaire...............................................................................................................................41

Web Dynamique v1.1

42/42