Vous êtes sur la page 1sur 8

Mysql avec EasyPhp

1er mars 2006

Introduction
MYSQL drive directement de SQL (Structured Query Language) qui est un langage de requ`tes e e vers les bases de donnes relationnelles. e Il en reprend la syntaxe mais nen a pas toute la puissance. Le serveur de base de donnes MySQL est tr`s souvent utilis avec le langage de cration de pages e e e e web dynamiques : PHP. base de donnes MYSQL script PHP e serveur HTTP Page HTML client

Les donnes manipules par le site seront stockes dans une base de donnes MySQL. Le script e e e e PHP , se servira de commandes MySQL pour grer et extraire des informations de la base de donnes e e an d engendrer les pages HTML qui seront interprtes par le navigateur. ee Nous allons dans ce Tp, utiliser EasyPHP qui est une application permettant dinstaller et de congurer automatiquement un environnement de travail complet sous Windows en regroupant un serveur Apache, un serveur MySQL, une interface graphique de gestion des bases de donnes e MySQL : PHPMyAdmin et le langage PHP.On suppose donc que EaysyPHP est install sur votre e machine. Ces notes sont un rsum succint des articles :utilser MySQL et PHP de Frederic Bouchery : e e http ://www.phpinfo.net/articles/article phpmysql.html et du tutoriel dintroduction de la doc mysql sur http ://www.nexen.net. Les liens vers les documentations MySQL et PHP se trouvent sur le site du cours.

MySQL

Pour pouvoir utiliser un serveur MySQL, il faut quil soit lanc. Cela se fait dans notre cas en e lanant EasyPHP qui na dautre eet que de dmarrer les serveurs Apache et MySQL. c e Vous pouvez ensuite dialoguer avec le serveur Mysql, soit en mode commande (dans une fenetre invite de commande), soit via linterface PhpMyadmin. Nous dcrivons ici le mode commande. e

1.1

Connexion

shell> mysql -h hote -u utilisateur -p Enter password: ******** ******** reprsente votre mot de passe, entrez-le lorsque mysql ache Enter password : . Si e vous travailler en local avec les param`tres par dfaut, il ny a pas de mot de passe. Si tout fonce e tionne, vous devrez voir quelques informations dintroduction suivies dune invite de commande mysql> 1

shell> mysql -h localhost -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 459 to server version: 3.22.20a-log Type help for help. mysql> Linvite vous dit que mysql attend que vous entriez des commandes. Apr`s vous tre connect avec succ`s, vous pouvez vous dconnecter ` tout moment en entrant e e e e e a QUIT apr`s linvite mysql> e

1.2

Crer et slectionner une base e e

mysql> CREATE DATABASE menagerie ; La cration dune base de donnes ne la slectionne pas pour lutilisation ; vous devez le faire e e e explicitement. Pour rendre menagerie la base courante, utilisez cette commande : mysql> USE menagerie ; Votre base a besoin dtre cre juste une fois, mais vous devez la slectionner pour lutiliser, e ee e chaque fois que vous dbutez une session mysql . e

1.3

Crer une table e

Si une table a t slectionne, vous pouvez crer des tables. Par exemple, dans la base ee e e e mnagerie : e mysql> CREATE TABLE animal (nom VARCHAR(20), maitre VARCHAR(20), -> espece VARCHAR(20), sexe CHAR(1), naissance DATE, mort DATE); VARCHAR est un bon choix pour les colonnes nom , maitre , et espece car leurs valeurs varient en longueur. La longueur de ces colonnes ne doit pas ncessairement tre la mme, et na pas besoin e e e dtre forcement 20 . Vous pouvez choisir une taille entre 1 et 255 , celle qui vous semblera la plus e raisonnable (si vous faites un mauvais choix et que vous vous apercevez plus tard que vous avez besoin dun champ plus long, MySQL fournit la commande ALTER TABLE) .Le sexe des animaux peut tre reprsent de plusieurs faons, par exemple, m et f , ou bien male et femelle . e e e c Il est plus simple dutiliser les caract`res simples m et f . e

1.4

Charger des donnes dans une table e

Pour ajouter des donnes ` une table, on peut utiliser les commandes LOAD DATA et INSERT. e a Nous ne dcrivons ici que la commande INSERT. e Dans sa forme la plus simple, vous spciez une valeur pour chaque colonne, dans lordre o` les e u colonnes sont listes dans la requte CREATE TABLE . Supposons que Diane ach`te un nouvel e e e hamster nomm Puball. Vous pourriez ajouter ce nouvel enregistrement en utilisant un INSERT e de la faon suivante : c mysql> INSERT INTO animal VALUES (Puffball,Diane,hamster,f,1999-03-30,NULL); Notez que les cha nes de caract`res et les valeurs de dates sont spcies en tant que cha e e e nes protges par des guillemets. De plus, avec INSERT vous pouvez insrer la valeur NULL directee e e ment pour reprsenter une valeur manquante. e

1.5

Rcuprer des informations ` partir dune table e e a

La commande SELECT est utilise pour rcuprer des informations ` partir dune table. La e e e a forme usuelle est : SELECT quoiSelectionner FROM quelTable WHERE conditionsASatisfaire quoiSelectionner indique ce que vous voulez voir. Cela peut tre une liste de colonnes, ou * e pour indiquer toutes les colonnes. quelTable indique la table ` partir de laquelle rcuprer les a e e donnes. La clause WHERE est optionnelle. Si elle est prsente, conditionsASatisfaire spcie e e e les conditions que les lignes doivent satisfaire pour tre slctionnes. e ee e Imaginons que nous ayons dans la table animal les donnes suivantes : e +----------+--------+---------+------+------------+------------+ | nom | maitre | espece | sexe | naissance | mort | +----------+--------+---------+------+------------+------------+ | Fluffy | Harold | chat | f | 1993-02-04 | NULL | | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | | Fang | Benny | chien | m | 1990-08-27 | NULL | | Bowser | Diane | chien | m | 1998-08-31 | 1995-07-29 | | Chirpy | Gwen | oiseau | f | 1998-09-11 | NULL | | Whistler | Gwen | oiseau | NULL | 1997-12-09 | NULL | | Slim | Benny | serpent | m | 1996-04-29 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+--------+---------+------+------------+------------+ mysql> SELECT * FROM animal ; achera la gure prcdente. e e mysql> SELECT * FROM animal WHERE espece = "chien" AND sexe = "f" ; achera les lignes de animal concernant les chiennes. mysql> SELECT nom, naissance FROM animal ; achera le nom et la date de naissance de tous les animeaux de la table animal. mysql> SELECT DISTINCT naissance FROM animal ; achera toutes les dates de naissance direntes e de la table. (enl`ve les rptitions du rsultat). e e e e mysql> SELECT nom, naissance FROM animal ORDER BY naissance ; trie le rsultat sur le champ e naissance. mysql> SELECT maitre, COUNT(*) FROM animal GROUP BY maitre ; COUNT() compte le nombre de rsultats non NULL. On extrait donc pour chaque ma e tre, son nom et le nombre danimeaux quil poss`de. e

1.6

Utiliser plusieurs tables

mysql> CREATE TABLE evenement (nom VARCHAR(20), date DATE, -> type VARCHAR(15), remarque VARCHAR(255)); Imagineons que cette table contienne les enregistrements suivants : nom date type remarque Fluffy 1995-05-15 mise bas Buffy 1993-06-23 mise bas Buffy 1994-06-19 mise bas Chirpy 1999-03-21 vtrinaire e e Slim 1997-08-03 vtrinaire e e 4 chatons, 3 femelles, 1 m^les a 5 chiots, 2 femelles, 3 m^les a 3 chiots, 3 femelles Redresser le bec Cotes casses e 3

Bowser Fang Fang Claws Whistler

1991-10-12 1991-10-12 1998-08-28 1998-03-17 1998-12-09

chenil chenil anniversaire anniversaire anniversaire

Don dun nouvel objet de mastication Don dun nouveau collier anti-puces Premier anniversaire

Pour trouver lge de chaque animal lorsquil a mis bas, on a besoin de la table animal pour a connaitre la date de naissance de lanimal et de la table evenement pour connaitre la date de laccouchement. Il faut faire une jointure sur les champs noms des 2 tables. On utilisera la fonction ` To Days qui retourne le nombre de jours depuis lan 0 correspondant a la date. Voici la requ`te : e mysql> -> -> -> -> SELECT animal.nom, (TO_DAYS(date) - TO_DAYS(naissance))/365 AS age, remarque FROM animal, evenement WHERE animal.nom = evenement.nom AND type = "mise bas";

+--------+------+--------------------------------+ | nom | age | remarque | +--------+------+--------------------------------+ | Fluffy | 2.27 | 4 chatons, 3 femelles, 1 m^le | a | Buffy | 4.12 | 5 chiots, 2 femelles, 3 m^les | a | Buffy | 5.10 | 3 chiots, 3 femelles | +--------+------+--------------------------------+ Pour trouver les paires mles / femelles par rapport ` lesp`ce , on fait une jointure de animal a a e avec animal. On a besoin de donner des alias pour direncier les 2 tables : e mysql> SELECT p1.nom, p1.sexe, p2.nom, p2.sexe, p1.espece -> FROM animal AS p1, animal AS p2 -> WHERE p1.espece = p2.espece AND p1.sexe = "f" AND p2.sexe = "m"; +--------+------+--------+------+---------+ | nom | sexe | nom | sexe | espece | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | chat | | Buffy | f | Fang | m | chien | | Buffy | f | Bowser | m | chien | +--------+------+--------+------+---------+

PHPMyAdmin

EasyPHP ore un utilitaire : PHPMyAdmin qui donne une interface graphique pour Mysql. Nous lutiliserons dans le TP.

MYSQL et PHP
Lutilisation de MySQL avec PHP seectue en 4 temps : 1. Connexion au serveur de donnes e 2. Slection de la base de donnes e e 3. Requte e 4

4. Exploitation des requtes e On peut ajouter ` ca, un 5`me temps facultatif dans le cas dune connexion simple : fermeture a e de la connexion.

3.1

Connexion au serveur de donnes e

Pour se connecter au serveur de donnes, il existe 2 mthodes : Ouverture dune connexion e e simple avec la fonction mysql connect ou Ouverture dune connexion persistante avec la fonction mysql pconnect La deuxi`me mthode di`re de la premi`re par le fait que la connexion reste active apr`s la e e e e e n du script, mais tous les hbergeurs nautorisent pas cette possibilit. e e Pour se connecter, il faut paramtrer ladresse du serveur de donnes ainsi que votre nom e e dutilisateur ( login en anglais) et votre mot de passe ( password en anglais). En retour, vous obtenez un identiant. Si lidentiant est ` 0, une erreur sest produite pendant la phase a de connexion. Cette erreur peut venir du fait que lon ne peut pas joindre le serveur (ex : panne rseau), que le nom du serveur nest pas bon, que vous ntes pas autoris ` accder ` ce serveur e e ea e a ou que votre mot de passe nest pas correct. Maintenant, si lidentiant est dirent de 0, tout e cest bien pass et vous tes connect au serveur de donnes. e e e e Remarque : Vous pouvez garder cet identiant dans une variable, mais si vous nouvrez pas dautres connexions en parall`le, ce nest pas utile. e Exemple : connexion ` une base de donnes sur Free : a e <?php if( mysql_connect( sql.free.fr , monchat.moustique , miaou ) > 0 ) echo Connexion russie ! ; e else echo Connexion impossible ! ; ?> Exemple : connexion en local : <?php if( mysql_connect( localhost , root) > 0 ) echo Connexion russie ! ; e else echo Connexion impossible ! ; ?>

3.2

Slection de la base e

En fait, les tapes slection et requte peuvent tre faites en mme temps, mais il est plus simple e e e e e si vous utilisez une seule base, de la slectionner avant de commencer vos requtes. Ainsi, toutes e e les requtes ` venir utiliseront cette base par dfaut. Pour faire cette slection, utilisez la fonction e a e e e mysql select db et vous lui passez en param`tre, le nom de votre base. Si la connexion naboutit pas, la fonction vous retourne False (ou 0 si vous prfrez) sinon elle retourne True. ee Remarque : Si cela vous chante, ou si vous avez ouvert plusieurs connexions en parall`le, vous e pouvez ajouter un second param`tre qui est lidentiant de la connexion. Si vous nen donnez pas, e la fonction utilise la derni`re connexion ouverte. e Exemple : Connexion ` la base de donne " ma_base " a e 5

<?php if( mysql_select_db( ma_base ) == True ) echo Slection de la base russie ; e e else echo Slection de la base impossible ; e ?>

3.3

Requte e

On utilise MySQL pour accder aux donnes. Pour envoyer Les requtes MySQL , on peut e e e utiliser 2 fonctions : u e ea e e mysql query dans le cas o` la base de donnes serait dj` slectionne. mysql db query dans le cas o` lon voudrait slectionner la base en mme temps. u e e Comme pour la connexion, cette fonction retourne un identiant qui est ` 0 lorsquune erreur a sest produite. Contrairement aux autres fonctions (connexion et slection), cet identiant est tr`s e e important, il est utilis pour retrouver les donnes rapatries par une requte de slection. e e e e e Lorsque lon fait une requte de slection, MySQL retourne les donnes et PHP les place en e e e mmoire. Lidentiant permet donc de retrouver ces donnes en mmoire. En n de script, la e e e mmoire est libre et les donnes sont donc perdues. Il est possible de librer la mmoire, pour e e e e e e ne pas surcharger le serveur, avant la n du script au moyen de la commande mysql free result. Exemple : On part du principe que la base de donnes est dj` slectionne et on veut avoir e ea e e des informations sur le membre nomm moustique : e <?php $requete = "SELECT * FROM membres WHERE pseudo = moustique "; $resultat = mysql_query( $requete ); ?>

3.4

Exploitation des requtes e

Apr`s lexcution dune requte de slection, les donnes ne sont pas aches, elles sont e e e e e e simplement mises en mmoire, il faut donc aller les chercher enregistrement par enregistrement e et les acher avec un minimum de traitement. PHP g`re un pointeur de rsultat, cest ` dire e e a quil rep`re un enregistrement parmi les autres, et lorsque lon veut en lire un, cest celui qui est e point qui sera retourn. Lorsque vous utilisez une fonction de lecture, le pointeur est dplac e e e e sur lenregistrement suivant et ainsi de suite jusqu` ce quil ny en ait plus. Les fonctions qui a retournent un enregistrement sont : mysql fetch row, mysql fetch array et mysql fetch object et prennent comme param`tre lidentiant de la requte. Les 3 exemples suivants partent dune e e requte SELECT nom, prenom, date FROM membres. e mysql fetch row :Cette fonction retourne un enregistrement sous la forme dun tableau simple. <?php $enregistrement = mysql_fetch_row( $resultat ); // Affiche le champ - nom echo $enregistrement[0] . <br>; // Affiche le champ - prenom echo $enregistrement[1] . <br>; // Affiche le champ - date 6

echo $enregistrement[2] . <br>; ?> mysql fetch array : Cette fonction retourne un enregistrement sous la forme dun tableau associatif. <?php $enregistrement = mysql_fetch_array( $resultat ); // Affiche le champ - prenom echo $enregistrement[prenom] . <br>; // Affiche le champ - nom echo $enregistrement[nom] . <br>; // Affiche le champ - date echo $enregistrement[date] . <br>; ?> mysql fetch object :Cette fonction retourne un enregistrement sous forme dune structure (objet). <?php $enregistrement = mysql_fetch_object( $resultat ); // Affiche le champ - date echo $enregistrement->date . <br>; // Affiche le champ - nom echo $enregistrement->nom . <br>; // Affiche le champ - prenom echo $enregistrement->prenom . <br>; ?> Si il ny a pas ou plus denregistrement ` lire, ces fonctions retournent false. Enn, si vous a voulez savoir combien denregistrements ont t retourns par la slection, vous pouvez utiliser la ee e e e e commande mysql num rows qui prend comme param`tre lidentiant de la requte.

3.5

Fermeture de la connexion

Vous pouvez fermer la connexion au moyen de la fonction mysql close, mais il est bon de savoir que cette opration sera faite lorsque le script se terminera. e

3.6

Exemple de synth`se e

Voici un exemple dutilisation de MySQL avec PHP. Ce script PHP se connecte sur la base menagerie , slctionne les noms et date de naissance des animeaux pour les acher dans une ee page html. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>ManipZoo</title> <meta http-equiv="Content-Type" content="text/HTML; charset=iso-8859-1" /> </head> 7

<body> <?php $mysqlserver = "localhost"; $mysqlloggin = "root"; // $mysqlpassword = secret; $connexion= mysql_connect( $mysqlserver , $mysqlloggin ) ; // possiblement un 3 argt = le mot de passe // retourne 0 si erreur. if (!$connexion){ echo "<p>connexion impossible au serveur </p> \n"; exit; } if (!mysql_select_db("menagerie",$connexion)){ // celle ci fait la connexion a une base echo "<p>acces a la base refuse </p>\n"; exit; }

echo "<p>connexion a la base menagerie reussie<p>"; $requete = "SELECT nom, naissance FROM animal ORDER BY naissance"; // Execution de la requ^te e $resultat = mysql_query($requete, $connexion); if (!$resultat){ echo "<p>erreur a lexecution de la requete$requete <br />"; echo "message de mysql : ".mysql_error($connexion); echo "</p>"; exit; } echo "<h3> affichage du resultat de la requete </h3>\n"; // Rcupration du nombre denregistrements e e $nombre_animaux = mysql_num_rows( $resultat ); echo "<p>". $nombre_animaux . " </p> \n "; echo " <ul>\n"; // boucle daffichage while( $row = mysql_fetch_array( $resultat ) ) { echo "<li>"; echo $row[nom] . . $row[naissance] ; echo "</li>\n"; } echo "</ul>\n";

?> </body> </html>