Listing du fichier l2a_tp2.php avec syntaxhighlighter
<?php # (gH) -_- l2a_tp2.php ; TimeStamp (unix) : 27 Février 2013 vers 12:35 error_reporting(E_ALL | E_NOTICE | E_STRICT) ; include("std.php") ; include("l2a_inc.php") ; $numTp = 2 ; debutPageTp($numTp) ; ## ------------------------------------------------------------------------------------------- sdl(3) ; echo cmt(' pour afficher toutes les solutions : l2a_tp'.$numTp.'.php?solutions=1') ; sdl(3) ; ## ------------------------------------------------------------------------------------------- debutSection() ; p("texte") ; echo s_span("Remarque ","grouge").": vous pouvez désormais utiliser Windows ou Linux pour écrire vos fichiers. " ; echo " De plus, il est possible d'utiliser le serveur ".b("devel.info-ua")." au lieu de ".b("forge.info.univ-angers.fr") ; echo " pour exécuter vos pages PHP. Cet autre serveur affiche les erreurs PHP alors que ".b("forge")." renvoie une page blanche." ; echo " Si vous êtes dans une des salles locales de TP, vous pouvez utiliser la forme courte du serveur, à savoir " ; echo " ".b("forge.info-ua")." au lieu de ".b("forge.info.univ-angers.fr").". " ; finp() ; pvide() ; $tableauDesRubriques = array() ; $idr = 0 ; $idr++; $tableauDesRubriques[$idr] = "Ecriture de fonctions et procédures" ; $idr++; $tableauDesRubriques[$idr] = "PHP conceptuel et utilisation de bibliothèques de fonctions" ; $idr++; $tableauDesRubriques[$idr] = "Expressions régulières et chaines de caractères" ; $idr++; $tableauDesRubriques[$idr] = "Fichiers, expressions régulières et fichiers-URL" ; $idr++; $tableauDesRubriques[$idr] = "La structure de données ".b("\"pile\"")." version 2" ; $idr++; $tableauDesRubriques[$idr] = "PHP et tables MySQL (1)" ; $idr++; $tableauDesRubriques[$idr] = "Analyse d'une application (1)" ; $idr++; $tableauDesRubriques[$idr] = "Parcours de fichier et documentation" ; $idr++; $tableauDesRubriques[$idr] = "Parcours de fichier et comptages d'attributs" ; $idr++; $tableauDesRubriques[$idr] = "PHP et tables MySQL (2)" ; $idr++; $tableauDesRubriques[$idr] = "PHP, tables, éléments et Javascript" ; $idr++; $tableauDesRubriques[$idr] = "Analyse d'une application (2)" ; $tdmCRLM = new tdm($tableauDesRubriques) ; $tdmCRLM->titre() ; $tdmCRLM->menu("oui","oui","nou") ; pvide() ; p() ; echo "Il est possible d'afficher toutes les solutions via ".href("l2a_tp$numTp.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ; finp() ; finSection() ; debutSection() ; $numExo = 0 ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Ecriture de fonctions et procédures ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "En programmation, on distingue classiquement fonction et procédure. Comment fait-on la différence en PHP ?" ; finp() ; p("texte") ; echo "Est-ce qu'une fonction PHP peut renvoyer plusieurs valeurs ou plusieurs variables ?" ; finp() ; p("texte") ; echo b("Application :")." écrire une fonction ".b("min_max")." qui renvoie la plus petite valeur et la plus grande valeur d'un "; echo href("http://php.net/manual/fr/language.types.array.php","\"array\"","gvertf nou").", " ; echo " qu'on testera en ligne de commandes." ; echo " Peut-on utiliser ".href("http://php.net/manual/fr/language.exceptions.php","try","grouge nou") ; echo " pour s'assurer que la variable passée est bien un tableau ?" ; finp() ; p("texte") ; echo "Au passage, quelles sont toutes les fonctions liées aux tableaux en PHP ?" ; echo " Et comment vérifier la syntaxe d'un programme PHP, puisqu'une erreur de syntaxe comme oublier un point-virgule ou " ; echo " un guillemet fait que tout la page HTML est blanche (vide) comme sur tout serveur de production ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "En PHP, tout est fonction. Mais l'instruction ".b("return()")." est facultative. Donc une fonction PHP sans " ; echo href("http://php.net/manual/fr/function.return.php","return()","gbleu nou")." peut " ; echo " être considérée comme une procédure." ; finp() ; p("texte") ; 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 " ; echo " tableau, ce qui permet de renvoyer plusieurs valeurs. En voici un exemple avec le renvoi du min et du max d'un tableau :" ; finp() ; pre_fichier("minmax.php","cadre") ; p("texte") ; echo "Il y a un peu moins d'une centaine de fonctions directement liées aux tableaux en PHP, comme le montre la page " ; echo href("http://www.php.net/manual/fr/ref.array.php","ref.array","gbleuf nou")." du manuel de référence. " ; echo " C'est sans doute trop, certaines fonctions auraient pu être regroupées à l'aide d'options, comme en " ; echo href("../tuteurs/tutperl.htm","PERL","grouge nou").". " ; finp() ; p("texte") ; echo " On ne peut pas utiliser ".href("http://php.net/manual/fr/language.exceptions.php","try","grouge nou") ; 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 " ; echo " des erreurs, mais seulement des ".em("warnings").". Donc le programme suivant ne \"capte\" rien :" ; finp() ; pre_fichier("minmaxv2.php","cadre") ; p("texte") ; echo "Il faut lire le ".href("http://www.php.net/manual/fr/index.php","manuel php","gvertf nou") ; echo " pour trouver qu'il existe une fonction ".href("http://php.net/manual/fr/function.is-array.php","is_array","gbleuf nou") ; echo " qui permet de résoudre notre problème :" ; finp() ; pre_fichier("minmaxv3.php","cadre") ; p("texte") ; echo "On remarquera au passage l'incohérence de nommage des fonctions en PHP avec ".b("isset")." et ".b("is-array")." et " ; echo " l'incohérence de nommage de la page Web : ".b("is-array.php")." pour ".b("is_array").". "; finp() ; p("texte") ; echo "Pour vérifier la syntaxe d'un programme PHP, le mieux est d'utiliser ".b("php -l fichier")." en ligne de commande, " ; echo" lorsqu'on a accès à une session en mode terminal sur le serveur. Sinon, on peut utiliser " ; echo href("http://www.icosaedro.it/phplint/phplint-on-line.html","php lint","gbleuf nou").", " ; echo href("http://phpcodechecker.com","phpcodechecker","gbleuf nou")." ou " ; echo href("http://www.meandeviation.com/tutorials/learnphp/php-syntax-check/v5-2/syntax-check.php","php syntax check","gbleuf nou").". " ; echo " Mais ceci ne vous dispense pas de XHTML validator parce que le code PHP suivant est valide, mais pas le code XHTML produit " ; echo " à cause du deuxième > en fin d'instruction et de l'absence d'apostrophe fermante pour l'attribut ".b("class")."." ; finp() ; pre_fichier("errnoerr.php","cadrebleu") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # PHP conceptuel et utilisation de bibliothèques de fonctions ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Réécrire le code PHP suivant en mode \"conceptuel\", c'est-à-dire sans aucune balise apparente, à l'aide de " ; echo href("stdphp.php","std.php","grouge nou")." (archive " ; echo href("std.zip","","gvertf nou").") dans une page Web valide au sens ".b("XHTML strict").". " ; finp() ; pre_fichier("nonconcept.php","cadre") ; p("texte") ; echo "Il est possible de rapatrier l'archive et de la décompresser en ligne de commandes (dans le bon répertoire !) via :" ; finp() ; pre_fichier("wgetarch2.txt","cadrejaune") ; p("texte") ; 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") ; echo " du fichier ".b("std.php")." pour afficher une page qui implémente une table des matières cliquable avec deux ou trois \"chapitres\" " ; echo " qui contiennent chacun deux ou trois paragraphes générés par la fonction ".b("para()")."." ; finp() ; p("texte") ; echo "Comment est définie la fonction ".b("h1()")." dans ".b("std.php")." ? " ; echo " Comment sait-on si une fonction de ".b("std.php")." fait un ".b("echo")." ou un ".b("return")." ? " ; echo " Comment sont nommées les fonctions de ".b("std.php")." ? " ; finp() ; p("texte") ; echo "Expliquer ensuite comment est généré et où (client ? serveur ?) le code XHTML produit en PHP et Javascript " ; echo " dans la section identifiée par ".b("sectdyn")." si on utilise le texte suivant " ; echo " qui correspond à la page ".href("jsdyn.php").". " ; finp() ; pre_fichier("jsdyn.php","cadre") ; p("texte") ; echo "Voici le fichier Javascript utilisé :" ; finp() ; pre_fichier("jsdyn.js","cadrejaune") ; p("texte") ; echo "Que se passe-t-il si Javascript n'est pas actif ? Y a-t-il un message d'erreur ?" ; finp() ; p("texte") ; echo "Après avoir lu le fichier ".href("montre.js")." écrire en PHP conceptuel une page qui utilise un bouton ".b("Afficher/Masquer") ; echo " qui sert à montrer ou cacher le texte préformaté mis dans un élement dont l'".b("id")." est ".b("surprise")." " ; echo " comme dans ".href("surprise.php").". " ; finp() ; pre_fichier("montre.js","cadre") ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Il s'agit en fait de l'".href("tds.php#rewrite","exercice 11","gvertf nou")." de notre cours sur la " ; echo href("pdc.php","technologie internet","gbleuf nou")." dont la solution est ".href("solutions.php#rewrite","ici","grouge nou").". " ; echo " On en profitera bien sûr pour regarder les autres exercices..." ; finp() ; p("texte") ; echo "Le code conceptuel est donc :" ; finp() ; pre_fichier("ouiconcept.php","cadre") ; p("texte") ; echo "Pour une démonstration de table des matières avec la fonction ".b("para()").", " ; echo " voir ".href("tdm_demo.php")." dont le code-source est ".href("montresource.php?nomfic=tdm_demo.php","ici")." et ci-dessous." ; finp() ; pre_fichier("tdm_demo.php","cadre") ; p("texte") ; 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()")." " ; echo " avec le niveau (".b("1, 2, 3")."...) passé en paramètre." ; echo " On peut consulter son code source ".href("stdphp.php?lafns=h1","ici").". " ; echo " La plupart des éléments XHTML «courts» sont implémentés comme des fonctions avec des ".b("echo").". " ; echo " Par contre les fonctions comme ".b("s_span()").", ".b("b()")." et ".b("href()")." utilisent ".b("return").". " ; echo " Les fonctions sont nommées comme les éléments. Ainsi il y a ".b("p()")." pour <p>," ; echo " ".b("br()")." pour <br />. Pour raccourcir la frappe, les divers <input> d'un formulaire " ; echo " ont leur propre fonction." ; finp() ; p("texte") ; 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\". " ; 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 " ; echo " texte ".b("Bonsoir !")." qui est inséré dans le ".b("<h1>")." et Javascript ajoute ensuite cet élément ".b("<h1>")." à la division." ; finp() ; p("texte") ; echo "Si Javascript n'est pas actif, il n'y a aucun message d'erreur, mais ".b("Bonsoir !")." ne sera pas affiché." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions régulières et chaines de caractères ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Il faudrait aider la ".em("jej")." (jeune et jolie) Abby -- ".href("http://fr.wikipedia.org/wiki/Abigail_Sciuto","Abigail Scituo")." --" ; echo " à identifier des suspects à l'aide de numéros de plaques minéralogiques. " ; echo " Voici ce qu'on sait des plaques des suspects, grâce au ".href("http://en.wikipedia.org/wiki/Naval_Criminal_Investigative_Service","NCIS")." :" ; finp() ; ul() ; debutli() ; p("texte") ; 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." ; finp() ; finli() ; debutli() ; p("texte") ; echo " si toutes les lettres sont des consonnes, il s'agit du suspect nommé " ; echo href("http://fr.wikipedia.org/wiki/Liste_des_personnages_de_NCIS_:_Enqu%C3%AAtes_sp%C3%A9ciales","Ari Haswari","gbleuf nou")."." ; finp() ; finli() ; debutli() ; p("texte") ; echo " si le numéro de plaque comporte un chiffre répété, il s'agit du " ; 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")."." ; finp() ; finli() ; debutli() ; p("texte") ; echo " si le numéro de plaque comporte avant les lettres exactement 4 chiffres avec une alternance pair/impair, il s'agit de " ; echo href("http://fr.wikipedia.org/wiki/Liste_des_%C3%A9pisodes_de_NCIS_:_Enqu%C3%AAtes_sp%C3%A9ciales","\"la grenouille\"","gbleuf nou")."." ; ; finp() ; finli() ; finul() ; p("texte") ; echo "Ecrire un document PHP qui reproduit le premier formulaire de la page ".href("ncis.php")." via du code valide pour XHTML strict. " ; 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") ; echo " et on mettra un lien vers ".href("http://fr.wikipedia.org/wiki/Abigail_Sciuto","la page Wiki associée").". " ; finp() ; p("texte") ; 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 " ; echo " quand on saisit un numéro de plaque. On utilisera, quand c'est possible les " ; 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 " ; echo href("http://www.php.net/manual/fr/function.preg-match.php","preg_match","gvert nou")." et " ; echo href("http://www.php.net/manual/fr/function.preg-match-all.php","preg_match_all","gvert nou")."." ; finp() ; p("texte") ; 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 " ; echo " à condition qu'il n'y ait pas plus de 3 tirets en tout " ; echo " (indication fournie par ".href("http://fr.wikipedia.org/wiki/Timothy_McGee","Mac Gee","gbleuf nou").")." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Pour le formulaire, consulter le " ; echo href("montresource.php?nomfic=ncis.php","code-source")." de la page." ; finp() ; p("texte") ; echo "Le mieux est sans doute d'écrire des fonctions spécialisées pour chaque suspect, d'où la solution " ; echo " nommée ".href("montresource.php?nomfic=ncis_res_sol.php","ncis_res_sol","gvert nou")." testable via " ; echo href("ncis_sol.php").". " ; echo " On remarquera les exemples de plaques ajoutés dans la page, utiles pour des tests unitaires et d'intégration." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Fichiers, expressions régulières et fichiers-URL" ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Rapatriez le fichier ".href("l2grps_2013.txt","","gbleuf nou")." et reproduisez le tableau fourni dans la " ; echo href("l2a_cc.php","page du controle continu","gvertf nou").". " ; finp() ; p("texte") ; echo "On voudrait connaitre la popularité de certains chanteurs ou artistes en consultant le nombre de \"hits\" renvoyés " ; echo " par Google quand on entre le nom du chanteur ou de l'artiste dans le moteur de recherches. " ; echo " Ecrire une page Web qui affiche la popularité de " ; echo " plusieurs chanteurs artistes et qui renvoie les résultats comme dans la page ".href("motsinternet.php")."." ; echo " On utilisera ".href("http://forge.info.univ-angers.fr/~gh/jphistopct.php","jphistopct")." pour générer les graphiques." ; echo " Si vous avez le temps, écrire un formulaire qui permet de saisir le nom des chanteurs ou des artistes." ; finp() ; p("texte") ; echo b("Remarque :") ; echo " il est possible de rapatrier le fichier ".href("l2grps_2013.txt","","gbleuf nou") ; echo " en ligne de commandes via " ; finp() ; pre("cadre") ; echo "\n" ; echo " \$forge_html> wget http://forge.info.univ-angers.fr/~gh/internet/l2grps_2013.txt\n" ; echo "\n" ; finpre() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Pour ".href("l2grps_2013.txt","","gbleuf nou")." il suffit de consulter " ; echo href("montresource.php?nomfic=l2a_cc.php","montresource.php?nomfic=l2a_cc.php","gvertf nou").". " ; finp() ; p("texte") ; echo "Dans la mesure où PHP peut ouvrir le fichier correspondant à une URL comme si c'était un fichier local, il suffit de " ; 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")."." ; finp() ; /* p() ; echo "Pour l'autre partie de l'exercice, ceux et celles qui sont venu(e)s en cours savent où est la solution." ; echo " Pour les personnes qui ne sont pas inscrites dans mes cours, vous pouvez me contacter par mail." ; finp() ;*/ finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # La structure de données ".b("\"pile\"")." version 2 ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Reprendre l'exercice 10 de la série 1 (la structure de données \"pile\") en mode démonstration dans une " ; echo " page Web. Indication : on utilisera une ".href("http://www.php.net/manual/fr/book.session.php","session").". " ; echo " Pour un exemple de ce qu'on veut réaliser, cliquer ".href("pilev2.php","ici").". " ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Voir ".href("pilev2.php")." dont le code-source est ci-dessous et " ; echo " ".href("montresource.php?nomfic=pilev2.php","ici","gvertf nou").". " ; finp() ; pre_fichier("pilev2.php","cadre") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # PHP et tables MySQL (1) ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; echo "On dispose dans ".href("fa.txt")." des instructions MySql qui ont permis de construire les tables " ; echo b("films")." et ".b("artistes")." dans la base ".s_span("statdata","grouge").". On pourra consulter " ; echo " la page ".href("filmsartistes.html","filmsartistes","gvert nou")." pour voir de façon plus agréable le contenu des tables." ; finp() ; p("texte") ; 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. " ; echo " On pourra essayer de trouver le code SQL en ligne de commande sur forge en mode terminal via " ; finp() ; pre_fichier("anonymous.txt","cadrejaune") ; p("texte") ; echo "Afficher ensuite le nom du film, l'année et le metteur en scène pour ces quinze films. " ; finp() ; p("texte") ; 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 " ; 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. " ; echo " On indiquera que le jeu est impossible si Javascript n'est pas actif. " ; echo " On écrira " ; echo " une version 1 qui utilise un champ texte " ; echo " pour saisir l'année (c'est donc difficile pour l'utilisateur et simple pour le programmeur) " ; echo " puis " ; echo " une version 2 qui fournit les années de sortie possibles dans une liste de sélection " ; echo " (c'est donc plus facile pour l'utilisateur et moins simple pour le programmeur). " ; echo " Voici en deux liens ce qu'on veut obtenir : ".href("quizz1.php")." et " .href("quizz2.php")."." ; finp() ; p("texte") ; echo " Ecrire ensuite un formulaire qui demande de choisir entre ".b("films")." et ".b("artistes").", " ; echo " puis qui demande combien on veut de lignes résultats et à partir de quelle ligne. " ; echo " Pour la table films, on utilisera les champs ".b("idFilm annee genre pays mes titre")." et on triera par ".b("annee")." alors que "; echo " pour la table artistes, on utilisera les champs ".b("idArtiste artnom artprenom anneenaiss")." et on triera par ".b("artnom").". " ; echo " Voir ".href("fa.php")." version 2 comme implémentation de ce qu'on veut." ; finp() ; p("texte") ; echo " Pour tous ces programmes, on utilisera ".b("std.php")." pour produire du ".href("php_conceptuel.php","PHP conceptuel","gbleu nou").". " ; echo " On en profitera pour trouver quelles fonctions de ".b("std.php")." utilisent MySql et celles qui affichent des tableaux." ; finp() ; p("texte") ; echo "Le lien " ; echo href("phpmysql.htm","phpmysql") ; echo " fournit un rappel de la syntaxe des fonctions et objets PHP pour effectuer des requêtes MySQL." ; finp() ; solution($numExo,$numTp) ; p("texte") ; echo "Le code MySQL pour trouver les quinze premiers films par ordre de date est simple : "; finp() ; pre_fichier("quinzefilms.mysql","cadre") ; p("texte") ; 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. " ; echo " On prend ici la date comme critère de tri." ; finp() ; p("texte") ; echo "Il ne reste plus qu'à inclure les résultats de la requête MySQL dans un tableau XHTML. " ; echo "Consulter ".href("quinzefilms.php","quinzefilms","gvertf nou")." comme page-solution, dont le code est ci-dessous." ; echo " Au passage, on a trouvé le metteur en scène grâce au numéro d'artiste." ; finp() ; pre_fichier("quinzefilms.php","cadrebleu") ; p("texte") ; echo "Le premier quizz utilise simplement un champ texte et un champ caché issu de MySql pour que Javascript " ; echo" puisse comparer la réponse utilisateur et la solution :" ; finp() ; pre_fichier("quizz1.php","cadrejaune") ; p("texte") ; echo "Le code Javascript se réduit donc à un test et à un affichage " ; finp() ; pre_fichier("quizz1.js","cadre rose_pastel") ; p("texte") ; echo "Le second quizz complète le premier quizz en l'incluant dans une division (élément <div>) avec un style ".b("invisible") ; 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. " ; echo " L'élément <select> qui affiche les années possibles est construit à l'aide de notre fonction " ; echo href("stdphp.php?lafns=listeSelectFromChampMySql","listeSelectFromChampMySql()")." de ".b("std.php").". " ; finp() ; pre_fichier("quizz2.php","cadrejaune") ; p("texte") ; echo "Le code Javascript est donc un tout petit plus compliqué puisqu'il doit mettre la réponse dans un paragraphe :" ; finp() ; pre_fichier("quizz2.js","cadre rose_pastel") ; p("texte") ; echo "Enfin, pour le questionnaire films ou artistes, " ; echo " voir ".href("fa.php")." dont le code-source est ".href("montresource.php?nomfic=fa.php","ici"). " comme exemple de formulaire " ; echo " et ".href("fa_res.php")." dont le code-source est ".href("montresource.php?nomfic=fa_res.php","ici"). " comme fichier implémentant " ; echo " l'attribut action. " ; finp() ; pre_fichier("fa.php","cadrebleu") ; pre_fichier("fa_res.php","cadrejaune") ; pre_fichier("fa.js","cadre") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Analyse d'une application (1) ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; 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 " ; echo " la page ".href("sen_quests2.php","senQuest").". On rechargera plusieurs fois la page." ; finp() ; p("texte") ; echo "Essayer aussi de définir la ou les bases de données impliquées. " ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Une lecture attentive du code source du fichier ".href("sen_quests2.php")." devrait être suffisante. " ; echo " Vous devez maintenant savoir comment y accéder..." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Parcours de fichier et documentation ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Il est facile de repérer une fonction PHP dans le code source puisqu'elle commence par le mot ".b("function").". " ; echo " En admettant que le début d'une fonction est toujours écrit en début de ligne (précédé éventuellement d'espaces), " ; echo " écrire un programme qui liste les fonctions d'un code-source php avec leur numéro de ligne, comme par exemple :" ; finp() ; pre_fichier("listing_design.txt","cadrebleu") ; p("texte") ; echo "Est-ce beaucoup plus compliqué si on essaie de lister toutes les fonctions d'un projet à partir d'un fichier \"maitre\" " ; echo " qui contient des ".href("http://php.net/manual/fr/function.include.php","include")." et des " ; echo href("http://php.net/manual/fr/function.require.php","require")." comme dans " ; echo href("ldphp_xmp.txt")." ? " ; finp() ; p("texte") ; echo "Expliquer comment les pages " ; echo href("stdphp.php","std","grouge nou")." et " ; echo href("../wstat/statghfns.php","statgh.r","grouge nou")." fonctionnent. " ; echo " Quelles précautions faut-il prendre lorsqu'on écrit des fonctions pour profiter d'une telle interface ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; pvide() ; vnc() ; p() ; echo "Ceux et celles qui sont venu(e)s en cours savent où est la solution." ; echo " Pour les personnes qui ne sont pas inscrites dans mes cours, vous pouvez me contacter par mail." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Parcours de fichier et comptages d'attributs ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "On voudrait analyser une page Web en termes d'attributs et d'éléments. " ; echo " Ecrire un formulaire qui permet de tester une URL quelconque, y compris un fichier XML. " ; echo " On pourra tester la validité W3C du texte analysé ; on fournira des URL prêtes à " ; echo " l'emploi pour faciliter le test du programme PHP utilisé comme attribut ".b("action")." du formulaire." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Voir la page ".href("eltatt.php","","gvertf nou")." qui fournit des liens pour les codes-sources PHP utilisés. " ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # PHP et tables MySQL (2) ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Compléter le formulaire de la question 6 en ajoutant un critère de tri pour choisir l'affichage. On viendra construire automatiquement " ; 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 " ; echo " tests, on utilisera des tableaux associatifs. Il est conseillé d'écrire une fonction ".b("listeDesChamps(table)")." dans un fichier " ; echo " nommé ".b("resfa_inc.php")." qu'on viendra inclure, aussi bien pour le formulaire que pour les résultats." ; finp() ; p("texte") ; echo "Il faudra certainement utiliser du ".b("Javascript")." dans le formulaire pour choisir quelle liste de champs afficher." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Voir ".href("fa.php")." comme formulaire d'entrée (version 2), dont le code-source est ".href("montresource.php?nomfic=fa.php","ici") ; 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. " ; echo " Le code-source Javascript utilisé est ".href("montresource.php?nomfic=fa.js","fa.js","gbleuf nou").". " ; finp() ; pre_fichier("fa.js","cadrebleu") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # "PHP, tables, éléments et Javascript ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Après réflexion, on aimerait que les tableaux affichés lors d'une requête MySQL soient " ; echo " triables quand on clique sur l'en-tete de la colonne. Est-ce facile à implémenter ?" ; finp() ; p("texte") ; echo "De même, si on pagine l'affichage avec un choix personnalisé (10 par page, 20 par page...)," ; echo " est-ce facile de disposer d'un bouton ou d'un lien ".b("voir les xx suivants")." ?" ; finp() ; p("texte") ; echo "Essayez de réaliser une page en PHP et Javascript qui utilise les éléments de formulaire suivants pour " ; echo " afficher les films :" ; finp() ; blockquote() ; div("cadre") ; p() ; nbsp(5) ; bouton("debl","class='bouton_fin vert_pastel'",""," Début de liste ") ; nbsp(5) ; bouton("suiv","class='bouton_fin jaune_pastel'",""," Suivants ") ; nbsp(5) ; bouton("mili","class='bouton_fin bleu_pastel'",""," Milieu ") ; nbsp(5) ; bouton("prec","class='bouton_fin jaune_pastel'",""," Précédents ") ; nbsp(5) ; bouton("fin","class='bouton_fin vert_pastel'",""," Fin de liste ") ; finp() ; p() ; nbsp(5) ; echo b("Paramétrisation : ") ; listeSelectFromTxt("nbParPag","5 10 20 25 50"); echo "films par page " ; finp() ; findiv() ; finblockquote() ; p("texte") ; echo "Essayez ensuite de réaliser une page en PHP et Javascript pour afficher les films sans rechargement explicite de la page." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Avoir un tableau XHTML triable n'est pas du ressort de PHP mais de Javascript. " ; echo " Nous conseillons d'utiliser ".href("../js/sorttable.js","sorttable.js","gbleuf nou")." qui demande seulement à être inclus " ; echo " dans la page et à ajouter ".b("class='sortable'")." dans l'élément table." ; 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... " ; finp() ; jsf("../js/sorttable.js") ; blockquote() ; table(1,15,"collapse sortable jaune_pastel") ; tr() ; th() ; echo "Nom usuel" ; finth() ; th() ; echo "Prénom principal" ; finth() ; fintr() ; tr() ; td() ; echo "BOND" ; fintd() ; td() ; echo "James" ; fintd() ; fintr() ; tr() ; td() ; echo "ARMA" ; fintd() ; td() ; echo "Line" ; fintd() ; fintr() ; tr() ; td() ; echo "ZOLA" ; fintd() ; td() ; echo "Emile" ; fintd() ; fintr() ; fintable() ; finblockquote() ; p("texte") ; echo "Pour la pagination, ce n'est pas très compliqué non plus, tout dépend d'où viennent les pages. " ; echo " Par exemple, pour un diaporama avec une liste de fichiers ou une liste d'URL, regardez ".href("../frames/framesindex.php","diaporamas").". " ; echo " Si les données viennent d'une base de données, il faut certainement jouer avec le SELECT ... LIMIT " ; echo " pour envoyer les \"bonnes\" informations. Voir ".href("pagination.php")." comme exemple d'implémentation. " ; 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. " ; echo " L'heure est affichée à chaque fois afin de montrer que chaque action utilisateur recharge la page. " ; finp() ; p("texte") ; 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 " ; 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 " ; 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." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Analyse d'une application (2) ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; 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 " ; echo " la page ".href("../stages/propsout.php","stages","grouge nou").". " ; finp() ; p("texte") ; echo "Essayer aussi de définir la ou les bases de données impliquées. " ; finp() ; p("texte") ; echo "Essayer d'imaginer tout ce que peut représenter l'analyse et l'implémentation d'un site comme " ; 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 " ; echo " faire sur le site." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; vnc() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- finPageTp($numTp) ; # contient finSection() et finPage() ; la fonction est dans l2a_inc.php ?>La coloration syntaxique est réalisée par : SyntaxHighlighter.
Si vous préférez, vous pouvez utiliser celle de geshi ou même celle construite autour de la fonction highlight_file.
Retour à la page principale de (gH)