L3 MIASHS 2014-2015 - Déroulement réel des cours

La « pensée » du dimanche 21 juillet 2019, 21h32m31s :
Les avions sont des jouets sans aucune valeur militaire.
  -- Maréchal Foch (1911)

Semaine du dredi 19 septemb' 2014 : CM n°1 (Cumul=2h)

Avant-propos Acid Test :
Si vous ne comprenez pas pourquoi les informaticiens vous cassent la tête en essayant de vous expliquer qu'Internet Explorer c'est vraiment pas bon, utilisez l'Acid Test, pour tester la compatibilité de votre navigateur avec les standards du W3C (l'organisme mondial chargé d'élaborer et de gérer les standards du web) : (x)HTML
  • En-tête d'une page HTML5 : pour passer les tests du W3C une page doit avoir la structure suivante :
    <!DOCTYPE html>
    <html>
      <head lang="fr">
        <meta charset="utf-8">
        <title>Un titre si possible intelligent...</title>
      </head>
      <body>
        ....
        ....
      </body>
    </html>
    
    À comparer avec celle nécessaire pour xHTML visible dans la section 2.5 du poly.
    Contrairement à xHTML, l'utilisation des majuscules & minuscules n'est pas différenciée en HTML5.
  • Quelques balises de base (dans leur version la plus simple) valables dans toutes les versions de (x)HTML(5): <h1>, <h2>, etc., <p>, <ul>, <ol>, <li>, <span>, <div> (section 2.6 du poly).
  • Nouveautés en HTML5 : nous nous concentrerons sur les nouvelles balises qui apportent de la sémantique au texte. Vous pourrez comprendre la philosophie derrière HTML5 en vous polongeant dans le livre Dive into HTML5 : http://diveintohtml5.info/. (Voir la page https://fr.wikipedia.org/wiki/HTML5 pour une simple liste de toutes les nouveautés.)
    • main : Définit le contenu principal de la page, il doit être unique dans la page.
    • section : Section générique regroupant un même sujet, une même fonctionnalité, de préférence avec un en-tête, ou bien section d'application web.
    • nav : Section possédant des liens de navigation principaux (au sein du document ou vers d'autres pages).
    • article : Section de contenu indépendante, pouvant être extraite individuellement du document ou syndiquée (flux RSS ou équivalent), sans pénaliser sa compréhension.
    • aside : Section dont le contenu est un complément par rapport à ce qui l'entoure, qui n'est pas forcément en lien direct avec le contenu mais qui peut apporter des informations supplémentaires.
    • hgroup : La balise <hgroup> n'existe plus en HTML5. Eh oui, ce sont des choses qui arrivent quand on travaille sur un truc pas entièrement finalisé.
    • mark : Définit un texte marqué. Surligneur de texte.
    • header : Section d'introduction d'un article, d'une autre section ou du document entier (en-tête de page).
    • footer : Section de conclusion d'une section ou d'un article, voire du document entier (pied de page).

    Vous trouverez sur le web de nombreuses images illustrant l'utilisation de ces balises, comme par exemple celle-ci qui provient de Alsacréation :

    Imbication des balises de base en HTML5

    Inconvénients : elles ne sont pas forcément compatibles avec tous les navigateurs... En particulier les anciens, et en particulier toutes les anciennes versions de IE jusqu'à IE8 compris. Visitez http://html5test.com/ pour connaître le niveau de compatibilité de votre navigateur.

Dernière modification : 25/8/2016

Semaine du dredi 19 septemb' 2014 : TD n°1 (Cumul=2h)

Avant tout

Si l'extension WebDeveloper n'est pas/plus installée, la ré-installer (voir CM n°1).
Vérifier également la présence du marque-page sur la page du cours.

HTML5
  • Compatibilté : comme dit précédemment, les balises HTML5 ne sont pas forcément compatibles avec tous les navigateurs... En particulier les anciens, et en particulier toutes les anciennes versions de IE jusqu'à IE8 compris. Visitez http://html5test.com/ pour connaître le niveau de compatibilité de votre navigateur.

    Les navigateurs autres que IE se contentent d'ignorer les balises qu'ils ne connaissent pas. Votre page ne sera pas présentée selon vos souhaits, mais le contenu sera là quand même.
    IE, lui, ignore le texte qui se trouvent dans de telles balises... Votre page risque d'être intégralement vide... Gênant...

    Pour vous protéger, vous pouvez placer les fichiers html5shiv.js et html5shiv-printshiv.js dans votre répertoire, et ajouter le code suivant dans vos pages web, juste avant </head> :

          <!--[if lt IE 9]>
             <script src="html5shiv.js"></script>
             <script src="html5shiv-printshiv.js"></script>
          <![endif]-->        
    
Gestion des couleurs en HTML (et CSS) Application directe
Réalisez les trois pages site01.html, site02.html et site03.html. Vos pages doivent absolument passer avec succès les tests du W3C. Vous ne vous occuperez bien entendu pas du tout de la présentation : ce sera fait avec l'étude des CSS.
Sur les machines des salles pédagogiques, vous enregistrez vos pages sous votre répertoire www et vous les visualisez dans le navigateur à l'adresse
http://webserv.pedago.local/~votreLogin/chemin
chemin est le chemin relatif vers votre page depuis www
Dernière modification : 25/8/2016

Semaine du dredi 26 septemb' 2014 : CM n°2 (Cumul=4h)

CSS
  • Feuille de style, séparation données-présentation, syntaxe d'une feuille de style.
  • Comme c'est beau les feuilles de style (chapitre 6 du poly).
  • Premier essai : sans CSS et avec CSS.
  • Premières propriétés : background, color, margin, padding, text-align.
  • Appliquer un style de CSS : chapitre 7 du poly.
  • Liste des éléments : chapitre 8 du poly.
  • Inclusion d'une feuille de style dans une page web (version simplifiée) :
    <link rel="stylesheet" href="fichier" />
  • Formulaires pour générer des CSS : voir le chapitre 12 du poly, ou :
  • Positionnement et affichage avec les CSS : voir le chapitre 13 du poly.
  • Les bugs d'Internet Explorer, les contourner, les utiliser : voir le chapitre 14 du poly.
Dernière modification : 25/8/2016

Semaine du dredi 26 septemb' 2014 : TD n°2 (Cumul=4h)

Exercice
  • Réaliser le site décrit au chapitre 10 du poly, en adaptant bien entendu à votre propre cas.
    Le résultat de votre travail devra réussir les tests du W3C pour HTML et CSS.
Remarques et infos complémentaires
Dernière modification : 25/8/2016

Semaine du dredi 3 octob' 2014 : CM n°3 (Cumul=6h)

Le contrôle n°1 aura lieu le vendredi 17 octobre, de 10h30 à 12h30, en salle C19, dans les conditions suivantes :
  • sur feuille,
  • tous documents PAPIER autorisés,
  • aucun document électronique (liseuse, tablette, ordinateur, téléphone, etc.).
Info complémentaire : les câbles sous-marins sur Wikipédia, et une carte des câbles sous-marins dans le monde.

PHP :
Dernière modification : 25/8/2016

Semaine du dredi 3 octob' 2014 : TD n°3 (Cumul=6h)

Exercices du Chapitre 5.
Remarque : les corrections des exercices sont à la fin du poly. Mais vous n'êtes pas obligés de tricher...
Dernière modification : 25/8/2016

Semaine du dredi 10 octob' 2014 : CM n°4 (Cumul=8h)

Suite des exercices du Chapitre 5.
Dernière modification : 25/8/2016

Semaine du dredi 10 octob' 2014 : TD n°4 (Cumul=8h)

Dernier rappel
Le contrôle n°1 aura lieu le vendredi 17 octobre, de 10h30 à 12h30, en salle C19, dans les conditions suivantes :
  • sur feuille,
  • tous documents PAPIER autorisés,
  • aucun document électronique (liseuse, tablette, ordinateur, téléphone, etc.).
Formulaires
Dernière modification : 25/8/2016

Semaine du dredi 17 octob' 2014 : CM n°5 (Cumul=10h)

  • Contrôle n°1.
  • Chaînes de caractères : Chapitre 8.
Dernière modification : 25/8/2016

Semaine du dredi 17 octob' 2014 : TD n°5 (Cumul=10h)

Dernière modification : 25/8/2016

Semaine du dredi 24 octob' 2014 : CM n°6 (Cumul=12h)

Dernière modification : 25/8/2016

Semaine du dredi 24 octob' 2014 : TD n°6 (Cumul=12h)

  • Exercices sur les tableaux en PHP : Chapitre 9
  • HTML5 et les navigateurs pas doués
    La plupart des navigateurs anciens se contenteront de n'associer aucun style aux balises nouvelles de HTML5. Vous pouvez résoudre le problème en stylant toutes les nouvelles balises (section, header, footer, etc.), en particulier en leur attribuant un « display:block; ».
    Pour ce qui est d'Internet Explorer, c'est plus compliqué. (Vous êtes étonnés, vous ? Moi pas...)
    Internet Explorer refusera tout simplement de leur appliquer un style, même si vous faites tout ce qu'il faut pour.
    Pour contourner le problème il existe deux scripts javascript qui vont vous sauver.
    Pour les utiliser :
    1. Vous les téléchargez et vous les recopiez dans vos répertoires :
    2. Vous ajoutez dans votre page HTML5, juste avant </head> :
          <!--[if lt IE 9]>
            <script src="html5shiv.js"></script>
            <script src="html5shiv-printshiv.js"></script>
          <![endif]-->
    Cela aura pour effet de forcer Internet Explorer à reconnaître les nouvelles balises, et les styles que vous aurez définis pourront alors s'appliquer.
  • Formulaires et HTML5
    HTML5 ajoute un certain nombre de contrôles pour les formulaires. (Vous pouvez les tester.)
    Les navigateurs qui ne savent pas les utiliser correctement se contenteront de les traiter comme un input de type text.
    Sauf mention contraire les versions récentes de Opera, Chrome et Firefox savent les utiliser correctement.
    1. Message d'invite dans un input :
      <input name="c0" placeholder="Veuillez remplir SVP">
    2. Autofocus sur n'importe quel contrôle :
      <input name="c1" autofocus>
    3. Saisie d'un email, avec contrôle (simple) de saisie :
      <input name="c2" type="email">
    4. Saisie d'une URL, avec contrôle (simple) de saisie :
      <input name="c3" type="URL">
    5. Saisir un nombre dans un certain intervalle :
      <input name="c4" type="number" min="0" max="10" step="2" value="6">
    6. Saisir un nombre avec un curseur :
      <input name="c5" type="range" min="0" max="10" step="2" value="6">
    7. Saisie d'une date :
      Plusieurs versions :
      <input name="c6" type="date">
      <input name="c7" type="datetime">
      <input name="c8" type="month">
      <input name="c9" type="week">
      <input name="c10" type="time">
      Fonctionne avec les versions récentes deOpéra, Chrome. Ne fonctionne pas pour l'instant avecFirefox.
    8. Choisir une couleur :
      <input name="c11" type="color">
    9. Champ obligatoire :
      <input name="c12" required>
  • Programmation séparée en PHP : Chapitre 10
Dernière modification : 25/8/2016

Semaine du dredi 7 novemb' 2014 : CM n°7 (Cumul=14h)

  • Sessions.
    Le texte qui suit est une partie de la page consacrée aux sessions sur le site de http://fr.php.net :
    Le support des sessions de PHP est un moyen de préserver des données entre plusieurs accès. Cela vous permet de créer des applications personnalisées, et d'augmenter l'attrait de votre site.
    Chaque visiteur accédant à votre page web se voit assigner un identifiant unique, appelé "identifiant de session". Il peut être stocké soit dans un cookie, soit propagé dans l'URL.
    Le support des sessions vous permet d'enregistrer un nombre illimité de variables qui doivent être préservées entre les requêtes. Lorsqu'un visiteur accède à votre site, PHP va vérifier automatiquement (si session.auto_start est activé) ou sur demande (explicitement avec session_start() ou implicitement avec session_register()) s'il existe une session du même nom. Si c'est le cas, l'environnement précédemment sauvé sera recréé.
    La seule fonction nécessaire pour un usage simple des sessions est session_start(), mais je ne peux que vous encourager à aller voir les autres.
  • Application des sessions : identification des visiteurs.
    Principe :
    • Deux variables de session contiennent le login et le mot de passe du visiteur (variables vides si le visiteur n'est pas identifié).
    • Si le visiteur n'est pas identifié, le menu propose un choix Se connecter qui envoie sur un formulaire de saisie (on peut aussi inclure ce formulaire directement dans le menu). Si le visiteur est identifié, le menu propose un choix Se déconnecter qui vide les variables de session qui contiennent le login et le mot de passe du visiteur.
    • Chaque page commence par quelque chose qui ressemblera à :
                if (le visiteur n'a pas le bon niveau d'autorisation pour cette page) {
                       message de refus
                       fin de page
                       return ;
                }
    • L'évaluation du niveau d'autorisation peut se faire de plusieurs manières :
      • Mauvais, car complique les modifications : coder en dur le test sur chaque possibilité  :
                            if ((nom=="bidule") && (mot de passe=="truc")) {
                                ...
        
                            } elseif ((nom=="chose") && (mot de passe=="n'importe quoi")) {
                                ...
                            } else
                                etc
                        
      • Mieux : ranger les noms et mots de passe dans un tableau, et parcourir le tableau pour faire la vérification.
      • (Parfait : la même chose, mais créer une table spéciale dans la base de données au lieu d'utiliser un tableau.)
    • Pour être parfait ce serait bien que ce soit une fonction qui affiche le menu, et que cette fonction décide d'elle-même des choix disponibles en fonction du niveau d'autorisation du visiteur.
    • Exemple d'utilisation des sessions : http://www.grappa.univ-lille3.fr/~gonzalez/session_php.
  • Espionner vos visiteurs : informations sur leur navigateur, informations sur leur origine, les suivre à la trace (cookies).
    Les informations que vous pouvez obtenir sans douleur sur vos visiteurs.
    1. Les informations sur leur navigateur :
      • Le navigateur que vous utilisez : Default Browser.
      • La version de votre navigateur : 0.0.
      • Votre système d'exploitation : unknown.
      • est-ce qu'il accepte les cookies (le vôtre n'accepte pas les cookies) ;
      • est-ce qu'il gère les applets java, javascript ? (Le vôtre ne gère pas les applets java, ne gère pas javascript.)
      La fonction à utiliser est get_browser().
      La liste des informations qu'on peut obtenir est la suivante  :
      • browser_name_regex (^.*$)
      • browser_name_pattern (*)
      • comment (Default Browser)
      • browser (Default Browser)
      • version (0.0)
      • majorver (0)
      • minorver (0)
      • platform (unknown)
      • platform_version (unknown)
      • alpha (false)
      • beta (false)
      • win16 (false)
      • win32 (false)
      • win64 (false)
      • frames (false)
      • iframes (false)
      • tables (false)
      • cookies (false)
      • backgroundsounds (false)
      • javascript (false)
      • vbscript (false)
      • javaapplets (false)
      • activexcontrols (false)
      • ismobiledevice (false)
      • istablet (false)
      • issyndicationreader (false)
      • crawler (false)
      • cssversion (0)
      • aolversion (0)
      Remarque :
      La fonction get_browser() nécessite que la directive de configuration browscap dans le fichier php.ini pointe vers le fichier browscap.ini de votre système. Ce fichier contient les caractéristiques des navigateurs, et il doit bien entendu être à jour.
      S'il vous est impossible de vous en assurer, vous pouvez vous rabattre sur la variable $_SERVER['HTTP_USER_AGENT'] qui contient un sous-ensemble de ces informations, mais d'une manière moins lisible. Pour vous on obtient « CCBot/2.0 (https://commoncrawl.org/faq/) ».
      Vous pouvez aussi utiliser la bibliothéque php-local-browscap.
    2. Les informations sur l'origine de vos visiteurs :
      • la page d'où ils viennent, par la variable $_SERVER['HTTP_REFERER'] ;
      • l'adresse de la machine de vos visiteurs, avec $_SERVER['REMOTE_ADDR'] pour l'adresse IP (pour vous il s'agit de « 54.242.193.41 »), et avec gethostbyaddr($_SERVER['REMOTE_ADDR']) pour son adresse domainisée (pour vous il s'agit de « ec2-54-242-193-41.compute-1.amazonaws.com »).
        En plus le nom de la machine permet peut-être de deviner votre pays.
    3. Les cookies :
      Les cookies doivent être vus comme des variables qui peuvent être conservées entre deux exécutions de la page. Ils sont enregistrés sur la machine cliente. La seule restriction est qu'ils doivent être enregistrés avant l'envoi de tout texte, donc en début de page.
      La fonction qui s'en charge est setcookie().
      Une utilisation pourrait être par exemple de mettre en tête de ce programme :
      1. <?php
      2.   $compteurdevisites = $_COOKIE['compteurdevisites']+1;
      3.   $dernierevisite = $_COOKIE['dernièrevisite'];
      4.   setcookie("compteurdevisites", "$compteurdevisites");
      5.   setcookie("dernièrevisite", time());
      6. ?>
      et il suffirait d'utiliser dans votre page
      1. <?php
      2.   echo "C'est votre <em>$compteurdevisites</em>° visite";
      3.   if ($dernierevisite != "") {
      4.       echo ", la dernière c'était le <em>"
      5.           .strftime("%A %e %B %Y", $dernierevisite)
      6.           ."</em>, à <em>"
      7.           .strftime("%Hh %Mm %Ss", $dernierevisite)
      8.           ."</em>";
      9.   }
      10.   echo ".";
      11. ?>
      pour obtenir cet affichage :
      C'est votre 1° visite.
    4. En tant qu'internaute, ces indiscrétions sont-elles dangereuses ?
      Elles permettent en tout cas pas mal de choses :
      • N'importe quel site marchand peut vous pister ainsi, et garder l'historique de vos connexions. Il lui suffit d'enregistrer un identifiant sur votre machine, et d'enregistrer dans ses bases de données l'historique de vos actions dans ses pages (vos clics, vos déplacements, ce que vous remplissez dans les formulaires, le temps passé sur chaque page que vous visitez, etc.).
      • N'oubliez pas que votre fournisseur d'accès connaît toutes les pages que vous avez consultées par son intermédaire.
      Il y a quand même des bonnes nouvelles dans tout ça :
      • Si vous vous connectez à internet par l'intermédiaire d'un fournisseur d'accès, votre adresse IP (54.242.193.41) change à chaque connexion... Votre machine devient beaucoup moins facilement identifiable, en tout cas sans la complicité de votre fournisseur d'accès (qui, lui, sait toujours à tout moment à quel utilisateur correspond chaque adresse IP).
        Il faut remarquer que les adresses changent de moins en moins avec les connexions par cable ou ADSL.
      • Grâce aux cookies, un site est en effet capable de savoir si vous êtes déjà venu le voir, MAIS :
        • Il ne sait pas réellement qui vous êtes : il sait seulement que vous êtes l'utilisateur n°X ; cela lui permet de savoir ce que vous avez fait d'autre chez lui, en tant qu'utilisateur n°X, mais c'est tout.
          Il n'est pas capable de deviner ce que vous n'avez pas dit : votre nom, votre numéro de carte de crédit, votre numéro de téléphone, l'endroit où vous vivez (bien que l'adresse IP de votre machine lui permette sans doute de deviner votre pays, voir plus haut).
          Attention : si vous donnez ce genre de renseignements (nom, numéro de carte de crédit, numéro de téléphone, endroit où vous vivez) quelque part, ne vous étonnez pas qu'on s'en souvienne...
        • Il suffit de les désactiver, pour que les cookies deviennent inoffensifs (voir ci-dessous).
    5. Comment s'en protéger ?
      • Il est facile de se protéger des cookies. Vous pouvez, au choix :
        • régler votre navigateur pour qu'il refuse les cookies ; cependant certains sites ne vous laissent pas entrer si vous avez désactivé l'option Cookies. Vous allez peut-être avoir envie de laisser les cookies actifs pour visiter ces sites ; si vous êtes vraiment certain que cela en vaut la peine, vous avez peut-être intérêt à regarder les deux points suivants ;
        • régler votre navigateur pour qu'il accepte les cookies, mais qu'il les efface à chaque nouvelle session ;
        • effacer vous-même à la main les cookies ; par exemple dans Firefox, vous allez dans la suite de menus Édition/Préférences/Vie privée, et vous pouvez effacer les cookies (et d'autres choses).
      • Le reste fait partie de la norme HTML. C'est ce qui concerne l'identification de votre machine, de son système d'exploitation et de son navigateur, des pages qui ont été visitées, de votre provenance, la protection est beaucoup plus difficile.
    6. Plus de lecture : la CNIL avec en particulier leurs pages intitulées « Découvrez comment vous êtes pistés sur internet ».
Dernière modification : 25/8/2016

Semaine du dredi 14 novemb' 2014 : CM n°8 (Cumul=16h)

Le contrôle n°2 aura lieu le jeudi 27 novembre de 10h30 à 12h30, en salle C33, dans les conditions suivantes :
  • sur feuille,
  • tous documents PAPIER autorisés,
  • aucun document électronique (liseuse, tablette, ordinateur, téléphone, etc.).
  • Accéder à une base de données : PDO (présentation succincte).
  • PDO, un premier programme de démo :
    demo_pdo.php
    [cacher les numéros de lignes]
    1. <!DOCTYPE html>
    2. <html>
    3.   <head lang="fr">
    4.     <meta charset="utf-8">
    5.     <title>Démo n°1</title>
    6. <style>
    7.     td,th {border:thin solid silver;}
    8. </style>
    9. </head><body>
    10. <?php
    11.     $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
    12.     $res = $db->query("SELECT * FROM langue") ;
    13.     $data = $res->fetchAll() ;
    14.     echo "Le résultat de la requête comporte "
    15.             .$res->rowCount()." lignes et "
    16.             .$res->columnCount()
    17.             ." colonnes&nbsp;:<br />\n"
    18.             ."<table>";
    19.     for ($l=0 ; $l<$res->rowCount() ; $l++ ) {
    20.         echo "<tr><th>".($l+1)."</th>";
    21.         for ($c=0 ; $c<$res->columnCount() ; $c++) {
    22.             echo "<td>".$data[$l][$c]."</td>";
    23.         }
    24.         echo "</tr>\n";
    25.     }
    26.     echo "</table>\n";
    27. ?>
    28. </body></html>
    29.  
    Remarque : sur certains gestionnaires de bases de données (en particulier Sqlite) il arrive que la méthode rowCount() ne fonctionne pas. Dans ce cas-là, remplacez $res->rowCount() par count($data), cela produira le même effet.
    On aurait aussi pu écrire cela :
    demo2_pdo.php
    [cacher les numéros de lignes]
    1. <!DOCTYPE html>
    2. <html>
    3.   <head lang="fr">
    4.     <meta charset="utf-8">
    5.     <title>Démo n°2</title>
    6. <style>
    7.     td,th {border:thin solid silver;}
    8. </style>
    9. </head><body>
    10. <?php
    11.     $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
    12.     $res = $db->query("SELECT * FROM langue") ;
    13.     $data = $res->fetchAll() ;
    14.     echo "Le résultat de la requête comporte "
    15.             .count($data)." lignes et "
    16.             .$res->columnCount()
    17.             ." colonnes&nbsp;:<br />\n"
    18.             ."<table>";
    19.     for ($l=0 ; $l<count($data) ; $l++ ) {
    20.         echo "<tr><th>".($l+1)."</th>";
    21.         for ($c=0 ; $c<$res->columnCount() ; $c++) {
    22.             echo "<td>".$data[$l][$c]."</td>";
    23.         }
    24.         echo "</tr>\n";
    25.     }
    26.     echo "</table>\n";
    27. ?>
    28. </body></html>
    29.  
  • Exercice sur la base Disques 2009.
    1. Les titres des disques de Mick Jagger (en variant les façons d'accéder aux données).
      La requête est
      SELECT dis_annee,dis_titre
        FROM disque,artiste
       WHERE dis_artiste=art_num
         AND art_nom='Jagger'
         AND art_prenom='Mick'
         AND art_groupe=''
        ORDER BY 1,2
      (disquesjagger).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Disques de Mick Jagger</title>
      6.   </head>
      7. <body>
      8. <?php
      9. // connexion à la base
      10. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      11. // exécution de la requête
      12. $res = $db->query("SELECT dis_annee,dis_titre
      13.                     FROM disque,artiste
      14.                    WHERE dis_artiste=art_num
      15.                      AND art_nom='Jagger'
      16.                      AND art_prenom='Mick'
      17.                      AND art_groupe=''
      18.                 ORDER BY 1,2") ;
      19. // récupération des données
      20. $data = $res->fetchAll() ;
      21. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      22. echo "\n<h1><em>foreach</em> pour les lignes, nommer les colonnes</h1>\n\n";
      23. echo "<ul>"; // début de liste
      24. foreach ( $data as $row ) { // pour chaque ligne ...
      25.     // ... afficher les informations
      26.     echo "\t<li>".$row["dis_annee"]." - ".$row["dis_titre"]."</li>\n";
      27. }
      28. echo "</ul>\n"; // fin de liste
      29. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      30. echo "\n<h1><em>foreach</em> pour les lignes, énumérer les colonnes</h1>\n\n";
      31. echo "<ul>"; // début de liste
      32. foreach ( $data as $row ) { // pour chaque ligne ...
      33.     // ... afficher les informations
      34.     echo "\t<li>";
      35.     for ($c=0;$c<$res->ColumnCount();$c++) { // pour chaque colonne
      36.         echo $row[$c];                       // afficher le contenu de la colonne
      37.         if ($c<$res->ColumnCount()-1) {      // si ce n'est pas la dernière ...
      38.             echo " - ";                      //  ... afficher un séparateur
      39.         }
      40.     }
      41.     echo "</li>\n";
      42. }
      43. echo "</ul>\n"; // fin de liste
      44. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      45. echo "\n<h1>Énumérer les lignes, nommer les colonnes</h1>\n\n";
      46. echo "<ul>"; // début de liste
      47. for ($l=0; $l<$res->RowCount() ; $l++) { // pour chaque ligne ...
      48.     // ... afficher les informations
      49.     echo "\t<li>".$data[$l]["dis_annee"]." - ".$data[$l]["dis_titre"]."</li>\n";
      50. }
      51. echo "</ul>\n"; // fin de liste
      52. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      53. echo "\n<h1>Énumérer les lignes, énumérer les colonnes</h1>\n\n";
      54. echo "<ul>"; // début de liste
      55. for ($l=0; $l<$res->RowCount() ; $l++) { // pour chaque ligne ...
      56.     // ... afficher les informations
      57.     echo "\t<li>";
      58.     for ($c=0;$c<$res->ColumnCount();$c++) { // pour chaque colonne
      59.         echo $data[$l][$c];                  // afficher le contenu de la colonne
      60.         if ($c<$res->ColumnCount()-1) {      // si ce n'est pas la dernière ...
      61.             echo " - ";                      //  ... afficher un séparateur
      62.         }
      63.     }
      64.     echo "</li>\n";
      65. }
      66. echo "</ul>\n"; // fin de liste
      67. // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      68. ?>
      69. </body></html>
      70.  
    2. Les chansons interprétées par Alain Bashung, accompagnées du disque où elles figurent.
      La requête est
        SELECT cha_titre,dis_titre,dis_annee,int_numero
          FROM disque,artiste,interprete,chanson
         WHERE int_artiste=art_num
           AND int_chanson=cha_num
           AND int_disque=dis_num
           AND art_prenom='Alain'
           AND art_nom='Bashung'
           AND art_groupe=''
      ORDER BY dis_annee,dis_titre,int_numero,cha_titre
      (chansonsbashung).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Chansons d'Alain Bashung</title>
      6.   </head>
      7. <body>
      8. <?php
      9. // connexion à la base
      10. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      11. // exécution de la requête
      12. $res = $db->query("SELECT cha_titre,dis_titre,dis_annee,int_numero
      13.                     FROM disque,artiste,interprete,chanson
      14.                    WHERE int_artiste=art_num
      15.                      AND int_chanson=cha_num
      16.                      AND int_disque=dis_num
      17.                      AND art_prenom='Alain'
      18.                      AND art_nom='Bashung'
      19.                      AND art_groupe=''
      20.                 ORDER BY dis_annee,dis_titre,int_numero,cha_titre") ;
      21. // récupération des données
      22. $data = $res->fetchAll() ;
      23. // début de liste
      24. echo "<ul>";
      25. // pour chaque ligne ...
      26. foreach ( $data as $row ) {
      27.     // ... afficher les informations
      28.     echo "<li><b>".$row["cha_titre"]."</b>, n°".$row["int_numero"]
      29.         ." sur <em>".$row["dis_titre"]."</em> (".$row["dis_annee"]
      30.         .")</li>\n";
      31. }
      32. // fin de liste
      33. echo "</ul>\n";
      34. ?>
      35. </body></html>
      36.  
    3. Le nombre de disques par genre.
      La requête est
        SELECT gen_nom,COUNT(*) AS nbre
          FROM chanson,genre
         WHERE cha_genre=gen_num
      GROUP BY gen_num,gen_nom
      ORDER BY 1
      (chansonspargenre).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Chansons par genre</title>
      6.   </head>
      7. <body>
      8. <?php
      9. // connexion à la base
      10. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      11. // exécution de la requête
      12. $res = $db->query("SELECT gen_nom,COUNT(*) AS nbre
      13.                     FROM chanson,genre
      14.                    WHERE cha_genre=gen_num
      15.                 GROUP BY gen_num,gen_nom
      16.                 ORDER BY 1") ;
      17. // récupération des données
      18. $data = $res->fetchAll() ;
      19. // début de liste
      20. echo "<ul>";
      21. // pour chaque ligne ...
      22. foreach ( $data as $row ) {
      23.     // ... afficher les informations
      24.     echo "<li>".$row["gen_nom"]." : ".$row["nbre"]."</li>\n";
      25. }
      26. // fin de liste
      27. echo "</ul>\n";
      28. ?>
      29. </body></html>
      30.  
    4. Les 10 artistes les plus représentés parmi les disques.
      La requête est
        SELECT COUNT(*) as nbre,art_prenom,art_nom,art_groupe
          FROM disque,artiste
         WHERE dis_artiste=art_num
      GROUP BY art_prenom,art_nom,art_groupe,art_num
      ORDER BY 1 DESC,3,2,4
         LIMIT 10
      (artistesdisques).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Nombre de disques par artiste</title>
      6.   </head>
      7. <body>
      8. <?php
      9. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      10. $res = $db->query("SELECT COUNT(*) as nbre,art_prenom,art_nom,art_groupe
      11.                     FROM disque,artiste
      12.                    WHERE dis_artiste=art_num
      13.                 GROUP BY art_prenom,art_nom,art_groupe,art_num
      14.                 ORDER BY 1 DESC,3,2,4
      15.                    LIMIT 10") ;
      16. $data = $res->fetchAll() ;
      17. echo "<ul>";
      18. foreach ( $data as $row ) {
      19.     echo "\t<li>".$row["art_prenom"]." ".$row["art_nom"]." "
      20.         .$row["art_groupe"]." (".$row["nbre"].")</li>\n";
      21. }
      22. echo "</ul>\n";
      23. ?>
      24. </body></html>
      25.  
    5. Les dernières chansons modifiées.
      La requête est
        SELECT cha_titre,
               TO_CHAR(cha_modif,'DD/MM/YYYY') AS date,
               TO_CHAR(cha_modif,'HH24hMI') AS heure
          FROM chanson
      ORDER BY cha_modif DESC
         LIMIT 10
      (chansonsmodifiees).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Les dernières chansons modifiées</title>
      6.   </head>
      7. <body>
      8. <?php
      9. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      10. $res = $db->query("SELECT cha_titre,
      11.                    TO_CHAR(cha_modif,'DD/MM/YYYY') AS date,
      12.                    TO_CHAR(cha_modif,'HH24hMI') AS heure
      13.               FROM chanson
      14.           ORDER BY cha_modif DESC
      15.              LIMIT 10") ;
      16. $data = $res->fetchAll() ;
      17. echo "<ul>";
      18. foreach ( $data as $row ) {
      19.     echo "\t<li>&laquo;&nbsp;".$row["cha_titre"]."&nbsp;&raquo; modifié le "
      20.         .$row["date"]." à ".$row["heure"].".</li>\n";
      21. }
      22. echo "</ul>\n";
      23. ?>
      24. </body></html>
      25.  
    6. Liste des personnes autorisées à se connecter (table autorisations). Les personnes dont le niveau d'autorisation n'est pas « anonyme » auront leur login et leur mot de passe masqués. (autorisations).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Personnes autorisées à se connecter</title>
      6.     <style type="text/css">
      7.       th,td {text-align:center;border:silver solid thin;}
      8.     </style>
      9. </head><body>
      10. <table>
      11. <tr>
      12.     <th>Nom</th>
      13.     <th>Prénom</th>
      14.     <th>Login</th>
      15.     <th>Mot de passe</th>
      16.     <th>Niveau de droits</th>
      17. </tr>
      18. <?php
      19. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      20. $res = $db->query("SELECT aut_login,aut_motdepasse,aut_nom,aut_prenom,dro_nom
      21.                    FROM autorisations,droits
      22.                    WHERE dro_num=aut_droits
      23.                    ORDER BY aut_droits,aut_nom,aut_prenom") ;
      24. $data = $res->fetchAll() ;
      25. foreach ($data as $ligne) {
      26.     echo "<tr><td>".$ligne["aut_nom"]."</td><td>"
      27.         .$ligne["aut_prenom"]."</td><td>"
      28.         .(strtolower($ligne["dro_nom"])=="anonyme"?$ligne["aut_login"]:"*****").
      29.         "</td><td>"
      30.         .(strtolower($ligne["dro_nom"])=="anonyme"?$ligne["aut_motdepasse"]:"*****")
      31.         ."</td><td>".$ligne["dro_nom"]."</td></tr>\n";
      32. }
      33. ?>
      34. </table>
      35. </body></html>
      36.  
    7. Un formulaire demande de saisir une année et affiche les titres de tous les disques parus cette année. (disquesannee).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Disques d'une année</title>
      6. </head><body>
      7. <?php
      8. // récupération du nom du programme pour renseigner l'attribut "action"
      9. $cettepage=basename($_SERVER["PHP_SELF"]);
      10. echo "<form action=\"$cettepage\">
      11. Année : <input name=\"annee\"";
      12. if (isset($_GET["annee"])) echo " value=\"".$_GET["annee"]."\" ";
      13. echo " />
      14. <input type=\"submit\">
      15. </form>";
      16. // si on a fait une demande
      17. if (isset($_GET["annee"])) {
      18.     // connexion à la base
      19.     $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      20.     // pour alléger l'écriture dans la suite
      21.     $annee=$_GET["annee"] ;
      22.     // exécution de la requête
      23.     $res = $db->query("SELECT dis_titre
      24.                         FROM disque
      25.                        WHERE dis_annee='$annee'
      26.                     ORDER BY dis_titre") ;
      27.     // récupération des données
      28.     $data = $res->fetchAll() ;
      29.     if (count($data)==0)
      30.         echo "Aucune chanson ne correspond à cette année.";
      31.     elseif (count($data)==1)
      32.         echo "Un seul disque correspond à cette année&nbsp;: "
      33.             ."<b>".$data[0]["dis_titre"]."</b>.";
      34.     else {
      35.         echo count($data)." disques correspondent à cette année&nbsp;:";
      36.         echo "<ul>";
      37.         foreach ( $data as $row ) {
      38.             echo "<li><b>".$row["dis_titre"]."</b></li>\n";
      39.         }
      40.         // fin de liste
      41.         echo "</ul>\n";
      42.     } // fin du if (count($data)==0)
      43. } // fin du if (isset($_GET["annee"]))
      44. ?>
      45. </body></html>
      46.  
    8. Un formulaire demande de saisir un artiste et affiche toutes les chansons correspondantes, le texte tapé pouvant être recherché dans le nom, le prénom ou le groupe de l'artiste. (chansonartiste).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Chansons d'un artiste</title>
      6. </head><body>
      7. <?php
      8. // récupération du nom du programme pour renseigner l'attribut "action"
      9. $cettepage=basename($_SERVER["PHP_SELF"]);
      10. echo "<form action=\"$cettepage\">
      11. Artiste : <input name=\"artiste\"";
      12. if (isset($_GET["artiste"])) echo " value=\"".$_GET["artiste"]."\" ";
      13. echo " />
      14. <input type=\"submit\">
      15. </form>";
      16.  
      17. // si on a fait une demande
      18. if (isset($_GET["artiste"])) {
      19.     // connexion à la base
      20.     $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      21.     // pour alléger l'écriture dans la suite
      22.     $artiste=$_GET["artiste"] ;
      23.     // exécution de la requête
      24.     $res = $db->query("SELECT cha_titre,dis_titre,int_numero,dis_annee
      25.                         FROM chanson,interprete,artiste,disque
      26.                        WHERE int_artiste=art_num
      27.                          AND int_chanson=cha_num
      28.                          AND int_disque=dis_num
      29.                          AND LOWER(art_prenom||art_nom||art_groupe)
      30.                              LIKE '%'||TRIM(LOWER('$artiste'))||'%'
      31.                     ORDER BY dis_annee,dis_titre,int_numero,cha_titre") ;
      32.     // récupération des données
      33.     $data = $res->fetchAll() ;
      34.     if (count($data)==0)
      35.         echo "Aucune chanson ne correspond à cet artiste.";
      36.     elseif (count($data)==1)
      37.         echo "Une seule chanson correspond à cet artiste&nbsp;: "
      38.             ."<b>".$data[0]["cha_titre"]."</b>, n°".$data[0]["int_numero"]
      39.             ." sur <em>".$data[0]["dis_titre"]."</em> (".$data[0]["dis_annee"].")";
      40.     else {
      41.         echo count($data)." chansons correspondent à cet artiste&nbsp;:";
      42.         echo "<ul>";
      43.         foreach ( $data as $row ) {
      44.             echo "<li><b>".$row["cha_titre"]."</b>, n°".$row["int_numero"]
      45.                 ." sur <em>".$row["dis_titre"]."</em> (".$row["dis_annee"].")</li>\n";
      46.         }
      47.         // fin de liste
      48.         echo "</ul>\n";
      49.     } // fin du if (count($data)==0)
      50. } // fin du if (isset($_GET["artiste"]))
      51. ?>
      52. </body></html>
      53.  
    9. Sélectionner un genre musical dans une liste déroulante et afficher le nombre de chansons de ce genre musical. (nbregenre).
      [cacher les numéros de lignes]
      1. <html><body>
      2. <?php
      3. // récupération du nom du programme pour renseigner l'attribut "action"
      4. $cettepage=basename($_SERVER["PHP_SELF"]);
      5. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      6. echo "<form action=\"$cettepage\">
      7. <select name=\"genre\">\n";
      8. $res = $db->query("SELECT gen_num,gen_nom
      9.                     FROM genre
      10.                 ORDER BY gen_num,gen_nom") ;
      11. $data = $res->fetchAll() ;
      12. foreach ( $data as $row ) {
      13.     echo "<option value=\"".$row["gen_num"]."\"";
      14.     if ($row["gen_num"]==$_GET["genre"]) echo " selected=\"selected\"";
      15.     echo ">".$row["gen_nom"]."</option>\n";
      16. }
      17. echo "</select>
      18. <input type=\"submit\" value=\"Afficher le nombre de chansons de ce genre musical\" />
      19. </form>";
      20.  
      21. // si on a fait une demande
      22. if (isset($_GET["genre"])) {
      23.     $res = $db->query("SELECT COUNT(*) AS nbre,gen_nom
      24.                         FROM genre,chanson
      25.                        WHERE cha_genre=gen_num
      26.                          AND gen_num=".$_GET["genre"]."
      27.                     GROUP BY gen_nom,gen_num
      28.                       HAVING gen_num=".$_GET["genre"]);
      29.     // récupération des données
      30.     $data = $res->fetchAll() ;
      31.     echo $data[0]["nbre"]." chanson".($data[0]["nbre"]>0?"s":"")
      32.         ." pour le genre <b>".$data[0]["gen_nom"]."</b>";
      33. } // fin du if (isset($_GET["genre"]))
      34. ?>
      35. </body></html>
    10. Sélectionner un artiste dans une liste déroulante, ce qui permet de sélectionner ensuite un de ses disques dans une liste déroulante, et enfin d'afficher les titres des chansons de ce disque. (chansonsartiste).
      [cacher les numéros de lignes]
      1. <!DOCTYPE html>
      2. <html>
      3.   <head lang="fr">
      4.     <meta charset="utf-8">
      5.     <title>Chansons d'un disque d'un artiste</title>
      6. </head><body>
      7. <?php
      8. // récupération du nom du programme pour renseigner l'attribut "action"
      9. $cettepage=basename($_SERVER["PHP_SELF"]);
      10. // connexion
      11. $db=new PDO('pgsql:host=masterid;dbname=disques2009','**nom**','**MdP**') ;
      12. // liste des artistes
      13. $res = $db->query("SELECT art_num,TRIM(art_prenom||' '||art_nom||' '||art_groupe) AS artiste
      14.                     FROM artiste
      15.                 ORDER BY art_nom,art_prenom,art_groupe") ;
      16. $data = $res->fetchAll() ;
      17. // construction du deuxième formulaire : choix de l'artiste
      18. echo "<form action=\"$cettepage\">
      19.    <select name=\"artiste\">\n";
      20. foreach ( $data as $row ) {
      21.     echo "<option value=\"".$row["art_num"]."\"";
      22.     if (isset($_GET["artiste"]) && ($row["art_num"]==$_GET["artiste"]))
      23.         echo " selected=\"selected\"";
      24.     echo ">".$row["artiste"]."</option>\n";
      25. }
      26. echo "</select>
      27.    <input type=\"submit\" value=\"Afficher les disques de cet artiste\" />
      28.    </form>";
      29. // si on a choisi un artiste
      30. if (isset($_GET["artiste"])) {
      31.     // liste des disques de l'artiste sélectionné
      32.     $res = $db->query("SELECT dis_num,dis_annee,dis_titre
      33.                         FROM disque
      34.                        WHERE dis_artiste=".$_GET["artiste"]."
      35.                     ORDER BY dis_annee,dis_titre");
      36.     // récupération des données
      37.     $data = $res->fetchAll() ;
      38.     if (count($data)==0) {
      39.         echo "Aucun disque n'existe pour cet artiste.";
      40.     } else {
      41.         // construction du deuxième formulaire : choix du disque
      42.         echo "<form action=\"$cettepage\">
      43.            <input type=\"hidden\" name=\"artiste\" value=\"".$_GET["artiste"]."\" />
      44.            <select name=\"disque\">\n";
      45.         foreach ( $data as $row ) {
      46.             echo "<option value=\"".$row["dis_num"]."\"";
      47.             if ($row["dis_num"]==$_GET["disque"])
      48.                 echo " selected=\"selected\"";
      49.             echo ">".$row["dis_titre"]." (".$row["dis_annee"].")</option>\n";
      50.         } // fin du foreach
      51.         echo "</select>
      52.            <input type=\"submit\" value=\"Afficher les chansons de ce disque\" />
      53.            </form>";
      54.         // si on a choisi un disque
      55.         if (isset($_GET["disque"])) {
      56.             // liste des chansons du disque sélectionné
      57.             $res = $db->query("SELECT int_numero,cha_titre
      58.                                FROM interprete,chanson
      59.                                WHERE int_chanson=cha_num
      60.                                AND int_disque=".$_GET["disque"]."
      61.                            ORDER BY int_numero");
      62.             // récupération des données
      63.             $data = $res->fetchAll() ;
      64.             if (count($data)==0) {
      65.                 echo "Aucune chanson n'existe pour ce disque.";
      66.             } else {
      67.                 foreach ( $data as $row ) {
      68.                     echo $row["int_numero"].". ".$row["cha_titre"]."<br />\n";
      69.                 } // fin du foreach
      70.             } // fin du if (count($data)==0)
      71.         } // fin du if (isset($_GET["disque"]))
      72.     } // fin du if (count($data)==0)
      73. } // fin du if (isset($_GET["artiste"]))
      74. ?>
      75. </body></html>
      76.  
Dernière modification : 25/8/2016

Semaine du dredi 14 novemb' 2014 : TD n°8 (Cumul=14h)

Exercices d'application
Réaliser un site qui combine les diverses notions vues lors de ce semestre: CSS, HTML5, PHP, accès à une base de données, identification (sessions), etc.
Trois versions :
  1. Simple, recap01 : identification. (Les personnes autorisées sont celle de la table autorisations
    Contenu des fichiers :
    1. <?php
    2. require("debutdepage.php");
    3. ?>
    4.  
    5.  
    6. Bien le bonjour....
    7.  
    8. <?php
    9. require("findepage.php");
    10. ?>
    11.  
    1. <?php
    2. require("fonctions.php");
    3. if (!isset($titre))
    4.     $titre="Exercice récapitulatif";
    5. ?>
    6. <!DOCTYPE html>
    7. <html>
    8.   <head lang="fr">
    9.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    10.     <meta charset="utf-8">
    11.     <link rel="shortcut icon" href="images/dg.ico" />
    12.     <link rel="stylesheet" type="text/css" href="style.css" />
    13.     <!--[if lt IE 9]>
    14.         <script src="html5shiv.js"></script>
    15.         <script src="html5shiv-printshiv.js"></script>
    16.     <![endif]-->  
    17.     <title><?=$titre?></title>            
    18. </head>
    19. <body>
    20.     <div class="version"></div>
    21. <?php require("identification.php"); ?>
    22.     <h1><?=$titre?></h1>        
    23.  
    1. </body>
    2. </html>
    3.  
    1. <?php
    2. // =====================================================================
    3. //       D I V E R S E S   I N I T I A L I S A T I O N S
    4. // =====================================================================
    5. $cettepage = basename($_SERVER["PHP_SELF"]);
    6. $db=new PDO('pgsql:host=localhost;dbname=disques2009','nobody', 'knows' );
    7.  
    8.  
    9. // =====================================================================
    10. //       A F F I C H A G E   D E S   E R R E U R S
    11. // =====================================================================
    12. if (isset($_GET["verb"])) {
    13.         // Afficher les erreurs à l'écran
    14.         ini_set('display_errors', 1);
    15.         // Enregistrer les erreurs dans un fichier de log
    16.         ini_set('log_errors', 1);
    17.         // Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
    18.         ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
    19.         // Afficher les erreurs et les avertissements
    20.         error_reporting(E_ALL);
    21. }
    22. // =====================================================================
    23. // =====================================================================
    24.  
    25.  
    26.  
    27. // =====================================================================
    28. //       F O N C T I O N S   D E   B A S E S   D E   D O N N É E S
    29. // =====================================================================
    30.  
    31. // =====================================================================
    32. //  Exécution d'une requête sans retour de résultat
    33. // =====================================================================
    34. function requete($req) {
    35.     global $db ;
    36.     $db->query($req);
    37.     if ($db->errorCode()!=0) {
    38.         echo "<h3 class=\"erreur\">Erreur sur la requête</h3><blockquote><p><pre>$req</pre></p></blockquote>\n";
    39.         $t=$db->errorInfo();
    40.         echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
    41.         echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
    42.         echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
    43.         echo "<h3 class=\"erreur\">Le programme a été interrompu</h3>";
    44.         echo "</body></html>";
    45.         die();
    46.     }
    47. }
    48. // =====================================================================
    49. function select($req) { // renvoie un tableau contenant le résultat de l'exécution d'une requête
    50.     global $db ;
    51.     $res = $db->query($req);
    52.     if ($db->errorCode()!=0) {
    53.         echo "<h3 class=\"erreur\">Erreur sur la requête</h3><blockquote><p><pre>$req</pre></p></blockquote>\n";
    54.         $t=$db->errorInfo();
    55.         echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
    56.         echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
    57.         echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
    58.         echo "<h3 class=\"erreur\">Le programme a été interrompu</h3>";
    59.         die();
    60.     }
    61.     return $res->fetchAll();
    62. }
    63. // =====================================================================
    64. function unevaleur($req) {
    65.    $res=select($req);
    66.    if (count($res) != 1) return "";
    67.     return $res[0][0];
    68. }
    69. // =====================================================================
    70. // =====================================================================
    71.  
    72.  
    73. // =====================================================================
    74. //       F O N C T I O N S   P O U R   I D E N T I F I C A T I O N
    75. // =====================================================================
    76.  
    77. // =====================================================================
    78. function motdepasse($nomDeLogin) {
    79.    $mdp = unevaleur("SELECT aut_motdepasse FROM autorisations WHERE aut_login='$nomDeLogin'");
    80.    if ($mdp == "") return null;
    81.    return $mdp;
    82. }
    83. // =====================================================================
    84. // Récupère les variables de sessions (nom, prénom, etc.) dans la base à partir du login
    85. function creerVariableDeSession($nomDeLogin, $champs) {
    86.   $req=""; $virg="";
    87.   foreach ($champs as $k=>$v) {
    88.     $req.="$virg$v as $k";
    89.     $virg=", ";
    90.   }
    91.         $res=select("SELECT $req FROM autorisations,droits WHERE dro_num=aut_droits AND aut_login='$nomDeLogin'");
    92.   if (count($res) != 1) return "";
    93.   foreach ($champs as $k=>$v)
    94.        $_SESSION[$k]=$res[0][$k];      
    95. }
    96. // =====================================================================
    97. // =====================================================================
    98.  
    99.  
    100.  
    101.  
    102.  
    103. ?>
    104.  
    1. <?php
    2. $premplirIdentifiant="Identifiant (votre adresse mail)";
    3. $action=$cettepage;
    4.  
    5. // nouvel utilisateur ??
    6. //if (isset($_POST["login"])) {
    7. if (!empty($_POST["login"])) {
    8.    $_SESSION['login']=$_POST['login'];
    9.    $_SESSION['password']=$_POST['password'];
    10. }
    11. // identification
    12. $nomDeLogin="";
    13. if (   isset($_SESSION['login'])
    14.     && (motdepasse($_SESSION['login'])!=NULL)
    15.     && (motdepasse($_SESSION['login'])==$_SESSION['password'])
    16.    ) {
    17.   $nomDeLogin = $_SESSION['login'];
    18.   creerVariableDeSession($nomDeLogin,
    19.                          array("nom"=>"aut_nom",
    20.                                "prenom"=>"aut_prenom",
    21.                                "accreditation"=>"dro_nom"),
    22.                          2);
    23. }
    24. if (!isset($nomDeLogin) || ($nomDeLogin=="")) {
    25.   $nomDeLogin=NULL;
    26. }
    27. // session nouvelle (à identifier) ou en cours ?
    28. if (   isset($_POST['off'])
    29.     || ($nomDeLogin==NULL)) {
    30.   unset($_SESSION['login'], $_SESSION['nom'], $_SESSION['prenom'],
    31.          $_SESSION['password'],$_SESSION['accreditation']);
    32. ?>
    33.         <h1>Vous devez vous identifier</h1>
    34.         <form action="<?=$cettepage?>" method="post">
    35.         <input name="login" autofocus placeholder="login..."/>
    36.         <input name="password" placeholder="Mot de passe" type="password"/>
    37.         <input type="submit" value="Je m'identifie"/>
    38.         </form>
    39. <?php
    40.   require("findepage.php");
    41.   die(); // pas identifié => rien de plus dans la page
    42. }  // fin de session nouvelle
    43.   else { //identifié => bouton de déconnexion
    44. ?>
    45. <div class="deconnexion">
    46.         <form action="<?=$cettepage?>" method="POST">
    47.         <input type="hidden" name="off" value="1"/>
    48.         <input type="submit" value="Déconnecter <?=$_SESSION['prenom']." ".strtoupper($_SESSION['nom'])?>"/>
    49.         </form>
    50. </div> 
    51. <?php
    52. }
    53. ?>
    54.  
    1. .version {
    2.     position:fixed;
    3.     bottom:1px;
    4.     right:1px;
    5.     background:silver;  
    6.     border:1px dotted #888;
    7.     color: #888;
    8.     padding:0.05em 0.3em;
    9. }
    10. .version:before {content:"Version 1.0";}
    11. .erreur {
    12.         border:silver solid red;
    13.         background:yellow;
    14. }
    15. .deconnexion {
    16.     position:fixed;
    17.     top:1px;
    18.     right:1px;    
    19. }
    20.  
  2. Élaborée, recap02 : menus un peu évolués.
    Contenu des fichiers :
    1. <?php
    2. require("debutdepage.php");
    3. ?>
    4.  
    5.  
    6. Bien le bonjour....
    7.  
    8. <?php
    9. require("findepage.php");
    10. ?>
    11.  
    1. <?php
    2. $titre="Quelques statisitiques sur les emprunts";
    3. require("debutdepage.php");
    4. ?>
    5.  
    6.  
    7. Bla bla bla....
    8.  
    9. <?php
    10. require("findepage.php");
    11. ?>
    12.  
    1. <?php
    2. $titre="Quelques infos sur les adhérents";
    3. require("debutdepage.php");
    4. ?>
    5.  
    6.  
    7. Etc. etc. etc. etc. etc. etc. etc. etc. etc. etc. etc. etc. etc.
    8.  
    9.  
    10. <?php
    11. require("findepage.php");
    12. ?>
    13.  
    1. <?php
    2. require("fonctions.php");
    3. if (!isset($titre))
    4.     $titre="Exercice récapitulatif";
    5. ?>
    6. <!DOCTYPE html>
    7. <html>
    8.   <head lang="fr">
    9.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    10.     <meta charset="utf-8">
    11.     <link rel="shortcut icon" href="images/dg.ico" />
    12.     <link rel="stylesheet" type="text/css" href="style.css" />
    13.     <!--[if lt IE 9]>
    14.         <script src="html5shiv.js"></script>
    15.         <script src="html5shiv-printshiv.js"></script>
    16.     <![endif]-->  
    17.     <title><?=$titre?></title>            
    18. </head>
    19. <body>
    20.     <div class="version"></div>
    21. <?php require("identification.php"); ?>
    22. <header>
    23.     <h1><?=$titre?></h1>        
    24. </header>
    25. <nav class="menu"> <!-- Le menu -->
    26. <?php    
    27. $menus=array("index.php"=>"Accueil",
    28.               "stats.php"=>"Stats sur les prêts",
    29.               "adherents.php"=>"Gestion des adhérents");
    30. foreach ($menus as $f=>$t) {
    31.     echo "<div class=\"eltmenu".($cettepage==$f?"actif":"")."\"><a href=\"$f\">$t</a></div>\n";
    32. }
    33.  
    34. ?>
    35. </nav>
    36. <main>
    37.  
    1. </main>
    2. </body>
    3. </html>
    4.  
    1. <?php
    2. // =====================================================================
    3. //       D I V E R S E S   I N I T I A L I S A T I O N S
    4. // =====================================================================
    5. $cettepage = basename($_SERVER["PHP_SELF"]);
    6. $db=new PDO('pgsql:host=localhost;dbname=disques2009','nobody', 'knows' );
    7.  
    8.  
    9. // =====================================================================
    10. //       A F F I C H A G E   D E S   E R R E U R S
    11. // =====================================================================
    12. if (isset($_GET["verb"])) {
    13.         // Afficher les erreurs à l'écran
    14.         ini_set('display_errors', 1);
    15.         // Enregistrer les erreurs dans un fichier de log
    16.         ini_set('log_errors', 1);
    17.         // Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
    18.         ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
    19.         // Afficher les erreurs et les avertissements
    20.         error_reporting(E_ALL);
    21. }
    22. // =====================================================================
    23. // =====================================================================
    24.  
    25.  
    26.  
    27. // =====================================================================
    28. //       F O N C T I O N S   D E   B A S E S   D E   D O N N É E S
    29. // =====================================================================
    30.  
    31. // =====================================================================
    32. //  Exécution d'une requête sans retour de résultat
    33. // =====================================================================
    34. function requete($req) {
    35.     global $db ;
    36.     $db->query($req);
    37.     if ($db->errorCode()!=0) {
    38.         echo "<h3 class=\"erreur\">Erreur sur la requête</h3><blockquote><p><pre>$req</pre></p></blockquote>\n";
    39.         $t=$db->errorInfo();
    40.         echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
    41.         echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
    42.         echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
    43.         echo "<h3 class=\"erreur\">Le programme a été interrompu</h3>";
    44.         echo "</body></html>";
    45.         die();
    46.     }
    47. }
    48. // =====================================================================
    49. function select($req) { // renvoie un tableau contenant le résultat de l'exécution d'une requête
    50.     global $db ;
    51.     $res = $db->query($req);
    52.     if ($db->errorCode()!=0) {
    53.         echo "<h3 class=\"erreur\">Erreur sur la requête</h3><blockquote><p><pre>$req</pre></p></blockquote>\n";
    54.         $t=$db->errorInfo();
    55.         echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
    56.         echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
    57.         echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
    58.         echo "<h3 class=\"erreur\">Le programme a été interrompu</h3>";
    59.         die();
    60.     }
    61.     return $res->fetchAll();
    62. }
    63. // =====================================================================
    64. function unevaleur($req) {
    65.    $res=select($req);
    66.    if (count($res) != 1) return "";
    67.     return $res[0][0];
    68. }
    69. // =====================================================================
    70. // =====================================================================
    71.  
    72.  
    73. // =====================================================================
    74. //       F O N C T I O N S   P O U R   I D E N T I F I C A T I O N
    75. // =====================================================================
    76.  
    77. // =====================================================================
    78. function motdepasse($nomDeLogin) {
    79.    $mdp = unevaleur("SELECT aut_motdepasse FROM autorisations WHERE aut_login='$nomDeLogin'");
    80.    if ($mdp == "") return null;
    81.    return $mdp;
    82. }
    83. // =====================================================================
    84. // Récupère les variables de sessions (nom, prénom, etc.) dans la base à partir du login
    85. function creerVariableDeSession($nomDeLogin, $champs) {
    86.   $req=""; $virg="";
    87.   foreach ($champs as $k=>$v) {
    88.     $req.="$virg$v as $k";
    89.     $virg=", ";
    90.   }
    91.         $res=select("SELECT $req FROM autorisations,droits WHERE dro_num=aut_droits AND aut_login='$nomDeLogin'");
    92.   if (count($res) != 1) return "";
    93.   foreach ($champs as $k=>$v)
    94.        $_SESSION[$k]=$res[0][$k];      
    95. }
    96. // =====================================================================
    97. // =====================================================================
    98.  
    99.  
    100.  
    101.  
    102.  
    103. ?>
    104.  
    1. <?php
    2. $premplirIdentifiant="Identifiant (votre adresse mail)";
    3. $action=$cettepage;
    4.  
    5. // nouvel utilisateur ??
    6. //if (isset($_POST["login"])) {
    7. if (!empty($_POST["login"])) {
    8.    $_SESSION['login']=$_POST['login'];
    9.    $_SESSION['password']=$_POST['password'];
    10. }
    11. // identification
    12. $nomDeLogin="";
    13. if (   isset($_SESSION['login'])
    14.     && (motdepasse($_SESSION['login'])!=NULL)
    15.     && (motdepasse($_SESSION['login'])==$_SESSION['password'])
    16.    ) {
    17.   $nomDeLogin = $_SESSION['login'];
    18.   creerVariableDeSession($nomDeLogin,
    19.                          array("nom"=>"aut_nom",
    20.                                "prenom"=>"aut_prenom",
    21.                                "accreditation"=>"dro_nom"),
    22.                          2);
    23. }
    24. if (!isset($nomDeLogin) || ($nomDeLogin=="")) {
    25.   $nomDeLogin=NULL;
    26. }
    27. // session nouvelle (à identifier) ou en cours ?
    28. if (   isset($_POST['off'])
    29.     || ($nomDeLogin==NULL)) {
    30.   unset($_SESSION['login'], $_SESSION['nom'], $_SESSION['prenom'],
    31.          $_SESSION['password'],$_SESSION['accreditation']);
    32. ?>
    33.         <h1>Vous devez vous identifier</h1>
    34.         <form action="<?=$cettepage?>" method="post">
    35.         <input name="login" autofocus placeholder="login..."/>
    36.         <input name="password" placeholder="Mot de passe" type="password"/>
    37.         <input type="submit" value="Je m'identifie"/>
    38.         </form>
    39. <?php
    40.   require("findepage.php");
    41.   die(); // pas identifié => rien de plus dans la page
    42. }  // fin de session nouvelle
    43.   else { //identifié => bouton de déconnexion
    44. ?>
    45. <div class="deconnexion">
    46.         <form action="<?=$cettepage?>" method="POST">
    47.         <input type="hidden" name="off" value="1"/>
    48.         <input type="submit" value="Déconnecter <?=$_SESSION['prenom']." ".strtoupper($_SESSION['nom'])?>"/>
    49.         </form>
    50. </div> 
    51. <?php
    52. }
    53. ?>
    54.  
    1. .version {
    2.     position:fixed;
    3.     bottom:1px;
    4.     right:1px;
    5.     background:silver;  
    6.     border:1px dotted #888;
    7.     color: #888;
    8.     padding:0.05em 0.3em;
    9. }
    10. .version:before {content:"Version 2.0";}
    11. .erreur {
    12.         border:silver solid red;
    13.         background:yellow;
    14. }
    15. .deconnexion {
    16.     position:fixed;
    17.     top:1px;
    18.     right:1px;    
    19.     z-index:10;  
    20. }
    21. a:link, a:visited, a:hover, a:visited:hover {
    22.     color:inherit;
    23.     text-decoration:none;
    24. }
    25. header{
    26.     position:fixed;
    27.     top:0;
    28.     left:0;
    29.     width:100%;
    30.     height:15%;
    31.     background:#ddd;
    32.     z-index:0;
    33. }
    34. header h1 {
    35.     text-align:center;
    36.     margin-top:1em;
    37. }
    38. nav.menu {
    39.     position:fixed;
    40.     left:2px;
    41.     top:17%;
    42.     width:15%;
    43.     border:silver solid 1px;
    44.     padding:2px;
    45. }
    46. div.eltmenu {
    47.     border:silver solid 1px;
    48.     padding:2px;
    49. }
    50. div.eltmenu:hover, div.eltmenuactif {
    51.     background:#444;
    52.     color:#ddd;
    53. }
    54. main {
    55.     position:fixed;
    56.     left:16%;
    57.     top:17%;
    58.     width:83.5%;
    59.     background:#ddd;
    60.     padding:2em 1em 4em;
    61. }
    62.  
  3. Complète, recap03 : contrôles d'accès aux pages.
    Contenu des fichiers :
    1. <?php
    2. require("debutdepage.php");
    3. ?>
    4.  
    5.  
    6. Bien le bonjour....
    7.  
    8. <?php
    9. require("findepage.php");
    10. ?>
    11.  
    1. <?php
    2. $niveaurequis=10;
    3. $titre="Quelques statisitiques sur les emprunts";
    4. require("debutdepage.php");
    5. ?>
    6.  
    7.  
    8. Bla bla bla....
    9.  
    10. <?php
    11. require("findepage.php");
    12. ?>
    13.  
    1. <?php
    2. $niveaurequis=99;
    3. $titre="Quelques infos sur les adhérents";
    4. require("debutdepage.php");
    5. ?>
    6.  
    7.  
    8. Etc. etc. etc. etc. etc. etc. etc. etc. etc. etc. etc. etc. etc.
    9.  
    10.  
    11. <?php
    12. require("findepage.php");
    13. ?>
    14.  
    1. <?php
    2. require("fonctions.php");
    3. if (!isset($titre))
    4.     $titre="Exercice récapitulatif";
    5. ?>
    6. <!DOCTYPE html>
    7. <html>
    8.   <head lang="fr">
    9.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    10.     <meta charset="utf-8">
    11.     <link rel="shortcut icon" href="images/dg.ico" />
    12.     <link rel="stylesheet" type="text/css" href="style.css" />
    13.     <!--[if lt IE 9]>
    14.         <script src="html5shiv.js"></script>
    15.         <script src="html5shiv-printshiv.js"></script>
    16.     <![endif]-->  
    17.     <title><?=$titre?></title>            
    18. </head>
    19. <body>
    20.     <div class="version"></div>
    21. <?php require("identification.php"); ?>
    22. <header>
    23.     <h1><?=$titre?></h1>        
    24. </header>
    25. <nav class="menu"> <!-- Le menu -->
    26. <?php    
    27. foreach ($menus as $f=>$t) {
    28.     if ($t[1]<=$_SESSION["niveau"])
    29.        echo "<div class=\"eltmenu".($cettepage==$f?"actif":"")."\"><a href=\"$f\">".$t[0]."</a></div>\n";
    30. }
    31.  
    32. ?>
    33. </nav>
    34. <main>
    35.  
    1. </main>
    2. </body>
    3. </html>
    4.  
    1. <?php
    2. // =====================================================================
    3. //       D I V E R S E S   I N I T I A L I S A T I O N S
    4. // =====================================================================
    5. $cettepage = basename($_SERVER["PHP_SELF"]);
    6. $db=new PDO('pgsql:host=localhost;dbname=disques2009','nobody', 'knows' );
    7. $menus=array("index.php"=>array("Accueil",0), /* fichier => [titre,niveau nécessaire] */
    8.               "stats.php"=>array("Stats sur les prêts",10),
    9.               "adherents.php"=>array("Gestion des adhérents",90));
    10.  
    11.  
    12. // =====================================================================
    13. //       A F F I C H A G E   D E S   E R R E U R S
    14. // =====================================================================
    15. if (isset($_GET["verb"])) {
    16.         // Afficher les erreurs à l'écran
    17.         ini_set('display_errors', 1);
    18.         // Enregistrer les erreurs dans un fichier de log
    19.         ini_set('log_errors', 1);
    20.         // Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
    21.         ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
    22.         // Afficher les erreurs et les avertissements
    23.         error_reporting(E_ALL);
    24. }
    25. // =====================================================================
    26. // =====================================================================
    27.  
    28.  
    29.  
    30. // =====================================================================
    31. //       F O N C T I O N S   D E   B A S E S   D E   D O N N É E S
    32. // =====================================================================
    33.  
    34. // =====================================================================
    35. //  Exécution d'une requête sans retour de résultat
    36. // =====================================================================
    37. function requete($req) {
    38.     global $db ;
    39.     $db->query($req);
    40.     if ($db->errorCode()!=0) {
    41.         echo "<h3 class=\"erreur\">Erreur sur la requête</h3><blockquote><p><pre>$req</pre></p></blockquote>\n";
    42.         $t=$db->errorInfo();
    43.         echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
    44.         echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
    45.         echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
    46.         echo "<h3 class=\"erreur\">Le programme a été interrompu</h3>";
    47.         echo "</body></html>";
    48.         die();
    49.     }
    50. }
    51. // =====================================================================
    52. function select($req) { // renvoie un tableau contenant le résultat de l'exécution d'une requête
    53.     global $db ;
    54.     $res = $db->query($req);
    55.     if ($db->errorCode()!=0) {
    56.         echo "<h3 class=\"erreur\">Erreur sur la requête</h3><blockquote><p><pre>$req</pre></p></blockquote>\n";
    57.         $t=$db->errorInfo();
    58.         echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
    59.         echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
    60.         echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
    61.         echo "<h3 class=\"erreur\">Le programme a été interrompu</h3>";
    62.         die();
    63.     }
    64.     return $res->fetchAll();
    65. }
    66. // =====================================================================
    67. function unevaleur($req) {
    68.    $res=select($req);
    69.    if (count($res) != 1) return "";
    70.     return $res[0][0];
    71. }
    72. // =====================================================================
    73. // =====================================================================
    74.  
    75.  
    76. // =====================================================================
    77. //       F O N C T I O N S   P O U R   I D E N T I F I C A T I O N
    78. // =====================================================================
    79.  
    80. // =====================================================================
    81. function motdepasse($nomDeLogin) {
    82.    $mdp = unevaleur("SELECT aut_motdepasse FROM autorisations WHERE aut_login='$nomDeLogin'");
    83.    if ($mdp == "") return null;
    84.    return $mdp;
    85. }
    86. // =====================================================================
    87. // Récupère les variables de sessions (nom, prénom, etc.) dans la base à partir du login
    88. function creerVariableDeSession($nomDeLogin, $champs) {
    89.   $req=""; $virg="";
    90.   foreach ($champs as $k=>$v) {
    91.     $req.="$virg$v as $k";
    92.     $virg=", ";
    93.   }
    94.   $res=select("SELECT $req FROM autorisations,droits WHERE dro_num=aut_droits AND aut_login='$nomDeLogin'");
    95.   if (count($res) != 1) return "";
    96.   foreach ($champs as $k=>$v)
    97.        $_SESSION[$k]=$res[0][$k];      
    98. }
    99. // =====================================================================
    100. // =====================================================================
    101.  
    102.  
    103.  
    104.  
    105.  
    106. ?>
    107.  
    1. <?php
    2. $premplirIdentifiant="Identifiant (votre adresse mail)";
    3. $action=$cettepage;
    4.  
    5. // nouvel utilisateur ??
    6. //if (isset($_POST["login"])) {
    7. if (!empty($_POST["login"])) {
    8.    $_SESSION['login']=$_POST['login'];
    9.    $_SESSION['password']=$_POST['password'];
    10. }
    11. // identification
    12. $nomDeLogin="";
    13. if (   isset($_SESSION['login'])
    14.     && (motdepasse($_SESSION['login'])!=NULL)
    15.     && (motdepasse($_SESSION['login'])==$_SESSION['password'])
    16.    ) {
    17.   $nomDeLogin = $_SESSION['login'];
    18.   creerVariableDeSession($nomDeLogin,
    19.                          array("nom"=>"aut_nom",
    20.                                "prenom"=>"aut_prenom",
    21.                                "niveau"=>"dro_niveau",
    22.                                "accreditation"=>"dro_nom"),
    23.                          2);
    24. }
    25. if (!isset($nomDeLogin) || ($nomDeLogin=="")) {
    26.   $nomDeLogin=NULL;
    27. }
    28. // session nouvelle (à identifier) ou en cours ?
    29. if (   isset($_POST['off'])
    30.     || ($nomDeLogin==NULL)) {
    31.   unset($_SESSION['login'], $_SESSION['nom'], $_SESSION['prenom'],
    32.          $_SESSION['password'],$_SESSION['accreditation'],$_SESSION['niveau']);
    33. ?>
    34.         <h1>Vous devez vous identifier</h1>
    35.         <form action="<?=$cettepage?>" method="post">
    36.         <input name="login" autofocus placeholder="login..."/>
    37.         <input name="password" placeholder="Mot de passe" type="password"/>
    38.         <input type="submit" value="Je m'identifie"/>
    39.         </form>
    40. <?php
    41.   require("findepage.php");
    42.   die(); // pas identifié => rien de plus dans la page
    43. }  // fin de session nouvelle
    44.   else { //identifié => bouton de déconnexion
    45. ?>
    46. <div class="deconnexion">
    47.         <form action="<?=$cettepage?>" method="POST">
    48.         <input type="hidden" name="off" value="1"/>
    49.         <input type="submit" value="Déconnecter <?=$_SESSION['prenom']." "
    50.          .strtoupper($_SESSION['nom']). " (".$_SESSION['accreditation'].")"?>"/>
    51.         </form>
    52. </div> 
    53. <?php
    54. }
    55. if ($niveaurequis>$_SESSION['niveau']) {
    56.     echo "<h1>Vous n'avez le niveau d'accréditation nécessaire pour accéder à ces pages</h1>";
    57.     require("findepage.php");
    58.     die();  
    59. }
    60. ?>
    61.  
    1. .version {
    2.     position:fixed;
    3.     bottom:1px;
    4.     right:1px;
    5.     background:silver;  
    6.     border:1px dotted #888;
    7.     color: #888;
    8.     padding:0.05em 0.3em;
    9. }
    10. .version:before {content:"Version 3.0";}
    11. .erreur {
    12.         border:silver solid red;
    13.         background:yellow;
    14. }
    15. .deconnexion {
    16.     position:fixed;
    17.     top:1px;
    18.     right:1px;
    19.     z-index:10;  
    20. }
    21. a:link, a:visited, a:hover, a:visited:hover {
    22.     color:inherit;
    23.     text-decoration:none;
    24. }
    25. header{
    26.     position:fixed;
    27.     top:0;
    28.     left:0;
    29.     width:100%;
    30.     height:15%;
    31.     background:#ddd;
    32.     z-index:0;
    33. }
    34. header h1 {
    35.     text-align:center;
    36.     margin-top:1em;
    37. }
    38. nav.menu {
    39.     position:fixed;
    40.     left:2px;
    41.     top:17%;
    42.     width:15%;
    43.     border:silver solid 1px;
    44.     padding:2px;
    45. }
    46. div.eltmenu {
    47.     border:silver solid 1px;
    48.     padding:2px;
    49. }
    50. div.eltmenu:hover, div.eltmenuactif {
    51.     background:#444;
    52.     color:#ddd;
    53. }
    54. main {
    55.     position:fixed;
    56.     left:16%;
    57.     top:17%;
    58.     width:83.5%;
    59.     background:#ddd;
    60.     padding:2em 1em 4em;
    61. }
    62.  
Dernière modification : 25/8/2016
Dernière modification : 25/8/2016