logo Pierre AULAS
Php/MySql - Examen du 11 juillet 2007
 Parcours  |   Réalisations  |   Cours  |   Chroniques  |   Divers
Élections parisiennes
Carnet de note
Université
Carnet de note
Correction Université
Correction Carnet de note
Météo France
Boursicotage
Diaporama

Examen php/mysql du 11 juillet 2007

L'examen comprend deux parties :

La première partie doit être rendue sous forme de fichier ".txt" portant votre nom en majuscule.

Exemple :

La seconde partie sera rendue sous forme d'un unique fichier ".php" portant votre nom en majuscule.

Exemple :

À l'heure dite, vous m'enverrez un mail contenant en pièce-jointes ces deux fichiers sous forme d'un ".zip" portant votre nom en majuscule.

Exemple :

Vous avez le droit d'utiliser votre cours et internet. Les outils de communication interpersonnels sont interdits (téléphone, messagerie, bouts de papier, yeux qui louchent, etc.).

Haut de page

Requêtes SQL: une histoire d'université (8 points)

Toutes les requêtes qui vous sont demandées portent sur une base de donnée dont le schéma est le suivant :

Schéma de la base Université

Écrire les requêtes MySQL qui répondent aux questions suivantes :

1. Les noms des étudiants dont les notes sont supérieures à 10. (1/2 point)

2. Les noms des étudiants qui habitent à Paris. (1/2 point)

3. Nom et numéro des cursus disponibles à Paris. (1/2 point)

4. Pour chaque étudiant, son nom et la moyenne de ses notes. (1/2 point)

5. Le nom et la moyenne des étudiants admissibles (dont la moyenne est au moins égale à 10). (1/2 point)

6. Les cours et la moyenne des notes obtenues dans chacun de ces cours. (1/2 point)

7. Les étudiants et le cursus dans lequel ils sont inscrits. (1/2 point)

8. La somme des cotisations versées pour chaque cursus. (1/2 point)

9. Le nom des professeurs bénéficiant du salaire le plus élevé. (1 point)

10. Le nombre de cursus disponibles par université. (1 point)

11. Le cursus ayant le plus grand nombre d'éléves. (1 point)

12. Écrire la question qui conduit à écrire cette requête: (1 point)

SELECT e.nom
FROM etudiant e
UNION
SELECT p.nom
FROM professeur p;

Correction Université

Haut de page

Cas pratique : le carnet de note (12 points)

L'exercice consiste à permettre à un utilisateur de visualiser les notes des élèves, soit élève par élève, soit matière par matière.

Vous pouvez charger la base de donnée 'bulletin' sur laquelle vous allez travailler ici.

Ce fichier permet la création de la base et l'insertion de données concernant 11 élèves dans 4 matières.
Charge à vous de la mettre en place sur votre poste de travail. La correction se fera avec cette base.

Le schéma de cette base est le suivant :

Votre travail consiste à réaliser un formulaire qui ait l'allure suivante :

La première liste recense les différents cours. Chaque intitulé de cours est cliquable et permet l'affichage suivant :

Un tableau avec des intitulés de colonnes: nom et prénom, date (au format '21 juin 2001'), moyenne (avec deux chiffres après la virgule).

Vous ferez en sorte que l'affichage des notes se fasse dans l'ordre chronologique.

Vous ferez également en sorte que les noms et prénoms d'élèves soient affichés de la manière suivante :

La seconde liste recense les différents élèves. Chaque nom d'élève est cliquable et permet l'affichage suivant :

L'apparence des tableaux destinés à accueillir l'affichage est laissé à votre convenance.

Voir le fonctionnement

Correction Carnet de note

Haut de page

Correction Université

Histoire de vous entrainer un peu, vous pouvez utiliser le fichier sql suivant pour tester vos réponses.

Schéma de la base Université

1. Les noms des étudiants dont les notes sont supérieures à 10. (1/2 point)

SELECT DISTINCT etudiant.nom
FROM etudiant e, notation n
WHERE e.id = n.id_etudiant
AND note > 10;

2. Les noms des étudiants qui habitent à Paris. (1/2 point)

SELECT e.nom
FROM etudiant e
WHERE e.ville = 'Paris';

3. Nom et numéro des cursus disponibles à Paris. (1/2 point)

SELECT c.nom, c.id
FROM cursus c, orientation o, universite u
WHERE c.id = o.id_cursus
AND u.id = o.id_universite
AND u.ville = 'Paris';

4. Pour chaque étudiant, son nom et la moyenne de ses notes. (1/2 point)

SELECT e.nom, AVG(n.note) AS moyenne
FROM etudiant e, notation n
WHERE e.id = n.id_etudiant
GROUP BY e.nom;

Schéma de la base Université

5. Le nom et la moyenne des étudiants admissibles (dont la moyenne est au moins égale à 10). (1/2 point)

SELECT e.nom, AVG(n.note) AS moyenne
FROM etudiant e, notation n
WHERE e.id = n.id_etudiant
GROUP BY e.nom
HAVING AVG(n.note) >= 10;

6. Les cours et la moyenne des notes obtenues dans chacun de ces cours. (1/2 point)

SELECT c.nom, AVG(n.note) AS moyenne
FROM cours c, notation n
WHERE c.id = n.id_cours
GROUP BY c.nom;

7. Les étudiants et le cursus dans lequel ils sont inscrits. (1/2 point)

SELECT e.nom, c.nom
FROM etudiant e, cursus c, inscription i
WHERE e.id = i.id_etudiant
AND i.id_cursus = c.id;

8. La somme des cotisations versées pour chaque cursus. (1/2 point)

SELECT c.nom, SUM(co.montant) as total
FROM cursus c, compte co, inscription i, etudiant e
WHERE c.id = i.id_cursus
AND i.id_etudiant = e.id
AND e.id = co.id_etudiant
GROUP BY c.nom;

Schéma de la base Université

9. Le nom des professeurs bénéficiant du salaire le plus élevé. (1 point) (OK mais on demandait le nom de tous les professeurs)

SELECT p.nom
FROM professeur p
ORDER BY p.salaire DESC LIMIT 1;

10. Le nombre de cursus disponibles par université. (1 point)

SELECT u.nom, COUNT(c.id) AS nombre
FROM universite u, orientation o, cursus c
WHERE c.id = o.id_cursus
AND u.id = o.id_universite
GROUP BY u.id;

11. Le cursus ayant le plus grand nombre d'éléves. (1 point)

Exemple de mauvaise solution, mais qui fonctionne :

SELECT c.nom, COUNT(id_etudiant) AS nombre_eleve
FROM cursus c, inscription i
WHERE c.id = i.id_cursus
GROUP BY c.nom
ORDER BY nombre_eleve DESC
LIMIT 1;

12. Ecrire la question qui conduit à écrire cette requête: (1 point)

SELECT e.nom
FROM etudiant e
UNION
SELECT p.nom
FROM professeur p;

Afficher tous les noms des professeurs et étudiants.

Haut de page

Correction Carnet de note

<?php

include('identifiant.php');
include('connexion.php');

//_____________________faireDate________________________

//Recoit une date du genre: 2007-07-06
function faireDate($pDate)
{
$jour = substr($pDate,8);
$mois = substr($pDate,5);
$annee = substr($pDate,0,4);
$tabMois = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
$nvlDate = $jour." ".$tabMois[$mois-1]." ".$annee;
return $nvlDate;
}

//======================= AFFICHAGE DES TABLEAUX ========================

print "<TABLE><TR><TD valign=\"top\">";

//___________________Tableau des cours______________________

print "<U>Liste des cours</U><BR><BR>";
print "<TABLE BORDER=\"1\">";
$connexion = seconnecter(SERVEUR, BASE, LOGIN, MDP);
$requete = "SELECT id, nom FROM cours";
$resultat = faireRequete($requete, $connexion);
while($objet = passerObjetSuivant($resultat))
{
print "<TR>";
print "<TD><A href=\"?afficherCours=".$objet->id."&nom=".$objet->nom."\">".$objet->nom."</A>";
}
print "</TABLE>";

print "<TD>";

//___________________Tableau des élèves______________________

print "<U>Liste des élèves</U><BR><BR>";
print "<TABLE BORDER=\"1\">";
$requete = "SELECT id, nom, prenom FROM eleve";
$resultat = faireRequete($requete, $connexion);
while($objet = passerObjetSuivant($resultat))
{
$prenom = ($objet->prenom)?" (".$objet->prenom.")":"";
print "<TR>";
print "<TD><A href=\"?afficherEleve=".$objet->id."&nom=".$objet->nom."&prenom=".$objet->prenom."\">".$objet->nom."$prenom</A>";
}
print "</TABLE>";
print "</TABLE>";

//======================= AFFICHAGE DES NOTES ========================

//____________________________Un lien a été seléctionné___________________________

if (!empty($_GET))
{

//___________________________Affichage des notes par cours___________________________

if (isset($_GET['afficherCours']))
{
//Copie de variables GET pour faciliter la lecture:
$afficher = $_GET['afficherCours'];
$nom = $_GET['nom'];

//__________Présentation du cours

print "<BR>Notes du cours : $nom<BR><BR>";

//__________Requête qui récupère toutes les notes du cours mentionné par la
//variable $_GET

$connexion = seconnecter(SERVEUR, BASE, LOGIN, MDP);
$requete = "SELECT e.nom, e.prenom, n.date, n.note "
."FROM eleve e, cours c, note n "
."WHERE e.id=n.id_eleve AND n.id_cours=c.id AND c.id=".$afficher //C'est ici que la requête peut varier selon le cours demandé
." ORDER BY n.date";
$resultat = faireRequete($requete, $connexion);

//Le résultat de la requête est placé dans un tableau tel que:
//$tableau['Toto'][20070610]=12;
//$tableau['Toto'][20070520]=13;
//$tableau['Titi'][20070610]=15;
//$tableau['Titi'][20070520]=14;
while($objet = passerObjetSuivant($resultat))
{
$prenom = ($objet->prenom)?" (".$objet->prenom.")":"";
$nom = $objet->nom.$prenom;
$tableau [$nom][$objet->date] = $objet->note;
}

//__________Affichage du résultat:

print "<TABLE border=\"1\">";

//----Première ligne du tableau avec en-têtes de colonnes:

print "<TR><TD>Nom et prénom";
foreach($tableau[$nom] as $date => $note)
{
print "<TD>".faireDate($date); //Affichage des dates
}
print "<TD>Moyenne";

//----Lignes suivantes avec nom de l'élève puis ses notes

foreach($tableau as $nom => $tabNotes)
{
print "<TR><TD>$nom";
$somme = 0; //Sert à faire la moyenne à la fin de chaque ligne
foreach($tabNotes as $note)
{
print "<TD>$note";
$somme += $note;
}
print "<TD>";
//__________Calcul et afficahge de la moyenne:
printf ("%.2f", $somme/count($tabNotes)); //Affichage formaté à deux décimales après la virgule
}

print "</TABLE>";
}

//___________________________Affichage des notes par élève___________________________

elseif (isset($_GET['afficherEleve']))
{
//Copie de variables GET pour faciliter la lecture:
$idEleve = $_GET['afficherEleve'];
$nom = $_GET['nom'];
$prenom = ($_GET['prenom'])?" (".$_GET['prenom'].")":"";

//__________Présentation du cours

print "<BR><U>Notes de $nom$prenom</U><BR><BR>";

//__________Requête qui récupère toutes les notes du cours mentionné par la
//variable $_GET
$connexion = seconnecter(SERVEUR, BASE, LOGIN, MDP);
$requete = "SELECT c.nom, n.date, n.note "
."FROM eleve e, cours c, note n "
."WHERE e.id=n.id_eleve AND n.id_cours=c.id AND e.id=".$idEleve//C'est ici que la requête peut varier selon l'élève demandé
." ORDER BY n.date";
$resultat = faireRequete($requete, $connexion);

//Le résultat de la requête est placé dans un tableau tel que:
//$tableau['Cours1'][20070610]=12;
//$tableau['Cours1'][20070520]=13;
//$tableau['Cours2'][20070610]=15;
//$tableau['Cours2'][20070520]=14;
while($objet = passerObjetSuivant($resultat))
{
$cours = $objet->nom;
$tableau [$cours][$objet->date] = $objet->note;
}

//__________Affichage du résultat:

//----Première ligne du tableau avec en-têtes de colonnes:

print "<TABLE><TR>";
foreach($tableau as $cours => $sstableau)
{
print "<TD valign=\"top\">";
print "<TABLE border=\"1\">";
print "<TR><TD>$cours<TD>Note";

//----Lignes suivantes avec date et note:

foreach($sstableau as $date => $note)
{
print "<TR><TD>".faireDate($date);
print "<TD>$note";
}
print "</TABLE>";
}
print "</TABLE>";
}
?>

Haut de page
Plan du site  |  Mentions légales  |  Crédits  |  Aide