Étape 1: Structure du site, données

Structure du site

Après réflexion, nous pourrions en arriver à un cahier des charges comme celui-ci:

  • la page d’accueil affichera tous les créneaux du planning par ordre chronologique sous la forme d’un tableau → elle sera bien évidemment générée par un script PHP
  • en haut de la page, différents filtres seront proposés: date, identifiant du cours, salle, enseignant, etc. → les listes de choix seront construites dynamiquement par les scripts PHP
  • dans le tableau, les valeurs pour les identifiants des cours, les noms des salles et les noms des enseignants devront être “cliquables” → renvoi vers un script PHP affichant le détail

Données utilisées

Cette analyse fait ressortir que nous aurons besoin de stocker les données suivantes:

  • pour les cours
    • numéro (clé)
    • identifiant (ex: 'R209')
    • libellé (ex: 'Initiation au développement Web')
  • pour les salles
    • numéro (clé)
    • description (ex: 'TD Info')
  • pour les enseignants
    • numéro (clé)
    • nom (ex: 'MM')
  • pour les créneaux du planning
    • numéro unique (clé)
    • date + heure de début (ex: '2022-04-04 08:00:00')
    • date + heure de fin
    • référence du cours
    • référence de la salle
    • référence de l’enseignant

Création de la base SQL

Pour stocker ces informations nous allons bien évidemment utiliser une base de données (SQLite dans notre cas). Voici ci-dessous la structure proposée pour ce tutoriel (via l’outil DB Browser for SQLite).

db_structure
structure de la base de données

Fichier SQL complet pour la création des tables avec insertion de quelques données de test (fichier planning_sqlite.sql)

-- SQL pour les tables du projets: cours, salle, prof, planning

BEGIN TRANSACTION;

-- Table cours

DROP TABLE IF EXISTS cours;

CREATE TABLE cours
  (numcours	INTEGER	PRIMARY KEY,
   idcours	TEXT		NOT NULL,
   libcours	TEXT		NULL
  );

INSERT INTO cours VALUES(1,'R201','Technologie de l''Internet');
INSERT INTO cours VALUES(2,'R204','Initiation à la téléphonie d''entreprise');
INSERT INTO cours VALUES(3,'SAE 21','SAE 21');
INSERT INTO cours VALUES(4,'R213','Mathématiques des systèmes numériques');
INSERT INTO cours VALUES(5,'R209','Initiation au développement Web');
INSERT INTO cours VALUES(6,'R214','Analyse mathématiques des signaux');
INSERT INTO cours VALUES(7,'R211','Expression, Culture, Communication');

INSERT INTO cours VALUES(501,'réunion','Présentation parcours BUT');

-- Table salle

DROP TABLE IF EXISTS salle;

CREATE TABLE salle
  (numsalle	INTEGER	PRIMARY KEY,
   descsalle	TEXT		NOT NULL
  );

INSERT INTO salle VALUES( 1,'Amphi BIO');
INSERT INTO salle VALUES( 2,'Salle de cours');
INSERT INTO salle VALUES( 3,'Téléformation');
INSERT INTO salle VALUES( 4,'TD6');
INSERT INTO salle VALUES( 5,'Réseaux');
INSERT INTO salle VALUES( 6,'Salle PC');
INSERT INTO salle VALUES( 7,'TD4');
INSERT INTO salle VALUES( 8,'Très Haut Débit');
INSERT INTO salle VALUES( 9,'Station');
INSERT INTO salle VALUES(10,'Projets');
INSERT INTO salle VALUES(11,'Réseaux optiques');
INSERT INTO salle VALUES(12,'TD Info');
INSERT INTO salle VALUES(13,'Téléphonie');

-- Table prof

DROP TABLE IF EXISTS prof;

CREATE TABLE prof
  (numprof	INTEGER	PRIMARY KEY,
   nomprof	TEXT		NOT NULL
  );

INSERT INTO prof VALUES(0,'accès libre');
INSERT INTO prof VALUES(1,'JJB');
INSERT INTO prof VALUES(2,'AA');
INSERT INTO prof VALUES(3,'PA');
INSERT INTO prof VALUES(4,'SS');
INSERT INTO prof VALUES(5,'SM');
INSERT INTO prof VALUES(6,'MM');
INSERT INTO prof VALUES(7,'FK');

-- Table planning

DROP TABLE IF EXISTS planning;

CREATE TABLE planning
  (numcreneau	INTEGER	PRIMARY KEY,
   debut	DATE		NOT NULL,
   fin		DATE		NOT NULL,
   numcours	INTEGER	NULL,
   numsalle	INTEGER	NULL,
   numprof	INTEGER	NULL
  );

INSERT INTO planning VALUES( 1,'2022-04-04 08:00:00','2022-04-04 09:30:00',1,1,1);
INSERT INTO planning VALUES( 2,'2022-04-04 09:30:00','2022-04-04 11:00:00',2,2,2);
INSERT INTO planning VALUES( 3,'2022-04-04 11:00:00','2022-04-04 12:30:00',3,3,3);
INSERT INTO planning VALUES( 4,'2022-04-04 13:30:00','2022-04-04 15:00:00',2,4,2);
INSERT INTO planning VALUES( 5,'2022-04-04 15:00:00','2022-04-04 18:00:00',1,5,1);
INSERT INTO planning VALUES( 6,'2022-04-04 18:00:00','2022-04-04 19:30:00',501,2,4);

INSERT INTO planning VALUES( 7,'2022-04-05 08:00:00','2022-04-05 11:00:00',5,6,5);
INSERT INTO planning VALUES( 8,'2022-04-05 11:00:00','2022-04-05 12:30:00',2,7,2);
INSERT INTO planning VALUES( 9,'2022-04-05 13:30:00','2022-04-05 15:00:00',3,8,0);
INSERT INTO planning VALUES(10,'2022-04-05 15:00:00','2022-04-05 18:00:00',5,9,6);

INSERT INTO planning VALUES(11,'2022-04-06 08:00:00','2022-04-06 09:30:00',3,10,0);
INSERT INTO planning VALUES(12,'2022-04-06 09:00:00','2022-04-06 11:00:00',3,11,0);
INSERT INTO planning VALUES(13,'2022-04-06 11:00:00','2022-04-06 12:30:00',6,12,5);
INSERT INTO planning VALUES(14,'2022-04-06 13:30:00','2022-04-06 15:00:00',7,3,7);
INSERT INTO planning VALUES(15,'2022-04-06 15:00:00','2022-04-06 18:00:00',2,13,2);

INSERT INTO planning VALUES(16,'2022-04-07 08:00:00','2022-04-07 09:30:00',6,2,5);
INSERT INTO planning VALUES(17,'2022-04-07 09:30:00','2022-04-07 11:00:00',5,12,6);
INSERT INTO planning VALUES(18,'2022-04-07 11:00:00','2022-04-07 12:30:00',4,12,5);

-- Validation de la transaction

COMMIT;

Pour mémoire voici comment créer votre base de données via l’interpréteur SQLite:

munier@atlantis:[...]/tuto_php/step01$ sqlite3 planning.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .read planning_sqlite.sql
sqlite> select * from cours;
1|R201|Technologie de l'Internet
2|R204|Initiation à la téléphonie d'entreprise
3|SAE 21|SAE 21
4|R213|Mathématiques des systèmes numériques
5|R209|Initiation au développement Web
6|R214|Analyse mathématiques des signaux
7|R211|Expression, Culture, Communication
501|réunion|Présentation parcours BUT
sqlite> .quit
munier@atlantis:[...]/tuto_php/step01$ 

Et n’oubliez pas que vous pouvez utiliser les commandes .mode column et .headers on de l’interpréteur SQLite pour avoir un affichage plus “convivial”.

munier@atlantis:[...]/tuto_php/step01$ sqlite3 planning.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .mode column
sqlite> .headers on
sqlite> select * from cours;
numcours    idcours     libcours
----------  ----------  -------------------------
1           R201        Technologie de l'Internet
2           R204        Initiation à la téléphoni
3           SAE 21      SAE 21
4           R213        Mathématiques des système
5           R209        Initiation au développeme
6           R214        Analyse mathématiques des
7           R211        Expression, Culture, Comm
501         réunion     Présentation parcours BUT
sqlite> .quit
munier@atlantis:[...]/tuto_php/step01$ 

Test de requêtes SQL

Avant d’aller plus loin, testons déjà quelques requêtes SQL pour s’assurer que cette organisation des données sera “exploitable”.

Recherchons par exemple la liste de tous les créneaux horaires concernant l’enseignant MM:

sqlite> select * from planning where numprof in (select numprof from prof where nomprof='MM');
numcreneau  debut                fin                  numcours    numsalle    numprof
----------  -------------------  -------------------  ----------  ----------  ----------
10          2022-04-05 15:00:00  2022-04-05 18:00:00  5           9           6
17          2022-04-07 09:30:00  2022-04-07 11:00:00  5           12          6
sqlite>

Conclusion

Nous avons maintenant une idée des pages Web nécessaires à notre site. Ces pages HTML seront générées dynamiquement par des scripts PHP qui utiliseront les informations stockées dans une base de données SQL.

La prochaine étape consiste à écrire notre premier script PHP.

Suivant