Devoirs en ligne

[45 min]

Une université propose des formations pour ses étudiants via une plate-forme d'enseignement en ligne. Plusieurs devoirs sont proposés, chacun ayant une description et une même date de rendu pour tous les étudiants souhaitant le faire. Le but de cet exercice est de réaliser un site Web permettant aux étudiants de consulter leurs notes.

Base de données

On vous donne ci-dessous le code SQL LDD de la base de données sous PostgreSQL ainsi qu'un exemple de code SQL LMD pour l'insertion de données.

1
CREATE TABLE etudiant(
2
login CHAR(8) PRIMARY KEY,
3
nom TEXT,
4
prenom TEXT
5
);
6
7
CREATE TABLE devoir(
8
num INTEGER PRIMARY KEY,
9
daterendu DATE UNIQUE NOT NULL,
10
description TEXT NOT NULL
11
);
12
13
CREATE TABLE note(
14
etudiant CHAR(8) REFERENCES etudiant(login),
15
devoir INTEGER REFERENCES devoir(num),
16
valeur INTEGER NOT NULL,
17
PRIMARY KEY(etudiant, devoir),
18
CHECK (valeur BETWEEN 0 AND 20)
19
);
20
21
INSERT INTO etudiant(login, nom, prenom) VALUES ('bfrankli', 'Franklin', 'Benjamin');
22
INSERT INTO devoir(num, daterendu, description) VALUES (1, '10-05-2013','Structures de donnees en C');
23
INSERT INTO note(etudiant, devoir, valeur) VALUES ('bfrankli', 1, 15);

Site Web

Le site Web sera composé :

  • d'une page d'accueil (accueil.html) comportant un formulaire où l'étudiant doit entrer son login ;

  • d'une page présentant les notes d'un étudiant pour chaque devoir qu'il a rendu ainsi que sa moyenne générale (notes.php).

La seconde page (notes.php) est appelée à partir de la première (accueil.html). On supposera dans le reste de l'exercice que tous les fichiers sont situés directement dans le répertoire public_html du serveur (sans sous-répertoires).

Exemple d'affichage pour notes.php

Question

Écrivez le formulaire HTML de la page d'accueil (accueil.html). On utilisera la méthode HTTP POST.

Indice

1
<form method="post" action="notes.php">
2
  <p>Login : </p>
3
  <input type="text" name="login"/>
4
  <input type="submit"/>
5
</form>

Solution

1
<html>
2
<body>
3
<h1>Accueil</h1>
4
<form method="post" action="notes.php">
5
  <p>Login : </p>
6
  <input type="text" name="login"/>
7
  <input type="submit"/>
8
</form>
9
</body>
10
</html>

Dans les questions suivantes, on supposera que le login spécifié dans le formulaire de accueil.html existe effectivement dans la base de données (on ne fera donc pas de test pour le vérifier) et on se référera à l'exemple d'affichage pour notes.php pour le résultat souhaité.

Question

Écrivez le code PHP permettant de générer le code HTML du titre de la page "Notes de l'étudiant..." pour le login en question.

Indice

1
echo "<h1>Notes de l'étudiant $vRow[prenom] $vRow[nom] (<i>$vRow[login]</i>)</h1>";

Solution

1
<?php
2
// Connexion à la base de données
3
$vConn = new PDO('pgsql:host=localhost;port=5432;dbname=devoirs', 'test', 'test');
4
5
// Écriture, préparation et exécution de la requête 1
6
$vSql = 'SELECT login, nom, prenom FROM etudiant WHERE login=:login';
7
$vResultSet = $vConn->prepare($vSql);
8
$vResultSet->bindValue(':login',$_POST['login'],PDO::PARAM_STR);
9
$vResultSet->execute();
10
// Traitement du résultat
11
$vRow = $vResultSet->fetch(PDO::FETCH_ASSOC);
12
echo "<h1>Notes de l'étudiant $vRow[prenom] $vRow[nom] (<i>$vRow[login]</i>)</h1>";
13
14
// Clôture de la connexion
15
$vConn=null;
16
?>

Question

Écrivez le code PHP permettant de générer le code HTML du tableau des notes de l'étudiant. Les devoirs seront affichés par ordre croissant de date de rendu.

Indice

On ajoutera une vue à la base de données préalablement à l'écriture du code PHP, afin d'éviter que la couche PHP ne contiennent du code SQL avancé.

Solution

SQL
1
CREATE VIEW v_devoir AS
2
SELECT d.description, d.daterendu, n.etudiant, n.valeur 
3
FROM devoir d JOIN note n ON n.devoir=d.num 
4
ORDER BY d.daterendu;
PHP
1
// Écriture, préparation et exécution de la requête 2
2
$vSql = 'SELECT * FROM v_devoir WHERE etudiant=:login';
3
$vResultSet = $vConn->prepare($vSql);
4
$vResultSet->bindValue(':login',$_POST['login'],PDO::PARAM_STR);
5
$vResultSet->execute();
6
// Traitement du résultat
7
echo "<table border='1'>";
8
echo "<tr><th>Devoir</th><th>Date de rendu</th><th>Note</th></tr>";
9
while ($vRow = $vResultSet->fetch(PDO::FETCH_ASSOC)) {
10
	echo "<tr><td>$vRow[desc]</td><td>$vRow[date]</td><td>$vRow[note]</td></tr>";
11
}
12
echo "</table>";

Question

Écrivez le code PHP permettant de calculer la moyenne générale de l'étudiant.

Solution

SQL
1
CREATE VIEW v_moy AS
2
SELECT ROUND(AVG(valeur),1) AS moy, etudiant
3
FROM note
4
GROUP BY etudiant;
1
// Écriture, préparation et exécution de la requête 3
2
$vSql = 'SELECT * FROM v_moy WHERE etudiant=:login';
3
$vResultSet = $vConn->prepare($vSql);
4
$vResultSet->bindValue(':login',$_POST['login'],PDO::PARAM_STR);
5
$vResultSet->execute();
6
// Traitement du résultat
7
$vRow = $vResultSet->fetch(PDO::FETCH_ASSOC);
8
echo "<p>Moyenne générale : <b>$vRow[moy]</b></p>";

Question

Écrivez le code HTML du lien hypertexte "Retour à l'accueil" et finalisez la page notes.php.

Indice

1
<a href="accueil.html">Retour à l'accueil</a>

Solution

1
<?php
2
// Connexion à la base de données
3
$vConn = new PDO('pgsql:host=localhost;port=5432;dbname=test', 'test', 'test');
4
5
// Écriture, préparation et exécution de la requête 1
6
$vSql = 'SELECT login, nom, prenom FROM etudiant WHERE login=:login';
7
$vResultSet = $vConn->prepare($vSql);
8
$vResultSet->bindValue(':login',$_POST['login'],PDO::PARAM_STR);
9
$vResultSet->execute();
10
// Traitement du résultat
11
$vRow = $vResultSet->fetch(PDO::FETCH_ASSOC);
12
echo "<h1>Notes de l'étudiant $vRow[prenom] $vRow[nom] (<i>$vRow[login]</i>)</h1>";
13
14
// Écriture, préparation et exécution de la requête 2
15
$vSql = 'SELECT * FROM v_devoir WHERE etudiant=:login';
16
$vResultSet = $vConn->prepare($vSql);
17
$vResultSet->bindValue(':login',$_POST['login'],PDO::PARAM_STR);
18
$vResultSet->execute();
19
// Traitement du résultat
20
echo "<table border='1'>";
21
echo "<tr><th>Devoir</th><th>Date de rendu</th><th>Note</th></tr>";
22
while ($vRow = $vResultSet->fetch(PDO::FETCH_ASSOC)) {
23
	echo "<tr><td>$vRow[desc]</td><td>$vRow[date]</td><td>$vRow[note]</td></tr>";
24
}
25
echo "</table>";
26
27
// Écriture, préparation et exécution de la requête 3
28
$vSql = 'SELECT * FROM v_moy WHERE etudiant=:login';
29
$vResultSet = $vConn->prepare($vSql);
30
$vResultSet->bindValue(':login',$_POST['login'],PDO::PARAM_STR);
31
$vResultSet->execute();
32
// Traitement du résultat
33
$vRow = $vResultSet->fetch(PDO::FETCH_ASSOC);
34
echo "<p>Moyenne générale : <b>$vRow[moy]</b></p>";
35
36
// Lien de retour 
37
echo "<p><a href='accueil.html'>Retour à l'accueil</a></p>";
38
39
// Clôture de la connexion
40
$vConn=null;
41
?>