

| |
Introduction aux bases de données
Nous allons maintenant faire une petite introduction sur les bases
de données. En effet, les bases de données prennent aujourd'hui
une proportion tellement importante dans les sites WEB que vous devriez
sûrement en utiliser un jour pour un site développé en PHP.
Pour l'information, sachez que ce site WEB utilise pratiquement que les
données d'une base de données (tous les tutoriaux, les astuces, etc...
sont contenus dans une base de données).
De plus, en utilisant les bases de données, vous allez vraiment découvrir
toutes les possibilités d'un environnement PHP / MySQL.
Cette introduction pourra vous paraître vraiment longue et inutile, néanmoins,
je vous recommande chaudement de la lire attentivement dans son intégralité.
Elle comporte énormément de notions capitales à comprendre.
Prenons un exemple simple et concret : supposons que l'on désire développer
une base de données contenant une liste de CD audio. Cette liste de CD
sera en fait composée de tous les CD que possède chaque personne d'un
groupe d'amis. Et ceci, afin de pouvoir se prêter mutuellement les différents
CD, et de savoir exactement qui à quoi comme CD.
On suppose que le groupe d'amis est composé de 3 personnes :
- LA GLOBULE
- Jeremy
- Benoît
Chaque personne a un numéro de téléphone, et chaque personne possède
un certain nombre de CD. On prendra aussi en considération le titre de
l'album et le nom de l'interprète.
On aurait alors très bien pu obtenir (sous forme d'un tableau) la base
de données suivante :
|
Propriétaire
|
N. tél
|
Auteur
|
Titre
|
|
LA GLOBULE
|
06-48-85-20-54
|
Cassius
|
Au rêve
|
|
LA GLOBULE
|
06-48-85-20-54
|
Daft Punk
|
Discovery
|
|
Jeremy
|
06-48-74-26-01
|
Cassius
|
Au rêve
|
|
Jeremy
|
06-48-74-26-01
|
Télépopmusik
|
Genetic world
|
|
Benoît
|
06-47-01-59-36
|
Clamaran
|
Release yourself
|
Notez bien que ce tableau, en terme de base de données, se nomme une table
et que chaque ligne du tableau se nomme un tuple.
La première ligne du tableau comporte les attributs
de la table (Propriétaire, N. tél, Auteur et Titre sont les attributs
de notre table).
Note : une base de données peut contenir
plusieurs tables.
Faisons maintenant quelques interrogations sur cette base de données :
Qui possède un album de Cassius ?
>> réponse : LA GLOBULE et Jeremy
Quel est le numéro de téléphone de Benoît ?
>> réponse : 06-47-01-59-36
Quels sont les albums des Daft Punk disponibles dans la liste de CD ?
>> réponse : Discovery (il n'y en a
qu'un seul)
A première vue donc, le principe des bases de données est très
facilement assimilable.
Il faut également savoir que dans la table d'une base de données, on
ne peut pas avoir 2 tuples (donc 2 lignes du tableau) ayant les mêmes
éléments (en effet, il serait quand même bête qu'une personne
ai un CD en double).
Imaginons maintenant que Jeremy vienne de se faire pick-pocketter son
tout nouveau portable (un beau 8310) dans le métro, et qu'il change
alors naturellement de numéro.
Supposons que son nouveau numéro est 06-85-98-78-12 et qu'en plus il
vienne de s'acheter un nouveau CD : Paradise de Bob Sinclar.
On insère alors une nouvelle ligne dans notre table (un nouveau tuple),
et l'on obtient donc :
|
Propriétaire
|
N. tél
|
Auteur
|
Titre
|
|
LA GLOBULE
|
06-48-85-20-54
|
Cassius
|
Au rêve
|
|
LA GLOBULE
|
06-48-85-20-54
|
Daft Punk
|
Discovery
|
|
Jeremy
|
06-48-74-26-01
|
Cassius
|
Au rêve
|
|
Jeremy
|
06-48-74-26-01
|
Télépopmusik
|
Genetic world
|
|
Benoît
|
06-47-01-59-36
|
Clamaran
|
Release yourself
|
|
Jeremy
|
06-85-98-78-12
|
Bob Sinclar
|
Paradise
|
Imaginons maintenant que j'interroge à nouveau ma base de données.
Quel est le numéro de téléphone de Jeremy ?
>> réponse : 06-85-98-78-12 ou bien
06-48-74-26-01
Nous remarquons tout de suite qu'un problème majeur arrive : c'est à
dire que Jeremy possède deux numéros de téléphone
alors qu'il ne devrait (en théorie) n'en posséder qu'un seul.
Pour remédier a ce problème, il faudrait, par exemple modifier tous
les premiers tuples et ainsi mettre à jour le numéro de téléphone de
Jeremy.
Dans notre cas, cette solution n'est pas vraiment gênante, en revanche,
lorsque la table comporte quelques centaines voir milliers de tuples,
c'est déjà beaucoup plus gênant.
En fait, ce problème survient généralement à cause d'une mauvaise
conception de la base de données.
En effet, au lieu de créer une seule table contenant toutes les
informations, nous aurions du créer deux tables :
- une contenant la liste des CD (Auteur et Titre)
- une contenant les informations des propriétaires des CD (Propriétaire
et N. de tel)
Ensuite, il nous resterait a faire un lien entre les tables, nous
permettant de savoir qui possède tel ou tel CD.
Mettons cette solution en pratique. On a alors notre table contenant la
liste des propriétaires qui aura les attributs suivants :
- numéro du propriétaire
- nom du propriétaire
- numéro de téléphone du propriétaire
Et la table contenant la liste de CD, aura les attributs suivants :
- numéro du propriétaire du CD
- Auteur du CD
- Titre du CD
(Et c'est grâce au numéro du propriétaire que l'on fera la liaison
entre les deux tables, l'opération se nommant une jointure)
On aura alors :
|
N. du propriétaire
|
Propriétaire
|
N. tél
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
|
2
|
Jeremy
|
06-85-98-78-12
|
|
3
|
Benoît
|
06-47-01-59-36
|
|
N. du propriétaire
|
Auteur
|
Titre
|
|
1
|
Cassius
|
Au rêve
|
|
1
|
Daft Punk
|
Discovery
|
|
2
|
Cassius
|
Au rêve
|
|
2
|
Télépopmusik
|
Genetic world
|
|
3
|
Clamaran
|
Release yourself
|
|
2
|
Bob Sinclar
|
Paradise
|
En ici, on remarque facilement que si une personne change de numéro de
téléphone, et bien nous avons qu'une seule modification à effectuer
(vu que chaque numéro de téléphone n'apparaît qu'une fois dans toute
la base).
Puis dans ce cas, nous remarquons également que c'est le N. de propriétaire
qui effectue la liaison entre les deux tables (c'est à dire la
jointure).
En conclusion :
Faites extrêmement attention au moment où vous créer les tables de
votre base de données afin de ne pas se retrouver dans une situation où
tout retour en arrière serait impossible : visualiser bien votre idée,
écrivez sur papier ce dont vous avez réellement besoin pour votre base
de données, et tentez au maximum d'éviter d'avoir des redondances dans
vos tables.
Création des tables en SQL
Le SQL (Structured Query Langage) est un
langage de requêtes qui nous permet de faire des interrogations (les
requêtes) sur un SGBD (Système de Gestion de
Base de Données).
Nous venons de faire une petite introduction sur les bases de données,
et maintenant, nous allons voir en détail comment utiliser le SQL pour
developper cette base de données.
Tout le code donné dans ce tutorial ne peut être interprété que par
votre SGBD. Ce code ne pourra pas être inclus dans vos pages PHP.
En effet, vous devrez utiliser ce code dans votre PHPMyAdmin par
exemple.
Reprenons l'exemple précédent, et on observe comment faire pour créer
nos deux tables.
Créons tout d'abord la table liste_proprietaire :
CREATE TABLE liste_proprietaire (
numero INT(5) NOT NULL,
nom VARCHAR(20) NOT NULL,
telephone VARCHAR(14) NOT NULL
) TYPE=MyISAM;
Nous venons ici de créer notre table liste_proprietaire, table
contenant trois attributs :
- numero qui correspond à un nombre entier (INT) de 5 chiffre
- nom qui correspond à une suite de caractères (VARCHAR) de 20 caractères
- telephone qui correspond à une suite de caractères (VARCHAR) de 14
caractères
Nous utilisons VARCHAR pour des chaînes de caractères pouvant mêler
du texte et des nombres. Toutefois, à la fin de ce tutorial, nous
allons passer en revue tous les types d'attributs possibles.
De plus, pour chacun de ces attributs, nous imposons que pour chaque
tuple donné, aucun attribut ne peut être vide (on a mis un NOT NULL
pour tous les attributs).
Enfin, le type MyISAM précise que nous avons affaire à une base de
données de type MySQL.
Créons ensuite la table liste_disque :
CREATE TABLE liste_disque (
numero INT(5) NOT NULL,
auteur VARCHAR(50) NOT NULL,
titre VARCHAR(50) NOT NULL
) TYPE=MyISAM;
Vu que les attributs ressemblent beaucoup à la première table, nous ne
ferons aucun commentaire sur cette table.
En revanche, nous aurions pu utiliser l'extra AUTO_INCREMENT pour les
attributs numero de la table liste_proprietaire. En effet, si on imagine
la page WEB nous permettant d'insérer des membres dans la liste des
propriétaires, on s'imagine mal qu'il faille préciser a chaque fois le
numéro du nouveau propriétaire.
Afin de palier à ce léger désagrément, nous allons applique un extra
à l'attribut de la première table, nous permettant de faire en fait
une incrémentation automatique à chaque insertion d'un nouveau propriétaire.
On aura alors la table liste_proprietaire définit comme ceci :
CREATE
TABLE liste_proprietaire (
numero INT(5) NOT NULL AUTO_INCREMENT,
nom VARCHAR(20) NOT NULL,
telephone VARCHAR(14) NOT NULL,
PRIMARY KEY (numero)
) TYPE=MyISAM;
Remarquons alors la ligne PRIMARY KEY (numero) qui nous indique
que la clé primaire de notre table est l'attribut numero. Ceci veut
dire que l'on est capable d'identifier n'importe quel tuple de la table
rien qu'à partir de l'attribut numero.
Passons maintenant en revue l'intégralité des types possibles pour les
attributs d'une table SQL. On a alors :
- TINYINT : entier de 0 à 255 (non signé)
- SMALLINT : entier de 0 à 65 535 (non signé)
- MEDIUMINT : entier de 0 à 16 777 215 (non
signé)
- INT : entier de 0 à 4 294 967 295 (non signé)
- BIGINT : entier de 0 à 18 446 744 073 709
551 615 (non signé)
- DECIMAL : un nombre à virgule flottante
(soit un nombre réel)
- DATE : une date allant du 1000-01-01 au
9999-12-31
- DATETIME : une date comportant une heure
allant du 1000-01-01 00:00:00 au 9999-12-31 23:59:59
- TIMESTAMP : une date comportant une heure
exprimée en secondes depuis le 1er janvier 1970 jusqu'à l'instant présent
- TIME : une mesure de l'heure qui va de
-838:59:59 à 838:59:59
- YEAR : une année qui va de 1901 à 2155
- CHAR : une chaîne de caractères de taille
fixée (de 1 à 255 caractères)
- VARCHAR : une chaîne de caractères de
taille variable (de 1 à 255 caractères)
- TINYTEXT ou TINYBLOB
: un objet BLOB ou TEXT ayant une longueur maximale de 255 caractères
- TEXT ou BLOB : un
objet BLOB ou TEXT ayant une longueur maximale de 65 535 caractères
- MEDIUMTEXT ou MEDIUMBLOB
: un objet BLOB ou TEXT ayant une longueur maximale de 16 777 215 caractères
- LONGTEXT ou LONGBLOB
: un objet BLOB ou TEXT ayant une longueur maximale de 4 294 967 295
caractères
Attention !!!
Il est tout de fois possible de créer des tables directement à partir
d'une page en PHP. Dans ce cas, pour créer les tables, il n'est
absolument pas nécessaire de passer par votre PHPMyAdmin, chose que je
déconseille fortement pour les débutants.
En clair, au début, utiliser PHPMyAdmin pour créer vos tables, puis,
une fois que vous aurez bien compris le principe, vous pourrez alors créer
vos tables directement à partir de vos scripts (ce qui est tout de même
déconseillé).
Fonctions PHP pour MySQL
Nous venons de voir comment créer nos tables SQL à l'aide d'un
PHPMyAdmin (par exemple).
Avant de voir comment faire pour insérer, modifier, supprimer et
afficher des tuples de notre base de données, il est bon de connaître
les fonctions PHP permettant de manoeuvrer ces tuples.
Ce tutorial est un peu comme une documentation, afin que les tutoriaux
suivants ne ressortent pas à vos yeux comme des choses provenant de
Mars ou de Jupiter.
Il faut déjà savoir que les fonctions PHP pour MySQL commence toujours
par mysql_ ce qui est plutôt bien pensé, non ?
Voici donc la liste de ces fonctions (nous étudierons que les
principales, regardez la documentation pour de plus amples
connaissances) :
|
:: Fonction ::
|
:: Signification ::
|
|
mysql_close
|
Ferme la connexion à une base de données
|
|
mysql_connect
|
Etablit une connexion vers la base de données
spécifiée dans les arguments
|
|
mysql_error
|
Retourne la description textuelle d'une
erreur générée par une action sur une base de données
|
|
mysql_fetch_array
|
Retourne un tableau qui représente tous les
tuples sélectionnés (un indice du tableau correspond à un
attribut des tuples obtenus). Chaque appel récupère le tuple
suivant jusqu'à ce qu'il n'y en ait plus
|
|
mysql_free_result
|
Libère la mémoire associé à la requête
spécifiée
|
|
mysql_num_rows
|
Retourne le nombre de tuple dans un résultat
|
|
mysql_query
|
Permet d'exécuter une requête SQL sur une
base de données
|
|
mysql_select_db
|
Sélectionne la base de données par défaut
|
Voyons maintenant comment faire pour se connecter à une base de données.
En effet, afin de pouvoir utiliser tous les éléments contenus dans une
base de données, vous devez indiquer, sur toutes vos pages PHP où vous
utilisez votre base, différents paramètres de connexion à votre base.
Etudions le code suivant :
<?php
$base = mysql_connect ('mon_serveur', 'login', 'password');
mysql_select_db ('ma_base_de_donnees', $base) ;
?>
La chaîne de caractères mon_serveur doit être
remplacé par celle qui correspond au nom de votre serveur (en règle générale,
il s'agit de localhost ; si ce n'est pas le
cas, veuillez contacter votre hébergeur pour de plus amples
informations).
login correspond à votre login pour accéder
à votre base.
password, votre mot de passe.
Et ma_base_de_donnees correspond au nom de
votre base de données.
Grâce à ce code nous allons donc pouvoir effectuer toutes nos requêtes
SQL sur les tables de notre base de données fraîchement créée.
Attention !!!
Ce code doit toujours être présent avant toute opération sur votre
base de données (une seule fois par page suffit par contre).
Mon conseil : faites vous un fichier connect_base.php.inc ou apparaîtra
seulement ce morceau de code, et dans chaque page ou vous souhaitez
utiliser votre base de données, vous n'aurez alors qu'à include() ce
fichier de connexion.
Afficher les données de votre base
Maintenant que les tables de votre base de données sont créées, nous
allons pouvoir voir comment faire pour pouvoir interroger cette base de
données, et par conséquent afficher les résultats sur vos pages WEB
:)
Avant de plonger à l'inconnu dans le code PHP pour faire ces
interrogations, nous allons voir comment s'effectuent ces interrogations
par le biais de requêtes SQL.
Et pour ce faire, nous allons nous baser sur l'exemple que nous avons
suivi lors du tutorial sur l'introduction aux bases de données.
Je vous rappelle que l'on avait alors deux tables qui peuvent être représentées
ainsi :
La table liste_proprietaire :
|
N. du propriétaire
|
Propriétaire
|
N. tél
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
|
2
|
Jeremy
|
06-85-98-78-12
|
|
3
|
Benoît
|
06-47-01-59-36
|
La table liste_disque :
|
N. du propriétaire
|
Auteur
|
Titre
|
|
1
|
Cassius
|
Au rêve
|
|
1
|
Daft Punk
|
Discovery
|
|
2
|
Cassius
|
Au rêve
|
|
2
|
Télépopmusik
|
Genetic world
|
|
3
|
Clamaran
|
Release yourself
|
|
2
|
Bob Sinclar
|
Paradise
|
Nous allons alors interroger la table pour connaître par exemple le numéro
de téléphone de LA GLOBULE.
On aura alors (en SQL je vous le rappelle, on verra plus tard comment
obtenir le même résultat dans une page WEB) :
SELECT telephone
FROM liste_proprietaire
WHERE nom="LA GLOBULE";
Etudions ce code :
- on sélectionne l'attribut que l'on désire obtenir (ici l'attribut telephone
qui correspond effectivement au numéro de téléphone des propriétaires).
- on utilise la table liste_proprietaire pour
faire notre sélection (en fait, on n'a besoin que de cette table pour
faire notre sélection, on verra plus tard que la clause FROM
peut contenir plusieurs tables, notamment dans le cas des jointures).
- on impose une condition, en effet, on veut
le téléphone de qui ? De LA GLOBULE, donc en écrivant WHERE
nom="LA GLOBULE", on impose au SGBD
de ne sélectionner dans notre table que les
tuples qui possèdent l'attribut nom qui est égal à LA GLOBULE. En
revanche, en n'écrivant pas cette ligne, on aurai obtenu tous les numéros
de téléphone de notre table (car dans ce cas, on n'aurait eu aucune
condition quand au nom du propriétaire).
Etudions maintenant le cas ou l'on effectue une sélection lorsque l'on
doit effectuer une jointure entre deux tables.
Interrogeons alors notre base de données pour connaître le nom des
propriétaires de l'album Au rêve de Cassius.
On aura alors :
SELECT liste_proprietaire.proprietaire
FROM liste_proprietaire, liste_disque
WHERE liste_disque.auteur = "Cassius"
AND liste_disque.titre = "Au rêve"
AND liste_proprietaire.numero = liste_disque.numero
ORDER BY liste_proprietaire.proprietaire ASC;
Etudions ce code :
- on sélectionne l'attribut proprietaire (ce
que l'on veut obtenir) tout en indiquant que cet attribut faire partie
de la table liste_proprietaire (ceci se fait
grâce au . qui relie le nom de l'attibut à
la table). En revanche, ici, il n'est pas vraiment nécessaire de préciser
que l'on sélectionne l'attribut proprietaire
de la table liste_proprietaire puisque cet
attribut de table n'apparaît que dans une seule table (en l'occurrence
la table liste_proprietaire).
En effet, si l'attribut proprietaire avait
existe dans plusieurs tables, nous aurions dû préciser de quelle table
il s'agit (le SGBD n'aurait pas su de quelle
table l'attribut dont nous parlons fait partie). Toutefois, je vous
recommande chaudement (sauf dans les cas extrêmement simple, de
toujours préciser au SGBD à quelle table
appartient l'attribut que vous sélectionnez).
- On utilise les tables liste_proprietaire et liste_disque
pour faire notre requête.
- On fait notre recherche sur la liste de disque en ne retenant que les
disques dont l'auteur est Cassius.
- Puis on retient les disques dont le titre est Au rêve.
- Ensuite (le plus important), on effectue une jointure
entre les tables, en disant que l'attribut numero
de la table liste_proprietaire correspond à
l'attribut numero de la table liste_disque.
- Enfin, on impose au SGBD de nous fournir les
résultats dans l'ordre alphabétique des noms de propriétaire (et ceci
grâce à la clause ORDER BY).
Notes :
- Pour organiser les résultats suivant l'ordre inverse de l'ordre
alphabétique, on aurait pu mettre en dernière condition, la condition ORDER
BY liste_proprietaire.proprietaire DESC.
- La clause ORDER BY est également valable
dans le cas d'attribut numérique. Dans ce cas, le SGBD
organise les résultats suivant un ordre croissant (lorsque l'on met ASC
à la fin) ou décroissant (lorsque l'on met DESC
à la fin).
- Cette astuce fonctionne également dans le cas où l'attribut est de
type date.
Remarque :
Nous avons que dans nos requêtes SQL nous
pouvions imposer au SGBD de ne sélectionner
que les tuples dont on impose la valeur de certains attributs (comme par
exemple en imposant que l'attribut auteur soit égal à Cassius
par le biais de la ligne WHERE liste_disque.auteur =
"Cassius").
En revanche, nous pouvons également faire une recherche en n'imposant
pas réellement la valeur de l'attribut mais plutôt en ne sélectionnant
que les tuples dont l'attribut commence par une certaine chaîne de
caractères ou bien même de ne sélectionner que les tuples dont
l'attribut ne fait que contenir une chaîne de
caractères. Tout ceci se fera grâce à la clause LIKE.
Prenons l'exemple suivant :
SELECT liste_proprietaire.proprietaire
FROM liste_proprietaire, liste_disque
WHERE liste_disque.auteur LIKE "C%"
AND liste_disque.titre = "Au rêve"
AND liste_proprietaire.numero = liste_disque.numero
ORDER BY liste_proprietaire.proprietaire ASC;
Dans ce cas, nous n'avons plus la ligne WHERE
liste_disque.auteur = "Cassius" mais la ligne WHERE
liste_disque.auteur LIKE "c%".
Ce changement implique que nous allons choisir non pas les disques dont
l'auteur est Cassius mais les disques dont
l'auteur commence par la lettre c.
On aurait également pu faire :
SELECT liste_proprietaire.proprietaire
FROM liste_proprietaire, liste_disque
WHERE liste_disque.auteur LIKE "%s%"
AND liste_disque.titre = "Au rêve"
AND liste_proprietaire.numero = liste_disque.numero
ORDER BY liste_proprietaire.proprietaire ASC;
Et dans ce cas, nous aurions sélectionné les tuples dont l'attribut auteur
de la table liste_disque contient la lettre s.
Remarque :
La clause LIKE n'est pas limitée à une seule
lettre. En effet, on peut très bien faire un LIKE
avec un mot complet.
Maintenant que vous connaissez tout de la sélection de tuples en
langage SQL, nous allons voir comment intégrer
ces requêtes SQL à vos pages PHP.
Créons une page PHP nous permettant de réaliser exactement la même
requête que la première de ce tutorial, c'est-à-dire la sélection du
numéro de téléphone de LA GLOBULE.
On a alors le code suivant :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Numéro de téléphone de LA GLOBULE</title>
</head>
<body>
<?
// lancement de la requete
$sql = 'SELECT telephone FROM liste_proprietaire WHERE nom = "LA GLOBULE"';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on recupere le resultat sous forme d'un tableau
$data = mysql_fetch_array($req);
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
mysql_close ();
?>
Le numéro de téléphone de LA GLOBULE est :<br />
<? echo $data['telephone']; ?>
</body>
</html>
Ce qui affichera à l'écran :
Le numéro de téléphone de LA GLOBULE est :
06-48-85-20-54
Mettons maintenant dans le cas où l'interrogation de la base de données
ne retourne pas un, mais un certain nombre de tuples (nombre que l'on ne
connaît pas).
En effet, recherchons tous les noms de propriétaires de disque, ainsi
que leur numéro de téléphone.
On aura alors le code suivant :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Nom et tél des membres</title>
</head>
<body>
<?
// lancement de la requête (on impose aucune condition puisque l'on désire obtenir la liste complète des propriétaires
$sql = 'SELECT telephone, nom FROM liste_proprietaire';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on va scanner tous les tuples un par un
while ($data = mysql_fetch_array($req)) {
// on affiche les résultats
echo 'Nom : '.$data['nom'].'<br />';
echo 'Son tél : '.$data['telephone'].'<br /><br />';
}
mysql_free_result ($req);
mysql_close ();
?>
</body>
</html>
Et ainsi, grâce à la boucle while, nous
pouvons parcourir tous les tuples obtenus par la requête SQL.
Pour finir, nous pouvons juste dire que lorsque l'on effectue une sélection
qui contient une jointure, le principe reste exactement le même.
Que faire en plus ?
Afin d'améliorer vos sélections, vous pouvez faire dépendre vos sélections
du résultat obtenu par un formulaire.
En effet, imaginons une première page avec un formulaire nous
permettant de choisir le nom d'un propriétaire via un menu déroulant.
Ensuite, dans la page où vous allez faire votre requête (qui donc être
également la page contenue dans le champ action de votre formulaire),
vous allez récupérer une variable, par exemple $_POST['nom_proprio']
(cf. le tutorial sur la récupération des données par le biais des
formulaires).
De plus, imaginons que l'on désire retrouver le numéro de téléphone
de ce propriétaire (celui choisi dans le menu-déroulant).
On aura alors (page pointée par le champ action du formulaire):
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Numéro de téléphone du membre choisi</title>
</head>
<body>
<?
// on teste si notre variable est déclarée
if (isset($_POST['nom_proprio'])) {
// lancement de la requête
$sql = 'SELECT telephone FROM liste_proprietaire WHERE nom = "'.$_POST['nom_proprio'].'"';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on récupère le résultat sous forme d'un tableau
$data = mysql_fetch_array($req);
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
mysql_close ();
// on affiche le résultat
echo 'Le numéro de téléphone est : '.$data['telephone'];
}
else {
echo 'La variable nom_proprio n\'est pas déclarée';
}
?>
</body>
</html>
Insérer des données dans votre base
Nous allons maintenant voir comment faire pour insérer des données
dans les tables de votre base de données.
Comme pour le tutorial précédent, nous allons le faire en se basant
sur l'exemple pris lors du tutorial faisant une introduction sur les
bases de données.
Et tout comme dans le tutorial précédent, nous allons tout d'abord
voir comment faire ces insertions en SQL, puis nous verrons comment les
faire directement à partir de vos pages WEB.
Pour vous remettre les idées au clair, je vous que l'on avait alors
deux tables, dont la structure ressemble à :
La table liste_proprietaire :
|
N. du propriétaire
|
Propriétaire
|
N. tél
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
|
2
|
Jeremy
|
06-85-98-78-12
|
|
3
|
Benoît
|
06-47-01-59-36
|
La table liste_disque :
|
N. du propriétaire
|
Auteur
|
Titre
|
|
1
|
Cassius
|
Au rêve
|
|
1
|
Daft Punk
|
Discovery
|
|
2
|
Cassius
|
Au rêve
|
|
2
|
Télépopmusik
|
Genetic world
|
|
3
|
Clamaran
|
Release yourself
|
|
2
|
Bob Sinclar
|
Paradise
|
Supposons alors que l'on décide d'ajouter un nouveau propriétaire de
disques : tibo par exemple.
Pour insérer ce nouveau propriétaire, il faut fournir au SGBD les
informations lui permettant d'insérer ce nouveau tuple dans la table
liste_proprietaire. Ces informations sont :
- le numéro du nouveau propriétaire
- le nom du nouveau propriétaire
- son numéro de téléphone
Bref, vous le voyez par vous-même, il s'agit en fit de fournir tous les
attributs de la table afin de produire un nouveau tuple.
En revanche, comme nous allons le voir, il n'est pas nécessaire de
fournir au SGBD le numéro du nouveau propriétaire car cet attribut à
été déclaré AUTO_INCREMENT lors de la création de la table. Ceci
implique que le SGBD sait, lors d'une nouvelle insertion, qu'il faut
qu'il prenne dans la table liste_proprietaire le numéro le plus grand
et qu'il l'augmente de un, et ce nouveau numéro (augmente de un)
correspondra au numéro de notre nouveau propriétaire.
On aura alors :
INSERT INTO liste_proprietaire VALUES ('','tibo','06-98-42-01-36');
On remarque tout de suite que la syntaxe pour une insertion est
relativement simple.
En effet, étudions ce code :
On insére où ? --> dans la table liste_proprietaire
On insérer quoi ? --> la valeur des différents attributs, c'est-à-dire
une première valeur qui correspond à l'attribut numero (qui je vous le
rappelle est AUTO_INCREMENT, on n'a donc pas l'utilité de préciser sa
valeur, le SGBD sachant quoi mettre), puis on insère la valeur tibo
pour l'attribut nom, et enfin la valeur 06-98-42-01-36 pour l'attribut
telephone.
Simple, non ?
Passons tout de suite à l'insertion d'un nouveau tuple, et ce, à
partir d'une page WEB.
Supposons que l'on désire insérer exactement le même tuple que dans
l'exemple précédent (c'est-à-dire que tibo fait tellement partie de
nos amis, qu'on a envie de partager nos disques avec lui).
On aura alors :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Insertion de tibo dans la base</title>
</head>
<body>
<?
// lancement de la requete
$sql = 'INSERT INTO liste_proprietaire VALUES ("", "tibo", "06-98-42-01-36")';
// on insere le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
?>
Tibo vient d'être inseré dans la base.
</body>
</html>
Imaginons, alors que l'on désire alors ajouter à la base un disque grâce
à la contribution de tibo.
Dans l'absolu, réfléchissons une minute sur ce que nous avons besoin :
- il s'agit d'un nouveau disque (soit son auteur et son titre).
- mais aussi, nous avons besoin du numéro qu'a pris le propriétaire
tibo dans la table liste_proprietaire.
Comment qu'on fait donc ce truc ? En effet, on voit bien que si l'on insère
directement un nouveau disque, la jointure entre les deux tables risque
de ne pas se faire.
En fait, il faudrait tout d'abord sélectionner le numéro qu'a pris
tibo dans la table_proprietaire (par le biais d'un requete SQL de type
SELECT, je vous renvoies au tutorial précèdent pour revoir la récupération
des données d'une base).
Cependant, imaginons que nous n'avons pas encore inséré le propriétaire
tibo dans notre base de données, et que l'on désire directement insérer
ce nouveau propriétaire ainsi qu'un disque lui appartenant. Nous allons
voir comment récupérer simplement le nouveau numero qui vient d'être
inséré (donc celui de tibo) et ainsi l'utiliser pour insérer notre
disque.
On a :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Insertion de tibo et d'un nouveau disque dans la base</title>
</head>
<body>
<?
// on prépare la requête
$sql = 'INSERT INTO liste_proprietaire VALUES("", "tibo", "06-98-42-01-36")';
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on récupère le dernier numéro inséré, soit le numéro de tibo
$numero_insere = mysql_insert_id();
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
$sql = 'INSERT INTO liste_disque VALUES ("'.$numero_insere.'", "The supermen lovers", "The player")';
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
?>
Tibo vient d'être inseré dans la base, ainsi que son nouveau disque : The player des Supermen lovers.
</body>
</html>
Que faire en plus ?
Et bien, tout comme dans le tutorial précédent, vous pouvez rendre vos
insertions vraiment dynamiques en effectuant tout simplement vos
insertions à partir des valeurs fournies par un formulaire.
Imaginons que l'on désire insérer des nouveaux disques. Supposons que
l'on dispose d'une page html contenant un formulaire permettant de
saisir le nom du propriétaire, et que ce formulaire vous demande également
le titre d'un album ainsi que son interprète (on suppose également que
le champ action de notre formulaire correspond au nom de la page PHP qui
traite les données, soit la page contenant le code ci-dessous).
On suppose enfin, que le champ du formulaire contenant le nom du propriétaire
porte le nom proprio (on pourra alors utiliser la variable
$_POST['proprio'] dans notre page PHP, tout en supposant de notre
formulaire à une méthode POST et npn GET), que le champ contenant
l'interprète porte le nom interprete et que le champ contenant le titre
porte le nom titre.
On aura alors :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Insertion de nouveaux disques dans la base</title>
</head>
<body>
<?
// on teste si les variables du formulaire sont bien déclarées
if (isset($_POST['proprio']) && isset($_POST['interprete']) && isset($_POST['titre'])) {
// on prépare la requête pour récupérer le numero du propriétaire
$sql = 'SELECT numero FROM liste_proprietaire WHERE nom = "'.$_POST['proprio'].'"';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on récupère le résultat sous forme d'un tableau
$data = mysql_fetch_array($req);
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
$sql = 'INSERT INTO liste_disque VALUES("'.$data['numero'].'", "'.$_POST['interprete'].'", "'.$_POST['titre'].'")';
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
echo 'Nous venons d\'insérer un nouveau disque : '.$_POST['titre'].' de '.$_POST['interprete'].' appartenant à '.$_POST['proprio'];
}
else {
echo 'Les variables du formulaire ne sont pas déclarées';
}
?>
</body>
</html>
Insérer des données dans votre base
Nous allons maintenant voir comment faire pour insérer des données
dans les tables de votre base de données.
Comme pour le tutorial précédent, nous allons le faire en se basant
sur l'exemple pris lors du tutorial faisant une introduction sur les
bases de données.
Et tout comme dans le tutorial précédent, nous allons tout d'abord
voir comment faire ces insertions en SQL, puis nous verrons comment les
faire directement à partir de vos pages WEB.
Pour vous remettre les idées au clair, je vous que l'on avait alors
deux tables, dont la structure ressemble à :
La table liste_proprietaire :
|
N. du propriétaire
|
Propriétaire
|
N. tél
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
|
2
|
Jeremy
|
06-85-98-78-12
|
|
3
|
Benoît
|
06-47-01-59-36
|
La table liste_disque :
|
N. du propriétaire
|
Auteur
|
Titre
|
|
1
|
Cassius
|
Au rêve
|
|
1
|
Daft Punk
|
Discovery
|
|
2
|
Cassius
|
Au rêve
|
|
2
|
Télépopmusik
|
Genetic world
|
|
3
|
Clamaran
|
Release yourself
|
|
2
|
Bob Sinclar
|
Paradise
|
Supposons alors que l'on décide d'ajouter un nouveau propriétaire de
disques : tibo par exemple.
Pour insérer ce nouveau propriétaire, il faut fournir au SGBD les
informations lui permettant d'insérer ce nouveau tuple dans la table
liste_proprietaire. Ces informations sont :
- le numéro du nouveau propriétaire
- le nom du nouveau propriétaire
- son numéro de téléphone
Bref, vous le voyez par vous-même, il s'agit en fit de fournir tous les
attributs de la table afin de produire un nouveau tuple.
En revanche, comme nous allons le voir, il n'est pas nécessaire de
fournir au SGBD le numéro du nouveau propriétaire car cet attribut à
été déclaré AUTO_INCREMENT lors de la création de la table. Ceci
implique que le SGBD sait, lors d'une nouvelle insertion, qu'il faut
qu'il prenne dans la table liste_proprietaire le numéro le plus grand
et qu'il l'augmente de un, et ce nouveau numéro (augmente de un)
correspondra au numéro de notre nouveau propriétaire.
On aura alors :
INSERT INTO liste_proprietaire VALUES ('','tibo','06-98-42-01-36');
On remarque tout de suite que la syntaxe pour une insertion est
relativement simple.
En effet, étudions ce code :
On insére où ? --> dans la table liste_proprietaire
On insérer quoi ? --> la valeur des différents attributs, c'est-à-dire
une première valeur qui correspond à l'attribut numero (qui je vous le
rappelle est AUTO_INCREMENT, on n'a donc pas l'utilité de préciser sa
valeur, le SGBD sachant quoi mettre), puis on insère la valeur tibo
pour l'attribut nom, et enfin la valeur 06-98-42-01-36 pour l'attribut
telephone.
Simple, non ?
Passons tout de suite à l'insertion d'un nouveau tuple, et ce, à
partir d'une page WEB.
Supposons que l'on désire insérer exactement le même tuple que dans
l'exemple précédent (c'est-à-dire que tibo fait tellement partie de
nos amis, qu'on a envie de partager nos disques avec lui).
On aura alors :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Insertion de tibo dans la base</title>
</head>
<body>
<?
// lancement de la requete
$sql = 'INSERT INTO liste_proprietaire VALUES ("", "tibo", "06-98-42-01-36")';
// on insere le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
?>
Tibo vient d'être inseré dans la base.
</body>
</html>
Imaginons, alors que l'on désire alors ajouter à la base un disque grâce
à la contribution de tibo.
Dans l'absolu, réfléchissons une minute sur ce que nous avons besoin :
- il s'agit d'un nouveau disque (soit son auteur et son titre).
- mais aussi, nous avons besoin du numéro qu'a pris le propriétaire
tibo dans la table liste_proprietaire.
Comment qu'on fait donc ce truc ? En effet, on voit bien que si l'on insère
directement un nouveau disque, la jointure entre les deux tables risque
de ne pas se faire.
En fait, il faudrait tout d'abord sélectionner le numéro qu'a pris
tibo dans la table_proprietaire (par le biais d'un requete SQL de type
SELECT, je vous renvoies au tutorial précèdent pour revoir la récupération
des données d'une base).
Cependant, imaginons que nous n'avons pas encore inséré le propriétaire
tibo dans notre base de données, et que l'on désire directement insérer
ce nouveau propriétaire ainsi qu'un disque lui appartenant. Nous allons
voir comment récupérer simplement le nouveau numero qui vient d'être
inséré (donc celui de tibo) et ainsi l'utiliser pour insérer notre
disque.
On a :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Insertion de tibo et d'un nouveau disque dans la base</title>
</head>
<body>
<?
// on prépare la requête
$sql = 'INSERT INTO liste_proprietaire VALUES("", "tibo", "06-98-42-01-36")';
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on récupère le dernier numéro inséré, soit le numéro de tibo
$numero_insere = mysql_insert_id();
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
$sql = 'INSERT INTO liste_disque VALUES ("'.$numero_insere.'", "The supermen lovers", "The player")';
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
?>
Tibo vient d'être inseré dans la base, ainsi que son nouveau disque : The player des Supermen lovers.
</body>
</html>
Que faire en plus ?
Et bien, tout comme dans le tutorial précédent, vous pouvez rendre vos
insertions vraiment dynamiques en effectuant tout simplement vos
insertions à partir des valeurs fournies par un formulaire.
Imaginons que l'on désire insérer des nouveaux disques. Supposons que
l'on dispose d'une page html contenant un formulaire permettant de
saisir le nom du propriétaire, et que ce formulaire vous demande également
le titre d'un album ainsi que son interprète (on suppose également que
le champ action de notre formulaire correspond au nom de la page PHP qui
traite les données, soit la page contenant le code ci-dessous).
On suppose enfin, que le champ du formulaire contenant le nom du propriétaire
porte le nom proprio (on pourra alors utiliser la variable
$_POST['proprio'] dans notre page PHP, tout en supposant de notre
formulaire à une méthode POST et npn GET), que le champ contenant
l'interprète porte le nom interprete et que le champ contenant le titre
porte le nom titre.
On aura alors :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Insertion de nouveaux disques dans la base</title>
</head>
<body>
<?
// on teste si les variables du formulaire sont bien déclarées
if (isset($_POST['proprio']) && isset($_POST['interprete']) && isset($_POST['titre'])) {
// on prépare la requête pour récupérer le numero du propriétaire
$sql = 'SELECT numero FROM liste_proprietaire WHERE nom = "'.$_POST['proprio'].'"';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on récupère le résultat sous forme d'un tableau
$data = mysql_fetch_array($req);
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
$sql = 'INSERT INTO liste_disque VALUES("'.$data['numero'].'", "'.$_POST['interprete'].'", "'.$_POST['titre'].'")';
// on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
echo 'Nous venons d\'insérer un nouveau disque : '.$_POST['titre'].' de '.$_POST['interprete'].' appartenant à '.$_POST['proprio'];
}
else {
echo 'Les variables du formulaire ne sont pas déclarées';
}
?>
</body>
</html>
Modifier des données de votre base
Après avoir vu comment on affiche les données d'une base de données
et comment on les insère, voyons maintenant comment modifier ces données.
Reprenons les deux tables que nous étudions depuis le début des
tutoriaux sur les bases de données.
Je vous rappelle que l'on avait alors :
La table liste_proprietaire :
|
N. du propriétaire
|
Propriétaire
|
N. tél
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
|
2
|
Jeremy
|
06-85-98-78-12
|
|
3
|
Benoît
|
06-47-01-59-36
|
|
4
|
Tibo
|
06-98-42-01-36
|
La table liste_disque :
|
N. du propriétaire
|
Auteur
|
Titre
|
|
1
|
Cassius
|
Au rêve
|
|
1
|
Daft Punk
|
Discovery
|
|
2
|
Cassius
|
Au rêve
|
|
2
|
Télépopmusik
|
Genetic world
|
|
3
|
Clamaran
|
Release yourself
|
|
2
|
Bob Sinclar
|
Paradise
|
|
4
|
The supermen lovers
|
The player
|
Voyons, en SQL tout d'abord comment modifié un tuple de la table liste_proprietaire.
Supposons que Benoît vienne de changer son
numéro de portable (et que son nouveau numéro est : 06-55-99-10-00),
il faudra alors faire la modification dans la base de données afin que
soit ancien numéro soit remplacé par le nouveau.
On aura alors :
UPDATE liste_proprietaire SET
telephone="06-55-99-10-00" WHERE nom="Benoît";
En effet, on modifie quelle table ?
On modifie liste_proprietaire.
Quel attribut modifie-t-on ?
On modifie l'attribut telephone (qui prendra
la valeur 06-55-99-10-00).
Et on fait les modifications pour quel(s) tuple(s) ?
On modifie le(s) tuple(s) où l'attribut nom
prend la valeur Benoît (dans notre cas, seul un tuple sera modifié car
notre table comporte qu'un seul tuple où l'attribut nom prend la valeur
Benoît).
Simple non ?
En revanche, notez bien que dans notre clause WHERE,
nous n'avons mis qu'une seule condition. Bien évidemment, tout est
possible, vous pouvez en mettre plusieurs
(ainsi que des clauses utilisant le LIKE vu
dans les tutoriaux précédents).
Tout dépend des tuples que vous voulez modifier.
Cependant, imaginons que nous désirons modifier plusieurs
attributs d'un même tuple.
En effet, supposons alors que nous possédons dans notre base de données
une table ressemblant à la table liste_proprietaire
(que nous avons déjà étudié), mais qui comportera plus d'attributs,
comme par exemple l'adresse du propriétaire ainsi que son age.
On pourrait alors très bien avoir une table ressemblant à ceci :
|
N.
|
Nom
|
N. tél
|
Adresse
|
Age
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
2, rue des lilas
|
23
|
|
2
|
Jeremy
|
06-85-98-78-12
|
4, rue des fauvettes
|
22
|
|
3
|
Benoît
|
06-55-99-10-00
|
2, rue des tulipes
|
66
|
|
4
|
Tibo
|
06-98-42-01-36
|
8, rue du facteur
|
23
|
Supposons alors que l'on se soit trompé dans l'age de Benoît et qu'au
lieu d'avoir 66 ans (il n'est pas si vieux que ça notre Benoît !), et
bien, il a tout simplement 65 ans :)
Supposons également que l'adresse de Benoît soit erronée et qu'il
n'habite pas 2 rue des tulipes, mais 3 rue des tulipes.
On aura alors :
UPDATE liste_proprietaire SET adresse="3, rue
des tulipes", age="65" WHERE nom="Benoît";
On remarque alors qu'il suffit de séparer les diverses modifications opérées
sur un même tuple par une simple virgule.
Voyons maintenant comment effectuer ces modifications dans une page PHP.
Pour ce faire, prenons notre deuxième modification, celle concernant
l'adresse et l'age de Benoît.
On aura alors :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Modification du tél et de l'adresse de Benoît</title>
</head>
<body>
<?
// lancement de la requête
$sql ='UPDATE liste_proprietaire SET adresse="3, rue des tulipes", age="65" WHERE nom="Benoît"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
?>
L'adresse et l'age de Benoît viennent d'être modifiés.
</body>
</html>
Attention !!!
En effet, les modifications peuvent être vraiment dangereuses pour
votre base de données.
En effet, si vous ne prenez pas un minimum de précaution pour effectuer
vos modifications, vous pouvez très bien modifier un tuple d'une table
et perde en même temps la jointure avec une autre
table.
En effet, nous savons que nos tables liste_disque
et liste_proprietaire sont liées par l'intermédiaire
du numéro de propriétaire (la jointure).
Ceci implique donc que si pour une raison ou pour une autre, nous sommes
amené à modifier ce numéro (dans la table liste_proprietaire
par exemple), il faudra également penser à faire la
modification de ce même numéro dans l'autre table (liste_disque)
afin que la jointure entre les deux tables
soit toujours fonctionnelle.
Que faire en plus ?
Et bien comme dans les tutoriaux précédents, vous pouvez effectuer des
modifications de tuples par le biais de formulaires.
Par exemple, supposons que l'on dispose d'un page WEB comportant un
formulaire disposant des champs suivants :
- un menu déroulant (de NAME proprio)
permettant de choisir le nom d'un propriétaire.
- un champs texte classique (de NAME nouvelle_adresse)
permettant à l'utilisateur de saisir une nouvelle
adresse pour le propriétaire sélectionne dans le menu déroulant
Supposons ensuite que ce formulaire a pour balise ACTION
la page traitement.php qui nous permet de
modifier l'adresse du propriétaire en question.
On aura alors le code suivant (pour la page traitment.php)
:
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Modification de l'adresse d'un propriétaire</title>
</head>
<body>
<?
// on teste si les variables du formulaire sont déclarées
if (isset($_POST['nouvelle_adresse']) && isset($_POST['proprio'])) {
// lancement de la requête
$sql = 'UPDATE liste_proprietaire SET adresse="'.$_POST['nouvelle_adresse'].'" WHERE nom="'.$_POST['proprio'].'"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
// un petit message permettant de se rendre compte de la modification effectuée
echo 'La nouvelle adresse de '.$_POST['proprio'].' est : '.$_POST['nouvelle_adresse'];
}
else {
echo 'Les variables du formulaire ne sont pas déclarées';
}
?>
</body>
</html>
Supprimer des données de votre base
Après avoir vu l'affichage des données provenant d'une base de données,
l'insertion et la modification de ces mêmes données, voyons maintenant
la dernière opération fondamentale
concernant ces base de données : la suppression
de tuples.
Reprenons alors nos deux tables liste_proprietaire
et liste_disque que nous avons utilise pendant
tous les tutoriaux concernant les bases de données.
Je vous rappelle que l'on avait alors :
La table liste_proprietaire :
|
N. du propriétaire
|
Propriétaire
|
N. tél
|
|
1
|
LA GLOBULE
|
06-48-85-20-54
|
|
2
|
Jeremy
|
06-85-98-78-12
|
|
3
|
Benoît
|
06-55-99-10-00
|
|
4
|
Tibo
|
06-98-42-01-36
|
La table liste_disque :
|
N. du propriétaire
|
Auteur
|
Titre
|
|
1
|
Cassius
|
Au rêve
|
|
1
|
Daft Punk
|
Discovery
|
|
2
|
Cassius
|
Au rêve
|
|
2
|
Télépopmusik
|
Genetic world
|
|
3
|
Clamaran
|
Release yourself
|
|
2
|
Bob Sinclar
|
Paradise
|
|
4
|
The supermen lovers
|
The player
|
Voyons alors, en SQL, comment supprimer un tuple de la table liste_proprietaire.
Supposons que l'on désire supprimer Tibo de
notre base de données. On écrira alors :
DELETE from liste_proprietaire WHERE
nom="Tibo";
En effet, on efface un tuple (ou plusieurs, tout dépend de la clause
WHERE) de quelle table ?
De la table liste_proprietaire.
Quel(s) tuple(s) efface-t-on ?
On efface tous les tuples de la table liste_proprietaire ou l'attribut nom
prend la valeur Tibo (dans notre cas, un seul tuple porte la valeur Tibo
pour l'attribut nom).
Notez bien que la clause WHERE peut très bien
contenir plusieurs conditions, elles seront alors séparés par des opérateurs
booléens (AND correspondant à un ET
logique ou OR correspondant à un OU
logique).
Cependant, je vous rappelle que des requêtes SQL peuvent être beaucoup
plus complexes, et dans ce cas, je vous renvoie à la documentation
MySQL, ce qui à notre niveau (débutant) n'est pas vraiment intéressant
(cela ne sert à rien de vous embrouiller les idées dès le départ).
Attention !!!
Lorsque l'on effectue une suppression de tuples, il faut toujours faire
attention à effacer non seulement les tuples
de la table dont on veut supprimer le(s) élément(s) mais éventuellement
les autres tuples d'une autre table (si les
deux tables sont jointes par le biais d'un
attribut).
En effet, dans notre exemple, nous venons de supprimer de la table liste_proprietaire
le tuple dont l'attribut nom valait Tibo.
Cependant, on remarque que la table liste_disque
comporte des éléments qui étaient liés à Tibo. Or, vu que ces
elements ne nous servent plus à rien maintenant (car on a supprimer
Tibo de la liste), il faut également penser à les supprimer (afin
d'avoir une base de données homogène).
Voyons maintenant comment effectuer ces suppressions par le biais d'une
page WEB écrite en PHP.
Prenons par exemple le cas d'une page PHP permettant la suppression de
Tibo de la base de données ainsi que de toutes les informations le
concernant (c'est-à-dire les disques lui appartenant).
On aura alors :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Suppression de Tibo de la base</title>
</head>
<body>
<?
// lancement de la requête pour effacer Tibo
$sql ='DELETE from liste_proprietaire WHERE nom="Tibo"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// lancement de la requête pour effacer les disques de Tibo (je vous rappelle que Tibo à le numéro 4)
$sql ='DELETE from liste_disque WHERE numero="4"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
?>
Tibo et tous ces disques ont étés supprimés de la base de données.
</body>
</html>
Que faire en plus ?
Comme dans les tutoriaux précédents, afin de rendre vos pages beaucoup
plus dynamiques, il serait intéressant de faire une page WEB contenant
un formulaire possédant un menu déroulant
permettant de choisir le nom du membre à effacer.
On suppose alors que ce menu déroulant à le champ NAME
qui prend la valeur proprio, et que le
formulaire a son champ ACTION qui prend la
valeur traitement.php.
Ceci implique que dans la page traitement.php,
on aura une variable $proprio qui contient le nom du propriétaire à
supprimer.
On aura alors le code suivant (pour la page traitement.php
placée dans le même répertoire que la page WEB contenant le
formulaire) :
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('ma_base', $base) ;
?>
<html>
<head>
<title>Suppression d'un membre de la base</title>
</head>
<body>
<?
// on teste si la variable du formulaire est bien déclarée
if (isset($_POST['proprio'])) {
// on recherche le numero du membre à supprimer
$sql = 'SELECT numero FROM liste_proprietaire WHERE nom = "'.$_POST[proprio].'"';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on recupere le resultat sous forme d'un tableau
$data = mysql_fetch_array($req);
// on recupere la valeur qui nous intersse
$numero_du_proprio = $data['numero'];
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
// lancement de la requête pour effacer notre membre
$sql ='DELETE from liste_proprietaire WHERE nom="'.$_POST['proprio'].'"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// lancement de la requête pour effacer les disques de notre membre
$sql ='DELETE from liste_disque WHERE numero="'.$numero_proprio.'"';
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base
mysql_close();
// un petit message afin de voir ce qui s'est passé
echo 'Nous venons de supprimer '.$_POST['proprio'].' de la base ainsi que tous ces disques';
}
else {
echo 'La variable de notre formulaire n\'est pas initialisée.';
}
?>
</body>
</html>
|
|