• Aucun résultat trouvé

L’´evaluation tiendra compte de l’efficacit´e de votre code

N/A
N/A
Protected

Academic year: 2022

Partager "L’´evaluation tiendra compte de l’efficacit´e de votre code"

Copied!
13
0
0

Texte intégral

(1)

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

(2)

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&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

(3)

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 ?

(4)

(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).

(5)

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.

(6)

(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.

(7)

(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.

(8)
(9)

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;

}

(10)

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 ?

(11)

(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.

(12)

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.

(13)

Références

Documents relatifs

Aucun document autoris´ e, calculatrice et t´ el´ ephone interdits.. Barˆ

Utilisation d’une cl´e PSK 256 bits statique pour les environnements o` u un serveur RADIUS est trop contraignant (maison, SoHo, ...)... D´erivation de la PSK d’une phrase

Pour cela, ` a partir d’un texte (en fran¸ cais par exemple), on calcule les probabilit´ es qu’une lettre donn´ ee se trouve im´ ediatement apr` es une autre lettre donn´ ee1.

[r]

[r]

[r]

[r]