WEBMESTRE : CONCEPTION DE SITES ET
ADMINISTRATION DE SERVEUR WEB
ALGORITHMIQUE PROGRAMMATION ORIENTÉE INTERNET ASPECTS
SERVEUR
Module 25819 cours et TP A4 (1/2 valeur)
PHP et les bases de données
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
Le plus grand soin a été apporté à la réalisation de ce support pédagogique afin de vous fournir une information
complète et fiable. Cependant le Cnam Champagne-Ardenne n’assume de responsabilité, ni pour son utilisation,
ni pour les contrefaçons de brevets ou atteintes aux droits de tierces personnes qui pourraient résulter de cette
utilisation.
Les exemples ou programmes présents dans cet ouvrage sont fournis pour illustrer les descriptions théoriques. Ils
ne sont en aucun cas destinés à une utilisation commerciale ou professionnelle.
Le Cnam ne pourra en aucun cas être tenu responsable des préjudices ou dommages de quelque nature que ce soit
pouvant résulter de l’utilisation de ces exemples ou programmes.
Tous les noms de produits ou autres marques cités dans ce support sont des marques déposées par leurs proprié-
taires respectifs.
Ce support pédagogique a été rédigé par Olivier FLAUZAC, Maître de Conférences à l’Université de Reims-Champagne-
Ardenne.
Copyright 2001-2004
c Centre d’Enseignement A Distance du Cnam Champagne-Ardenne.
Tous droits réservés.
Toute reproduction, même partielle, par quelque procédé que ce soit, est interdite sans autorisation préalable du
Cnam Champagne-Ardenne. Une copie par xérographie, photographie, film, support magnétique ou autre, constitue
une contrefaçon passible des peines prévues par la loi, du 11 mars 1957 et du 3 juillet 1995, sur la protection des
droits d’auteur.
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
Objectifs
– gérer des connexions entre des scripts PHP et une base de données.
Table des matières
1 Introduction aux bases de données 1
1.1 Structure des informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 SGBD, bases et tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2 Types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Le langage SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1 Création de bases et de tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.2 Insertion et suppression d’éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.3 Extraction d’informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Accès aux bases de données en PHP 3
2.1 Connexion à la base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Exécution et exploitation des résultats d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Libération des ressources et déconnexion de la base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Exemple Récapitulatif 6
Avertissement Le but de ce chapitre n’est pas de faire un panorama complet sur la gestion et l’utilisation des bases
de données, mais de montrer comment le langage PHP peut «s’interfacer» et exploiter des informations contenues
dans une base de données. Pour une étude approfondie des bases de données, reportez-indows. Si vous travaillez
sous Linux, MySQL est fourni en standard avec l’ensemble des distributions.
1 Introduction aux bases de données
Une base de données peut être définie comme un moyen de stocker des informations de manière structurée. L’objectif
d’une base de données est de permettre, à des utilisateurs, ou à des programmes, de partager des informations.
Pour permettre l’exploitation des informations contenues dans les bases de données, il est nécessaire d’avoir un
environnement permettant la gestion des informations. Ce système est un Système de Gestion de Bases de Données
(SGBD). Grâce à ce système, il est possible d’ajouter des informations, de gérer plusieurs bases, de consulter les
informations contenues, de gérer l’accès aux informations ...
Il existe de nombreux systèmes de gestion de bases de données, on citera, à titre d’exemple : Oracle, MySQL,
PostgreSQL, DBase, Access ...
Dans la suite, nous utiliserons le système de gestion de bases de données MySQL, qui est fourni dans la distribution
d’EasyPHP, ainsi que dans toutes les distributions Linux.
Algorithmique programmation orientée internet aspects serveur 1
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
1.1 Structure des informations
Les informations contenues dans un système de gestion de bases de données, sont hierarchisées et respectent
certains formats.
1.1.1 SGBD, bases et tables
Comme nous l’avons dit précédemment, le système de gestion de bases de données est chargé d’assurer la gestion
des différents éléments et des différentes informations.
Dans le cadre d’un système de gestion de bases de données, on distingue trois niveaux : la base, la table et l’enre-
gistrement.
Un enregistrement représente une «ligne» d’informations. Par exemple, si vous souhaitez créer un carnet d’adresse,
une ligne sera du type (Dupont , Jean , 35 rue d’ici, 00000 ailleurs). Un enregistrement respecte un certain
format : type et nombre d’éléments, appelés des champs. Ce format est défini lors de la définition de la table.
Une table est, non seulement, une collection d’enregistrements, mais aussi la structure de ces différents champs.
Avant donc d’insérer des données, ou d’accéder à des données, il est indispensable de connaître le nombre, le nom
et le type de chaque champ.
Enfin une base est un ensemble de tables dont la combinaison permet de retrouver des informations. La structure
des bases, ainsi que des différentes tables qui les composent, et les relations qui existent entre les tables ne font pas
l’objet de ce cours.
On peut noter qu’un système de gestion de bases de données est capable d’exploiter plusieurs bases différentes et
indépendantes.
1.1.2 Types de données
Comme nous venons de le mentionner, les tables sont composées de champs typés. Donc lors de la création d’une
table, il est indispensable de définir, pour chaque champ, son nom, ainsi que son type.
Nous allons, dans le tableau suivant, présenter les principaux types de champs utilisables dans le cadre de MySQL.
Type MySQL Type de donnée Remarques
INT nombre entier peut être «modulé» en fonction de la taille
FLOAT nombre à virgule peut être «modulé» en fonction de la taille
VARCHAR(M) chaîne de caractères taille de la chaîne inférieure à M
TEXT chaîne de caractères longueur maximale 65535 caractères
DATE date format anglophone AAA-MM-JJ
TIME heure format HH:MM:SS
1.2 Le langage SQL
La communication avec un système de gestion de bases de données, se fait à l’aide d’un langage particulier norma-
lisé : le SQL. Comme dans le cas du HTML, chaque éditeur a adapté le langage normalisé SQL à sa manière, ce qui
peut provoquer des incompatibilités entre les différents systèmes de gestion de bases de données. Nous allons dans
cette partie présenter les principales instruction SQL utilisées pour construire des requêtes MySQL. Nous verrons
ensuite qu’il existe un utilitaire permettant de gérer une base de données MySQL à l’aide d’un serveur WEB et du
langage PHP. Il est toutefois indispensable de connaître un minimum de SQL pour pouvoir réaliser des accès depuis
PHP.
PHP et les bases de données 2
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
1.2.1 Création de bases et de tables
Avant toute chose, il est nécessaire de construire sa base et sa, ou ses, tables. La création d’une base se fait à l’aide
de la requête create dont le prototype, pour la création de base, est le suivant :
create database nom_base ;
Une fois la base créée, il est alors nécessaire de créer au moins une table, dans cette base, pour pouvoir y stocker
des enregistrements. La création d’une base, nécessite le nommage des différents champs, ainsi que la description
des types des champs. La création d’une table se fait à l’aide de la requête create, dont le prototype, pour la création
de table, est le suivant :
create t a b l e nom_table ( nom_champ1 type_champ1 , nom_champ2 type_champ2 . . . ) ;
A titre d’exemple, nous donnons ci-dessous les requêtes SQL permettant la création d’une table CONTACT constituée
de 4 champs de texte, et de la base CARNET.
create database CARNET;
create t a b l e CONTACT (NOM TEXT , PRENOM TEXT , ADRESSE TEXT , TEL TEXT ) ;
1.2.2 Insertion et suppression d’éléments
Une fois la base et une table créées, on peut ajouter et supprimer des enregistrements.
L’ajout d’un enregistrement dans une table se fait à l’aide de la requête insert dont le prototype est le suivant :
i n s e r t i n t o nom_table values ( val_champ1 , val_champ2 . . . ) ;
Vous pouvez remarquer dans la requête précédente, que seul le nom de la table apparaît. Ceci suppose que la base
sur laquelle on travaille, la base qui contient la table, ait été sélectionnée au préalable. Cette sélection se fait à l’aide
de la requête use dont le prototype est le suivant :
use nom_base ;
La suppression d’un enregistrement se fait à l’aide de la requête delete dont le prototype est le suivant :
delete from nom_table where nom_champ = v a l e u r ;
Il faut noter que dans la structure précédente, l’ensemble des enregistrements vérifiant la condition nom_champ =
valeur seront supprimés !
1.2.3 Extraction d’informations
Une fois les informations insérées, nous pouvons y accéder. L’accès aux informations peut se faire de plusieurs
manières. Dans tous les cas, on utilise une requête select. Les différentses utilisations de cette requête sont :
– lecture de l’ensemble des enregistrements et de l’ensemble des champs :
s e l e c t ∗ from nom_table ;
– lecture d’un sous-ensemble des champs et de l’ensemble des enregistrements :
s e l e c t champ1 , champ2 from nom_table ;
– lecture de l’ensemble des champs d’une sélection des enregistrements, sélection selon une condition :
s e l e c t ∗ from nom_table where nom_champ = v a l e u r ;
– lecture d’un sous-ensemble des champs d’une sélection des enregistrements, sélection selon une condition :
s e l e c t champ1 , champ2 from nom_table where nom_champ = v a l e u r ;
Algorithmique programmation orientée internet aspects serveur 3
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
1.3 phpMyAdmin
Comme vous l’avez remarqué, l’utilisation de MySQL est fastidieux en ligne de commande. Pour simplifier la gestion
des bases, il existe un outil accessible au travers d’un serveur WEB, développé en PHP : phpMyAdmin. Cet outil,
ou plus exactement cet ensemble de pages et de scripts PHP est fourni dans la distribution EasyPHP.
Lorsque vous vous connectez à la page principale de phpMyAdmin, vous obtenez un menu composé des éléments
suivants :
– Afficher l’état du serveur MySQL - permettant de récupérer les statistiques du serveur MySQL ;
– Afficher les variables du serveur MySQL - permettant de récupérer l’état du serveur ;
– Afficher les processus - permettant de connaître la liste des connexions actives ;
– Recharger MySQL - permettant de recharger et de réinitialiser la base ;
– Privilèges - permettant de créer des comptes utilisateurs et d’attribuer des droits d’accès aux différents utilisateurs ;
– Bases de données - permettant la gestion des bases, des tables et des enregistrements ;
– Exporter - permettant d’exporter une base, ou en ensemble de tables et d’enregistrements, sous forme texte.
A l’aide de cet outil, il est donc possible d’effectuer l’ensemble des opérations que nous avons décrites précédem-
ment, presque sans connaître le langage SQL !
2 Accès aux bases de données en PHP
Lorsque les données sont stockées dans une base de données, ou plus exactement dans une, ou plusieurs, tables,
il est possible d’y faire un accès depuis un script PHP. L’accès à une base de données depuis PHP permet de
réaliser des requêtes sur une base. Il est possible de réaliser l’ensemble des requêtes que nous avons abordées
précédemment, depuis PHP, à condition évidemment d’en posséder les droits !
Dans cette partie, nous allons considérer que la base, ainsi qu’une table existe, nous nous limiterons donc à l’exé-
cution de requête d’extraction, d’insertion et de suppression de données. Pour l’ensemble des exemple suivants,
nous considèrerons que accèderons à la table CONTACT constituée de 4 champs de texte (type TEXT) : NOM , PRENOM ,
ADRESSE , TEL, cette table étant incluse dans la base CARNET.
Le schéma d’accès à une base de données, et d’utilisation des informations qu’elle contient est le suivant :
1. connexion à la base ;
2. exécution de la requête ;
3. exploitation des résultats (si nécessaire) ;
4. libération de la mémoire contenant les résultats ;
5. déconnexion de la base.
Nous allons maintenant décrire chacune des étapes, en présentant les fonctions PHP utilisées.
2.1 Connexion à la base
Avant de réaliser une requête, il est nécessaire de se connecter au système de gestion de bases de données, et de
sélectionner la base sur laquelle on va travailler.
La première étape est la connexion. Cette connexion se fait à l’aide de la fonction mysql_connect, dont le prototype
est le suivant :
i n t mysql_connect ( s t r i n g s e r v e r , s t r i n g username , s t r i n g password ) ;
Cette fonction retourne un entier, appelé link_identifier, qui sera l’identificateur de connexion, et exploite les
paramètres suivants :
– server : l’adresse du serveur sous forme de chaîne de caractères ;
– username : le nom d’utilisateur ;
PHP et les bases de données 4
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
– password : le mot de passe de l’utilisateur.
Si la connexion est refusée, la valeur retournée est FALSE.
Une fois connecté, il est nécessaire de sélectionner la base contenant les tables sur lesquelles on va réaliser les
requêtes. Cette sélection se fait à l’aide de la fonction mysql_select_db, dont le prototype est le suivant :
i n t mysql_select_db ( s t r i n g database_name , resource l i n k _ i d e n t i f i e r )
Cette fonction retourne un entier qui prendra pour valeur TRUE si la connexion réussit, et FALSE dans le cas contraire.
Les paramètres de cette fonction sont :
– database_name : le nom de la base que l’on souhaite utiliser ;
– link_identifier : l’identificateur de connexion.
Donc pour se connecter à la base d’exemple que nous avons mentionnée précédemment, les instructions seront :
$con = mysql_connect ( " l o c a l h o s t " , " o l i v i e r " , " t o t o " ) ;
i f ( $con === FALSE ) {
p r i n t " e r r e u r de connexion " ;
} else {
$ s e l = mysql_select_db ( "CARNET" , $con ) ;
i f ( $ s e l === FALSE ) {
p r i n t " e r r e u r de s é l e c t i o n de base " ;
}
}
Comme vous pouvez le remarquer, le test successif des différents identificateurs rend le code difficilement lisible.
Pour simplifier le code, il est possible, comme dans le cas du langage Perl, d’utiliser la fonction die(...), qui stoppe
l’exécution du script lors de l’occurrence d’une erreur.
L’exemple précédent devient alors :
$con = mysql_connect ( " l o c a l h o s t " , " o l i v i e r " , " t o t o " ) o r d i e ( " e r r e u r de connexion " ) ;
mysql_select_db ( "CARNET" , $con ) o r d i e ( " e r r e u r de s é l e c t i o n de base " ) ;
2.2 Exécution et exploitation des résultats d’une requête
Une fois connecté au système de gestion de bases de données, et la base de «travail» sélectionnée, nous pouvons
exécuter une requête. L’exécution d’une requête se fait sous forme SQL : la requête que l’on souhaite effectuer est
en fait contenue dans une chaîne de caractères, d’où l’importance de connaître un minimum le langage SQL !
L’exécution d’une requête se fait à l’aide de la fonction mysql_query dont le prototype est le suivant :
resource mysql_query ( s t r i n g query , l i n k _ i d e n t i f i e r ) ;
Cette fonction prend donc en paramètres :
– query qui est la chaîne de caractères contenant la requête ;
– link_identifier qui est l’identificateur de connexion.
Cette fonction retourne une variable contenant le «résultat» de la requête, appelé result_identifier. Ce résultat
peut être : l’ensemble des éléments obtenus lors d’une requête de type select, le nombre de lignes affectées par la
requête ...
Si nous reprenons la base que nous utilisons depuis le début de ce chapitre, l’exécution d’une requête récupérant
l’ensemble des éléments contenus dans la table CONTACT prend la forme :
$res = mysql_query ( " s e l e c t ∗ from CONTACT; " , $con ) ;
L’exploitation du résultat se fait en fonction du type de la requête, c’est-à-dire en fonction du résultat obtenu.
Dans le cas d’une requête de type select, le résultat obtenu est sous la forme d’un tableau, dont chaque case
contient une «ligne». Il est donc nécessaire de récupérer les lignes une à une et de les traiter successivement.
Algorithmique programmation orientée internet aspects serveur 5
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
L’instruction premettant de récupérer une ligne de résultat est l’instruction mysql_fetch_row, dont le prototype est le
suivant :
a r r a y mysql_fetch_row ( resource r e s u l t _ i d e n t i f i e r ) ;
Cette instruction prend en paramètre l’identificateur de résultat, et retourne une ligne de résultat sous la forme d’un
tableau. On peut remarquer que la lecture d’une ligne fait automatiquement «passer» à la ligne de résultat suivante.
Une fois que l’on a lu toutes les lignes, cette instruction renvoie FALSE.
Si nous nous reportons à l’exemple précédent, l’affichage de l’ensemble des résultats est de la forme :
w h i l e ( $row = mysql_fetch_row ( $res ) ) {
p r i n t ( " <p> $row [ 0 ] ; $row [ 1 ] , $row [ 2 ] , $row [ 3 ] </ p> " ) ;
}
Dans le cas d’une requête affectant le contenu d’une table, insertion ou suppression par exemple, il est possible de
connaître le nombre de lignes affectées par la requête à l’aide de la fonction mysql_num_rows, dont le prototype est
le suivant :
i n t mysql_num_rows ( resource r e s u l t _ i d e n t i f i e r ) ;
2.3 Libération des ressources et déconnexion de la base
Une fois un résultat de requête exploité, il est toujours stocké en mémoire. Pour éviter de surcharger la mémoire
d’un serveur, il est conseillé «d’effacer» ce résultat de la mémoire à l’aide de la fonction mysql_free_result, dont le
prototype est le suivant :
i n t m y s q l _ f r e e _ r e s u l t ( resource r e s u l t _ i d e n t i f i e r ) ;
Enfin, lorsque l’ensemble des requêtes a été effectué, il faut fermer la connexion avec la base de données. Cette
fermeture se fait à l’aide de la fonction mysql_close, dont le prototype est le suivant :
boolean mysql_close ( resource l i n k _ i d e n t i f i e r ) ;
2.4 Gestion des erreurs
L’exécution d’une requête peut provoquer des erreurs, login ou mot de passe non valide, connexion impossible, erreur
dans la requête ... Lorsqu’une erreur est provoquée, il est possible de récupérer le message d’erreur à l’aide de la
fonction mysql_error, dont le prototype est le suivant :
s t r i n g m y s q l _ e r r o r ( resource l i n k _ i d e n t i f i e r ) ;
3 Exemple Récapitulatif
Nous allons maintenant donner un exemple récapitulatif. Cet exemple est composé d’un ensemble de scripts PHP
et de pages HTML traitant de l’affichage de l’ensemble des éléments contenus dans la table CONTACT, ainsi que de
l’ajout d’un nouvel enregistrement à cette table, les données étant obtenues à l’aide d’un formulaire.
Pour simplifier le code, et en assurer une maintenance aisée, nous proposons de créer, en premier, un fichier conte-
nant les paramètre de connexion. Ce fichier sera inclus dans l’ensemble des scripts php.
Voici le fichier de configuration de la connexion :
PHP et les bases de données 6
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
< !−− f i c h i e r c o n f i g . i n c −−>
<?
$serv = " l o c a l h o s t " ; / / adresse du s e r v e u r
$log = " o l i v i e r " ; / / login
$pass= " t o t o " ; / / mot de passe
$base= "CARNET" ; / / nom de l a base
$ t a b l e = "CONTACT" ; / / nom de l a t a b l e
?>
Voici maintenant le script permettant l’affichage de l’ensemble des enregistrements :
< !−− f i c h i e r s e l e c t . php −−>
<? i n c l u d e ( " c o n f i g . i n c " ) ; ?>
<html>
<head>
< t i t l e > A f f i c h a g e de tous l e s éléments < / t i t l e >
< / head>
<body>
<h1> Ensemble des adresses < / h1>
< t a b l e border= " 1 " >
<?
$con = mysql_connect ( $serv , $log , $pass ) o r d i e ( " e r r e u r de connexion " ) ;
mysql_select_db ( $base , $con ) o r d i e ( " e r r e u r de s é l e c t i o n " ) ;
$req = " s e l e c t ∗ from $ t a b l e ; " ;
$res = mysql_query ( $req , $con ) ;
w h i l e ( $row = mysql_fetch_row ( $res ) ) {
pr i nt ( "<tr >" ) ;
f o r ( $ i =0; $ i <count ( $row ) ; $ i + + ) {
p r i n t ( " < td > $row [ $ i ] </ td > " ) ;
}
p r i n t ( " </ t r > " ) ;
}
m y s q l _ f r e e _ r e s u l t ( $res ) ;
mysql_close ( $con ) ;
?>
< / table>
< / body>
< / html>
La page HTML suivante récupère les informations à l’aide d’un formulaire, et les passe à un script PHP permettant
l’ajout d’un nouvel enregistrement.
< !−− f i c h i e r a j o u t . html −−>
<html>
<head>
< t i t l e > formulaire d ’ ajout </ t i t l e >
< / head>
<body>
<h1> A j o u t d ’ une adresse < / h1>
<form name= " a j o u t " method= "POST" action= " a j o u t . php " >
< t a b l e border= " 0 " >
<tr>
< td> nom < / td> <td> <input type= " t e x t " name= "nom" > < / td>
Algorithmique programmation orientée internet aspects serveur 7
CONSERVATOIRE NATIONAL DES ARTS ET METIERS
</ tr>
<tr>
<td> prenom < / td> <td> < input type= " t e x t " name= " prenom " > < / td>
</ tr>
<tr>
<td> adresse < / td> <td> <input type= " t e x t " name= " adresse " > < / td>
</ tr>
<tr>
<td> Téléphone < / td> <td> < input type= " t e x t " name= " telephone " > < / td>
</ tr>
<tr>
<td>< / td> <td><input type= " submit " value= "Go ! ! ! " >< / td>
</ tr>
< / table>
< / form>
< / body>
< / html>
Le script suivant ajout un enregistrement à la table CONTACT.
< !−− f i c h i e r a j o u t . php −−>
<? i n c l u d e ( " c o n f i g . i n c " ) ; ?>
<html>
<head>
< t i t l e > A j o u t d ’ une adresse < / t i t l e >
< / head>
<body>
<h1> A j o u t < / h1>
<?
$con = mysql_connect ( $serv , $log , $pass ) o r d i e ( " e r r e u r de connexion " ) ;
mysql_select_db ( $base , $con ) o r d i e ( " e r r e u r de s é l e c t i o n " ) ;
$req = " i n s e r t i n t o $ t a b l e values ( ’ $nom ’ , ’ $prenom ’ , ’ $adresse ’ , ’ $telephone ’ ) ; " ;
/ / a t t e n t i o n aux c a r a c t è r e s ’ pour l e s v a l e u r s des champs dans l a requête ! ! !
$res = mysql_query ( $req , $con ) o r d i e ( " e r r e u r d ’ i n s e r t i o n " ) ;
mysql_close ( $con ) ;
?>
<p> personne a j o u t é e :
< u l>
< l i > <? p r i n t $nom ?> < / l i >
< l i > <? p r i n t $prenom ?> < / l i >
< l i > <? p r i n t $adresse ?> < / l i >
< l i > <? p r i n t $telephone ?> < / l i >
< / ul>
< / p>
< / body>
< / html>
PHP et les bases de données 8