Valid XHTML    Valid CSS2    

Listing du fichier l2a_tp2.php

 

00001     <?php
00002     
# (gH) -_- l2a_tp2.php ; TimeStamp (unix) : 27 Février 2013 vers 12:35
00003     
00004     
error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00005     include(
"std.php") ;
00006     include(
"l2a_inc.php") ;
00007     
00008     
$numTp
= 2 ;
00009     
debutPageTp
($numTp) ;
00010     
00011     
## -------------------------------------------------------------------------------------------
00012     
00013     
sdl
(3) ; echo cmt(' pour afficher toutes les solutions : l2a_tp'.$numTp.'.php?solutions=1') ; sdl(3) ;
00014     
00015     
## -------------------------------------------------------------------------------------------
00016     
00017     
debutSection() ;
00018     
00019     
p
("texte") ;
00020     echo
s_span
("Remarque&nbsp;","grouge").": vous pouvez désormais utiliser Windows ou Linux pour écrire vos fichiers. " ;
00021     echo
" De plus, il est possible d'utiliser le serveur "
.b("devel.info-ua")." au lieu de ".b("forge.info.univ-angers.fr") ;
00022     echo
" pour exécuter vos pages PHP. Cet autre serveur affiche les erreurs PHP alors que "
.b("forge")." renvoie une page blanche." ;
00023     echo
" Si vous &ecirc;tes dans une des salles locales de TP, vous pouvez utiliser la forme courte du serveur, à savoir " ;
00024     echo
" "
.b("forge.info-ua")." au lieu de ".b("forge.info.univ-angers.fr").". " ;
00025     
finp() ;
00026     
pvide() ;
00027     
00028     
$tableauDesRubriques = array() ;
00029     
$idr
= 0 ;
00030     
$idr
++; $tableauDesRubriques[$idr] = "Ecriture de fonctions et procédures" ;
00031     
$idr
++; $tableauDesRubriques[$idr] = "PHP conceptuel et utilisation de bibliothèques de fonctions" ;
00032     
$idr
++; $tableauDesRubriques[$idr] = "Expressions régulières et chaines de caractères" ;
00033     
$idr
++; $tableauDesRubriques[$idr] = "Fichiers, expressions régulières et fichiers-URL" ;
00034     
$idr
++; $tableauDesRubriques[$idr] = "La structure de données ".b("\"pile\"")." version 2" ;
00035     
$idr
++; $tableauDesRubriques[$idr] = "PHP et tables MySQL (1)" ;
00036     
$idr
++; $tableauDesRubriques[$idr] = "Analyse d'une application (1)" ;
00037     
$idr
++; $tableauDesRubriques[$idr] = "Parcours de fichier et documentation" ;
00038     
$idr
++; $tableauDesRubriques[$idr] = "Parcours de fichier et comptages d'attributs" ;
00039     
$idr
++; $tableauDesRubriques[$idr] = "PHP et tables MySQL (2)" ;
00040     
$idr
++; $tableauDesRubriques[$idr] = "PHP, tables, éléments et Javascript" ;
00041     
$idr
++; $tableauDesRubriques[$idr] = "Analyse d'une application (2)" ;
00042     
$tdmCRLM
= new tdm($tableauDesRubriques) ;
00043     
$tdmCRLM
->titre() ;
00044     
$tdmCRLM
->menu("oui","oui","nou") ;
00045     
00046     
pvide() ;
00047     
00048     
p() ;
00049      echo
"Il est possible d'afficher toutes les solutions via "
.href("l2a_tp$numTp.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ;
00050     
finp() ;
00051     
00052     
finSection() ;
00053     
00054     
debutSection() ;
00055     
$numExo
= 0 ;
00056     
00057     
## -------------------------------------------------------------------------------------------
00058     
00059     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Ecriture de fonctions et procédures
00060     
00061     ## -------------------------------------------------------------------------------------------
00062     
00063     
blockquote() ;
00064     
00065     
blockquote() ;
00066     
00067     
p
("texte") ;
00068     echo
"En programmation, on distingue classiquement fonction et procédure. Comment fait-on la différence en PHP&nbsp;?" ;
00069     
finp() ;
00070     
00071     
p
("texte") ;
00072     echo
"Est-ce qu'une fonction PHP peut renvoyer plusieurs valeurs ou plusieurs variables&nbsp;?" ;
00073     
finp() ;
00074     
00075     
p
("texte") ;
00076     echo
b
("Application :")." écrire une fonction ".b("min_max")." qui renvoie la plus petite valeur et la plus grande valeur d'un ";
00077     echo
href
("http://php.net/manual/fr/language.types.array.php","\"array\"","gvertf nou").", " ;
00078     echo
" qu'on testera en ligne de commandes." ;
00079     echo
" Peut-on utiliser "
.href("http://php.net/manual/fr/language.exceptions.php","try","grouge nou") ;
00080     echo
" pour s'assurer que la variable passée est bien un tableau&nbsp;?" ;
00081     
finp() ;
00082     
00083     
p
("texte") ;
00084     echo
"Au passage, quelles sont toutes les fonctions liées aux tableaux en PHP&nbsp;?" ;
00085     echo
" Et comment vérifier la syntaxe d'un programme PHP, puisqu'une erreur de syntaxe comme oublier un point-virgule ou " ;
00086     echo
" un guillemet fait que tout la page HTML est blanche (vide) comme sur tout serveur de production&nbsp;?" ;
00087     
finp() ;
00088     
00089     
finblockquote() ;
00090     
00091     
solution
($numExo,$numTp) ;
00092     
00093     
p
("texte") ;
00094     echo
"En PHP, tout est fonction. Mais l'instruction "
.b("return()")." est facultative. Donc une fonction PHP sans " ;
00095     echo
href
("http://php.net/manual/fr/function.return.php","return()","gbleu nou")." peut " ;
00096     echo
" &ecirc;tre considérée comme une procédure." ;
00097     
finp() ;
00098     
00099     
p
("texte") ;
00100     echo
"Une fonction PHP ne peut pas renvoyer plus d'une variable ni plus d'une valeur directement. Par contre, la variable peut &ecirc;tre un " ;
00101     echo
" tableau, ce qui permet de renvoyer plusieurs valeurs. En voici un exemple avec le renvoi du min et du max d'un tableau&nbsp;:" ;
00102     
finp() ;
00103     
00104     
pre_fichier
("minmax.php","cadre") ;
00105     
00106     
p
("texte") ;
00107     echo
"Il y a un peu moins d'une centaine de fonctions directement liées aux tableaux en PHP, comme le montre la page " ;
00108     echo
href
("http://www.php.net/manual/fr/ref.array.php","ref.array","gbleuf nou")." du manuel de référence. " ;
00109     echo
" C'est sans doute trop, certaines fonctions auraient pu &ecirc;tre regroupées à l'aide d'options, comme en " ;
00110     echo
href
("../tuteurs/tutperl.htm","PERL","grouge nou").". " ;
00111     
finp() ;
00112     
00113     
p
("texte") ;
00114     echo
" On ne peut pas utiliser "
.href("http://php.net/manual/fr/language.exceptions.php","try","grouge nou") ;
00115     echo
" pour s'assurer que la variable passée est bien un tableau parce que les fonctions que nous avons utilisées ne renvoient pas " ;
00116     echo
" des erreurs, mais seulement des "
.em("warnings").". Donc le programme suivant ne \"capte\" rien&nbsp;:" ;
00117     
finp() ;
00118     
00119     
pre_fichier
("minmaxv2.php","cadre") ;
00120     
00121     
p
("texte") ;
00122     echo
"Il faut lire le "
.href("http://www.php.net/manual/fr/index.php","manuel php","gvertf nou") ;
00123     echo
" pour trouver qu'il existe une fonction "
.href("http://php.net/manual/fr/function.is-array.php","is_array","gbleuf nou") ;
00124     echo
" qui permet de résoudre notre problème&nbsp;:" ;
00125     
finp() ;
00126     
00127     
pre_fichier
("minmaxv3.php","cadre") ;
00128     
00129     
p
("texte") ;
00130     echo
"On remarquera au passage l'incohérence de nommage des fonctions en PHP avec "
.b("isset")." et ".b("is-array")." et " ;
00131     echo
" l'incohérence de nommage de la page Web&nbsp;: "
.b("is-array.php")." pour ".b("is_array").". ";
00132     
finp() ;
00133     
00134     
p
("texte") ;
00135     echo
"Pour vérifier la syntaxe d'un programme PHP, le mieux est d'utiliser "
.b("php&nbsp;-l&nbsp;fichier")." en ligne de commande, " ;
00136     echo
" lorsqu'on a accès à une session en mode terminal sur le serveur. Sinon, on peut utiliser " ;
00137     echo
href
("http://www.icosaedro.it/phplint/phplint-on-line.html","php lint","gbleuf nou").", " ;
00138     echo
href
("http://phpcodechecker.com","phpcodechecker","gbleuf nou")." ou " ;
00139     echo
href
("http://www.meandeviation.com/tutorials/learnphp/php-syntax-check/v5-2/syntax-check.php","php syntax check","gbleuf nou").". " ;
00140     echo
" Mais ceci ne vous dispense pas de XHTML validator parce que le code PHP suivant est valide, mais pas le code XHTML produit " ;
00141     echo
" à cause du deuxième &gt; en fin d'instruction et de l'absence d'apostrophe fermante pour l'attribut "
.b("class")."." ;
00142     
finp() ;
00143     
00144     
pre_fichier
("errnoerr.php","cadrebleu") ;
00145     
00146     
finsolution() ;
00147     
00148     
finblockquote() ;
00149     
00150     
## -------------------------------------------------------------------------------------------
00151     
00152     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # PHP conceptuel et utilisation de bibliothèques de fonctions
00153     
00154     ## -------------------------------------------------------------------------------------------
00155     
00156     
blockquote() ;
00157     
00158     
blockquote() ;
00159     
00160     
p
("texte") ;
00161     echo
"Réécrire le code PHP suivant en mode \"conceptuel\", c'est-à-dire sans aucune balise apparente, à l'aide de " ;
00162     echo
href
("stdphp.php","std.php","grouge nou")." (archive " ;
00163     echo
href
("std.zip","","gvertf nou").") dans une page Web valide au sens ".b("XHTML strict").". " ;
00164     
finp() ;
00165     
00166     
pre_fichier
("nonconcept.php","cadre") ;
00167     
00168     
p
("texte") ;
00169     echo
"Il est possible de rapatrier l'archive et de la décompresser en ligne de commandes (dans le bon répertoire&nbsp;!) via&nbsp;:" ;
00170     
finp() ;
00171     
00172     
pre_fichier
("wgetarch2.txt","cadrejaune") ;
00173     
00174     
00175     
p
("texte") ;
00176     echo
"Dans une autre page, écrire une fonction "
.b("para(nbl)")." qui produit ".b("nbl")." lignes de texte répétitif. Utiliser ensuite la classe d'objets ".b("tdm") ;
00177     echo
" du fichier "
.b("std.php")." pour afficher une page qui implémente une table des matières cliquable avec deux ou trois \"chapitres\" " ;
00178     echo
" qui contiennent chacun deux ou trois paragraphes générés par la fonction "
.b("para()")."." ;
00179     
finp() ;
00180     
00181     
p
("texte") ;
00182     echo
"Comment est définie la fonction "
.b("h1()")." dans ".b("std.php")."&nbsp;? " ;
00183     echo
" Comment sait-on si une fonction de "
.b("std.php")." fait un ".b("echo")." ou un ".b("return")."&nbsp;? " ;
00184     echo
" Comment sont nommées les fonctions de "
.b("std.php")."&nbsp;? " ;
00185     
finp() ;
00186     
00187     
p
("texte") ;
00188     echo
"Expliquer ensuite comment est généré et où (client&nbsp;? serveur&nbsp;?) le code XHTML produit en PHP et Javascript " ;
00189     echo
" dans la section identifiée par "
.b("sectdyn")." si on utilise le texte suivant " ;
00190     echo
" qui correspond à la page "
.href("jsdyn.php").". " ;
00191     
finp() ;
00192     
00193     
pre_fichier
("jsdyn.php","cadre") ;
00194     
00195     
p
("texte") ;
00196     echo
"Voici le fichier Javascript utilisé&nbsp;:" ;
00197     
finp() ;
00198     
00199     
pre_fichier
("jsdyn.js","cadrejaune") ;
00200     
00201     
p
("texte") ;
00202     echo
"Que se passe-t-il si Javascript n'est pas actif&nbsp;? Y a-t-il un message d'erreur&nbsp;?" ;
00203     
finp() ;
00204     
00205     
p
("texte") ;
00206     echo
"Après avoir lu le fichier "
.href("montre.js")." écrire en PHP conceptuel une page qui utilise un bouton ".b("Afficher/Masquer") ;
00207     echo
" qui sert à montrer ou cacher le texte préformaté mis dans un élement dont l'"
.b("id")." est ".b("surprise")." " ;
00208     echo
" comme dans "
.href("surprise.php").". " ;
00209     
finp() ;
00210     
00211     
pre_fichier
("montre.js","cadre") ;
00212     
00213     
finblockquote() ;
00214     
00215     
solution
($numExo,$numTp) ;
00216     
00217     
p
("texte") ;
00218     echo
"Il s'agit en fait de l'"
.href("tds.php#rewrite","exercice 11","gvertf nou")." de notre cours sur la " ;
00219     echo
href
("pdc.php","technologie internet","gbleuf nou")." dont la solution est ".href("solutions.php#rewrite","ici","grouge nou").". " ;
00220     echo
" On en profitera bien s&ucirc;r pour regarder les autres exercices..." ;
00221     
finp() ;
00222     
00223     
p
("texte") ;
00224     echo
"Le code conceptuel est donc&nbsp;:" ;
00225     
finp() ;
00226     
00227     
pre_fichier
("ouiconcept.php","cadre") ;
00228     
00229     
p
("texte") ;
00230     echo
"Pour une démonstration de table des matières avec la fonction "
.b("para()").", " ;
00231     echo
" voir "
.href("tdm_demo.php")." dont le code-source est ".href("montresource.php?nomfic=tdm_demo.php","ici")." et ci-dessous." ;
00232     
finp() ;
00233     
00234     
pre_fichier
("tdm_demo.php","cadre") ;
00235     
00236     
p
("texte") ;
00237     echo
"La fonction "
.b("h1()")." est définie comme la fonction ".b("h2()")." et la fonction ".b("h3()")." par un appel à la fonction ".b("h()")." " ;
00238     echo
" avec le niveau ("
.b("1, 2, 3")."...) passé en paramètre." ;
00239     echo
" On peut consulter son code source "
.href("stdphp.php?lafns=h1","ici").". " ;
00240     echo
" La plupart des éléments XHTML &laquo;courts&raquo; sont implémentés comme des fonctions avec des "
.b("echo").". " ;
00241     echo
" Par contre les fonctions comme "
.b("s_span()").", ".b("b()")." et ".b("href()")." utilisent ".b("return").". " ;
00242     echo
" Les fonctions sont nommées comme les éléments. Ainsi il y a "
.b("p()")." pour &lt;p&gt;," ;
00243     echo
" "
.b("br()")." pour &lt;br&nbsp;/&gt;. Pour raccourcir la frappe, les divers &lt;input&gt; d'un formulaire " ;
00244     echo
" ont leur propre fonction." ;
00245     
finp() ;
00246     
00247     
p
("texte") ;
00248     echo
"Pour la page "
.href("jsdyn.php")." le code PHP génère (coté serveur) et transmet un élément ".b("&lt;h1&gt;")." dans une division identifiée par \"jsdyn\". " ;
00249     echo
" Lorsque la page est entièrement chargée (évènement "
.b("onLoad")."), le navigateur crée en mémoire via Javascript (coté client) un deuxième ".b("&lt;h1&gt;")." puis le " ;
00250     echo
" texte "
.b("Bonsoir&nbsp;!")." qui est inséré dans le ".b("&lt;h1&gt;")." et Javascript ajoute ensuite cet élément ".b("&lt;h1&gt;")." à la division." ;
00251     
finp() ;
00252     
00253     
p
("texte") ;
00254     echo
"Si Javascript n'est pas actif, il n'y a aucun message d'erreur, mais "
.b("Bonsoir&nbsp;!")." ne sera pas affiché." ;
00255     
finp() ;
00256     
00257     
finsolution() ;
00258     
00259     
finblockquote() ;
00260     
00261     
## -------------------------------------------------------------------------------------------
00262     
00263     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Expressions régulières et chaines de caractères
00264     
00265     ## -------------------------------------------------------------------------------------------
00266     
00267     
blockquote() ;
00268     
00269     
blockquote() ;
00270     
00271     
p
("texte") ;
00272     echo
"Il faudrait aider la "
.em("jej")." (jeune et jolie) Abby --&nbsp;".href("http://fr.wikipedia.org/wiki/Abigail_Sciuto","Abigail Scituo")."&nbsp;--" ;
00273     echo
" à identifier des suspects à l'aide de numéros de plaques minéralogiques. " ;
00274     echo
" Voici ce qu'on sait des plaques des suspects, gr&acirc;ce au "
.href("http://en.wikipedia.org/wiki/Naval_Criminal_Investigative_Service","NCIS")."&nbsp;:" ;
00275     
finp() ;
00276     
00277     
ul() ;
00278     
00279     
debutli
() ; p("texte") ;
00280      echo
"le numéro de plaque d'une voiture se compose de 1 à 4 chiffres, un espace, deux lettres, un espace et enfin deux chiffres, et rien d'autre." ;
00281     
finp
() ; finli() ;
00282     
00283     
debutli
() ; p("texte") ;
00284      echo
" si toutes les lettres sont des consonnes, il s'agit du suspect nommé " ;
00285      echo
href
("http://fr.wikipedia.org/wiki/Liste_des_personnages_de_NCIS_:_Enqu%C3%AAtes_sp%C3%A9ciales","Ari Haswari","gbleuf nou")."." ;
00286     
finp
() ; finli() ;
00287     
00288     
00289     
debutli
() ; p("texte") ;
00290      echo
" si le numéro de plaque comporte un chiffre répété, il s'agit du " ;
00291      echo
href
("http://fr.wikipedia.org/wiki/Liste_des_personnages_de_NCIS_:_Enqu%C3%AAtes_sp%C3%A9ciales","tueur de port en port","gbleuf nou")."." ;
00292     
finp
() ; finli() ;
00293     
00294     
debutli
() ; p("texte") ;
00295      echo
" si le numéro de plaque comporte avant les lettres exactement 4 chiffres avec une alternance pair/impair, il s'agit de " ;
00296      echo
href
("http://fr.wikipedia.org/wiki/Liste_des_%C3%A9pisodes_de_NCIS_:_Enqu%C3%AAtes_sp%C3%A9ciales","\"la grenouille\"","gbleuf nou")."." ; ;
00297     
finp
() ; finli() ;
00298     
00299     
finul() ;
00300     
00301     
p
("texte") ;
00302     echo
"Ecrire un document PHP qui reproduit le premier formulaire de la page "
.href("ncis.php")." via du code valide pour XHTML strict. " ;
00303     echo
" On affichera l'image "
.href("http://static1.ozap.com/articles/0/15/02/10/@/1415258-pauley-perrette-est-abby-sciuto-dans-diapo-1.jpg","abby.jpg") ;
00304     echo
" et on mettra un lien vers "
.href("http://fr.wikipedia.org/wiki/Abigail_Sciuto","la page Wiki associée").". " ;
00305     
finp() ;
00306     
00307     
p
("texte") ;
00308     echo
"A partir du formulaire "
.href("ncis.php")." écrire le programme défini par l'attribut ".b("action")." de façon à afficher les suspects possibles " ;
00309     echo
" quand on saisit un numéro de plaque. On utilisera, quand c'est possible les " ;
00310     echo
href
("http://www.php.net/manual/fr/ref.pcre.php","expressions régulières PCRE","grouge nou")." pour avoir un code PHP concis et notamment " ;
00311     echo
href
("http://www.php.net/manual/fr/function.preg-match.php","preg_match","gvert nou")." et " ;
00312     echo
href
("http://www.php.net/manual/fr/function.preg-match-all.php","preg_match_all","gvert nou")."." ;
00313     
finp() ;
00314     
00315     
p
("texte") ;
00316     echo
"Reprendre l'exercice si on admet que certaines lettres ou certains chiffres ne sont pas exploitables. On notera par un tiret toute lettre ou chiffre non su " ;
00317     echo
" à condition qu'il n'y ait pas plus de 3 tirets en tout " ;
00318     echo
" (indication fournie par "
.href("http://fr.wikipedia.org/wiki/Timothy_McGee","Mac Gee","gbleuf nou").")." ;
00319     
finp() ;
00320     
00321     
00322     
finblockquote() ;
00323     
00324     
solution
($numExo,$numTp) ;
00325     
00326     
p
("texte") ;
00327     echo
"Pour le formulaire, consulter le " ;
00328     echo
href
("montresource.php?nomfic=ncis.php","code-source")." de la page." ;
00329     
finp() ;
00330     
00331     
p
("texte") ;
00332     echo
"Le mieux est sans doute d'écrire des fonctions spécialisées pour chaque suspect, d'où la solution " ;
00333     echo
" nommée "
.href("montresource.php?nomfic=ncis_res_sol.php","ncis_res_sol","gvert nou")." testable via " ;
00334     echo
href
("ncis_sol.php").". " ;
00335     echo
" On remarquera les exemples de plaques ajoutés dans la page, utiles pour des tests unitaires et d'intégration." ;
00336     
finp() ;
00337     
00338     
finsolution() ;
00339     
00340     
finblockquote() ;
00341     
00342     
## -------------------------------------------------------------------------------------------
00343     
00344     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Fichiers, expressions régulières et fichiers-URL"
00345     
00346     ## -------------------------------------------------------------------------------------------
00347     
00348     
blockquote() ;
00349     
00350     
blockquote() ;
00351     
00352     
p
("texte") ;
00353     echo
"Rapatriez le fichier "
.href("l2grps_2013.txt","","gbleuf nou")." et reproduisez le tableau fourni dans la " ;
00354     echo
href
("l2a_cc.php","page du controle continu","gvertf nou").". " ;
00355     
finp() ;
00356     
00357     
p
("texte") ;
00358     echo
"On voudrait connaitre la popularité de certains chanteurs ou artistes en consultant le nombre de \"hits\" renvoyés " ;
00359     echo
" par Google quand on entre le nom du chanteur ou de l'artiste dans le moteur de recherches. " ;
00360     echo
" Ecrire une page Web qui affiche la popularité de " ;
00361     echo
" plusieurs chanteurs artistes et qui renvoie les résultats comme dans la page "
.href("motsinternet.php")."." ;
00362     echo
" On utilisera "
.href("http://forge.info.univ-angers.fr/~gh/jphistopct.php","jphistopct")." pour générer les graphiques." ;
00363     echo
" Si vous avez le temps, écrire un formulaire qui permet de saisir le nom des chanteurs ou des artistes." ;
00364     
finp() ;
00365     
00366     
p
("texte") ;
00367     echo
b
("Remarque&nbsp;:") ;
00368     echo
" il est possible de rapatrier le fichier "
.href("l2grps_2013.txt","","gbleuf nou") ;
00369     echo
" en ligne de commandes via&nbsp;" ;
00370     
finp() ;
00371     
00372     
pre
("cadre") ;
00373      echo
"\n" ;
00374      echo
" \$forge_html> wget http://forge.info.univ-angers.fr/~gh/internet/l2grps_2013.txt\n" ;
00375      echo
"\n" ;
00376     
finpre() ;
00377     
00378     
finblockquote() ;
00379     
00380     
solution
($numExo,$numTp) ;
00381     
00382     
p
("texte") ;
00383     echo
"Pour "
.href("l2grps_2013.txt","","gbleuf nou")." il suffit de consulter " ;
00384     echo
href
("montresource.php?nomfic=l2a_cc.php","montresource.php?nomfic=l2a_cc.php","gvertf nou").". " ;
00385     
finp() ;
00386     
00387     
p
("texte") ;
00388     echo
"Dans la mesure où PHP peut ouvrir le fichier correspondant à une URL comme si c'était un fichier local, il suffit de " ;
00389     echo
" repérer le texte comme "
.b("Environ 6&#160;840&#160;000 résultats")." dans la page renvoyée par Google, d'où la solution ".href("chanteurs.php")."." ;
00390     
finp() ;
00391     
/*
00392     p() ;
00393     echo "Pour l'autre partie de l'exercice, ceux et celles qui sont venu(e)s en cours savent où est la solution." ;
00394     echo " Pour les personnes qui ne sont pas inscrites dans mes cours, vous pouvez me contacter par mail." ;
00395     finp() ;*/
00396     
00397     
finsolution() ;
00398     
00399     
finblockquote() ;
00400     
00401     
## -------------------------------------------------------------------------------------------
00402     
00403     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # La structure de données ".b("\"pile\"")." version 2
00404     
00405     ## -------------------------------------------------------------------------------------------
00406     
00407     
blockquote() ;
00408     
00409     
blockquote() ;
00410     
00411     
p
("texte") ;
00412     echo
"Reprendre l'exercice 10 de la série 1 (la structure de données \"pile\") en mode démonstration dans une " ;
00413     echo
" page Web. Indication : on utilisera une "
.href("http://www.php.net/manual/fr/book.session.php","session").". " ;
00414     echo
" Pour un exemple de ce qu'on veut réaliser, cliquer "
.href("pilev2.php","ici").". " ;
00415     
finp() ;
00416     
00417     
finblockquote() ;
00418     
00419     
solution
($numExo,$numTp) ;
00420     
00421     
p
("texte") ;
00422     echo
"Voir "
.href("pilev2.php")." dont le code-source est ci-dessous et " ;
00423     echo
" "
.href("montresource.php?nomfic=pilev2.php","ici","gvertf nou").". " ;
00424     
finp() ;
00425     
00426     
pre_fichier
("pilev2.php","cadre") ;
00427     
00428     
finsolution() ;
00429     
00430     
finblockquote() ;
00431     
00432     
## -------------------------------------------------------------------------------------------
00433     
00434     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # PHP et tables MySQL (1)
00435     
00436     ## -------------------------------------------------------------------------------------------
00437     
00438     
blockquote() ;
00439     
00440     
p
("texte") ;
00441     echo
"On dispose dans "
.href("fa.txt")." des instructions MySql qui ont permis de construire les tables " ;
00442     echo
b
("films")." et ".b("artistes")." dans la base ".s_span("statdata","grouge").". On pourra consulter " ;
00443     echo
" la page "
.href("filmsartistes.html","filmsartistes","gvert nou")." pour voir de façon plus agréable le contenu des tables." ;
00444     
finp() ;
00445     
00446     
p
("texte") ;
00447     echo
"Ecrire un programme qui affiche dans une page Web les 15 premiers films (où est le piège&nbsp;?). On fournira le nom et l'année du film. " ;
00448     echo
" On pourra essayer de trouver le code SQL en ligne de commande sur forge en mode terminal via " ;
00449     
finp() ;
00450     
00451     
pre_fichier
("anonymous.txt","cadrejaune") ;
00452     
00453     
p
("texte") ;
00454     echo
"Afficher ensuite le nom du film, l'année et le metteur en scène pour ces quinze films. " ;
00455     
finp() ;
00456     
00457     
p
("texte") ;
00458     echo
"Ecrite ensuite un \"jeu\" qui tire au hasard un film et demande l'année de sortie. On utilisera astucieusement un formulaire en mode " ;
00459     echo
" POST pour avoir la solution (cachée) dans le formulaire afin de pouvoir vérifier facilement la solution et gérer la réponse en Javascript. " ;
00460     echo
" On indiquera que le jeu est impossible si Javascript n'est pas actif. " ;
00461     echo
" On écrira " ;
00462     echo
" une version 1 qui utilise un champ texte " ;
00463     echo
" pour saisir l'année (c'est donc difficile pour l'utilisateur et simple pour le programmeur) " ;
00464     echo
" puis " ;
00465     echo
" une version 2 qui fournit les années de sortie possibles dans une liste de sélection " ;
00466     echo
" (c'est donc plus facile pour l'utilisateur et moins simple pour le programmeur). " ;
00467     echo
" Voici en deux liens ce qu'on veut obtenir : "
.href("quizz1.php")." et " .href("quizz2.php")."." ;
00468     
finp() ;
00469     
00470     
p
("texte") ;
00471     echo
" Ecrire ensuite un formulaire qui demande de choisir entre "
.b("films")." et ".b("artistes").", " ;
00472     echo
" puis qui demande combien on veut de lignes résultats et à partir de quelle ligne. " ;
00473     echo
" Pour la table films, on utilisera les champs "
.b("idFilm annee genre pays mes titre")." et on triera par ".b("annee")." alors que ";
00474     echo
" pour la table artistes, on utilisera les champs "
.b("idArtiste artnom artprenom anneenaiss")." et on triera par ".b("artnom").". " ;
00475     echo
" Voir "
.href("fa.php")." version 2 comme implémentation de ce qu'on veut." ;
00476     
finp() ;
00477     
00478     
p
("texte") ;
00479     echo
" Pour tous ces programmes, on utilisera "
.b("std.php")." pour produire du ".href("php_conceptuel.php","PHP conceptuel","gbleu nou").". " ;
00480     echo
" On en profitera pour trouver quelles fonctions de "
.b("std.php")." utilisent MySql et celles qui affichent des tableaux." ;
00481     
finp() ;
00482     
00483     
p
("texte") ;
00484     echo
"Le lien " ;
00485     echo
href
("phpmysql.htm","phpmysql") ;
00486     echo
" fournit un rappel de la syntaxe des fonctions et objets PHP pour effectuer des requ&ecirc;tes MySQL." ;
00487     
finp() ;
00488     
00489     
solution
($numExo,$numTp) ;
00490     
00491     
p
("texte") ;
00492     echo
"Le code MySQL pour trouver les quinze premiers films par ordre de date est simple&nbsp;: ";
00493     
finp() ;
00494     
00495     
pre_fichier
("quinzefilms.mysql","cadre") ;
00496     
00497     
p
("texte") ;
00498     echo
"Le piège est le fait que &laquo;les quinze premiers&raquo; n'a aucun sens si on ne précise pas le critère de tri. " ;
00499     echo
" On prend ici la date comme critère de tri." ;
00500     
finp() ;
00501     
00502     
p
("texte") ;
00503     echo
"Il ne reste plus qu'à inclure les résultats de la requ&ecirc;te MySQL dans un tableau XHTML. " ;
00504     echo
"Consulter "
.href("quinzefilms.php","quinzefilms","gvertf nou")." comme page-solution, dont le code est ci-dessous." ;
00505     echo
" Au passage, on a trouvé le metteur en scène gr&acirc;ce au numéro d'artiste." ;
00506     
finp() ;
00507     
00508     
pre_fichier
("quinzefilms.php","cadrebleu") ;
00509     
00510     
p
("texte") ;
00511     echo
"Le premier quizz utilise simplement un champ texte et un champ caché issu de MySql pour que Javascript " ;
00512     echo
" puisse comparer la réponse utilisateur et la solution&nbsp;:" ;
00513     
finp() ;
00514     
00515     
pre_fichier
("quizz1.php","cadrejaune") ;
00516     
00517     
p
("texte") ;
00518     echo
"Le code Javascript se réduit donc à un test et à un affichage&nbsp;" ;
00519     
finp() ;
00520     
00521     
pre_fichier
("quizz1.js","cadre rose_pastel") ;
00522     
00523     
p
("texte") ;
00524     echo
"Le second quizz complète le premier quizz en l'incluant dans une division (élément &lt;div&gt;) avec un style "
.b("invisible") ;
00525     echo
" que Javascript rend visible si Javascript est actif. La réponse est affichée de la m&ecirc;me façon, dans une autre division. " ;
00526     echo
" L'élément &lt;select&gt; qui affiche les années possibles est construit à l'aide de notre fonction " ;
00527     echo
href
("stdphp.php?lafns=listeSelectFromChampMySql","listeSelectFromChampMySql()")." de ".b("std.php").". " ;
00528     
finp() ;
00529     
00530     
pre_fichier
("quizz2.php","cadrejaune") ;
00531     
00532     
p
("texte") ;
00533     echo
"Le code Javascript est donc un tout petit plus compliqué puisqu'il doit mettre la réponse dans un paragraphe&nbsp;:" ;
00534     
finp() ;
00535     
00536     
pre_fichier
("quizz2.js","cadre rose_pastel") ;
00537     
00538     
p
("texte") ;
00539     echo
"Enfin, pour le questionnaire films ou artistes, " ;
00540     echo
" voir "
.href("fa.php")." dont le code-source est ".href("montresource.php?nomfic=fa.php","ici"). " comme exemple de formulaire " ;
00541     echo
" et "
.href("fa_res.php")." dont le code-source est ".href("montresource.php?nomfic=fa_res.php","ici"). " comme fichier implémentant " ;
00542     echo
" l'attribut action. " ;
00543     
finp() ;
00544     
00545     
pre_fichier
("fa.php","cadrebleu") ;
00546     
pre_fichier
("fa_res.php","cadrejaune") ;
00547     
pre_fichier
("fa.js","cadre") ;
00548     
00549     
finsolution() ;
00550     
00551     
finblockquote() ;
00552     
00553     
## -------------------------------------------------------------------------------------------
00554     
00555     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Analyse d'une application (1)
00556     
00557     ## -------------------------------------------------------------------------------------------
00558     
00559     
blockquote() ;
00560     
00561     
blockquote() ;
00562     
00563     
p
("texte") ;
00564     echo
"Essayer de trouver tous les choix de programmation qui ont été faits dans l'implémentation d'un système d'exercices disponible sur " ;
00565     echo
" la page "
.href("sen_quests2.php","senQuest").". On rechargera plusieurs fois la page." ;
00566     
finp() ;
00567     
00568     
p
("texte") ;
00569     echo
"Essayer aussi de définir la ou les bases de données impliquées. " ;
00570     
finp() ;
00571     
00572     
finblockquote() ;
00573     
00574     
solution
($numExo,$numTp) ;
00575     
00576     
00577     
p
("texte") ;
00578     echo
"Une lecture attentive du code source du fichier "
.href("sen_quests2.php")." devrait &ecirc;tre suffisante. " ;
00579     echo
" Vous devez maintenant savoir comment y accéder..." ;
00580     
finp() ;
00581     
00582     
finsolution() ;
00583     
00584     
finblockquote() ;
00585     
00586     
## -------------------------------------------------------------------------------------------
00587     
00588     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Parcours de fichier et documentation
00589     
00590     ## -------------------------------------------------------------------------------------------
00591     
00592     
blockquote() ;
00593     
blockquote() ;
00594     
00595     
p
("texte") ;
00596     echo
"Il est facile de repérer une fonction PHP dans le code source puisqu'elle commence par le mot "
.b("function").". " ;
00597     echo
" En admettant que le début d'une fonction est toujours écrit en début de ligne (précédé éventuellement d'espaces), " ;
00598     echo
" écrire un programme qui liste les fonctions d'un code-source php avec leur numéro de ligne, comme par exemple&nbsp;:" ;
00599     
finp() ;
00600     
00601     
pre_fichier
("listing_design.txt","cadrebleu") ;
00602     
00603     
p
("texte") ;
00604     echo
"Est-ce beaucoup plus compliqué si on essaie de lister toutes les fonctions d'un projet à partir d'un fichier \"maitre\" " ;
00605     echo
" qui contient des "
.href("http://php.net/manual/fr/function.include.php","include")." et des " ;
00606     echo
href
("http://php.net/manual/fr/function.require.php","require")." comme dans " ;
00607     echo
href
("ldphp_xmp.txt")."&nbsp;? " ;
00608     
finp() ;
00609     
00610     
p
("texte") ;
00611     echo
"Expliquer comment les pages " ;
00612     echo
href
("stdphp.php","std","grouge nou")." et " ;
00613     echo
href
("../wstat/statghfns.php","statgh.r","grouge nou")." fonctionnent. " ;
00614     echo
" Quelles précautions faut-il prendre lorsqu'on écrit des fonctions pour profiter d'une telle interface&nbsp;?" ;
00615     
finp() ;
00616     
00617     
finblockquote() ;
00618     
00619     
solution
($numExo,$numTp) ;
00620     
00621     
pvide() ;
00622     
00623     
vnc() ;
00624     
p() ;
00625     echo
"Ceux et celles qui sont venu(e)s en cours savent où est la solution." ;
00626     echo
" Pour les personnes qui ne sont pas inscrites dans mes cours, vous pouvez me contacter par mail." ;
00627     
finp() ;
00628     
00629     
finsolution() ;
00630     
00631     
finblockquote() ;
00632     
00633     
## -------------------------------------------------------------------------------------------
00634     
00635     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Parcours de fichier et comptages d'attributs
00636     
00637     ## -------------------------------------------------------------------------------------------
00638     
00639     
blockquote() ;
00640     
blockquote() ;
00641     
00642     
p
("texte") ;
00643     echo
"On voudrait analyser une page Web en termes d'attributs et d'éléments. " ;
00644     echo
" Ecrire un formulaire qui permet de tester une URL quelconque, y compris un fichier XML. " ;
00645     echo
" On pourra tester la validité W3C du texte analysé&nbsp;; on fournira des URL pr&ecirc;tes à " ;
00646     echo
" l'emploi pour faciliter le test du programme PHP utilisé comme attribut "
.b("action")." du formulaire." ;
00647     
finp() ;
00648     
00649     
finblockquote() ;
00650     
00651     
solution
($numExo,$numTp) ;
00652     
00653     
p
("texte") ;
00654     echo
"Voir la page "
.href("eltatt.php","","gvertf nou")." qui fournit des liens pour les codes-sources PHP utilisés. " ;
00655     
finp() ;
00656     
00657     
finsolution() ;
00658     
00659     
finblockquote() ;
00660     
00661     
## -------------------------------------------------------------------------------------------
00662     
00663     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # PHP et tables MySQL (2)
00664     
00665     ## -------------------------------------------------------------------------------------------
00666     
00667     
blockquote() ;
00668     
blockquote() ;
00669     
00670     
p
("texte") ;
00671     echo
"Compléter le formulaire de la question 6 en ajoutant un critère de tri pour choisir l'affichage. On viendra construire automatiquement " ;
00672     echo
" la liste de tous les champs possibles, et on utilisera des fonctions pour toute action répétée au moins deux fois. Afin d'éviter les " ;
00673     echo
" tests, on utilisera des tableaux associatifs. Il est conseillé d'écrire une fonction "
.b("listeDesChamps(table)")." dans un fichier " ;
00674     echo
" nommé "
.b("resfa_inc.php")." qu'on viendra inclure, aussi bien pour le formulaire que pour les résultats." ;
00675     
finp() ;
00676     
00677     
p
("texte") ;
00678     echo
"Il faudra certainement utiliser du "
.b("Javascript")." dans le formulaire pour choisir quelle liste de champs afficher." ;
00679     
finp() ;
00680     
00681     
finblockquote() ;
00682     
00683     
solution
($numExo,$numTp) ;
00684     
00685     
p
("texte") ;
00686     echo
"Voir "
.href("fa.php")." comme formulaire d'entrée (version 2), dont le code-source est ".href("montresource.php?nomfic=fa.php","ici") ;
00687     echo
" et "
.href("fa_res2.php")." et son ".href("montresource.php?nomfic=fa_res2.php","code source","gbleuf nou")." pour la gestion des résultats. " ;
00688     echo
" Le code-source Javascript utilisé est "
.href("montresource.php?nomfic=fa.js","fa.js","gbleuf nou").". " ;
00689     
finp() ;
00690     
00691     
pre_fichier
("fa.js","cadrebleu") ;
00692     
00693     
finsolution() ;
00694     
00695     
finblockquote() ;
00696     
00697     
## -------------------------------------------------------------------------------------------
00698     
00699     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "PHP, tables, éléments et Javascript
00700     
00701     ## -------------------------------------------------------------------------------------------
00702     
00703     
blockquote() ;
00704     
blockquote() ;
00705     
00706     
p
("texte") ;
00707     echo
"Après réflexion, on aimerait que les tableaux affichés lors d'une requ&ecirc;te MySQL soient " ;
00708     echo
" triables quand on clique sur l'en-tete de la colonne. Est-ce facile à implémenter&nbsp;?" ;
00709     
finp() ;
00710     
00711     
p
("texte") ;
00712     echo
"De m&ecirc;me, si on pagine l'affichage avec un choix personnalisé (10 par page, 20 par page...)," ;
00713     echo
" est-ce facile de disposer d'un bouton ou d'un lien "
.b("voir les xx suivants")."&nbsp;?" ;
00714     
finp() ;
00715     
00716     
p
("texte") ;
00717     echo
"Essayez de réaliser une page en PHP et Javascript qui utilise les éléments de formulaire suivants pour " ;
00718     echo
" afficher les films&nbsp;:" ;
00719     
finp() ;
00720     
00721     
blockquote() ;
00722     
div
("cadre") ;
00723     
p() ;
00724     
nbsp
(5) ;
00725     
bouton
("debl","class='bouton_fin vert_pastel'","","&nbsp;Début de liste&nbsp;") ;
00726     
nbsp
(5) ;
00727     
bouton
("suiv","class='bouton_fin jaune_pastel'","","&nbsp;Suivants&nbsp;") ;
00728     
nbsp
(5) ;
00729     
bouton
("mili","class='bouton_fin bleu_pastel'","","&nbsp;Milieu&nbsp;") ;
00730     
nbsp
(5) ;
00731     
bouton
("prec","class='bouton_fin jaune_pastel'","","&nbsp;Précédents&nbsp;") ;
00732     
nbsp
(5) ;
00733     
bouton
("fin","class='bouton_fin vert_pastel'","","&nbsp;Fin de liste&nbsp;") ;
00734     
finp() ;
00735     
p() ;
00736     
nbsp
(5) ;
00737      echo
b
("Paramétrisation&nbsp;:&nbsp;") ;
00738     
listeSelectFromTxt
("nbParPag","5 10 20 25 50"); echo "films par page " ;
00739     
finp() ;
00740     
findiv() ;
00741     
finblockquote() ;
00742     
00743     
p
("texte") ;
00744     echo
"Essayez ensuite de réaliser une page en PHP et Javascript pour afficher les films sans rechargement explicite de la page." ;
00745     
finp() ;
00746     
00747     
finblockquote() ;
00748     
00749     
solution
($numExo,$numTp) ;
00750     
00751     
p
("texte") ;
00752     echo
"Avoir un tableau XHTML triable n'est pas du ressort de PHP mais de Javascript. " ;
00753     echo
" Nous conseillons d'utiliser "
.href("../js/sorttable.js","sorttable.js","gbleuf nou")." qui demande seulement à &ecirc;tre inclus " ;
00754     echo
" dans la page et à ajouter "
.b("class='sortable'")." dans l'élément table." ;
00755     echo
" Une démonstration est fournie dans le "
.href("l2a_cc.php","texte du CC","grouge nou")." et ci-dessous&nbsp;: cliquez sur les noms de colonnes... " ;
00756     
finp() ;
00757     
00758     
jsf
("../js/sorttable.js") ;
00759     
blockquote() ;
00760     
table
(1,15,"collapse sortable jaune_pastel") ;
00761     
tr() ;
00762     
th
() ; echo "Nom usuel" ; finth() ;
00763     
th
() ; echo "Prénom principal" ; finth() ;
00764     
fintr() ;
00765     
tr() ;
00766     
td
() ; echo "BOND" ; fintd() ;
00767     
td
() ; echo "James" ; fintd() ;
00768     
fintr() ;
00769     
tr() ;
00770     
td
() ; echo "ARMA" ; fintd() ;
00771     
td
() ; echo "Line" ; fintd() ;
00772     
fintr() ;
00773     
tr() ;
00774     
td
() ; echo "ZOLA" ; fintd() ;
00775     
td
() ; echo "Emile" ; fintd() ;
00776     
fintr() ;
00777     
fintable() ;
00778     
finblockquote() ;
00779     
00780     
p
("texte") ;
00781     echo
"Pour la pagination, ce n'est pas très compliqué non plus, tout dépend d'où viennent les pages. " ;
00782     echo
" Par exemple, pour un diaporama avec une liste de fichiers ou une liste d'URL, regardez "
.href("../frames/framesindex.php","diaporamas").". " ;
00783     echo
" Si les données viennent d'une base de données, il faut certainement jouer avec le SELECT ... LIMIT " ;
00784     echo
" pour envoyer les \"bonnes\" informations. Voir "
.href("pagination.php")." comme exemple d'implémentation. " ;
00785     echo
" Pour comprendre la page "
.href("pagination.php")." on pourra remplacer POST par GET et décommenter les lignes indiquées dans le code-source. " ;
00786     echo
" L'heure est affichée à chaque fois afin de montrer que chaque action utilisateur recharge la page. " ;
00787     
finp() ;
00788     
00789     
p
("texte") ;
00790     echo
"Pour une solution PHP et AJAX, sans recharger la page, le code est un peu plus compliqué puisqu'il faut effacer la zone du tableau et " ;
00791     echo
" en reconstruire un autre, solution sans doute plus rapide que de réécrire dans les cases du tableau. Pour cela, on pourrait utiliser un " ;
00792     echo
" programme PHP qui renvoie juste le tableau en XHTML et laisser à Javascript le soin de remplacer le tableau précédent avec ce tableau." ;
00793     
finp() ;
00794     
00795     
finsolution() ;
00796     
00797     
finblockquote() ;
00798     
00799     
## -------------------------------------------------------------------------------------------
00800     
00801     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Analyse d'une application (2)
00802     
00803     ## -------------------------------------------------------------------------------------------
00804     
00805     
blockquote() ;
00806     
00807     
blockquote() ;
00808     
00809     
p
("texte") ;
00810     echo
"Essayer de trouver tous les choix qui ont été faits ainsi que leur motivation dans l'implémentation d'un système de rendez-vous d'exposé de stage disponible sur " ;
00811     echo
" la page "
.href("../stages/propsout.php","stages","grouge nou").". " ;
00812     
finp() ;
00813     
00814     
p
("texte") ;
00815     echo
"Essayer aussi de définir la ou les bases de données impliquées. " ;
00816     
finp() ;
00817     
00818     
00819     
p
("texte") ;
00820     echo
"Essayer d'imaginer tout ce que peut représenter l'analyse et l'implémentation d'un site comme " ;
00821     echo
href
("../Leadb/","LEAdb","gvertf nou")." qui est XHTML valide. On viendra parcourir les différents menus pour voir tout ce qu'il est possible de " ;
00822     echo
" faire sur le site." ;
00823     
finp() ;
00824     
00825     
finblockquote() ;
00826     
00827     
solution
($numExo,$numTp) ;
00828     
00829     
vnc() ;
00830     
00831     
finsolution() ;
00832     
00833     
finblockquote() ;
00834     
00835     
00836     
## -------------------------------------------------------------------------------------------
00837     
00838     
finPageTp
($numTp) ; # contient finSection() et finPage() ; la fonction est dans l2a_inc.php
00839     
00840     
?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)