1/42
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.
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.
3/42
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.
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
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" ;
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 :
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"] ;
Exercice 2 : -
en recopiant le code ci-dessus, faire le test de la substitution de variable avec des tableaux. 6/42
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" ;
$a
" ; $a=$a*2 ;}
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> ; " }
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 }
if (condition) { instructions si la condition est vraie } else { instructions si la condition est fausse }
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.
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
Affichage lcran
Fichier HTML
PHP
figure 2 circulation des requtes et des variables lors de lutilisation dun formulaire
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).
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.
12/42
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).
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.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.
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.
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.
15/42
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.
16/42
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.
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
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.
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)
Exercice 8 : Corrig :
on veut que nom et prenom sappellent sappellent firstName, lastName dans le rsultat. Ecrire la requte SQL.
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
19/42
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.
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.
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.
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.
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.
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
23/42
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)
24/42
$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.
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.
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.
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">
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) )
28/42
} else if ($operation=="ajout club") { // Ici, on laisse le code dvelopp prcdemment } echo $message ;
Exercice 12 : - dans le code ci-dessus, les indices du tableau $_POST ont t oublis. Compltez le code. Tester le.
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 " ; ?>
29/42
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.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">
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.
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.
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
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.
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.
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.
39/42
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
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
42/42