Vous êtes sur la page 1sur 5

Bases de donnes (INF

), TELECOM ParisTech

TP PHP & MySQL


Bogdan Cautis (bogdan.cautis@telecom-paristech.fr) Pierre Senellart (pierre.senellart@telecom-paristech.fr) fvrier
Le but de ce TP est de dcouvrir lutilisation dun SGBD dans le cadre du dveloppement dune application Web. la place dOracle, nous utiliserons le SGBD MySQL pour ce TP, ce qui nous permettra den constater les similarits et dirences (le langage SQL est utilis dans Oracle et dans MySQL, mais il y a parfois de petites dirences). On utilisera galement le langage de programmation PHP.

Loutil de ligne de commande mysql


Nous allons raliser au cours de TP une mini-application Web permettant de grer une petite base de donnes de lms. Dans un premier temps, nous allons supposer qu chaque lm est associ un titre, un nom de ralisateur, et un pays. . Imaginer un schma de base de donnes relationnelle adapt cette application. . Nous allons crer le ou les tables correspondantes dans le serveur de bases de donnes MySQL. Pour cela, nous allons utiliser loutil de ligne de commande mysql (cest lquivalent de loutil sqlplus pour Oracle). Taper linvite du shell :
/usr/pkg/bin/mysql -h mysql.infres.enst.fr -P 3307 -u login -p login

o login votre identiant de connexion MySQL ( mettre deux fois sur la ligne ci-dessus, une fois pour le nom dutilisateur, une fois pour le nom de base). Votre mot de passe MySQL vous sera alors demand. . Vous pouvez taper linvite de commande MySQL des ordres SQL ou dautres commandes spciques cet outil. Les ordres et commandes se terminent en gnral par un caractre ; (pour un achage en colonne) ou \G (pour un achage en ligne). La commande HELP vous permettra dobtenir de laide sur toute autre commande (on pourra aussi se rfrer la documentation en-ligne de MySQL, voir http://dev.mysql.com/doc/refman/5.0/en/). Commenons par examiner la liste des bases de donnes auxquelles vous avez accs avec SHOW DATABASES. La base de donnes information_schema est une base virtuelle contenant des mta-informations sur les autres bases. Nous allons nous placer dans lautre bases de donnes votre disposition avec USE nom_base. . Crer maintenant la ou les tables appropries, avec lordre SQL standard de cration de table. La commande DESCRIBE Nom_table permet dacher le schma dune table cre. Noter que le type de donnes Oracle VARCHAR2(n) nexiste pas, il est remplac en MySQL par le type VARCHAR(n) . Insrer la main quelques lms dans la base de donnes.

Premier formulaire HTML


Vous placerez les documents produits dans le sous-rpertoire public_html de votre rpertoire Unix principal. Si votre login Unix est pierre, vous pourrez accder un document index.html via un serveur Web lURL : http://www.infres.enst.fr/~pierre/index.html. Sassurer que le serveur Web a bien un droit de lecture sur votre rpertoire principale et le sous-rpertoire public_html laide de la commande :
chmod a+rx ~ ~/public_html

Il peut tre ncessaire de rutiliser cette commande chaque fois que vous crez un nouveau chier, en fonction de la conguration. Crer un document HTML ajout_nouveau_film.html contenant un formulaire qui servira ajouter un nouveau lm dans la base de donnes. Titre et nom de ralisateur pourront tre saisis comme du texte libre, tandis que le pays pourra tre propos par une liste droulante quelques entres. Si vous tes dbutant en HTML, ou si vous avez besoin de vous rafrachir la mmoire, rfrez-vous rapidement au cours li depuis la page Web du cours : http://pierre.senellart.com/enseignement/2008-2009/
inf225/

PHP et MySQL
PHP est un langage interprt, adapt pour le dveloppement de sites Web. Un script PHP est un document incluant du contenu littral textuel (en gnral des morceaux de pages HTML) et des blocs dinstructions encadrs par les pseudo-balises <?php (ou <?) et ?>. Un tel script est mis la disposition du serveur Web et est interprt par celui-ci pour fournir lutilisateur une page Web (ou un autre document). Ainsi, le programme PHP suivant ache la table de multiplication de 1 $M sous forme dun tableau HTML, o $M est rcupr comme paramtre de requte HTTP GET (cest--dire indiqu sous la forme ?M=30 la n de lURL) :
<?php $M=$_GET["M"]?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>Table de multiplication</title></head> <body> <h1>Table de multiplication</h1> <table> <caption>Table de multiplication de 1 <?php echo $M ?></caption> <tr> <th></th> <?php for($i=1;$i<=$M;$i=$i+1) { echo "<th>$i</th>"; } ?> </tr> <?php for($i=1;$i<=$M;$i=$i+1) { echo "<tr><th>$i</th>"; for($j=1;$j<=$M;$j=$j+1) { echo "<td>".($i*$j)."</td>"; } echo "</tr>"; } ?> </table> </body>

</html>

La syntaxe de PHP est trs proche de celle de C, C++ ou Java. Nous indiquons ici les principales dirences : Nest interprt que le code entre pseudo-balises PHP. Le contenu lextrieur de ces pseudo-balises est produit tel quel dans la page de rsultat, comme si ctait une chane de caractres littrale en argument de loprateur echo. Ainsi, les deux lignes suivantes sont quivalentes :
Hello <?php echo "world" ?>! Hello world!

Un raccourci est propos par la pseudo-balise <?= ; celle-ci est quivalente <? suivantes sont quivalentes.
1 <?php echo $M ?> 1 <?= $M ?>

echo,

donc les deux lignes

Les variables en PHP sont toujours prxes dun symbole $ . Elles nont pas besoin dtre dclares, et son non types. Les chanes de caractres littrales sont dlimites en PHP par des guillemets simples ou doubles. La diffrence entre ces deux possibilits est quune chane de caractre dlimite par guillemet double est sujette interpolation : le nom dune variable est remplac par sa valeur. Ainsi, echo "Jai $age ans"; produit Jai 30 ans si $age contient la valeur 30. La concatnation de chanes de caractres sexprime par loprateur . . En plus des valeurs scalaires (entiers, ottants, chanes de caractres. . .), PHP supporte nativement deux types de valeur de tableaux : les tableaux indics et les tableaux associatifs. Le parcours dun tableau peut se faire avec une boucle for standard, ou avec linstruction foreach. Pour un tableau indic, les deux blocs suivants sont quivalents :
// Boucle foreach foreach($tableau as $case) { echo $case."\n"; } // Boucle for foreach($indice=0;$indice<count($tableau);++$indice) { echo $tableau[$indice]."\n"; }

De mme pour un tableau associatif :


// Boucle foreach foreach($tableau as $clef => $valeur) { echo "$clef=$valeur\n"; } // Boucle for $clefs=array_keys($tableau); foreach($indice=0;$indice<count($clefs);++$indice) { echo $clefs[$indice]."=".$tableau[$clefs[$indice]]."\n"; }

Vous pouvez vous rfrer la documentation en ligne de PHP, sur http://php.net/, en particulier pour connatre lensemble des fonctions de la (riche) bibliothque standard. $_GET et $_POST sont deux tableaux associatifs proposant respectivement les paramtres GET et POST de la requte HTTP ; ils servent donc rcuprer les paramtres des formulaires. Laccs une base de donnes MySQL depuis PHP utilise les fonctions suivantes :

mysql_connect($serveur,$login,$mdp) mysql_select_db($nom_base) mysql_query($ordre_sql) mysql_fetch_array($resultat) mysql_fetch_assoc($resultat) mysql_error()

tablit une connexion au serveur slectionne une base de donnes excute un ordre SQL retourne une liste de rsultat, sous forme de tableau indic retourne une liste de rsultat, sous forme de tableau associatif renvoie le dernier message derreur

Une utilisation typique est ainsi :


if(!mysql_connect("mysql.infres.enst.fr:3307","login","password")) { echo "<p>Desol, connexion impossible</p>"; exit; } if(!mysql_select_db("database")) { echo "<p>Desol, accs la base impossible</p>"; exit; } $resultat= mysql_query("SELECT * FROM Personne"); if($resultat) { while($ligne=mysql_fetch_assoc($resultat)) { echo "<p>".$ligne["prenom"]." a ". $ligne["age"]." ans</p>"; } } else { echo "<p>Erreur dans lexcution de la requte.</p>"; echo "<p>Message de MySQL: ".mysql_error()."</p>"; }

. Rcuprer depuis la page Web du TP (http://pierre.senellart.com/enseignement/2008-2009/ inf225/) le script PHP achant la table de multiplication et le tester. . crire un script affichage.php qui ache sous la forme dun tableau HTML le contenu de la table Films, tri par titre. . crire un script insert.php comme script de traitement des donnes du formulaire ajout_nouveau_film.html, insrant le lm correspondant dans la base de donnes. . Ajouter au tableau de affichage.php une colonne avec des formulaires contenant des boutons Supprimer (on aura besoin dutiliser des champs de formulaire de type hidden). . crire le script supprimer.php correspondant.

Scurit et redirections
. Tenter dajouter avec le formulaire ralis un lm dont le titre comprend : une apostrophe (p. ex., LAuberge Espagnole) ; des chevrons (p. ex., Bienvenue <Gattaca>). Que se passe-t-il dans chacun de ces deux cas ? . Lapostrophe est un caractre spcial pour MySQL, qui dlimite les chanes de caractres (SQL). Comme un ordre SQL est vu par PHP comme une simple chane de caractres (PHP), il est crucial dchapper (cest--dire, prcder dun backslash) les apostrophes contenus dans des variables PHP destines tre utilises lintrieur dune chane de caractres MySQL. La fonction mysql_escape_string fait cela (la fonction stripslashes fait lopration inverse au cas o celle-ci est ncessaire). Ne pas faire attention cela peut non seulement causer des bugs, mais aussi des problmes de scurit. Quel sera, ainsi, le comportement de la requte suivante :
mysql_query("SELECT * FROM Users WHERE login=$login AND password=$password");

si $password contient OR 1=1 -- ( -- introduit des commentaires en SQL) ? Ce problme de scurit est connu sous le nom dinjection de code SQL. Ajouter partout o cest ncessaire cette protection, tester. . Les chevrons, de mme que lesperluette (&), sont des caractres spciaux en HTML. Ainsi, une chane de caractres ache par un simple echo contenant ces caractres va tre interprt comme du code HTML, ce qui peut poser des problmes dachage, voire des problmes de scurit en cas de code actif (en particulier, scripts JavaScript), connus sous le nom de XSS ou cross-site scripting. La fonction htmlspecialchars permet de remplacer ces caractres par les entits correspondantes (p. ex., &lt; pour <). Dans le cas o le texte produit est lintrieur dun attribut HTML, il faut aussi protger les guillemets avec :
echo htmlspecialchars($variable,ENT_QUOTES);

Ajouter partout o cest ncessaire cette protection, tester. . Bien que beaucoup de scripts PHP aient pour rle de produire une page HTML qui sera ache dans un navigateur, certains dentre eux se contentent de raliser une action (insertion, suppression) avant de passer la main un autre script. Ce comportement peut-tre obtenu avec la fonction PHP header qui modie les en-ttes HTTP envoys au client Web ; ainsi,
header("Location: suite.php");

demande une redirection vers suite.php. Attention : une telle redirection (de mme que toute manipulation des en-ttes HTTP) nest possible que si rien na encore t crit sur la page (pas de blanc, pas de dclaration de type de document HTML, etc.). Ajouter une telle redirection depuis insert.php et supprimer.php vers affichage.php, dans le cas o les oprations se sont droules sans encombre. . Que se passe-t-il si lon demande la suppression dun lm qui porte le mme nom quun autre lm ? On pourra ajouter une colonne supplmentaire dclare comme AUTO_INCREMENT si ncessaire.

Jointure
. On voudrait maintenant ajouter notre base de donnes une liste dacteurs pour chaque lm. Revoir le schma de la base de donnes pour permettre ceci. viter au maximum la redondance dinformations ! . Ajouter la main quelques acteurs apparaissant dans les lms dj rentrs. . Modier le script affichage.php pour acher dans une colonne supplmentaire du tableau HTML la liste des acteurs (par exemple, spars par des virgules). . Modier le formulaire dajout et insert.php pour demander la liste des acteurs apparaissant dans le lm. La liste des acteurs possibles pourra tre prsente sous forme de liste choix multiple (cest--dire, avec <select multiple="multiple">). Il sera ncessaire de faire du formulaire dajout un script PHP pour rcuprer la liste des acteurs. . Crer un formulaire dajout de nouvel acteur et le script PHP correspondant. . Complter lapplication en permettant la modication des donnes existantes, en embellissant les pages HTML avec du code CSS, etc.

Ce nest pas une question sans fondement puisque par exemple trois lms dirent portent le titre La vie est belle. On peut mme imaginer des cas o deux lms dirents ont le mme titre, le mme nom de ralisateur et le mme pays.