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 ","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 ê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 ?" ;
00069 finp() ;
00070
00071 p("texte") ;
00072 echo "Est-ce qu'une fonction PHP peut renvoyer plusieurs valeurs ou plusieurs variables ?" ;
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 ?" ;
00081 finp() ;
00082
00083 p("texte") ;
00084 echo "Au passage, quelles sont toutes les fonctions liées aux tableaux en PHP ?" ;
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 ?" ;
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 " ê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 ê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 :" ;
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 ê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 :" ;
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 :" ;
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 : ".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 -l 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 > 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 !) via :" ;
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")." ? " ;
00183 echo " Comment sait-on si une fonction de ".b("std.php")." fait un ".b("echo")." ou un ".b("return")." ? " ;
00184 echo " Comment sont nommées les fonctions de ".b("std.php")." ? " ;
00185 finp() ;
00186
00187 p("texte") ;
00188 echo "Expliquer ensuite comment est généré et où (client ? serveur ?) 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é :" ;
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 ? Y a-t-il un message d'erreur ?" ;
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ûr pour regarder les autres exercices..." ;
00221 finp() ;
00222
00223 p("texte") ;
00224 echo "Le code conceptuel est donc :" ;
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 «courts» 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 <p>," ;
00243 echo " ".b("br()")." pour <br />. Pour raccourcir la frappe, les divers <input> 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("<h1>")." 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("<h1>")." puis le " ;
00250 echo " texte ".b("Bonsoir !")." qui est inséré dans le ".b("<h1>")." et Javascript ajoute ensuite cet élément ".b("<h1>")." à 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 !")." 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 -- ".href("http://fr.wikipedia.org/wiki/Abigail_Sciuto","Abigail Scituo")." --" ;
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âce au ".href("http://en.wikipedia.org/wiki/Naval_Criminal_Investigative_Service","NCIS")." :" ;
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 :") ;
00368 echo " il est possible de rapatrier le fichier ".href("l2grps_2013.txt","","gbleuf nou") ;
00369 echo " en ligne de commandes via " ;
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 840 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 ?). 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ê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 : ";
00493 finp() ;
00494
00495 pre_fichier("quinzefilms.mysql","cadre") ;
00496
00497 p("texte") ;
00498 echo "Le piège est le fait que «les quinze premiers» 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ê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â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 :" ;
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 " ;
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 <div>) avec un style ".b("invisible") ;
00525 echo " que Javascript rend visible si Javascript est actif. La réponse est affichée de la même façon, dans une autre division. " ;
00526 echo " L'élément <select> 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 :" ;
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 ê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 :" ;
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")." ? " ;
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 ?" ;
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é ; on fournira des URL prê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ête MySQL soient " ;
00708 echo " triables quand on clique sur l'en-tete de la colonne. Est-ce facile à implémenter ?" ;
00709 finp() ;
00710
00711 p("texte") ;
00712 echo "De mê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")." ?" ;
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 :" ;
00719 finp() ;
00720
00721 blockquote() ;
00722 div("cadre") ;
00723 p() ;
00724 nbsp(5) ;
00725 bouton("debl","class='bouton_fin vert_pastel'",""," Début de liste ") ;
00726 nbsp(5) ;
00727 bouton("suiv","class='bouton_fin jaune_pastel'",""," Suivants ") ;
00728 nbsp(5) ;
00729 bouton("mili","class='bouton_fin bleu_pastel'",""," Milieu ") ;
00730 nbsp(5) ;
00731 bouton("prec","class='bouton_fin jaune_pastel'",""," Précédents ") ;
00732 nbsp(5) ;
00733 bouton("fin","class='bouton_fin vert_pastel'",""," Fin de liste ") ;
00734 finp() ;
00735 p() ;
00736 nbsp(5) ;
00737 echo b("Paramétrisation : ") ;
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 à ê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 : 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 ?>
La coloration syntaxique est réalisée par un enrobage de la function php nommée highlight_file
mais si vous préférez, vous pouvez utiliser celle de SyntaxHighlighter ou même celle de geshi.
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)