Vous êtes sur la page 1sur 105

MySQL

pour booster votre site web PHP

Hugo Etivant

Dernire mise jour : 20 juillet 2003

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 1


Introduction
MySQL drive directement de SQL (Structured Query Language) qui est un
langage de requte vers les bases de donnes exploitant le modle
relationnel.
Il en reprend la syntaxe mais nen conserve pas toute la puissance puisque de
nombreuses fonctionnalits de SQL napparaissent pas dans MySQL
(slections imbriques, cls trangres)
Le serveur de base de donnes MySQL est trs souvent utilis avec le
langage de cration de pages web dynamiques : PHP. Il sera discut ici des
commandes MySQL utilisables via PHP dans les conditions typiques
dutilisation dans le cadre de la gestion dun site personnel hberg
gratuitement (par exemple sur Free.fr).

Base de Script Page


MySQL HTTP
donnes PHP HTML

Serveur Client

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 2


Sommaire

Thorie des bases de donnes relationnelles


Syntaxe de MySQL
Fonctions de MySQL
Interface avec PHP
Administration avec loutil phpMyAdmin

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 3


1 Thorie des
bases de
donnes
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 4
Concepts du modle relationnel
Avant dattaquer le vif du sujet, un petit glossaire du jargon des bases de
donnes :
Domaine : ensemble des valeurs dun attribut.
Relation : sous ensemble du produit cartsien dune liste de domaines. Cest
en fait un tableau deux dimensions dont les colonnes correspondent aux
domaines et dont les lignes contiennent des tuples. On associe un nom
chaque colonne.
Attribut : une colonne dune relation, caractris par un nom.
Tuple : liste des valeurs dune ligne dune relation.

Une relation est un peu une classe (programmation oriente objet) qui ne
possderait que des attributs et donc chaque instance reprsenterait un tuple.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 5


Les relations
Une relation est une table comportant des colonnes (appeles aussi attributs)
dont le nom et le type caractrisent le contenu qui sera insr dans la table.

Imaginons que lon veuille stocker dans notre base de donnes notre carnet
dadresses. On va donc crer la relation Personne qui aura pour attributs :
nom, prnom, adresse, tlphone. Autrement dit, cest une table nomme
Personne possdant les colonnes : nom, prnom, adresse, tlphone.

Les lignes que contiendra cette table seront appeles enregistrements ou


tuples.

Personnes

nom prnom adresse tlphone


Dupond Marc 8 rue de loctet 0123456789

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 6


Algbre relationnelle
Lalgbre relationnelle regroupe toutes les oprations possibles sur les
relations. Voici la liste des oprations possibles :
Projection : on ne slectionne quun ou plusieurs attributs dune relation (on
ignore les autres). Par exemple nafficher que les colonnes nom et prnom de
la table Personnes.
Jointure : on fabrique une nouvelle relation partir de 2 ou plusieurs autres en
prenant comme pivot 1 ou plusieurs attributs. Par exemple, on concatne la
table du carnet dadresse et celle des inscrits la bibliothque en fonction du
nom de famille (ces typiquement du recoupement de fichiers).
Slection : on slectionne tous les tuples ou bien seulement une partie en
fonction de critres de slection qui portent sur les valeurs des attributs. Par
exemple nafficher que les lignes de la table Personnes qui vrifient la
condition suivante : le nom ne commence pas par la lettre C.

Cette algbre est facilement possible avec les commandes de MySQL


(SELECT FROM WHERE).

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 7


Projection
Personnes
nom prnom adresse tlphone
Martin Pierre 7 alle des vers 0258941236
Dupond Jean 32 all Poivrot 0526389152
Dupond Marc 8 rue de loctet 0123456789

On projette la table
Personnes sur les
colonnes nom et prnom.
SELECT nom, prnom
FROM Personnes

nom prnom
Martin Pierre
Dupond Jean
Dupond Marc

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 8


Jointure
Personnes Bibliothque
nom prnom adresse tlphone nom Dernierlivre
Martin Pierre 7 alle des vers 0258941236 Dupond Robinson
Dupond Jean 32 all Poivrot 0526389152 Jospin Faust
Martin Misre

On joint les deux tables, grce


la colonne nom.
SELECT Personnes.prnom, dernierlivre
Et on combine cette jointure
FROM Personnes, Bibliothque
une projection sur les attributs
WHERE Personnes.nom = Bibliothque.nom
nom et dernierlivre.
Attention lever toute ambi-
gut sur les noms dattribut
prnom Dernierlivre dans le cas o deux tables
possdent des colonnes de
Jean Robinson
mme nom.
Pierre Misre

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 9


Slection
Personnes
nom prnom adresse tlphone
Martin Pierre 7 alle des vers 0258941236
Dupond Jean 32 all Poivrot 0526389152
Dupond Marc 8 rue de loctet 0123456789

On ne slectionne que les


tuples dont lattribut nom
SELECT * est gale Dupond.
FROM Personnes
WHERE nom = Dupond

nom prnom adresse tlphone


Dupond Jean 32 all Poivrot 0526389152
Dupond Marc 8 rue de loctet 0123456789

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 10


2 Syntaxe de
MySQL
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 11
Types des attributs (I)
Les proprits de vos objets peuvent tre de types trs diffrents :
Nombre entier sign ou non (temprature, quantit commande, ge)
Nombre virgule (prix, taille)
Chane de caractres (nom, adresse, article de presse)
Date et heure (date de naissance, heure de parution)
numration (une couleur parmi une liste prdfinie)
Ensemble (une ou des monnaies parmi une liste prdfinie)

Il sagit de choisir le plus adapt vos besoins.

Ces types requirent une plus ou moins grande quantit de donnes stocker.
Par exemple, ne pas choisir un LONGTEXT pour stocker un prnom mais
plutt un VACHAR(40) !

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 12


Types des attributs (II) entiers

nom borne infrieure borne suprieure


TINYINT -128 127
TINYINT UNSIGNED 0 255
SMALLINT -32768 32767
SMALLINT UNSIGNED 0 65535
MEDIUMINT -8388608 8388607
MEDIUMINT UNSIGNED 0 16777215
INT* -2147483648 2147483647
INT* UNSIGNED 0 4294967295
BIGINT -9223372036854775808 9223372036854775807
BIGINT UNSIGNED 0 18446744073709551615

(*) : INTEGER est un synonyme de INT.


UNSIGNED permet davoir un type non sign.
ZEROFILL : remplissage des zros non significatifs.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 13


Types des attributs (III) flottants
Les flottants dits aussi nombres rels sont des nombres virgule. Contrairement aux
entiers, leur domaine nest pas continu du fait de limpossibilit de les reprsenter avec
une prcision absolue.

Exemple du type FLOAT :

-1.175494351E-38 3.402823466E+38

-3.402823466E+38 1.175494351E-38
0

nom domaine ngatif : Domaine positif :


borne infrieure borne infrieure
borne suprieure borne suprieure
FLOAT -3.402823466E+38 1.175494351E-38
-1.175494351E-38 3.402823466E+38
DOUBLE* -1.7976931348623157E+308 2.2250738585072014E-308
-2.2250738585072014E-308 1.7976931348623157E+308

(*) : REAL est un synonyme de DOUBLE.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 14


Types des attributs (IV) chanes
nom longueur
CHAR(M) Chane de taille fixe M, o 1<M<255, complte avec
des espaces si ncessaire.
CHAR(M) BINARY Idem, mais insensible la casse lors des tris et
recherches.
VARCHAR(M) Chane de taille variable, de taille maximum M, o
1<M<255, complt avec des espaces si ncessaire.
VARCHAR(M) BINARY Idem, mais insensible la casse lors des tris et
recherches.
TINYTEXT Longueur maximale de 255 caractres.
TEXT Longueur maximale de 65535 caractres.
MEDIUMTEXT Longueur maximale de 16777215 caractres.
LONGTEXT Longueur maximale de 4294967295 caractres.
DECIMAL(M,D)* Simule un nombre flottant de D chiffres aprs la virgule et
de M chiffres au maximum. Chaque chiffre ainsi que la
virgule et le signe moins (pas le plus) occupe un
caractre.
(*) : NUMERIC est un synonyme de DECIMAL.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 15
Types des attributs (V) chanes
Les types TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT peuvent tre
judicieusement remplacs respectivement par TINYBLOB, BLOB,
MEDIUMBLOB et LONGBLOB.

Ils ne diffrent que par la sensibilit la casse qui caractrise la famille des
BLOB. Alors que la famille des TEXT sont insensibles la casse lors des tris et
recherches.

Les BLOB peuvent tre utiliss pour stocker des donnes binaires.

Les VARCHAR, TEXT et BLOB sont de taille variable. Alors que les CHAR et
DECIMAL sont de taille fixe.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 16


Types des attributs (VI) dates et heures
nom description
DATE Date au format anglophone AAAA-MM-JJ.
DATETIME Date et heure au format anglophone AAAA-MM-JJ HH:MM:SS.
TIMESTAMP Affiche la date et lheure sans sparateur : AAAAMMJJHHMMSS.
TIMESTAMP(M) Idem mais M vaut un entier pair entre 2 et 14. Affiche les M premiers
caractres de TIMESTAMP.
TIME Heure au format HH:MM:SS.
YEAR Anne au format AAAA.

nom description En cas dinsertion dun enregistrement en


TIMESTAMP(2) AA laissant vide un attribut de type TIMESTAMP,
TIMESTAMP(4) AAMM celui-ci prendra automatiquement la date et
TIMESTAMP(6) AAMMJJ heure de linsertion. Contrairement Unix (o
TIMESTAMP(8) AAAAMMJJ le timestamp est le nombre de secondes
TIMESTAMP(10) AAMMJJHHMM coules depuis le 1er janvier 1970), en
TIMESTAMP(12) AAMMJJHHMMSS MySQL, il est une chane de format comme
TIMESTAMP(14) AAAAMMJJHHMMSS indiqu ci-contre.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 17


Types des attributs (VII) dates et heures
nom description
DATE Date au format anglophone AAAA-MM-JJ.
DATETIME Date et heure au format anglophone AAAA-MM-JJ HH:MM:SS.
TIMESTAMP Affiche la date et lheure sans sparateur : AAAAMMJJHHMMSS.
TIMESTAMP(M) Idem mais M vaut un entier pair entre 2 et 14. Affiche les M
premiers caractres de TIMESTAMP.
TIME Heure au format HH:MM:SS.
YEAR Anne au format AAAA.

Le format de date AAAA-MM-JJ signifie : anne sur 4 chiffre, mois sur 2


chiffres et jour sur 2 chiffres avec pour sparateur le tiret. Le format dheure
HH:MM:SS signifie : heure, minute et seconde chacune sur 2 chiffres, avec
pour sparateur les deux points.
Dans le format tendu qui comprend la date et lheure, des deux dernires
sont spares par un espace. Les formats de date sont assez permissifs car
des variantes sont tolres. Il est possible de mettre nimporte quel caractre
qui ne soit pas un chiffre en guise de sparateur, il est aussi possible de na
pas en mettre, comme cela est affich par TIMESTAMP.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 18


Types des attributs (VIII) numrations
Un attribut de type ENUM peut prendre une valeur parmi celles dfinies lors de
la cration de la table plus la chane vide ainsi que NULL si la dfinition le
permet. Ces valeurs sont exclusivement des chanes de caractres. Une
numration peut contenir 65535 lments au maximum.

Dfinition dun tel attribut :


nom_attribut ENUM(valeur 1,valeur 2)
nom_attribut ENUM(valeur 1,valeur 2) NULL

A chaque valeur est associe un index allant de 0 N si N valeurs ont t


dfinies. Lindex 0 est associ la chane nulle, lindex 1 la premire
valeur Lindex NULL est associ la valeur NULL.

Si une slection (SELECT ou WHERE) est faite dans un contexte numrique,


lindex est renvoy. Sinon, cest la valeur qui est retourne.

Il peut tre dfini jusqu 65535 valeurs distinctes insensibles la casse.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 19


Types des attributs (IX) ensembles
Un attribut de type SET peut prendre pour valeur la chane vide, NULL ou une
chane contenant une liste de valeurs qui doivent tre dclares lors de la
dfinition de lattribut lors de la cration de la relation.

Par exemple, un attribut dclar comme ci :


SET(voiture, moto, vlo) NOT NULL
peut prendre les valeurs suivantes :
(chane vide)
voiture,moto
vlo,voiture,moto
et autres combinaisons de listes des trois valeurs dfinie plus haut.

Un attribut dclar comme suit :


SET(voiture, moto, vlo) NULL
peut prendre, en plus ce celles prcdentes, la valeur NULL.

Il ne peut tre dfini que 64 lments maximum.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 20


Identificateurs
Les noms des bases, relations, attributs, index et alias sont constitus de
caractres alphanumriques et des caractres _ et $.
Un nom comporte au maximum 64 caractres.
Comme les bases de donnes et les relations sont codes directement dans le
systme de fichiers, la sensibilit la casse de MySQL dpend de celle du
systme dexploitation sur lequel il repose. Sous Windows, la casse na pas
dimportance ; alors que sous Unix, elle en a !
Le point . est un caractre rserv utilis comme sparateur entre le nom
dune base et celui dune relation, entre le nom dune relation et celui dun
attribut.
Exemple :
SELECT base1.table25.attribut5
FROM base1.table25

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 21


Exemple (I)
Imaginons que lon veuille construire la version web dun journal papier. Nous
devrons crer une table pour stocker les articles de presse. Les informations
relatives un article sont les suivantes : titre, texte, date de parution, auteur,
rubrique.
Un titre ayant une longueur raisonnable, il sera de type VARCHAR(80), le texte
pourra tre trs grand : TEXT (65535 caractres !), la date sera au format
DATE (YYYY:MM:JJ). Lauteur pourra tre cod sur un VARCHAR(80). Et la
rubrique pourrait tre un ENUM.

CREATE TABLE article (


id MEDIUM INT UNSIGNED PRIMARY KEY,
titre VARCHAR(80),
texte TEXT,
parution DATE,
auteur VARCHAR(80),
rubrique ENUM(conomie,sports,international,politique,culture)
)

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 22


Exemple (II)
Cette dfinition apporte certaines limitations : le nombre et le nom des
rubriques sont fixs la cration de la relation (CREATE TABLE). Bien sr, il
sera toujours possible de modifier la dfinition de la table (ALTER TABLE) pour
modifier ou ajouter une rubrique ; mais ce ne sera pas pratique du tout.
On peut imaginer une interface web qui permette un administrateur dajouter,
de renommer ou de supprimer des rubriques. Pour cela on va crer une
nouvelle relation : la table rubrique.
La relation article contiendra non plus le nom de la rubrique mais une
rfrence vers le nom de cette rubrique. Ainsi, lors dune slection, il faudra
faire une jointure entre les deux tables article et rubrique pour connatre le
nom de la rubrique associe un article.
CREATE TABLE article ( CREATE TABLE rubrique (
id TINYINT UNSIGNED PRIMARY KEY,
rubrique_idx TINYINT label VARCHAR(40)
) )
SELECT *
FROM article,rubrique
WHERE article.rubrique_idx=rubrique.id
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 23
Crer une relation (I)
La cration dune relation utilise la commande CREATE TABLE selon la
syntaxe suivante :

CREATE [TEMPORARY] TABLE nom_relation [IF NOT EXISTS] (


nom_attribut TYPE_ATTRIBUT [OPTIONS]

)

TEMPORARY donne pour dure de vie la table : le temps de la connexion de


lutilisateur au serveur, aprs, elle sera dtruite. En labsence de cette option, la
table sera permanente moins dtre dtruite par la commande DROP TABLE.
Loption IF NOT EXIST permet de ne crer cette table que si une table de
mme nom nexiste pas encore.
A lintrieur des parenthses, il sera list tous les attributs, cls et indexs de la
table.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 24


Crer une relation (II)
Le type de lattribut doit tre dun type vu prcdemment.
Les options seront vues au fur et mesure du cours.

Exemple du carnet dadresse :


CREATE TABLE Personne (
nom VARCHAR(40),
prnom VARCHAR(40),
adresse TINYTEXT,
tlphone DECIMAL(10,0)
)
Notre carnet dadresse est stock dans un tableau (appel Relation) de nom
Personne qui comporte les colonnes (dites aussi attributs) suivantes : nom
(chane de 40 caractres maximum), prnom (idem), adresse (texte de
longueur variable mais infrieure 255 caractres) et tlphone (chane de 10
caractres). Chacune des personnes ajouter au carnet dadresse occupera
une ligne de cette table. Une ligne est dite enregistrement dans le jargon des
bases de donnes.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 25


Crer une relation (III)
A sa cration, la table peut tre remplie par une requte SELECT (qui sera vue
en dtail plus tard). Par dfaut, une table est vide sa cration.

Exemple :
CREATE TABLE Personne (
nom VARCHAR(40),
prnom VARCHAR(40),
adresse TINYTEXT,
tlphone DECIMAL(10,0)
) SELECT firstname, name, town, tel FROM Users

Les options IGNORE et REPLACE placer entre la parenthse fermante et le


SELECT permettent respectivement dignorer les doublons et de remplacer les
doublons par la dernire valeur trouve. Ces options ne sont prises en compte
que pour grer le problme des contraintes dunicit (UNIQUE, PRIMARY
KEY).

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 26


Cl primaire (I)
Pour des raisons pratiques, nous souhaitons pouvoir associer chacun des
enregistrements de la relation un identifiant numrique unique qui puise tre
pass en paramtre nos scripts PHP.
Pour cela on rajoute un nouvelle attribut de type entier. Pour nous facilit la
tche, cet entier ne devra pas tre sign mais tre suffisamment grand pour
identifier tous nos enregistrements car destin un dcompte (donc dbute
forcment 1 et pas -127 par exemple).
Dans notre exemple, le carnet dadresse ne devrait pas excder plusieurs
centaines de personnes. Ainsi un attribut de type SMALLINT UNSIGNED
devrait faire laffaire. Nous le nommerons par la suite : id.
Cet attribut devra ne jamais tre vide, il faut donc prciser loption NOT NULL
pour le forcer prendre une valeur de son domaine (entre 0 et 65535).
Il devra aussi tre unique, cest--dire que deux enregistrements ne pourront
pas avoir une valeur identique de id. Il faut alors faire la dclaration suivante :
UNIQUE (id) la suite de la liste des attributs.
Pour simplifier, on utilisera loption PRIMARY KEY qui regroupe NOT NULL et
UNIQUE en remplacement des deux dernires dclarations.
Et pour finir, il faut signifier que cette valeur doit sincrmenter
automatiquement chaque insertion dun enregistrement grce loption
AUTO_INCREMENT.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 27


Cl primaire (II)
Notre exemple devient :

CREATE TABLE Personne (


id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(40),
prnom VARCHAR(40),
adresse TINYTEXT,
tlphone DECIMAL(10,0)
)

Cet identifiant numrique unique auto-incrmental, sappelle une cl


primaire .
La numrotation des cls primaires, dbute 1 et pas 0.

Personnes

Id nom prnom adresse tlphone


1 Dupond Marc 8 rue de loctet 0123456789

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 28


Cl primaire (III)
Notre cl primaire peut tre associe simultanment plusieurs attributs mais
selon une syntaxe diffrente.
Si au lieu de crer un identifiant numrique unique, on souhaite simplement
interdire davoir des doublon sur le couple (nom,prnom) et den interdire la
nullit, on va crer une cl primaire sur ce couple.
La connaissance des seuls nom et prnom suffit identifier sans ambigut un
et un seul enregistrement.

Mauvaise syntaxe :
CREATE TABLE Personne (
nom VARCHAR(40) PRIMARY KEY,
prnom VARCHAR(40) PRIMARY KEY,
adresse TINYTEXT,
tlphone DECIMAL(10,0) Bonne syntaxe :
) CREATE TABLE Personne (
nom VARCHAR(40),
prnom VARCHAR(40),
adresse TINYTEXT,
tlphone DECIMAL(10,0),
PRIMARY KEY (nom,prnom)
)
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 29
Attribut non nul
Considrons que lon souhaite que certains attributs aient obligatoirement une
valeur. On utilisera loption NOT NULL.
Dans ce cas, si malgr tout, aucune valeur nest fournie, la valeur par dfaut
si elle est dclare la cration de la relation sera automatiquement affecte
cet attribut dans lenregistrement.
Si aucune valeur par dfaut nest dclare :
- la chane vide sera affecte lattribut sil est de type chane de caractres
- la valeur zro 0 sil est de type nombre
- la date nulle 0000-00-00 et/ou lheure nulle 00:00:00 sil est de type date,
heure ou date et heure.

Exemple :
adresse TINYTEXT NOT NULL

Au contraire, on utilisera loption NULL si on autorise labsence de valeur.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 30


Valeur par dfaut
Pour donner une valeur par dfaut un attribut, on utilise loption DEFAULT.
Lors de lajout dun enregistrement cette valeur sera affecte lattribut si
aucune valeur nest donne.

Exemple :
tlphone DECIMAL(10,0) DEFAULT 0123456789

Les attributs de type chane de caractres de la famille TEXT et BLOB ne


peuvent pas avoir de valeur par dfaut.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 31


Attribut sans doublon (I)
Pour interdire lapparition de doublon pour un attribut, on utilise loption
UNIQUE.

Syntaxe :
UNIQUE [nomdelacontrainte](liste des attributs)

Exemple, pour interdire tout doublon de lattribut nom :


UNIQUE(nom)

Pour interdire les doublons sur lattribut nom mais les interdire aussi sur
prnom, tout en les laissant indpendants :
UNIQUE(nom)
UNIQUE(prnom)
nom prnom
enregistrement interdit
Dupond Marc car Marc est un doublon
Dupont Pierre dans la colonne prnom
Martin Marc
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 32
Attribut sans doublon (II)
Pour interdire tout doublon un ensemble dattributs (tuple), on passe en
paramtre UNIQUE la liste des attributs concerns.

Pour interdit tout doublon du couple (nom, prnom) :


UNIQUE(nom,prnom)

nom prnom
Dupond Marc enregistrement interdit car le
Dupont Pierre couple (Martin, Marc) est un
Martin Marc
doublon du couple (nom,prnom)
Martin Pierre
Martin Marc

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 33


Index (I)
Lors de la recherche dinformations dans une relation, MySQL parcours la
table correspondante dans nimporte quel ordre. Dans le cas dun grand
nombre de lignes, cette recherche est trs trs longue du fait du parcours de
TOUTE la table.
Pour y remdier, une optimisation possible et FORTEMENT recommande, est
dutiliser des indexs.
La cration dun index associ un attribut ou un ensemble ordonn
dattributs va crer une liste ordonne des valeurs de ces attributs et de
ladresse de la ligne associe. Cest sur les valeurs de cette liste que se fera
les recherches et les tris. Les algorithmes de recherche et de tri sur des
ensembles ordonnes sont normment plus rapides !
Ainsi, dune recherche cot prohibitif, on passe une recherche sur un
ensemble dj tri. On gagne donc normment en temps daccs aux
informations. Bien que cela ralentisse les mises jour (insertion, suppression,
modification de cl).
On choisira de crer des indexs sur les attributs qui seront les plus sollicits
par les recherches ou utiliss comme critre de jointure. Par contre, on
pargnera les attributs qui contiennent peu de valeurs diffrentes les unes des
autres et ceux dont les valeurs sont trs frquemment modifies.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 34


Index (II)
Syntaxe :
INDEX index (liste des attributs)

Exemple, pour crer un index sur les 3 premiers caractres seulement


de lattribut nom :
INDEX idx_nom (nom(3))

Exemple, pour crer un index sur le couple (nom,prnom) :


INDEX idx_nom_prenom (nom,prnom)

Un index peut porter sur 15 colonnes maximum.


Une table peut possder au maximum 16 indexs.
Un index peut avoir une taille dau maximum 256 octets et ne doit
porter que sur des attributs NOT NULL.
Il suffit de suffixer lattribut (CHAR, VARCHAR) pour dire de ne prendre
que les M premiers caractres pour lindexation.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 35
Supprimer une relation
La commande DROP TABLE prend en paramtre le nom de la table
supprimer. Toutes les donnes quelle contient sont supprimes et sa dfinition
aussi.

Syntaxe :
DROP TABLE relation

Exemple :
DROP TABLE Personnes

Si un beau jour on saperoit quune relation a t mal dfinie au dpart, plutt


que de la supprimer et de la reconstruire bien comme il faut, on peut la
modifier trs simplement. Cela vite de perdre les donnes quelle contient.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 36


Modifier une relation
La cration dune relation par CREATE TABLE nen rend pas dfinitives les
spcifications. Il est possible den modifier la dfinition par la suite, tout moment
par la commande ALTER TABLE.

Voici ce quil est possible de raliser :


- ajouter/supprimer un attribut
- crer/supprimer une cl primaire
- ajouter une contrainte dunicit (interdire les doublons)
- changer la valeur par dfaut dun attribut
- changer totalement la dfinition dun attribut
- changer le nom de la relation
- ajouter/supprimer un index

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 37


Ajouter un attribut
Syntaxe :
ALTER TABLE relation ADD definition [ FIRST | AFTER attribut]

Ajoutons lattribut fax qui est une chane reprsentant un nombre de 10


chiffres:
ALTER TABLE Personnes ADD fax DECIMAL(10,0)

Nous aurions pu forcer la place o doit apparatre cet attribut. Pour le mettre
en tte de la liste des attributs de la relation, il faut ajouter loption FIRST en fin
de commande. Pour le mettre aprs lattribut tlphone, il aurait fallu ajouter
AFTER tlphone.

Note : il ne doit pas dj avoir dans la relation un attribut du mme nom !

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 38


Supprimer un attribut (I)
Attention, supprimer un attribut implique la suppression des valeurs qui se
trouvent dans la colonne qui correspond cet attribut, sauf utiliser loption
IGNORE.

Syntaxe :
ALTER TABLE relation DROP attribut

Exemple :
ALTER TABLE Personnes DROP prnom

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 39


Supprimer un attribut (II)
La suppression dun attribut peut incidemment provoquer des erreurs sur les
contraintes cl primaire (PRIMARY KEY) et unique (UNIQUE).

CREATE TABLE Personne (


id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(40),
prnom VARCHAR(40),
adresse TINYTEXT,
tlphone DECIMAL(10,0),
UNIQUE(nom,prnom)
)

ALTER TABLE Personnes DROP prnom Refus doprer la


suppression, car cela
contredirait la contrainte
nom prnom nom dunicit qui resterait sur
Dupond Marc Dupond lattribut nom.
Martin Marc Martin
Martin Pierre Martin

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 40


Crer une cl primaire
La cration dune cl primaire nest possible quen labsence de cl primaire
dans la relation.

Syntaxe :
ALTER TABLE relation ADD PRIMARY KEY (attribut)

Exemple :
ALTER TABLE Personnes ADD PRIMARY KEY (nom,prnom)

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 41


Supprimer une cl primaire
Comme une cl primaire est unique, il ny a aucune ambigut lors de la
suppression.

Syntaxe :
ALTER TABLE relation DROP PRIMARY KEY

Exemple :
ALTER TABLE Personnes ADD PRIMARY KEY

Sil ny a aucune cl primaire lorsque cette commande est excute, aucun


message derreur ne sera gnr, le commande sera simplement ignore.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 42


Ajout dune contrainte dunicit
Il est possible (facultatif) de donner un nom la contrainte.
Cette contrainte peut sappliquer plusieurs attributs.
Si les valeurs dj prsentes dans la relation sont en contradiction avec cette
nouvelle contrainte, alors cette dernire ne sera pas applique et une erreur
sera gnre.

Syntaxe :
ALTER TABLE relation ADD UNIQUE [contrainte] (attributs)

Exemple pour interdire tout doublon sur lattribut fax de la relation Personnes :
ALTER TABLE Personnes ADD UNIQUE u_fax (fax)

Autre exemple fictif :


ALTER TABLE Moto ADD UNIQUE u_coul_vitre (couleur,vitre)

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 43


Changer la valeur par dfaut dun attribut
Pour changer ou supprimer la valeur par dfaut dun attribut.
Attention aux types qui nacceptent pas de valeur par dfaut (les familles
BLOB et TEXT).

Syntaxe :
ALTER TABLE relation ALTER attribut { SET DEFAULT valeur |
DROP DEFAULT }

Changer sa valeur par dfaut :


ALTER TABLE Personnes ALTER tlphone SET DEFAULT
9999999999

Supprimer sa valeur par dfaut :


ALTER TABLE Personnes ALTER tlphone DROP DEFAULT

Le changement ou la suppression naffecte en rien les enregistrements qui ont


eu recours cette valeur lors de leur insertion.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 44


Changer la dfinition dun attribut
Pour changer la dfinition de lattribut sans le renommer :
ALTER TABLE relation MODIFY attribut definition_relative

Exemple 1 :
ALTER TABLE Personnes MODIFY fax VARCHAR(14)

Pour changer sa dfinition en le renommant :


ALTER TABLE relation CHANGE attribut definition_absolue

Exemple 2 :
ALTER TABLE Personnes CHANGE fax num_fax VARCHAR(14)

Attention, si le nouveau type appliqu lattribut est incompatible avec les


valeurs des enregistrements dj prsents dans la relation, alors elles risques
dtres modifies ou remises zro !

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 45


Changer le nom de la relation
Syntaxe :
ALTER TABLE relation RENAME nouveau_nom

Exemple :
ALTER TABLE Personnes RENAME Carnet

Cela consiste renommer la table, et donc le fichier qui la stocke.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 46


Ajouter un index
Une table ne peut comporter que 32 indexs.
Et un index ne peut porter que sur 16 attributs maximum la fois.

Syntaxe :
ALTER TABLE relation ADD INDEX index (attributs)

Exemple :
ALTER TABLE Personnes ADD INDEX nom_complet
(nom,prnom)

Dans cet exemple, on a ajout la relation Personnes un index que lon


nomme nom_complet et qui sapplique aux deux attributs nom et prnom.
Ainsi, les recherches et les tris sur les attributs nom et prnom seront
grandement amliors. Car un index apporte les changements sous-jacents
permettant doptimiser les performances du serveur de base de donnes.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 47


Supprimer un index
Syntaxe :
ALTER TABLE relation DROP INDEX index

Exemple :
ALTER TABLE Personnes DROP INDEX nom_complet

Cette exemple permet de supprimer lindex nomm nom_complet de la relation


Personnes.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 48


Ajouter un enregistrement (I) insertion tendue
Ajouter un enregistrement une relation revient ajouter une ligne la table.
Pour cela, pour chacun des attributs, il faudra en prciser la valeur. Si
certaines valeurs sont omises, alors les valeurs par dfauts dfinie les de la
cration de la relation seront utilises. Si on ne dispose pas non plus de ces
valeurs par dfaut, alors MySQL mettra 0 pour un nombre, pour une chane,
0000-00-00 pour une date, 00:00:00 pour une heure, 00000000000000 pour un
timestamp (si le champs poste la contrainte NOT NULL). Dans le cas o
lattribut porte la contrainte NULL (par dfaut) alors la valeur par dfaut de
lattribut quel soit sont type sera la suivante : NULL.

Syntaxe dune insertion tendue :


INSERT INTO relation(liste des attributs) VALUES(liste des valeurs)

Exemple :
INSERT INTO Personnes(nom,prnom) VALUES(Martin,Jean)

REPLACE est un synonyme de INSERT, mais sans doublon. Pratique pour


respecter les contraintes dunicit (UNIQUE, PRIMARY KEY).

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 49


Ajouter un enregistrement (II) insertion standard
Une syntaxe plus courte mais plus ambigu permet dinsrer un
enregistrement dans une table. Elle consiste omettre la liste des noms
dattribut la suite du nom de la relation. Cela impose que la liste des valeurs
suivant le mot cl VALUES soit exactement celle dfinie dans la table et
quelles soient dans lordre dfini dans la dfinition de la table ; sinon des
erreurs se produiront.

Syntaxe dune insertion standard :


INSERT INTO relation VALUES(liste exhaustive et ordonne des
valeurs)

Exemple :
CREATE TABLE Ballon (
taille INT NOT NULL,
couleur VARCHAR(40)
)
INSERT INTO Ballon VALUES(20, rouge) ok
INSERT INTO Ballon VALUES(rouge, 20) faux
INSERT INTO Ballon VALUES(rouge) faux

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 50


Ajouter un enregistrement (III) insertion complte
Dans le cas o lon souhaite procder linsertion de plusieurs
enregistrements les uns la suite des autres, il y a deux mthodes :
- faire une boucle qui envoie autant dINSERT que ncessaire au serveur
- faire une insertion dite complte

Syntaxe dune insertion complte :


INSERT INTO relation VALUES (liste des valeurs), (liste dautres
valeurs), (liste dencore dautres valeurs),

Exemple :
INSERT INTO Ballon VALUES (20, rouge), (35, vert fluo), (17,
orange), (28, crulen)

Cet exemple est quivalent aux requtes suivantes :


INSERT INTO Ballon VALUES(20, rouge)
INSERT INTO Ballon VALUES(35, vert fluo)
INSERT INTO Ballon VALUES(17, orange)
INSERT INTO Ballon VALUES(28, crulen)

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 51


Ajouter un enregistrement (IV) insertion complte
Linsertion complte permet dinsrer plusieurs enregistrements dans une
mme table. Une insertion complte ne permet pas dinsrer des donnes
dans plusieurs tables diffrentes.

Linsertion complte et linsertion tendue peuvent tre associes dans une


mme requte :
INSERT INTO Ballon(taille, couleur) VALUES (20, rouge), (35, vert
fluo), (17, orange), (28, crulen)

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 52


Modifier un enregistrement (I)
Pour modifier un ou des enregistrement(s) dune relation, il faut prciser un
critre de slection des enregistrement modifier (clause WHERE), il faut
aussi dire quels sont les attributs dont on va modifier la valeur et quelles sont
ces nouvelles valeurs (clause SET).

Syntaxe :
UPDATE [ LOW_PRORITY ] relation SET attribut=valeur, [
WHERE condition ] [ LIMIT a ]

Exemple :
UPDATE Personnes SET tlphone=0156281469 WHERE
nom=Martin AND prnom = Pierre

Cet exemple modifie le numro de tlphone de Martin Pierre.

LOW_PRORITY est une option un peu spciale qui permet de nappliquer la


ou les modification(s) quune fois que plus personne nest en train de lire dans
la relation.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 53
Modifier un enregistrement (II)
Il est possible de modifier les valeurs dautant dattributs que la relation en
contient.

Exemple pour modifier plusieurs attributs :


UPDATE Personnes SET tlphone=0156281469,
fax=0156281812 WHERE id = 102

Pour appliquer la modification tous les enregistrements de la relation, il suffit


de ne pas mettre de clause WHERE.

LIMIT a permet de nappliquer la commande quaux a premiers


enregistrements satisfaisant la condition dfinie par WHERE.

Autre exemple :
UPDATE Enfants SET age=age+1

Il est donc possible de modifier la valeur dun attribut relativement sa valeur


dj existante.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 54


Supprimer un enregistrement
Attention, la suppression est dfinitive !

Syntaxe :
DELETE [ LOW_PRIORITY ] FROM relation [ WHERE condition ] [
LIMIT a ]

Exemple :
DELETE FROM Personnes WHERE nom=Martin AND
prnom=Marc

Pour vider une table de tous ces lments, ne pas mettre de clause WHERE.
Cela efface et recre la table, au lieu de supprimer un un chacun des tuples
de la table (ce qui serait trs long).

Exemple :
DELETE FROM Personnes

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 55


Slectionner des enregistrements (I)
Pour extraire de votre base de donnes des informations, comme la liste des
personnes de votre carnet dadresse qui vivent Paris.

Syntaxe gnrale :
SELECT [ DISTINCT ] attributs
[ INTO OUTFILE fichier ]
[ FROM relation ]
[ WHERE condition ]
[ GROUP BY attributs [ ASC | DESC ] ]
[ HAVING condition ]
[ ORDER BY attributs ]
[ LIMIT [a,] b ]

Exemple :
SELECT nom,prnom FROM Personnes WHERE adresse LIKE
%paris%

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 56


Slectionner des enregistrements (II)
Nom Description
SELECT Spcifie les attributs dont on souhaite connatre les valeurs.
DISTINCT Permet dignorer les doublons de ligne de rsultat.
INTO OUTFILE Spcifie le fichier sur lequel effectuer la slection.
FROM Spcifie le ou les relations sur lesquelles effectuer la slection.
WHERE Dfinie le ou les critres de slection sur des attributs.
GROUP BY Permet de grouper les lignes de rsultats selon un ou des
attributs.
HAVING Dfinie un ou des critres de slection sur des ensembles de
valeurs dattributs aprs groupement.
ORDER BY Permet de dfinir lordre (ASCendant par dfaut ou
DESCendant) dans lenvoi des rsultats.
LIMIT Permet de limiter le nombre de lignes du rsultats

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 57


Slectionner des enregistrements (III)
Procdons par tapes :
Pour slectionner tous les enregistrements dune relation :
SELECT * FROM relation
Pour slectionner toutes les valeurs dun seul attribut :
SELECT attribut FROM relation
Pour liminer les doublons :
SELECT DISTINCT attribut FROM relation
Pour trier les valeurs en ordre croissant :
SELECT DISTINCT attribut FROM relation ORDER BY attribut ASC
Pour se limiter aux num premiers rsultats :
SELECT DISTINCT attribut FROM relation ORDER BY attribut ASC
LIMIT num
Pour ne slectionner que ceux qui satisfont une condition :
SELECT DISTINCT attribut FROM relation WHERE condition
ORDER BY attribut ASC LIMIT num

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 58


Slectionner des enregistrements (IV)
Relation de dpart :
SELECT * FROM Gens
Gens
1
Nom Prenom Age
Dupond Pierre 24
Martin Marc 48 SELECT Nom FROM Gens
Dupont Jean 51 Gens

Martin Paul 36 Nom 2


Dupond Lionel 68 Dupond

Chirac Jacques 70 Martin


Dupont Gens
3 Nom
Martin
Dupond Dupond
Chirac Martin
Dupont
Chirac
SELECT DISTINCT Nom FROM Gens

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 59


Slectionner des enregistrements (V)

Gens SELECT DISTINCT Nom


Nom FROM Gens
Chirac
ORDER BY Nom ASC
Dupond
Dupont
4
Gens SELECT DISTINCT Nom
Martin 5 Nom FROM Gens
Chirac ORDER BY Nom ASC
Dupond LIMIT 2

6 Gens SELECT DISTINCT Nom


Nom FROM Gens
Dupond WHERE Nom <> Chirac
ORDER BY Nom ASC
LIMIT 2

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 60


Optimisation
Aprs la suppression de grandes parties dune table contenant des index, les
index des tuples supprims sont conservs, rallongeant dautant les slections.
Pour supprimer ces index obsoltes et vider les trous , il faut loptimiser.

Syntaxe :
OPTIMIZE TABLE Relation

Exemple :
OPTIMIZE TABLE Personnes

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 61


Jointure volue (I)
En dbut de ce document, on a vu la jointure suivante :
SELECT Personnes.nom, nblivres
FROM Personnes, Bibliothque
WHERE Personnes.nom = Bibliothque.nom
qui permet de concatner deux relation en prenant un attribut comme pivot.
Il est possible de concatner deux relation sur plusieurs attributs la fois, ou
mme de concatner X relation sur Y attributs.
Les requtes utilisant trs souvent les jointures, il a t cr une syntaxe
spciale plus rapide : JOIN que la mthode vue plus haut : avec la clause
WHERE.

Ainsi la jointure prcdente peut scrire aussi :


SELECT Personnes.nom, nblivres
FROM Personnes INNER JOIN Bibliothque
USING (nom)
ce qui signifie que les deux relations Personnes et Bibliothque sont
concatne (INNER JOIN) en utilisant (USING) lattribut nom.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 62


Jointure volue (II)
La syntaxe USING permet de lister les attributs servant de pivot. Ces attributs
doivent porter le mme nom dans chacune des tables devant tre
concatnes.
Si les attributs pivots ne portent pas le mme nom, il faut utiliser la syntaxe
ON.

Ainsi la jointure prcdente peut scrire aussi :


SELECT Personnes.nom, nblivres
FROM Personnes INNER JOIN Bibliothque
ON Personnes.nom = Bibliothque.nom

La mthode INNER JOIN ninclus les enregistrements de la premire table que


sils ont une correspondance dans la seconde table.

Personnes Bibliothque Rsultat de la jointure


Nom Prnom Nom Nblivres Nom Nblivres
Martin Jean Martine 5 Tartan 10
Tartan Pion Tartan 10 Dupond 3
Dupond Jacques Dupond 3
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 63
Jointure volue (III)
Pour remdier aux limites de INNER JOIN, il existe la syntaxe LEFT JOIN qui
inclus tous les enregistrements de la premire table mme sils nont pas de
correspondance dans la seconde table. Dans ce cas prcis, lattribut non
renseign prendra la valeur NULL.

L encore, le ON peut avantageusement tre remplac par le USING.

La jointure devient :
SELECT Personnes.nom, nblivres
FROM Personnes LEFT JOIN Bibliothque
ON Personnes.nom = Bibliothque.nom

Personnes Bibliothque Rsultat de la jointure


Nom Prnom Nom Nblivres Nom Nblivres
Martin Jean Martine 5 Martin NULL
Tartan Pion Tartan 10 Tartan 10
Dupond Jacques Dupond 3 Dupond 3

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 64


3 Fonctions
de MySQL
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 65
Les fonctions
Bien que ces fonctions appartiennent typiquement MySQL, la cration dun
chapitre part se justifie par le fait que je vais me contenter ici dnumrer les
fonctions les plus courantes.
Reportez-vous au manuel MySQL pour la liste dtaille de toutes les fonctions
disponibles dans votre version du serveur MySQL.
Ces fonctions sont ajouter vos requtes dans un SELECT, WHERE,
GROUP BY ou encore HAVING.

Dabord sachez que vous avez votre disposition :


les parenthses ( ),
les oprateurs arithmtiques (+, -, *, /, %),
les oprateurs binaires (<, << , >, >>, |, &),
les oprateurs logiques qui retournent 0 (faux) ou 1 (vrai) (AND, OR, NOT,
BETWEEN, IN),
les oprateurs relationnels (<, <=, =, >, >=, <>).
Les oprateurs et les fonctions peuvent tres composs entre eux pour donner
des expressions trs complexes.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 66


Quelques exemples
SELECT nom Liste du nom des produits dont le prix est infrieur ou
FROM produits gale 100.5 EUR.
WHERE prix <= 100.5

SELECT nom,prnom Liste des nom et prnom des lves dont


FROM lves lge est compris entre 12 et 16 ans.
WHERE age BETWEEN 12 AND 16

SELECT modle Liste des modles de voiture dont


FROM voitures la couleur est dans la liste : rouge,
WHERE couleur IN (rouge, blanc, noir) blanc, noir.

SELECT modle Liste des modles de voiture dont


FROM voitures la couleur nest pas dans la liste :
WHERE couleur NOT IN (rose, violet) rose, violet.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 67


Fonctions de comparaison de chanes
Le mot cl LIKE permet de comparer deux chanes.
Le caractre % est spcial et signifie : 0 ou plusieurs caractres.
Le caractre _ est spcial et signifie : 1 seul caractre, nimporte lequel.

Lexemple suivant permet de rechercher tous les clients sont le prnom


commence par Jean, cela peut tre Jean-Pierre, etc :
SELECT nom
FROM clients
WHERE prnom LIKE Jean%

Pour utiliser les caractres spciaux ci-dessus en leur enlevant leur fonction
spciale, il faut les faire prcder de lantislash : \.
Exemple, pour lister les produit dont le code commence par la chane _XE :
SELECT *
FROM produit
WHERE code LIKE \_XE%

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 68


Fonctions mathmatiques
Fonction Description
ABS(x) Valeur absolue de X.
SIGN(x) Signe de X, retourne -1, 0 ou 1.
FLOOR(x) Arrondi lentier infrieur.
CEILING(x) Arrondi lentier suprieur.
ROUND(x) Arrondi lentier le plus proche.
EXP(x), LOG(x), SIN(x), Bon, l cest les fonctions de maths de base
COS(x), TAN(x), PI()
POW(x,y) Retourne X la puissance Y.
RAND(), RAND(x) Retourne un nombre alatoire entre 0 et 1.0
Si x est spcifi, entre 0 et X
TRUNCATE(x,y) Tronque le nombre X la Yme dcimale.

SELECT nom Cet exemple affiche dans un ordre


FROM filiales alatoire le nom des filiales dont le chiffre
WHERE SIGN(ca) = -1 daffaire est ngatif.
ORDER BY RAND() A noter que : SIGN(ca) = -1 ! ca < 0
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 69
Fonctions de chanes
Fonction Description
TRIM(x) Supprime les espaces de dbut et de fin de chane.
LOWER(x) Converti en minuscules.
UPPER(x) Converti en majuscules.
LONGUEUR(x) Retourne la taille de la chane.
LOCATE(x,y) Retourne la position de la dernire occurrence de x
dans y. Retourne 0 si x nest pas trouv dans y.
CONCAT(x,y,) Concatne ses arguments.
SUBSTRING(s,i,n) Retourne les n derniers caractres de s en
commenant partir de la position i.
SOUNDEX(x) Retourne une reprsentation phontique de x.

SELECT UPPER(nom)
FROM clients
WHERE SOUNDEX(nom) = SOUNDEX(Dupond)
On affiche en majuscules le nom de tous les clients dont le nom ressemble
Dupond.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 70
Fonctions de dates et heures
Fonction Description
NOW() Retourne la date et heure du jour.
TO_DAYS(x) Conversion de la date X en nombre de jours
depuis le 1er janvier 1970.
DAYOFWEEK(x) Retourne le jour de la semaine de la date x
sous la forme dun index qui commence 1
(1=dimanche, 2=lundi)
DAYOFMONTH(x) Retourne le jour du mois (entre 1 et 31).
DAYOFYEAR(x) Retourne le jour de lanne (entre 1 et 366).
SECOND(x), MINUTE(x), Retournent respectivement les secondes,
HOUR(x), MONTH(x), minutes, heures, mois, anne et semaine de la
YEAR(x), WEEK(x) date.

SELECT titre
FROM article
WHERE (TO_DAYS(NOW()) TO_DAYS(parution)) < 30
Cet exemple affiche le titre des articles parus il y a moins de 30 jours.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 71


Fonctions utiliser dans les GROUP BY
Fonction Description
COUNT([DISTINCT]x,y,) Dcompte des tuples du rsultat par projection
sur le ou les attributs spcifis (ou tous avec
*). Loption DISTINCT limine les doublons.
MIN(x), MAX(x), AVG(x), Calculent respectivement le minimum, le
SUM(x) maximum, la moyenne et la somme des valeurs
de lattribut X.
SELECT DISTINCT model Ici on affiche le palmars des models
FROM voiture de voitures qui proposent un choix de
GROUP BY model plus de 10 couleurs.
HAVING COUNT(couleur) > 10

SELECT COUNT(*) Affichage de tous les clients.


FROM client

SELECT DISTINCT produit.nom, SUM(vente.qt * produit.prix) AS total


FROM produit, vente
WHERE produit.id = vente.produit_idx Classement des produits
GROUP BY produit.nom par la valeur totale vendue.
ORDER BY total
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 72
4 Interface
avec PHP
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 73
Connexion (I)
Pour se connecter une base depuis un script php, il faut spcifier un nom de
serveur, un nom dutilisateur, un mot de passe et un nom de base.
Aucune connexion nest possible sans authentification auprs du serveur de
base de donnes.
Les actions possibles de lutilisateur sur la base laquelle il se connecte
dpendent des droits qui lui auront t fournis par ladministrateur de la base
de donnes.

mysql_connect($server,$user,$password) : permet de se connecter au


serveur $server en tant quutilisateur $user avec le mot de passe $password,
retourne lidentifiant de connexion si succs, FALSE sinon. Si ces arguments
manquent, les valeurs par dfaut du fichier de configuration php.ini seront
utilises.
mysql_select_db($base[,$id]) : permet de choisir la base $base, peut
prendre un identifiant $id de connexion ; retourne TRUE en cas de succs,
sinon FALSE. Les identifiants de connexion ne sont pas ncessaires si on ne
se connecte qu un seul serveur la fois, ils permettent seulement de lever
toute ambigut en cas de connexions multiples (vers plusieurs serveurs dans
le mme script).
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 74
Connexion (II)
mysql_close([$id]) : permet de fermer la connexion un serveur de bases de
donnes, largument optionnel $id est lidentifiant de session retourn
louverture de la connexion.
A not que toutes les connexions aux serveurs de bases de donnes sont
automatiquement fermes la fin de lexcution du script qui les aura
ouvertes.

Dans le cas o le visiteur du site doit naviguer travers diffrents script PHP
qui se connectent tous au mme serveur, il est prfrable davoir recours aux
connexions persistantes . Une connexion persistante est ouverte avec la
fonction mysql_pconnect() qui est en tout point comparable
mysql_connect() la seule diffrence que la connexion nest pas ferme la
fin du script qui a ouvert la connexion. Ainsi, les scripts suivants peuvent
continuer lancer des requtes la base de donnes sans avoir rouvrir de
connexion en direction du serveur.
Une connexion persistante ne peut pas tre ferme avec la fonction
mysql_close(). Au del dun certain temps dinactivit, la ou les connexions
persistantes ouvertes sont automatiquement fermes.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 75


Connexion (III)
Exemple 1 :
if( $id = mysql_connect(localhost,foobar,0478) ) {
if(mysql_select_db(gigabase) ) {
echo Succs de connexion.;
/* code du script */
} else {
die(Echec de connexion la base.);
}
mysql_close($id);
} else {
die(Echec de connexion au serveur de base de donnes.);
}

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 76


Connexion (IV)
Exemple 2 :
@mysql_connect(localhost,foobar,0478) or die(Echec de
connexion au serveur.);
@mysql_select_db(gigabase) or die(Echec de slection de la base.);

Cet exemple est quivalent au prcdent mais plus court crire. Le symbole
@ (arobase) permet dviter le renvoi de valeur par la fonction quil prcde.

On pourra avantageusement intgrer ce code dans un fichier que lon pourra


joindre par include(). Cest aussi un moyen de scuriser le mot de passe de
connexion.

Une connexion persistante vite davoir rouvrir une connexion dans chaque
script. Les connexions sont automatiquement fermes au bout dun certain
temps en cas dabsence de toute activit

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 77


Interrogation
Pour envoyer une requte une base de donne, il existe la fonction :
mysql_query($str) qui prend pour paramtre une chane de caractres qui
contient la requte crite en SQL et retourne un identificateur de rsultat ou
FALSE si chec.

Exemple :
$result = mysql_query(SELECT tlphone FROM Personnes WHERE
nom=\$name\);
Cet exemple recherche le tlphone dune personne portant pour nom la
valeur de la chane $name. Lidentificateur de rsultat $result permettra
dautres fonctions dextraire ligne par ligne les donnes retournes par le
serveur. Chaque appel cette fonction retournera un tuple du rsultat. Cest
pourquoi cette instruction pourra tre utilise au sein dune boucle while qui
sarrtera lorsque mysql_query() renverra FALSE.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 78


Extraction des donnes (I) tableau
mysql_fetch_row($result) : retourne une ligne de rsultat (un tuple) sous la
forme dun tableau. Les lments du tableau tant les valeurs des attributs de
la ligne. Retourne FALSE sil ny a plus aucune ligne.

Exemple 1 :
$requet = SELECT * FROM users;
if($result = mysql_query($requet)) {
while($ligne = mysql_fetch_row($result)) {
$id = $ligne[0];
$name = $ligne[1];
$address = $ligne[2];
echo $id - $name, $address <br />;
}
} else {
echo Erreur de requte de base de donnes.;
}
Ici, on accde aux valeurs de la ligne par leur indice dans le tableau.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 79


Extraction des donnes (II) associatif
mysql_fetch_array($result) et mysql_fetch_assoc($result) : retournent un
tableau associatif. Les cls tant les noms des attributs et leurs valeurs
associes leurs valeurs respectives. Retourne FALSE sil ny a plus aucune
ligne.

Exemple 2 :
$requet = SELECT * FROM users;
if($result = mysql_query($requet)) {
while($ligne = mysql_fetch_array($result)) {
$id = $ligne[id];
$name = $ligne[name];
$address = $ligne[address];
echo $id - $name, $address <br />;
}
} else {
echo Erreur de requte de base de donnes.;
}
Ici, on accde aux valeurs de la ligne par lattribut dans le tableau associatif.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 80


Extraction des donnes (III) objet
mysql_fetch_object($result) : retourne un objet. Les attributs de lobjet
correspondent ceux de la ligne de rsultat. Et les valeurs des attributs de
lobjet correspondent ceux de la ligne de rsultat. Retourne FALSE sil ny a
plus aucune ligne.

Exemple 3 :
$requet = SELECT * FROM users;
if($result = mysql_query($requet)) {
while($ligne = mysql_fetch_object($result)) {
$id = $ligne->id;
$name = $ligne->name;
$address = $ligne->address;
echo $id - $name, $address <br />;
}
} else {
echo Erreur de requte de base de donnes.;
}
Ici, on accde aux valeurs par leur attribut dans lobjet.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 81


Statistiques sur une requte
mysql_affected_rows([$id]) : retourne le nombre de lignes modifies par la
dernire requte INSERT, UPDATE ou DELETE effectue sur le serveur
identifie par $id (les DELETE sans clause WHERE retourneront 0 lignes, car
la table sera recre au lieu de supprimer les lignes une une).
$requet = DELETE FROM users WHERE name LIKE \Martin%\;
$result = mysql_query($requet) or die(Erreur de base de donnes.);
$num = mysql_affected_rows();

mysql_num_rows($result) : retourne le nombre de lignes retournes par la


dernire requte SELECT dont on connat lidentifiant de rsultat $result.
$requet = SELECT name FROM users WHERE birth > \1980-05-10\;
$result = mysql_query($requet) or die(Erreur de base de donnes.);
$num = mysql_num_rows();

mysql_num_fields($result) : retourne le nombre dattributs des tuples du


rsultat dune requte.
$requet = SELECT * FROM users;
$result = mysql_query($requet) or die(Erreur de base de donnes.);
$num = mysql_num_fields();

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 82


Informations sur les attributs (I)
Les fonctions suivantes sappliquent au $field me attribut retourn par la
dernire requte identifie par $result :
mysql_field_name($result, $field) : retourne le nom
mysql_field_len($result, $field) : retourne la taille
mysql_field_type($result, $field) : retourne le type
mysql_field_flags($result, $field) : retourne les drapeaux
mysql_field_table($result, $field) : retourne le nom de la table
mysql_fetch_field($result [,$field]) : retourne un objet contenant des informations
sur lattribut $field. Ses attributs sont name (nom), table (nom de la table),
max_length (taille), type (type) et les boolens suivants : not_null, primary_key,
unique_key, multiple_key, numeric, blob, unsigned, zerofill.
mysql_field_seek($result, $field) : prpositionne lindex $field afin de ne pas le
passer en paramtre mysql_fetch_field().

Lindex commence zro.


Elles ne peuvent tre utilise quaprs un appel la fonction mysql_query()
retournant le pointeur de rsultat $result.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 83


Informations sur les attributs (II)
mysql_list_dbs([$id]) : retourne un pointeur de rsultat simulant la requte
suivante : SHOW DATABASES. Liste des bases de donnes.

mysql_list_tables($base [, $id]) : retourne un pointeur de rsultat simulant la


requte suivante : SHOW TABLES FROM $base. Liste des relations de la
base de donnes $base.

mysql_list_fields ($base, $table [, $id]) : retourne un pointeur de rsultat


simulant la requte suivante : SHOW COLUMNS FROM $table FROM
$base. Ce pointeur peut tre utilis par les fonctions mysql_field_* afin
davoir des informations sur une table $table de la base $base. Lidentifiant de
connexion $id est optionnel.

mysql_fetch_lengths($result) : retourne un tableau contenant la taille de


chaque attribut de la ligne du dernier tuple rsultat de la requte $result, ou
FALSE sinon. Ne peut tre utilise quaprs lune des fonctions dextraction.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 84


Informations sur les attributs (III)
if($result = mysql_query(SELECT * FROM forum) ) {
for($i=1; $i<= mysql_num_fields($result); $i++ ) {
echo mysql_field_name($result, $i-1), , ,
mysql_field_len($result, $i-1), , , Dfinition de la table :
mysql_field_type($result, $i-1), , , CREATE TABLE forum (
id bigint(20) unsigned auto_increment,
mysql_field_flags($result, $i-1), ,, title tinytext NOT NULL,
mysql_field_table($result, $i-1), <br />; mesg text NOT NULL,
} hits mediumint(8) unsigned NOT NULL,
author_idx bigint(20) unsigned NOT NULL,
} else die(Erreur de base de donnes.); date datetime NOT NULL,
PRIMARY KEY(id)
)
Rsultats :
nom taille type drapeaux table
id 20 int not_null primary_key unsigned auto_increment forum
title 255 blob not_null blob forum
mesg 65535 blob not_null blob forum
hits 8 int not_null unsigned forum
author_idx 20 int not_null unsigned forum
date 19 datetime not_null forum

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 85


Informations sur les attributs (IV)
if($result = mysql_query(SELECT * FROM forum) ) {
$infos = mysql_fetch_field($result, 0); Rsultat :
print_r($infos); stdClass Object
} (
[name] => id
Cet exemple affiche les informations sur le premier attribut [table] => forum
des rsultats de la requte. On voit quil sappelle id, quil [def] =>
appartient la table forum, que sa taille maximum est de [max_length] => 2
2 digits, quil porte les contraintes suivantes : NOT NULL [not_null] => 1
et PRIMARY KEY, quil est de type numrique non sign : [primary_key] => 1
INT, UNSIGNED. [multiple_key] => 0
[unique_key] => 0
[numeric] => 1
[blob] => 0
[type] => int
[unsigned] => 1
[zerofill] => 0
)
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 86
Fonctions sur le serveur
mysql_create_db($base [, $id]) : cration de la base $base.
mysql_db_name($result, $row [, $field]) : Lit les noms des bases de
donnes. $result est lidentifiant de rsultat issu de mysql_list_dbs(). $row
est l'index dans le rsultat. Retourne FALSE si chec.
mysql_db_query($base, $query [, $id]) : excution de la requte $query sur
la base $base. Retourne un identifiant de rsultat si succs ou FALSE si
chec.
mysql_query($query [, $id]) : excution de la requte sur la base ouverte.
Retourne un identifiant de rsultat si succs ou FALSE si chec.
mysql_drop_db($base [, $id]) : supprime la base de donnes $base.
Retourne TRUE si succs ou FASE si chec.
mysql_select_db($base [, $id]) : slectionne la base de donnes $base sur
le serveur sur lequel on est connect et dont $id est lidentifiant de connexion.
Retourne TRUE si succs ou FASE si chec.
$result = mysql_list_dbs();
$num = mysql_num_rows($result); Cet exemple affiche la liste
for ($i=0; $i<$num; $i++) des bases de donnes du
echo mysql_db_name($result, $i).<br />; serveur.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 87


Gestion des erreurs
Il est recommand de tester systmatiquement les valeurs retournes par les
fonction de traitement sur une base de donnes afin dviter la pollution de la
page web par des Warning.

mysql_errno([$id]) : retourne le numro derreur de la dernire opration


MySQL effectue sur la connexion courante ou celle didentifiant $id.

mysql_error([$id]) : retourne le message derreur de la dernire opration


MySQL effectue sur la connexion courante ou celle didentifiant $id.

Exemple :
$requet = DELETE FROM users WHERE name LIKE \Martin%\;
if($result = mysql_query($requet)) {

} else {
echo Erreur de base de donnes n.mysql_errno().: .mysql_error();
}

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 88


Fonctions additionnelles
Quelques fonctions supplmentaires trs utiles :
mysql_free_result($result) : efface de la mmoire du serveur les lignes de rsultat de
la requte identifies par $requet. Trs utile pour amliorer les performances du
serveur. A nutiliser que si votre script utilise vraiment beaucoup de mmoire.
mysql_insert_id([$id]) : retourne lidentifiant dun attribut cl primaire
AUTO_INCREMENT de la dernire insertion.
mysql_data_seek($result, $row) : Permet de prpositionner le pointeur interne de
rsultat $result la ligne $row. Le prochain appel une fonction dextraction de tuple
du rsultat ira directement cette ligne. Retourne TRUE si succs et FALSE sinon.

Penser bien tester la valeur de retour des fonctions (mysql_query et les


autres) afin de dtecter toute erreur et dviter de polluer votre page avec des
Warnings.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 89


Directives de configuration du php.ini
Ces informations sont utilises si elles sont omises lors dune connexion :
mysql.default_host chane de caractres
Adresse par dfaut du serveur de bases de donnes.
mysql.default_user chane de caractres
Utilisateur par dfaut.
mysql.default_password chane de caractres
Mot de passe par dfaut.

Connexions persistantes :
mysql.allow_persistent boolen
Active ou dsactive les connexions persistantes.
mysql.max_persistent entier
Nombre maximum de connexions persistantes par processus.

Connexions :
mysql.max_links entier
Nombre de connexion simultanes maximum, par processus, incluant les connexions
persistantes

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 90


5 Administration
avec loutil web
phpMyAdmin
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 91
Prsentation
Loutil phpMyAdmin est dvelopp en PHP et offre une interface intuitive pour
ladministration des base de donnes du serveur.
Il est tlchargeable ici : http://phpmyadmin.sourceforge.net

Cet outil permet de :


- crer de nouvelles bases
- crer/modifier/supprimer des tables
- afficher/ajouter/modifier/supprimer des tupes dans des tables
- effectuer des sauvegarde de la structure et/ou des donnes
- effectuer nimporte quelle requte
- grer les privilges des utilisateurs

Les exemples qui vont suivrent


sappliquent la version 2.2.6

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 92


Cration/slection dune base de donnes
Avant de manipuler des donnes, il faut crer une ou des bases de donnes.

ETAPE 2 : slectionnez le
nom de la base
manipuler (le nombre de ETAPE 1 : crivez le nom de
tables de la base apparat la base de donne crer.
entre parenthses) Puis cliquez sur Crer

Et aussi.. choix de la langue de linterface de phpMyAdmin

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 93


Gestion de la base de donnes (I)

Choix dune table


grer en particulier
crire une requte
MySQL excuter
Actions sur les tables : afficher
leur contenu intgral, faire une
slection sur critres, ajouter
des donnes, grer ses proprit
Excuter une requte
intrinsques, supprimer, vider.
MySQL contenue
dans un fichier

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 94


Gestion de la base de donnes (II)
Accs un formulaire dtaill
pour effectuer une requte

Option permettant de
transmettre le schma
sous la forme dun fichier

Affichage du schma (structure


et/ou donnes) des tables
slectionnes de la base

Accs un formulaire dtaill


dajout dune table dans la base

Supprimer la base
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 95
Affichage dune table

Rappel de la base, de
Rappel de la requte la table et du serveur

Colonnes = noms
des attributs de la
table

Liste des
enregistrements de
la table par pages de
X lignes
Supprimer un enregistrement

Accs au formulaire de modification Permet de naviguer dans


dun enregistrement les pages de rsultats

Insertion dun nouvel Afficher par page de X lignes


enregistrement
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 96
Insertion/modification dun enregistrement
Nom du Choix dune fonction
Type
champ appliquer la valeur saisie

Valeur saisir

Les champs et leurs types


sont dfinis lors de la
cration de la table : tous
les champs sont pas
forcment obligatoires
Les formulaires dinsertion
et de modification sont
similaires.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 97


Gestion dune table (I)
Proprits des Quelques actions rapides :
attributs de la table affichage, slection, insertion
dun enregistrement, vidage,
suppression

Quelques actions
sur les attributs :
modifier, supprimer
; plus les contraintes
: cl primaire et
unique ; et y mettre
un index

Modifier ou supprimer Quelques


Crer une nouvelle plusieurs attributs en statistiques et
cl sur X attributs mme temps infos

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 98


Gestion dune table (II)
Affichage de la version
imprimable de la page

crire une requte excuter


ou spcifier un fichier en
contenant une ou plusieurs

Ajouter X champs dans la table


une position particulire

Rordonner les donnes de


table en fonction dun attribut

Accs au formulaire dinsertion de


donnes dans la table partir dun fichier
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 99
Gestion dune table (III)
Permet dafficher le schma
(structure et/ou donnes) de
la table.
Le schma dune table est
lensemble de la structure et
des donnes dune table.
La structure est compose
de la dfinition des
proprits des attributs et
des cls.

Le rsultat de sortie structure et/ou donnes est constitu des requtes


MySQL de cration de la table et dinsertion des enregistrements.
Le format CSV est un fichier texte dont chaque ligne reprsente un
enregistrement.
Le rsultat peut tre transmis sous la forme dun fichier (qui lui-mme peut
tre compress).
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 100
Gestion dune table (IV)
Dplacer la table
vers une autre base Changer le nom de la table
avec changement
de nom possible
La copier (avec ou sans les
dans la foule
donnes) vers une autre base avec
changement de nom possible

Quelques oprations de
maintenance : vrification,
analyse, rparation, optimisation

Lui associer un commentaire

Changer le format de la table

La supprimer Recharger la table en mmoire du serveur

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 101


Insertion des donnes dans une table
On accde cet
cran var le lien
Insrer des
donnes provenant
d'un fichier texte
dans la table de la
page de gestion de
la table.
Permet dinsrer
des enregistrements
dans une table
partir dun fichier de
donnes au format
CSV.

On peut changer les valeurs par dfaut des


sparateurs standards du CSV.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 102


Cration dune cl
On accde cet
cran var le lien
Crer une clef sur
X colonne(s de la
page de gestion de
la table.
Permet de crer
une cl sur une ou
plusieurs colonnes.

Il faut nommer la cl, en spcifier le type, et les


attributs sur lesquels elle sapplique.
On peut rajouter une autre colonne cette cl avant
de valider lajout de la cl.

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 103


Liens
La rfrence PHP (anglais & franais) :
http://www.php.net

La rfrence MySQL (anglais) :


http://www.mysql.com

Le manuel MySQL traduit en franais ici :


http://dev.nexen.net/docs/

Des cours et articles intressants :


http://www.developpez.com
dont la FAQ PHP & MySQL : http://php.developpez.com/faq/

Loutil phpMyAdmin :
http://phpmyadmin.sourceforge.net

Le CyberZode Qui Frtille http://cyberzoide.developpez.com 104


Historique
20 juillet 2003 : insertions compltes et tendues ; jointures (105 diapos)
9 mars 2003 : corrections, aide phpMyAdmin (101 diapos)
17 dcembre 2002 : plus dexemples, api php, jointures (90 diapos)
9 dcembre 2002 : premire publication (73 diapos)
5 dcembre 2002 : cration du document par Hugo Etivant (54 diapos)

Remerciement tous ceux qui part leurs suggestions et critiques font


progresser la qualit de ce document.

Ce cours sinspire des ressources suivantes :


" cours de SQL de M. PICHAT (UCBL)
" transparents de Mohand-Sad HACID (LISI, UCBL)
" manuel MySQL (Nexen)

Hugo Etivant
cyberzoide@yahoo.fr
http://cyberzoide.developpez.com/
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 105

Vous aimerez peut-être aussi