O. Auzende Ingénierie Web Création d une base PHP et MySQL Lancez easyphp et créez une base baseqcm, pour l instant vide. Nous allons la remplir avec des questions de C2i (certificat Informatique et Internet). Le fichier baseqcm.dump vous est fourni. Remplissez la base à l aide de ce fichier. CREATE TABLE categories (num tinyint(2) NOT NULL AUTO_INCREMENT, intitule varchar(30), PRIMARY KEY(num), UNIQUE id(num)); INSERT INTO categories VALUES(1, 'technique'); INSERT INTO categories VALUES(2, 'culture'); INSERT INTO categories VALUES(3, 'utilisation'); CREATE TABLE questions (num tinyint(4) NOT NULL AUTO_INCREMENT, categorie tinyint(2), texte varchar(250), PRIMARY KEY(num), UNIQUE id(num)); CREATE TABLE reponses (num tinyint(5) NOT NULL AUTO_INCREMENT, question tinyint(4), texte varchar(100), qualite tinyint(2), PRIMARY KEY(num), UNIQUE id(num)); INSERT INTO questions VALUES(1, 1, 'La memoire centrale :'); INSERT INTO reponses VALUES(1, 1, 'se vide lorsqu\'on arrete l\'ordinateur', 3); INSERT INTO reponses VALUES(2, 1, 'conserve les donnees indefiniment', -1); INSERT INTO reponses VALUES(3, 1, 'transfere les donnees sur le disque dur avant de se vider', -1); INSERT INTO reponses VALUES(4, 1, 'ne se vide jamais', -1); INSERT INTO questions VALUES(2, 1, 'Dans la mémoire centrale, on stocke :'); INSERT INTO reponses VALUES(5, 2, 'les programmes et les donnees', 3); INSERT INTO reponses VALUES(6, 2, 'les programmes seulement', -1); INSERT INTO reponses VALUES(7, 2, 'les donnees seulement', -1); INSERT INTO reponses VALUES(8, 2, 'Windows', -1); INSERT INTO questions VALUES(3, 1, 'Une disquette est :'); INSERT INTO reponses VALUES(9, 3, 'une memoire remanente', 3); INSERT INTO reponses VALUES(10, 3, 'une memoire volatile', -1); INSERT INTO reponses VALUES(11, 3, 'une memoire permanente', -1); INSERT INTO reponses VALUES(12, 3, 'une memoire rapide', -1);... La structure de la base ainsi créée comporte trois tables (modèle relationnel) : En encadré, les clés ; les traits représentent les jointures. Interrogation directe de la base de données Faites exécuter via PHPMyAdmin les requêtes suivantes : - nombre de catégories de questions - nombre de questions - énoncés des questions - nom des catégories et nombre de questions par catégories 1
Fonctions PHP d accès aux bases de données mysql Les principales fonctions sont : o mysql_connect() reçoit en argument le nom d une machine hôte, le nom d un utilisateur et son éventuel mot de passe. Elle établit la connexion. o mysql_select_db() permet de sélectionner une base de données particulière. o mysql_query() transmet une requête SQL au serveur pour qu il l exécute. En cas de succès, elle renvoie l identificateur d un ensemble résultat, en l occurrence une table (virtuelle). o mysql_close() ferme la connexion MySQL. o mysql_fetch_row retourne une ligne de résultat sous la forme d'un tableau. o mysql_fetch_array retourne une ligne de résultat sous la forme d'un tableau associatif. o mysql_result retourne un champ d'un résultat. o mysql_insert_id() ramène le dernier identificateur attribué. Lecture de la base de données par PHP Fichier lecture1.php : il utilise la fonction mysql_fetch_row : <html> <body> <?php $db=mysql_connect("localhost","root",""); mysql_select_db("baseqcm",$db); $result=mysql_query("select * FROM categories",$db); if ($lignes=mysql_fetch_row($result)) { echo "<table border=1>\n"; echo "<tr><td>numéro</td><td>intitulé</td></tr>\n"; do { printf("<tr><td>%s</td><td>%s</td></tr>\n",$lignes[0], $lignes[1]); while ($lignes=mysql_fetch_row($result)); echo "</table>\n"; else { echo "table vide";?> </body> </html> Fichier lecture2.php : il utilise la fonction mysql_fetch_array : <html> <body> <?php $db=mysql_connect("localhost","root",""); mysql_select_db("baseqcm",$db); $result=mysql_query("select * FROM categories",$db); if ($lignes=mysql_fetch_array($result)) { echo "<table border=1>\n"; echo "<tr><td>numéro</td><td>intitulé</td></tr>\n"; do { printf("<tr><td>%s</td><td>%s</td></tr>\n",$lignes["num"], $lignes["intitule"]); while ($lignes=mysql_fetch_array($result)); echo "</table>\n"; else { echo "table vide";?> </body> </html> 2
O. Auzende Ingénierie Web Exercices 1) Ecrire une page nbparcategorie.php affichant l intitulé de chaque catégorie ainsi que le nombre de questions de cette catégorie : 2) Générer la page questions.php comportant uniquement les questions de la base : 3) Modifier la page questions.php pour qu elle affiche les questions de la base et les réponses associées : 3
3) Modifier cette page en y introduisant un formulaire (method="post" et action="reponse.php") et en faisant apparaître des boutons radio devant chaque réponse : Le nom de la variable associée aux boutons radio correspondant aux réponses à la question 1 sera "q1", celui de la variable associée aux boutons radio des réponses à la question 2 sera "q2", etc. Le début du source généré sera donc : La memoire centrale : <br> <input type='radio' name='q1' value='3'>se vide lorsqu'on arrete l'ordinateur<br> <input type='radio' name='q1' value='-1'>conserve les donnees indefiniment<br> <input type='radio' name='q1' value='-1'>transfere les donnees sur le disque dur avant de se vider<br> <input type='radio' name='q1' value='-1'>ne se vide jamais<br> <hr> Dans la mémoire centrale, on stocke : <br> <input type='radio' name='q2' value='3'>les programmes et les donnees<br> <input type='radio' name='q2' value='-1'>les programmes seulement<br> <input type='radio' name='q2' value='-1'>les donnees seulement<br> <input type='radio' name='q2' value='-1'>windows<br> <hr> Une disquette est : <br> <input type='radio' name='q3' value='3'>une memoire remanente<br> <input type='radio' name='q3' value='-1'>une memoire volatile<br> <input type='radio' name='q3' value='-1'>une memoire permanente<br> <input type='radio' name='q3' value='-1'>une memoire rapide<br> <hr>... 4) Modifier cette page en faisant apparaître, pour chaque question, les réponses dans le désordre. Pour cela : o initialiser un générateur de nombres aléatoires par la fonction srand(); o récupérer les textes à mélanger dans un tableau $donnees o mélanger les éléments de $donnees par la fonction shuffle : shuffle($donnees); 5) Ecrire la page reponse.php calculant le score réalisé par l utilisateur lorsqu il valide le formulaire de la page questions.php. 4
O. Auzende Ingénierie Web 6) Ajout/suppression de catégorie Ecrire la page insercategorie.php ci-contre qui affiche les catégories existantes et demande le nom d une nouvelle catégorie. Le formulaire fera appel comme action au fichier insertioncategorie.php avec la méthode POST. Ecrire ensuite la page réponse insertioncategorie.php qui réalise l insertion dans la base et réaffiche les catégories existantes (ci-contre). Ecrire la page supprcategorie.php qui propose dans une liste de sélection les catégories existantes et demande celle à supprimer (ci-contre). Le formulaire fera appel comme action au fichier suppressioncategorie.php avec la méthode POST. Ecrire ensuite la page réponse suppressioncategorie.php qui réalise la suppression dans la base si cette suppression est possible et réaffiche les catégories restantes. A noter : la suppression n est possible que s il n existe aucune question de cette catégorie dans la base (voir ci-dessous à gauche). Sinon, afficher un message (voir ci-dessous à droite) : 7) Ajout/suppression de question Ecrire la page inserquestion.php ci-contre ; le formulaire fera appel comme action au fichier insertionquestion.php avec la méthode POST. Ecrire ensuite la page insertionquestion.php qui réalise l insertion effective de la question et des réponses dans la base. A noter : on insère d abord la question dans la table questions, on récupère son identificateur num par la ligne $num=mysql_insert_id() ; qui ramène le dernier identificateur attribué puis on insère les réponses dans la table reponses 5
Affichage souhaité ci-contre après une insertion réussie de question accompagnée de ses réponses : Ecrire supprquestion.php qui propose dans une liste de sélection les textes des questions existantes et demande celle à supprimer (ci-contre). Le formulaire fera appel comme action à suppressionquestion.php avec la méthode POST. Ecrire suppressionquestion.php qui réalise la suppression effective de la question et des réponses correspondantes dans la base. A noter : on supprime d abord les réponses dans la table reponses, puis on supprime la question dans la table questions. Affichage souhaité ci-contre : 8) Menu principal Ecrire une page index.html proposant le menu cicontre permettant d appeler une des pages précédentes. 6