IFT 1147, Hiver 2004 Dominik Gehl Programmation serveur Web avec PHP
EXAMEN Final
Lundi 19 avril 2004, salle Z-110 Dur´ee: 170 minutes
Directives:
• L’examen comporte 13 pages.
• L’examen est `a livre ouvert.
• Toute page HTML (PHP) doit ˆetre conforme `a la sp´ecification HTML 4.01.
• L’´evaluation tiendra compte de l’efficacit´e de votre code.
• R´epondez sur le questionnaire.
1. /25
2. /40
3. /20
4. /15
Total: /100
Indication importante:
Pour vous ´eviter d’´ecrire trop de code redondant pendant l’examen, vous pouvez vous servir du fichier utilitaires.incsuivant:
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ères modification le ", date("d/m/Y", $timestamp);
echo " à ", 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
1. (25 points)Dans chacun des cinq cas suivants, r´epondez de la mani`ere la plus concise possible.
(a) (2 points)Nommez deux languages de programmation cˆot´e serveur.
(b) (2 points) Vous voulez rendre la valeur d’une variable Javascript disponible `a PHP. Que devez-vous faire ?
(c) (5 points)Que devez-vous faire pour cr´eer l’usager MySQLfinalqui poss`ede comme seul droit celui de consulter le contenu complet la base de donn´eesDB_Finalen utilisant le mot de passe secretFinal et en se connectant `a partir de deimos.iro.umontreal.ca?
(d) (8 points)La fonction session_start
Quelle est l’utilit´e de la fonction session_start ?
Expliquez le fonctionnement cˆot´e serveur desession_start
Expliquez le fonctionnement cˆot´e client de session_start
Quand est-ce qu’on ne peut pas l’utiliser ?
(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¸con crypt´ee dans une base de donn´ees en vous servant de
$motDePasseCrypte = crypt($motDePasse);
Comment devez vous v´erifier les mots de passe lors de l’authentification de vos usagers ?
Questions 2 `a 4 de l’examen
Vous voulez cr´eer en PHP un sondage en ligne. Voici quelques tables de la base de donn´ees MySQLSondage dont vous aurez `a 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’´enonc´e de toutes les questions se trouve dans la table Question, les r´eponses possibles dans la table ReponsePossible. Pour chaque question l’usager doit choisir une et une seule r´eponse.
La r´eponse choisie devra ˆetre enregistr´ee dans la table ReponseUsager (question 2).
Chaque usager doit, avant de pouvoir acc´eder au sondage, s’authentifier grˆace `a la pagelogin.php (question 3).
2. (40 points) sondage.php
La page sondage.php affiche, une `a la fois les questions `a l’usager. Lorsque l’usager soumet sa r´eponse, cette mˆeme page l’enregistre dans la base de donn´ees, et affiche ensuite la prochaine question (en ordre du questionID).
(a) (10 points) Cr´eez la fonction afficherQuestion($questionID) qui affiche `a l’usager le formulaire HTML avec la question$questionID et ses choix de r´eponses.
(b) (5 points) Cr´eez la fonction verifierReponse($questionID, $reponseID) qui v´erifie dans la base de donn´ees si$reponseIDest une r´eponse valide pour la question$questionID.
Votre fonction doit retourner un bool´een.
(c) (5 points)Cr´eez la fonctionenregistrerReponse($questionID, $reponseID, usagerID) qui enregistre dans la base de donn´ees la r´eponse de l’usager.
(d) (5 points) Cr´eez la fonction obtenirProchainQuestionID($questionID) qui retourne l’identifiant de la question qu’il faudra poser `a l’usager apr`es la question questionID. Re- tournez-1 lorsquequestionIDest la derni`ere question du questionnaire.
(e) (15 points) Cr´eez maintenant le reste de la pagesondage.php Vous devez tenir compte des situations suivantes:
• l’usager acc`ede sondage.php sans authentification. Vous devez alors le rediriger vers la pagelogin.php.
• aucune r´eponse n’a ´et´e choisie ou le num´ero de la r´eponse choisie ne correspond pas
`a un num´ero de r´eponse possible pour cette question. R´eaffichez alors cette question avec un message d’erreur.
• apr`es avoir enregistr´e la r´eponse `a la derni`ere question, affichez le messageNous vous remercions beaucoup de votre participation `a l’usager.
3. (20 points) login.phpLisez 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;
}
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´ees.
Quel est le nom de cette base de donn´ees ?
Quel est le code MySQL qui permet de cr´e´er cette base de donn´ees ainsi que toutes les tables utilis´ees dans la page login.php ?
(b) (13 points) Ajoutez dans le code de la pagelogin.phples v´erifications suivantes:
• un login doit avoir entre 6 et 8 caract`eres. Il ne peut contenir que des chiffres et des lettres entreaetz(en minuscules et en majuscules).
• un mot de passe doit avoir au moins 8 caract`eres. Il doit contenir au moins une minuscule, au moins une majuscule et au moins un chiffre.
Ecrivez le code PHP ci-dessous et indiquez dans le code source de la page´ login.phpo`u ce code doit ˆetre ins´er´e.
4. (15 points) resultat.php
Vous voulez cr´eer la pageresultat.php qui affiche un sommaire des r´eponses donn´ees.
La fonction obtenirStatistique() suivante retourne le nombre de fois qu’une r´eponse a ´et´e donn´ee au cours du sondage pour autant qu’elle a ´et´e donn´ee 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´eez maintenant la page resultat.php qui affiche en HTML les questions et r´eponses du sondage et le nombre de fois que chaque r´eponse a ´et´e donn´ee.
• Il n’est pas n´ecessaire d’utiliser une gestion de sessions et/ou authentification pour cette page.
• Vous n’avez pas besoin d’afficher les question et r´eponses qui n’ont jamais ´et´e donn´ees.
• Vous pouvez supposer que la fonction obtenirStatistique se trouve d´ej`a dans la page resultat.php. Servez-vous d’elle.