Valid XHTML     Valid CSS2    

Développement Web avancé L2 (PHP et MySQL)

TP numéro 2

                     gilles.hunault "at" univ-angers.fr

 

Remarque : vous pouvez désormais utiliser Windows ou Linux pour écrire vos fichiers. De plus, il est possible d'utiliser le serveur devel.info-ua au lieu de forge.info.univ-angers.fr pour exécuter vos pages PHP. Cet autre serveur affiche les erreurs PHP alors que forge renvoie une page blanche. Si vous êtes dans une des salles locales de TP, vous pouvez utiliser la forme courte du serveur, à savoir forge.info-ua au lieu de forge.info.univ-angers.fr.

 

Table des matières cliquable

  1. Ecriture de fonctions et procédures

  2. PHP conceptuel et utilisation de bibliothèques de fonctions

  3. Expressions régulières et chaines de caractères

  4. Fichiers, expressions régulières et fichiers-URL

  5. La structure de données "pile" version 2

  6. PHP et tables MySQL (1)

  7. Analyse d'une application (1)

  8. Parcours de fichier et documentation

  9. Parcours de fichier et comptages d'attributs

10. PHP et tables MySQL (2)

11. PHP, tables, éléments et Javascript

12. Analyse d'une application (2)

 

Il est possible d'afficher toutes les solutions via ?solutions=1.

 

1. Ecriture de fonctions et procédures

En programmation, on distingue classiquement fonction et procédure. Comment fait-on la différence en PHP ?

Est-ce qu'une fonction PHP peut renvoyer plusieurs valeurs ou plusieurs variables ?

Application : écrire une fonction min_max qui renvoie la plus petite valeur et la plus grande valeur d'un "array", qu'on testera en ligne de commandes. Peut-on utiliser try pour s'assurer que la variable passée est bien un tableau ?

Au passage, quelles sont toutes les fonctions liées aux tableaux en PHP ? Et comment vérifier la syntaxe d'un programme PHP, puisqu'une erreur de syntaxe comme oublier un point-virgule ou un guillemet fait que tout la page HTML est blanche (vide) comme sur tout serveur de production ?

Solution :  

 

2. PHP conceptuel et utilisation de bibliothèques de fonctions

Réécrire le code PHP suivant en mode "conceptuel", c'est-à-dire sans aucune balise apparente, à l'aide de std.php (archive std.zip) dans une page Web valide au sens XHTML strict.


     <?php
          echo "<ul>\n" ;
          echo "<li><p> Voir le fichier <a href=\"montresource.php?nomfic=combien.php\">combien.php</a>";
          echo "La commande <b>mysqldump</b> fournit le code-source pour la recréation " ;
          echo "de la table et du remplissage avec les données, soit ici : " ;
          echo "<a href='elf.mysql.txt'>elf.mysql</a>." ;
          echo "</p></li>\n" ;
     
     
          echo "<li><p> Voir le fichier <a href=\"montresource.php?nomfic=combien.php\">combien.php</a>";
          echo " dont l'<em>exécution</em> est <a href='combien.php'>ici</a>." ;
          echo "</p>" ;
          echo "<p> " ;
          echo "</p></li>" ;
          echo "</ul>" ;
     ?>
     

Il est possible de rapatrier l'archive et de la décompresser en ligne de commandes (dans le bon répertoire !) via :


     > cd ~/forge_html/
     > wget http://forge.info.univ-angers.fr/~gh/internet/std.zip
     > unzip std.zip
     

Dans une autre page, écrire une fonction para(nbl) qui produit nbl lignes de texte répétitif. Utiliser ensuite la classe d'objets tdm du fichier std.php pour afficher une page qui implémente une table des matières cliquable avec deux ou trois "chapitres" qui contiennent chacun deux ou trois paragraphes générés par la fonction para().

Comment est définie la fonction h1() dans std.php ? Comment sait-on si une fonction de std.php fait un echo ou un return ? Comment sont nommées les fonctions de std.php ?

Expliquer ensuite comment est généré et où (client ? serveur ?) le code XHTML produit en PHP et Javascript dans la section identifiée par sectdyn si on utilise le texte suivant qui correspond à la page jsdyn.php.


     <?php
     
     #    (gH)   -_-  jsdyn.php  ;  TimeStamp (unix) : 17 Mars 2013 vers 10:16
     
     error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
     include("std.php") ;
     debutPage("Elément h1 généré","strict","","jsdyn.js") ;
     sdl(5) ;
     
     ## -------------------------------------------------------------------------------------------
     
     div("","sectdyn") ;
     h1("Bonjour") ;
     findiv() ;
     
     ## -------------------------------------------------------------------------------------------
     
     sdl(5) ;
     finPage() ;
     
     ?>
     

Voici le fichier Javascript utilisé :


     //    (gH)   -_-  jsdyn.js  ;  TimeStamp (unix) : 14 Mars 2013 vers 11:40
     
     function h1dyn(x) {
     
     var elt   = document.createElement("h1")         ;
     var h1txt = document.createTextNode("Bonsoir !") ;
     
     elt.appendChild(h1txt) ;
     window.document.getElementById("sectdyn").appendChild(elt) ;
     
     } ; // fin de fonction h1dyn
     
     // ###############################################
     
     function addEvent(obj, evType, fn){
      if (obj.addEventListener){
        obj.addEventListener(evType, fn, false);
        return true;
      } else if (obj.attachEvent){
        var r = obj.attachEvent("on"+evType, fn);
        return r;
      } else {
        return false;
      }
     } // # fin de function addEvent
     
     // ###############################################
     
     addEvent(window, 'load', h1dyn);
     
     

Que se passe-t-il si Javascript n'est pas actif ? Y a-t-il un message d'erreur ?

Après avoir lu le fichier montre.js écrire en PHP conceptuel une page qui utilise un bouton Afficher/Masquer qui sert à montrer ou cacher le texte préformaté mis dans un élement dont l'id est surprise comme dans surprise.php.


     // ceci est le  fichier montre.js
     
     
     function montre(sens) {
     
     if (sens==1) {
       window.document.getElementById("surprise").setAttribute("class","cadre visible") ;
       window.document.getElementById("dor").innerHTML = "&nbsp;cliquer ici pour masquer le texte&nbsp;" ;
       window.document.getElementById("dor").setAttribute("onclick","montre(0)") ;
     } else {
       window.document.getElementById("surprise").setAttribute("class","cadre invisible") ;
       window.document.getElementById("dor").innerHTML = "&nbsp;cliquer ici pour afficher le texte&nbsp;" ;
       window.document.getElementById("dor").setAttribute("onclick","montre(1)") ;
     } // fin si
     
     } // fin de fonction montre
     

Solution :  

 

3. Expressions régulières et chaines de caractères

Il faudrait aider la jej (jeune et jolie) Abby -- Abigail Scituo -- à identifier des suspects à l'aide de numéros de plaques minéralogiques. Voici ce qu'on sait des plaques des suspects, grâce au NCIS :

  • 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.

  • si toutes les lettres sont des consonnes, il s'agit du suspect nommé Ari Haswari.

  • si le numéro de plaque comporte un chiffre répété, il s'agit du tueur de port en port.

  • si le numéro de plaque comporte avant les lettres exactement 4 chiffres avec une alternance pair/impair, il s'agit de "la grenouille".

Ecrire un document PHP qui reproduit le premier formulaire de la page ncis.php via du code valide pour XHTML strict. On affichera l'image abby.jpg et on mettra un lien vers la page Wiki associée.

A partir du formulaire ncis.php écrire le programme défini par l'attribut action de façon à afficher les suspects possibles quand on saisit un numéro de plaque. On utilisera, quand c'est possible les expressions régulières PCRE pour avoir un code PHP concis et notamment preg_match et preg_match_all.

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 à condition qu'il n'y ait pas plus de 3 tirets en tout (indication fournie par Mac Gee).

Solution :  

 

4. Fichiers, expressions régulières et fichiers-URL

Rapatriez le fichier l2grps_2013.txt et reproduisez le tableau fourni dans la page du controle continu.

On voudrait connaitre la popularité de certains chanteurs ou artistes en consultant le nombre de "hits" renvoyés par Google quand on entre le nom du chanteur ou de l'artiste dans le moteur de recherches. Ecrire une page Web qui affiche la popularité de plusieurs chanteurs artistes et qui renvoie les résultats comme dans la page motsinternet.php. On utilisera jphistopct pour générer les graphiques. Si vous avez le temps, écrire un formulaire qui permet de saisir le nom des chanteurs ou des artistes.

Remarque : il est possible de rapatrier le fichier l2grps_2013.txt en ligne de commandes via 


  $forge_html> wget http://forge.info.univ-angers.fr/~gh/internet/l2grps_2013.txt

Solution :  

 

5. La structure de données "pile" version 2

Reprendre l'exercice 10 de la série 1 (la structure de données "pile") en mode démonstration dans une page Web. Indication : on utilisera une session. Pour un exemple de ce qu'on veut réaliser, cliquer ici.

Solution :  

 

6. PHP et tables MySQL (1)

On dispose dans fa.txt des instructions MySql qui ont permis de construire les tables films et artistes dans la base statdata. On pourra consulter la page filmsartistes pour voir de façon plus agréable le contenu des tables.

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. On pourra essayer de trouver le code SQL en ligne de commande sur forge en mode terminal via


       $forge> mysql --host=localhost --user=anonymous --password=anonymous
     
       mysql> USE statdata ;
     
       mysql> SELECT ...
     

Afficher ensuite le nom du film, l'année et le metteur en scène pour ces quinze films.

Ecrite ensuite un "jeu" qui tire au hasard un film et demande l'année de sortie. On utilisera astucieusement un formulaire en mode 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. On indiquera que le jeu est impossible si Javascript n'est pas actif. On écrira une version 1 qui utilise un champ texte pour saisir l'année (c'est donc difficile pour l'utilisateur et simple pour le programmeur) puis une version 2 qui fournit les années de sortie possibles dans une liste de sélection (c'est donc plus facile pour l'utilisateur et moins simple pour le programmeur). Voici en deux liens ce qu'on veut obtenir : quizz1.php et quizz2.php.

Ecrire ensuite un formulaire qui demande de choisir entre films et artistes, puis qui demande combien on veut de lignes résultats et à partir de quelle ligne. Pour la table films, on utilisera les champs idFilm annee genre pays mes titre et on triera par annee alors que pour la table artistes, on utilisera les champs idArtiste artnom artprenom anneenaiss et on triera par artnom. Voir fa.php version 2 comme implémentation de ce qu'on veut.

Pour tous ces programmes, on utilisera std.php pour produire du PHP conceptuel. On en profitera pour trouver quelles fonctions de std.php utilisent MySql et celles qui affichent des tableaux.

Le lien phpmysql fournit un rappel de la syntaxe des fonctions et objets PHP pour effectuer des requêtes MySQL.

Solution :  

 

7. Analyse d'une application (1)

Essayer de trouver tous les choix de programmation qui ont été faits dans l'implémentation d'un système d'exercices disponible sur la page senQuest. On rechargera plusieurs fois la page.

Essayer aussi de définir la ou les bases de données impliquées.

Solution :  

 

8. Parcours de fichier et documentation

Il est facile de repérer une fonction PHP dans le code source puisqu'elle commence par le mot function. En admettant que le début d'une fonction est toujours écrit en début de ligne (précédé éventuellement d'espaces), écrire un programme qui liste les fonctions d'un code-source php avec leur numéro de ligne, comme par exemple :


      Fonction(s) du fichier design.php
      ---------------------------------
     
            1.  affich_header                      33
            2.  affich_menu                        48
            3.  doctype_head                       11
            4.  fin_lea                           113
     

Est-ce beaucoup plus compliqué si on essaie de lister toutes les fonctions d'un projet à partir d'un fichier "maitre" qui contient des include et des require comme dans ldphp_xmp.txt ?

Expliquer comment les pages std et statgh.r fonctionnent. Quelles précautions faut-il prendre lorsqu'on écrit des fonctions pour profiter d'une telle interface ?

Solution :  

 

9. Parcours de fichier et comptages d'attributs

On voudrait analyser une page Web en termes d'attributs et d'éléments. Ecrire un formulaire qui permet de tester une URL quelconque, y compris un fichier XML. On pourra tester la validité W3C du texte analysé ; on fournira des URL prêtes à l'emploi pour faciliter le test du programme PHP utilisé comme attribut action du formulaire.

Solution :  

 

10. PHP et tables MySQL (2)

Compléter le formulaire de la question 6 en ajoutant un critère de tri pour choisir l'affichage. On viendra construire automatiquement 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 tests, on utilisera des tableaux associatifs. Il est conseillé d'écrire une fonction listeDesChamps(table) dans un fichier nommé resfa_inc.php qu'on viendra inclure, aussi bien pour le formulaire que pour les résultats.

Il faudra certainement utiliser du Javascript dans le formulaire pour choisir quelle liste de champs afficher.

Solution :  

 

11. PHP, tables, éléments et Javascript

Après réflexion, on aimerait que les tableaux affichés lors d'une requête MySQL soient triables quand on clique sur l'en-tete de la colonne. Est-ce facile à implémenter ?

De même, si on pagine l'affichage avec un choix personnalisé (10 par page, 20 par page...), est-ce facile de disposer d'un bouton ou d'un lien voir les xx suivants ?

Essayez de réaliser une page en PHP et Javascript qui utilise les éléments de formulaire suivants pour afficher les films :

                             

     Paramétrisation :  films par page

Essayez ensuite de réaliser une page en PHP et Javascript pour afficher les films sans rechargement explicite de la page.

Solution :  

 

12. Analyse d'une application (2)

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 la page stages.

Essayer aussi de définir la ou les bases de données impliquées.

Essayer d'imaginer tout ce que peut représenter l'analyse et l'implémentation d'un site comme LEAdb qui est XHTML valide. On viendra parcourir les différents menus pour voir tout ce qu'il est possible de faire sur le site.

Solution :  

 

Code-source php de cette page ; code javascript utilisé. Retour à la page principale du cours.

 

 

retour gH    Retour à la page principale de   (gH)