É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).
Fichier SQL complet pour la création des tables avec insertion de quelques données de test (fichier <code>planning_sqlite.sql</code>)
-- 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.