Vous êtes sur la page 1sur 13

IFT 1147, Hiver 2004 Dominik Gehl

Programmation serveur Web avec PHP


EXAMEN Final

Lundi 19 avril 2004, salle Z-110


Durée: 170 minutes

Directives:
• L’examen comporte 13 pages.
• L’examen est à livre ouvert.
• Toute page HTML (PHP) doit être conforme à la spécification HTML 4.01.
• L’évaluation tiendra compte de l’efficacité de votre code.
• Répondez sur le questionnaire.

1. /25
2. /40
3. /20
4. /15

Total: /100

Nom: Code permanent:


Indication importante:

Pour vous éviter d’écrire trop de code redondant pendant l’examen, vous pouvez vous servir du fichier
utilitaires.inc suivant:

function afficherEnTeteHTML($titre, $tabCSS)


{
echo <<< END_ECHO
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>$titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
END_ECHO;
for ($i = 0; $i < sizeof($tabCSS); $i++) {
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"{$tabCSS[$i]}\">\n";
}
echo "</head>\n";
echo "<body>\n";
}

function afficherBasHTML()
{
echo "<hr>\n";
echo "<center>\n";
$timestamp=getlastmod();
echo "Derni&egrave;res modification le ", date("d/m/Y", $timestamp);
echo " &agrave; ", date("H:i:s", $timestamp), ".";
echo "</center>\n";
echo "</body>\n";
echo "</html>\n";
}

//vous pouvez ajouter ici d’autres fonctions utilitaires


//dont vous avez besoin

2
1. (25 points) Dans chacun des cinq cas suivants, répondez de la manière la plus concise possible.

(a) (2 points) Nommez deux languages de programmation côté serveur.

(b) (2 points) Vous voulez rendre la valeur d’une variable Javascript disponible à PHP. Que
devez-vous faire ?

(c) (5 points) Que devez-vous faire pour créer l’usager MySQL final qui possède comme seul
droit celui de consulter le contenu complet la base de données DB_Final en utilisant le mot
de passe secretFinal et en se connectant à partir de deimos.iro.umontreal.ca ?

(d) (8 points) La fonction session_start

Quelle est l’utilité de la fonction session_start ?

Expliquez le fonctionnement côté serveur de session_start

Expliquez le fonctionnement côté client de session_start

Quand est-ce qu’on ne peut pas l’utiliser ?

3
(e) (8 points) La fonction crypt

Est-ce que crypt(’secret’) == crypt(’secret’) ? Pourquoi ?

Vous enregistrez les mots de passe de vos usagers de façon cryptée dans une base de données
en vous servant de
$motDePasseCrypte = crypt($motDePasse);
Comment devez vous vérifier les mots de passe lors de l’authentification de vos usagers ?

Questions 2 à 4 de l’examen

Vous voulez créer en PHP un sondage en ligne. Voici quelques tables de la base de données
MySQL Sondage dont vous aurez à vous servir:

• Question
questionID entier, auto increment primaire
enonce text
• ReponsePossible
questionID entier primaire
reponseID entier primaire
reponse text
• ReponseUsager
login entier primaire
questionID entier primaire
reponseID entier primaire

L’énoncé de toutes les questions se trouve dans la table Question, les réponses possibles dans
la table ReponsePossible. Pour chaque question l’usager doit choisir une et une seule réponse.
La réponse choisie devra être enregistrée dans la table ReponseUsager (question 2).
Chaque usager doit, avant de pouvoir accéder au sondage, s’authentifier grâce à la page login.php
(question 3).

4
2. (40 points) sondage.php

La page sondage.php affiche, une à la fois les questions à l’usager. Lorsque l’usager soumet sa
réponse, cette même page l’enregistre dans la base de données, et affiche ensuite la prochaine
question (en ordre du questionID).

(a) (10 points) Créez la fonction afficherQuestion($questionID) qui affiche à l’usager le


formulaire HTML avec la question $questionID et ses choix de réponses.

5
(b) (5 points) Créez la fonction verifierReponse($questionID, $reponseID) qui vérifie
dans la base de données si $reponseID est une réponse valide pour la question $questionID.
Votre fonction doit retourner un booléen.

(c) (5 points) Créez la fonction enregistrerReponse($questionID, $reponseID, usagerID)


qui enregistre dans la base de données la réponse de l’usager.

6
(d) (5 points) Créez la fonction obtenirProchainQuestionID($questionID) qui retourne
l’identifiant de la question qu’il faudra poser à l’usager après la question questionID. Re-
tournez -1 lorsque questionID est la dernière question du questionnaire.

(e) (15 points) Créez maintenant le reste de la page sondage.php


Vous devez tenir compte des situations suivantes:
• l’usager accède sondage.php sans authentification. Vous devez alors le rediriger vers
la page login.php.
• aucune réponse n’a été choisie ou le numéro de la réponse choisie ne correspond pas
à un numéro de réponse possible pour cette question. Réaffichez alors cette question
avec un message d’erreur.
• après avoir enregistré la réponse à la dernière question, affichez le message Nous vous
remercions beaucoup de votre participation à l’usager.

7
8
3. (20 points) login.php Lisez le code ci-dessous de la page login.php

<?php
require("utilitaires.inc");

function authentifier($userLogin, $userPwd)


{
GLOBAL $user, $passwd, $host;
mysql_connect($host,$user,$passwd);
mysql_select_db("dift1147_auth");
$requeteID = mysql_query("SELECT count(*) nombre FROM users
WHERE login=’$userLogin’ and passwd=’$userPwd’");
$ligne=mysql_fetch_assoc($requeteID);
$returnValue == ($ligne["nombre"] == 1);
mysql_free_result($requeteID);
mysql_close();
return $returnValue;
}

function afficherFormulaire()
{
echo <<< END_ECHO
<form method="post" action="{$_SERVER["PHP_SELF"]}">
<table border="0">
<tr>
<td>Login</td>
<td><input type="text" name="userLogin" size="8" maxlength="8"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="text" name="userPwd" size="8" maxlength="8"></td>
</tr>
<tr>
<td colspan="2" style="text-align:center">
<input type="submit" value="Login">
</td>
</tr>
</table>
</form>
END_ECHO;
}

9
session_start();

if ((array_key_exists("userLogin", $_POST)) &&


(array_key_exists("userPwd", $_POST)) &&
(authentifier($_POST["userLogin"], $_POST["userPwd"]))) {
$_SESSION["login"] = $_POST["userLogin"];
header("Location: sondage.php?PHPSESSID={$_REQUEST["PHPSESSID"]}");
exit;
}

afficherEnTeteHTML("Login", array());

if ((array_key_exists("userLogin", $_POST)) &&


(array_key_exists("userPwd", $_POST))) {
echo "Login ou mot de passe invalide";
}

afficherFormulaire();
afficherBasHTML();
?>

(a) (7 points) Le code de la page login.php se sert d’une base de données.

Quel est le nom de cette base de données ?

Quel est le code MySQL qui permet de créér cette base de données ainsi que toutes les
tables utilisées dans la page login.php ?

10
(b) (13 points) Ajoutez dans le code de la page login.php les vérifications suivantes:
• un login doit avoir entre 6 et 8 caractères. Il ne peut contenir que des chiffres et des
lettres entre a et z (en minuscules et en majuscules).
• un mot de passe doit avoir au moins 8 caractères. Il doit contenir au moins une
minuscule, au moins une majuscule et au moins un chiffre.
Écrivez le code PHP ci-dessous et indiquez dans le code source de la page login.php où ce
code doit être inséré.

11
4. (15 points) resultat.php
Vous voulez créer la page resultat.php qui affiche un sommaire des réponses données.
La fonction obtenirStatistique() suivante retourne le nombre de fois qu’une réponse a été
donnée au cours du sondage pour autant qu’elle a été donnée au moins une fois.

function obtenirStatistique()
{
GLOBAL $user, $passwd, $host;
$returnArray = array();
mysql_connect($host,$user,$passwd);
mysql_select_db("Sondage");
$requeteID = mysql_query("SELECT Question.questionID, enonce,
ReponsePossible.reponseID, reponse, count(*) nombre
FROM Question, ReponsePossible, ReponseUsager
WHERE Question.questionID = ReponsePossible.questionID
AND Question.questionID = ReponseUsager.questionID
AND ReponsePossible.reponseID = ReponseUsager.reponseID
GROUP BY Question.questionID, enonce,
ReponsePossible.reponseID, reponse");
while ($ligne = mysql_fetch_assoc($requeteID)) {
$qID = $ligne["questionID"];
$rID = $ligne["reponseID"];
$returnArray[$qID]["enonce"] = $ligne["enonce"];
$returnArray[$qID]["reponses"][$rID]["reponse"] = $ligne["reponse"];
$returnArray[$qID]["reponses"][$rID]["nb"] = $ligne["nombre"];
}
mysql_free_result($requeteID);
mysql_close();
return $returnArray;
}

Créez maintenant la page resultat.php qui affiche en HTML les questions et réponses du
sondage et le nombre de fois que chaque réponse a été donnée.

• Il n’est pas nécessaire d’utiliser une gestion de sessions et/ou authentification pour cette
page.
• Vous n’avez pas besoin d’afficher les question et réponses qui n’ont jamais été données.
• Vous pouvez supposer que la fonction obtenirStatistique se trouve déjà dans la page
resultat.php. Servez-vous d’elle.

12
Bonne Chance !

13

Vous aimerez peut-être aussi