Bases de données relationnelles & SQL

Documents pareils
Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

Langage SQL : créer et interroger une base

16H Cours / 18H TD / 20H TP

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Information utiles. webpage : Google+ : digiusto/

Bases de données relationnelles

Introduction au Système de Gestion de Base de Données et aux Base de Données

Rappel sur les bases de données

Le Langage SQL version Oracle

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Le Langage De Description De Données(LDD)

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Présentation du module Base de données spatio-temporelles

Bases de Données relationnelles et leurs systèmes de Gestion

Olivier Mondet

Conception des bases de données : Modèle Entité-Association

Pour les débutants. langage de définition des données

Création et Gestion des tables

1 Introduction et installation

CREATION WEB DYNAMIQUE

I4 : Bases de Données

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

INF 1250 INTRODUCTION AUX BASES DE DONNÉES. Guide d étude

Dossier I Découverte de Base d Open Office

Créer le schéma relationnel d une base de données ACCESS

Chapitre 5 LE MODELE ENTITE - ASSOCIATION

Bases de données élémentaires Maude Manouvrier

PHP 5. La base de données MySql. A. Belaïd 1

Modélisation des données

Les bases de données

Bases de Données Avancées

Les bases de données Page 1 / 8

Le langage SQL (première partie) c Olivier Caron

Introduction aux Bases de Données

Vincent Augusto

Le langage SQL Rappels

BASES DE DONNÉES. CNAM Centre associé de Clermont-Ferrand Cycle A Année J. Darmont I. INTRODUCTION II. LES SYSTÈMES HIÉRARCHIQUES

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

UML et les Bases de Données

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Nom de l application

Modélisation de bases de données : Le modèle relationnel

Bases de Données. Plan

Bases de Données Relationnelles. Le Modèle Relationnel

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

UML (Diagramme de classes) Unified Modeling Language

Application web de gestion de comptes en banques

DEVAKI NEXTOBJET PRESENTATION. Devaki Nextobjects est un projet sous license GNU/Public.

Bases de données. Chapitre 1. Introduction

Access et Org.Base : mêmes objectifs? Description du thème : Création de grilles d écran pour une école de conduite.

Systèmes d information et bases de données (niveau 1)

CONCEPTION Support de cours n 3 DE BASES DE DONNEES

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

1 Position du problème

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Cours: Administration d'une Base de Données

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Devenez un véritable développeur web en 3 mois!

INTRODUCTION AUX TECHNOLOGIES D INGENIERIE DES DONNEES DIRIGEE PAR LES MODELES

Bases de Données. Le cas des BD relationnelles ouverture sur les BD relationnelles spatiales Séance 2 : Mise en oeuvre

Cours Bases de données

Chapitre 1 Généralités sur les bases de données

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Conception d une base de données

Chapitre VIII. Les bases de données. Orientées Objet. Motivation

et les Systèmes Multidimensionnels

Bases de données cours 1

TP3 : Creation de tables 1 seance

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Mercredi 15 Janvier 2014

A QUOI SERVENT LES BASES DE DONNÉES?

UE 8 Systèmes d information de gestion Le programme

Base de Données et Langage SQL

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

1/ Présentation de SQL Server :

Introduction à la B.I. Avec SQL Server 2008

Objectifs du TP : Initiation à Access

Optimisations des SGBDR. Étude de cas : MySQL

Formation à l utilisation des Systèmes de Gestion de Bases de Données Relationnelles. organisée avec la collaboration du

NF26 Data warehouse et Outils Décisionnels Printemps 2010

Faculté des sciences de gestion et sciences économiques BASE DE DONNEES

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

PROSOP : un système de gestion de bases de données prosopographiques

Chaîne opératoire de réalisation d une base de données. ANF «Comment concevoir une base de données» (29-30/01/2015)

PHP 4 PARTIE : BASE DE DONNEES

Le modèle de données

INTRODUCTION AUX BASES de DONNEES

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

LE MODELE CONCEPTUEL DE DONNEES

Chapitre 1 : Introduction aux bases de données

1. Base de données SQLite

Les BASES de DONNEES dans WampServer

INTRODUCTION AUX METHODES D INGENIERIE DES DONNEES DIRIGEE PAR LES MODELES

Entrepôt de données 1. Introduction

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

KIELA CONSULTING. Microsoft Office Open Office Windows - Internet. Formation sur mesure

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Transcription:

Bases de données relationnelles & SQL Objectifs Appréhender les concepts du modèle relationnel. Etre capable de concevoir un schéma relationnel. Etre capable de créer une base de données relationnelle et d en manipuler les données avec le langage SQL. Niveau requis Aucune connaissance préalable n est requise. Durée 3 jours Droits d auteur Michel GRECH

SOMMAIRE conception des bases de données relationnelles... 5 1. Introduction aux bases de données... 5 1.1. Architecture d un système informatique utilisant des bases de données... 5 1.2. Les trois niveaux de description des données... 5 2. La conception des bases de données... 6 2.1. les deux étapes principales de la conception... 6 2.2. Objectif de la modélisation... 6 2.3. Raisonnements et démarche pour la conception des bases de données... 7 2.4. Démarche pour la conception des modèles de données... 9 2.5. Quelques représentations intéressantes... 13 2.6. Les contraintes... 17 2.7. Exercice récapitulatif... Erreur! Signet non défini. Systèmes de gestion de bases de données... 21 1. Indépendance des niveaux physique / interne / externe... 21 2. Manipulation des données par des langages non procéduraux... 22 3. Partage des données... 22 4. Sécurité des données... 23 5. Principales fonctions assurées par les SGBD... 23 Le modèle relationnel... 24 1. Objectifs du modèle relationnel... 24 2. Les concepts principaux... 24 2.1. Domaine... 24 2.2. Relation... 24 2.3. Attribut... 25 2.4. Clefs... 25 2.5. Vues... 26 2.6. Les types de colonnes... 26 3. Les opérateurs relationnels... 28 3.1. Les opérateurs uniares... 29 3.2. Les opérateurs n-aires... 29 3.3. Les agrégats... 32 4. Les contraintes... 32 Infotique - 2 -

4.1. L intégrité des bases de données... 33 4.2. Contraintes sur une colonne... 33 4.3. Contraintes d intégrité référentielle... 35 5. Les règles de normalisation... 36 5.1. Première forme normale... 36 5.2. Deuxième forme normale... 36 5.3. Troisième forme normale... 36 6. Les règles de traduction modèles conceptuels de données -> schémas relationnels.. 37 6.1. Traduction des entités... 37 6.2. Traduction des associations... 37 7. Exemple récapitulatif... 38 7.1. Dictionnaire des données... 38 7.2. Dictionnaire des règles... 39 7.3. Enoncé... 39 7.4. Solution... 39 SQL... 44 1. Objectifs de SQL... 44 2. Normes... 44 3. Utilisation de SQL... 44 4. La création et la modification de schémas... 45 4.1. Création de schéma... 45 4.2. Création de table... 45 4.3. Modification de table... 46 4.4. Ajouter des contraintes... 47 4.5. Suppression de table... 47 4.6. Création de vues... 47 5. La mise à jour des données... 48 5.1. Insertion de lignes... 48 5.2. Modification... 48 5.3. Suppression de lignes... 50 6. La consultation des données... 50 6.1. Forme canonique des requêtes SELECT... 50 6.2. Les opérateurs : booléens, BETWEEN, LIKE... 50 6.3. Utilisation de fonctions SQL... 52 6.4. Fonctions numériques... 53 Infotique - 3 -

6.5. Fonctions date... 53 6.6. Les agrégats... 54 6.7. Les jointures... 55 6.8. Les opérateurs ensemblistes... 56 6.9. Les sous-requêtes... 57 7. Le contrôle des autorisations... 58 7.1. Accorder une autorisation... 58 7.2. Révoquer une autorisation... 58 MySQL et PHP... 59 1. MySQL brève présentation... 59 2. Utilisation de MySQL... 59 2.1. L utilisation en mode commande... 59 2.2. Utilisation via l utilitaire PHPMYADMIN... 63 2.3. Utilisation via un programme PHP... 63 3. Eléments d administration de MySQL... 68 3.1. Administrer comptes utilisateurs et autorisation... 68 3.2. Créer une base de données... 70 3.3. Afficher, insérer, modifier, supprimer des données... 74 3.4. Exécuter des requêtes SQL... 74 3.5. Sauvegarder, importer et exporter... 75 4. Exemple récapitulatif... 76 4.1. Premier exemple recherche dans une base de données et affichage du résultat dans un formulaire... 76 4.2. Identification, authentification et ouverture d une session... 81 Infotique - 4 -

CONCEPTION DES BASES DE DONNEES RELATIONNELLES 1. Introduction aux bases de données 1.1. ARCHITECTURE D UN SYSTEME INFORMATIQUE UTILISANT DES BASES DE DONNEES Premier composant- la base de données que l on peut considérer en première approche comme un stock de données sur support permanent Deuxième composant - un Système de Gestion de Base de Données (SGBD) dont la fonction est la manipulation des données de la base de façon efficace et sure : mise à jour et consultation Troisième composant : une ou des application(s) informatiques qui constituent des interfaces entre les utilisateurs et leur logique «métier» et le SGBD 1.2. LES TROIS NIVEAUX DE DESCRIPTION DES DONNEES Le niveau conceptuel qui s attache à décrire (à représenter) la sémantique d un ensemble d objets de gestion constituant un «domaine» sans préoccupation de représentation en machine. Ce niveau sera représenté par un «modèle conceptuel des données». Le niveau interne (ou logique) qui représente l implémentation du niveau conceptuel pour une classe de solutions informatiques : par exemple les Systèmes de Gestion de Bases de Données Relationnelles SGBDR. Dans le contexte d un SGBD relationnel, ce niveau sera représenté, par exemple, par un «schéma relationnel». Infotique - 5 -

Le schéma, unique, de la base de données est parfois nommé «schéma canonique» par opposition aux schémas liés aux applications. Le niveau externe qui décrit la vision des applications (perception via les besoins utilisateurs) sur les données. Ce niveau sera lui aussi représenté par des schémas relationnels qui constitueront des «vues». 2. La conception des bases de données 2.1. LES DEUX ETAPES PRINCIPALES DE LA CONCEPTION Dans le cadre des bases de données relationnelles, le résultat de l opération de conception d une base de données est un «modèle logique de données» ou «schéma relationnel» immédiatement implémentable avec le SGBD choisi. L opération de conception se déroule généralement en deux étapes de poids différents : Une étape de modélisation sémantique des données dont le résultat est un ou plusieurs «modèles conceptuels des données «(vocabulaire Merise) ou diagrammes de classes (vocabulaire UML). Cette étape représente la plus grande part de l effort de conception. Une étape de traduction des modèles conceptuels des données ou diagrammes de classes en schémas relationnels. 2.2. OBJECTIF DE LA MODELISATION D une façon générale un modèle est la représentation d un objet réel tel que la manipulation du modèle vaille celle de l objet lui-même. Le modèle «simule» l objet représenté. Le modèle est présenté dans un formalisme adéquat. Le modèle ne préjuge d aucune solution d implémentation (base de données ou autre). La modélisation de données vise en premier lieu à «capturer» la sémantique d objets de gestion dans un document. Le document résultant est exprimé dans un formalisme adapté dont les principales qualités doivent être notamment : L expressivité : utilisation d un nombre de signes réduit pour exprimer n importe quelle situation La simplicité d interprétation pour permettre un dialogue sans ambigüité entre utilisateurs et concepteurs Un modèle conceptuel des données ne doit pas essayer de représenter le point de vue des applications (besoin en données) mais le point de vue sémantique d un domaine : gestion des Infotique - 6 -

effectifs, manuscrits médiévaux, observatoire virtuel Un modèle de données vise la plus grande neutralité de point de vue sur le domaine considéré. 2.3. RAISONNEMENTS ET DEMARCHE POUR LA CONCEPTION DES BASES DE DONNEES Les deux principaux formalismes couramment utilisés sont : Le modèle «Entité / Association» Le diagramme de classe UML 2 2.3.1. Le modèle «Entité / Association» Il s agit d un modèle graphique à base de deux objets : les entités et les associations. 2.3.1.1. Les représentations graphiques Graphiquement, une entité est représentée par un rectangle doté de deux compartiments : Un premier compartiment pour le titre : «Personne», «Unité» Un second compartiment pour les propriétés de l entité, c'est-à-dire toutes les informations pouvant lui être associées. Une association est représentée par un rectangle aux bords arrondis. Une association peut posséder un titre («affecté») ainsi que des propriétés. 2.3.1.2. Sémantique Entités Du point de vue de la sémantique, une entité représente un objet majeur dans le domaine de l utilisateur, c'est-à-dire d un objet homogène et consistant et d un objet aisément distinguable des autres objets du domaine. Les propriétés à l intérieur d une entité sont fortement couplées : le numéro d agent, le nom d agent et la date de naissance agent sont par exemple fortement liés. Infotique - 7 -

Associations Une association représente un couplage sémantique entre plusieurs objets du domaine de l utilisateur. Une association est le signe d un couplage entre données mais moins fort qu entre données appartenant à une même entité. Les données numéro agent et code unité sont couplées mais d une façon moins forte que sont couplées les données numéro agent et nom agent. Le titre d une association est souvent une forme verbale. Une association peut elle-même porter des propriétés. La dimension d une association est le nombre d entités y participant. La plupart des associations sont binaires (dimension de deux), mais on peut représenter des associations d une dimension supérieure. Une dimension supérieure à trois ou quatre est souvent le signe d une erreur de représentation. L exemple ci-dessous présente une association de dimension trois. L association porte une propriété. Une association peut être définie d une entité sur elle-même : Une personne est supérieure hiérarchique d une autre Un mot clef peut être synonyme (ou antonyme ou dérivé ) d un autre Plusieurs associations peuvent être définies entre deux mêmes entités Infotique - 8 -

2.3.1.3. Les cardinalités Bases de données relationnelles & SQL Chaque «patte» d association est qualifiée par un couple de cardinalité mesurant une sorte d intensité de participation d une entité à une association. Le couple de cardinalité est un couple d entier : (cardinalité minimum, cardinalité maximum). Par exemple : une personne est affectée au minimum à aucune unité et au maximum à une unité. Le couple de cardinalité est : (0, 1). Les cardinalités minimum sont 0 ou 1 Les cardinalités maximum sont 1 ou n Les cardinalités sont l indication de contraintes sur la participation d une entité à une assocation. Ces contraintes sont indiquées pour la participation minimum : 0 (pas de contrainte) et 1 (contrainte) et pour la cardinalité maximum : 1 (contrainte) et n (pas de contrainte). 2.3.1.4. Les identifiants Une des règles essentielles liées à la construction des modèles est la garantie d absence de doublons d occurrences d entités. L identifiant d une entité est une propriété ou la combinaison minimum de propriétés nécessaire pour distinguer deux occurrences d une entité. Plusieurs propriétés ou combinaisons de propriétés peuvent parfois jouer le rôle d identifiant, il importe de choisir parmi les identifiants potentiels celui qui jouera ce rôle. Un identifiant peut être «relatif», c'est-à-dire qu il n identifie une entité que dans le contexte de la participation de celle-ci à une association. Dans l exemple ci-dessous une classe est identifiée par un numéro de classe (par exemple A2) et par un niveau (par exemple 6 ème ). L identifiant complet de Classe est donc la combinaison de numéro de classe et de niveau, numéro de classe étant un identifiant relatif. 2.3.1.5. Identifiant d une association L identifiant d une association est constitué de la collection des identifiants des entités participant à l association. Dans l exemple cité plus haut et concernant les Personnages, les Textes et les Rôles, l identifiant de l association «intervient» est constitué de la collection des identifiants de Personne, de Rôle et de Texte. 2.4. DEMARCHE POUR LA CONCEPTION DES MODELES DE DONNEES Infotique - 9 -

2.4.1. Première étape : préparation du projet Les deux tâches préalables à mener au minimum sont les suivantes : Mener l étude d opportunité Délimiter le domaine Bases de données relationnelles & SQL 2.4.2. Deuxième étape : établissement du dictionnaire des données et du dictionnaire des règles Un dictionnaire des données est un document à deux colonnes : Nom de la donnée Signification de la donnée Le dictionnaire des données se construit après avoir délimité précisément le domaine. 2.4.2.1. Dresser la liste des données La première étape de constitution du domaine consiste en un relevé systématique de toutes les informations du domaine jugées «pertinentes». Ce travail s appuie principalement sur le dépouillement de documents existants (documents écrits, écrans d applications ) La principale préoccupation est de dresser un relevé complet. A l issue de cette première étape, on dispose d une liste «brute» d informations. 2.4.2.2. Epurer la liste des données La deuxième étape vise à épurer la liste obtenue en la débarrassant : Des informations calculées Des synonymes Des polysèmes Les informations calculées ne seront pas stockées dans la future base de données pour deux raisons : Si des résultats de calcul étaient stockés, ils deviendraient faux dès qu un des opérandes changerait de valeur Les résultats peuvent être recalculés à tout instant La suppression des synonymes et des polysèmes permet de lever toutes les ambigüités de représentation des informations et d interprétation de leur restitution. 2.4.2.3. Dictionnaire des règles Le dictionnaire des règles consigne l énoncé des principales règles de gestion dans le but de déterminer comment associer les données entre elles (soit en les regroupant au sein d une même entité, soit en associant des entités). Infotique - 10 -

2.4.3. Troisième étape : ébaucher le modèle de données Il n est en général pas très difficile de produire une première ébauche de modèle de données. Une démarche possible est la suivante : 1) Identifier les principaux objets du domaine de gestion concerné 2) Dessiner les entités (au moins les entités majeures) 3) Dessiner les associations en s appuyant sur le dictionnaire des règles 4) Préciser les cardinalités 5) Choisir les identifiants 2.4.4. Quatrième étape : supprimer les redondances et les multivaluations Le premier objectif d un modèle est de «capturer» la sémantique d un domaine. Un autre objectif essentiel d un modèle est d éviter les anomalies de représentation et de cohérence liées à : La redondance de certaines informations Au caractère multivalué de certaines propriétés La redondance des informations est une des principales sources d incohérence des bases de données. Si une même valeur doit être répétée plusieurs fois (une orthographe de pays par exemple), elle risque de ne pas l être d une façon identique ce qui rendrait impossible toute recherche sur la propriété concernée (le pays par exemple) En cas de mise à jour, il n est pas garanti que toutes les occurrences de la valeur soit bien mises à jour (le Zaïre devient le congo ) Le problème de la redondance d une propriété est entièrement résolu par la création d une nouvelle entité de type référentiel. Exemple Dans cette entité, la propriété grade est redondante. La solution est : Infotique - 11 -

La multivaluation des informations, classique dans les bases de données réalisées sans méthode, entraine une mauvaise représentation des données et un futur accès malaisé à celles-ci. Par exemple, si une entreprise implantée sur plusieurs sites était représentée sous la forme : entreprise, site 1, site 2, site 3 Il faudrait pour bien faire pouvoir prévoir le nombre maximum de sites, La majorité des entreprises auraient des propriétés vides Pour rechercher toutes les entreprises implantées sur un site donné, il faudrait écrire une requête du type : Site = site 1 ou Site = site 2. Le problème de la multivaluation est entièrement résolu par la création d une nouvelle entité. Exemple Cette entité possède en fait une propriété ville multivaluée. Le fait qu une unité soit implantée dans 4 ou 5 villes ne pourrait être représenté. La solution est la suivante : La modélisation et surtout la génération de la base de données sont grandement facilitées par l utilisation d un AGL, si possible libre, comme DBDesigner (v4). Infotique - 12 -

2.5. QUELQUES REPRESENTATIONS INTERESSANTES 2.5.1. Les associations réflexives Cette modélisation permet d exprimer qu une entité est associée à elle-même. Peuvent être traitées de cette façon les associations exprimant une hiérarchie entre occurrences d une entité. Dans l exemple ci-dessous, on modélise un organigramme hiérarchique. L association n est pas symétrique, le «rôle» de chacune des pattes de l association doit être précisé : «est le» et «a pour». Peuvent également être traitées les associations exprimant une équivalence entre occurrences d une entité. Dans l exemple ci-dessous, les deux associations sont symétriques, il n est pas nécessaire de préciser le «rôle» de chacune des pattes de l association. Infotique - 13 -

2.5.2. Généralisation / spécialisation Une difficulté récurrente de la modélisation est de choisir entre représenter des objets comme étant des objets différents ou comme étant un seul objet. Le mécanisme dit de «généralisation / spécialisation» appuyé sur le concept d héritage permet de faire coexister les deux points de vue. Cette modélisation permet d exprimer que : Des entités sont traitées de la même façon (un agent titulaire, un CDD, un thésard sont tous trois collaborateurs d une unité de recherche). Les mêmes entités sont traitées différemment (un agent titulaire, un CDD, un thésard n ont pas toutes leurs propriétés en commun). Infotique - 14 -

2.5.3. Les historiques En cas de modification d une occurrence d association, on peut souhaiter conserver l ancienne valeur. On ajoute alors la nouvelle valeur aux anciennes plutôt que de remplacer la dernière valeur par la nouvelle. Si la cardinalité maximum était de 1, elle est alors de n. La modélisation ci-dessous permet de conserver l historique des nominations des personnes à des grades successifs. L identifiant de l association possèdegrade est constitué par le couple des identifiants des entités associées, soit(numeropersonne, CodeGrade). Il sera impossible d enregistrer deux fois la même occurrence d association (Personne, Grade) ce qui convient bien car il est impossible d être nommé deux fois au même grade dans la carrière d une personne. Dans l exemple ci-dessous, l association est de dimension 3 et son identifiant est (numeropersonne, codesite, Date). En effet, il doit être possible d enregistrer deux affectations successives d une même personne à une même unité, l identifiant ne peut par conséquent être limité au couple (numeropersonne, codesite) et doit contenir un troisième élément quel qu il soit (date est le plus courant). Infotique - 15 -

La date est placée dans une entité (pseudo entité) Date et n est pas considérée comme une propriété de l association affecté pour que l on puisse distinguer deux affectations successives d un agent à une même unité. 2.5.4. La méta modélisation Cette modélisation permet, en introduisant un degré d abstraction supplémentaire, de représenter de façon commune un grand nombre d entités qu il serait peu pratique de considérer comme étant tout à fait différentes. On souhaite modéliser les équipements installés sur les carrefours à feu d un département. Dans le but de pouvoir assurer la maintenance de ces équipements et de pouvoir éditer des statistiques périodiques, les caractéristiques techniques des équipements doivent être décrites. Les équipements sont très divers : poteaux, lampes, radars, boucles enterrées, modems, pilotes d armoires à feu et leurs caractéristiques très différentes. Une première modélisation «naïve» donnerait ceci (on ne tient pas compte des propriétés redondantes) : Infotique - 16 -

2.6. LES CONTRAINTES D une façon générale, la qualité des données dans un système d information, automatisé ou non, dépend de la bonne structuration de celles-ci et aussi pour une part importante du respect d un certain nombre de contraintes de gestion de celles-ci. La qualité des données contenues dans une base de données dépendra donc en grande partie du soin apporté identifier ces contraintes, les exprimer et les implémenter dans la base. Les contraintes peuvent être exprimées : Soit dans le modèle (conceptuel) des données Soit dans le schéma relationnel Soit lors de l implémentation du schéma relationnel. Il est notamment possible d exprimer un certain nombre de contraintes sémantiques dans un modèle de données, même s il n existe pas de langage approprié et complet pour le faire : Soit sous forme purement textuel (essentiellement) Soit sous forme normalisée 2.6.1. Les contraintes concernant les propriétés 2.6.1.1. Contrainte d existence Cette contrainte exprime le fait qu une propriété possède nécessairement une valeur. 2.6.1.2. Contrainte d unicité Cette contrainte exprime le fait qu une propriété ne peut posséder deux fois une même valeur. Infotique - 17 -

2.6.1.3. Contrainte d identifiant Bases de données relationnelles & SQL Une contrainte d identifiant est la combinaison d une contrainte d existence et d une contrainte d unicité. 2.6.1.4. Contrainte de type Cette contrainte exprime le fait qu une propriété appartient à un des types suivants : texte (ou caractère ou alphanumérique), numérique, date Si la propriété est de type texte, on peut spécifier s il s agit d une propriété dont la longueur (nombre de caractères) est fixe ou variable et indiquer une longueur qui sera soit une longueur exacte, soit une longueur maximum). 2.6.1.5. Contrainte de valeur Les contraintes de valeurs peuvent s exprimer de plusieurs façons : Par encadrement : valeur minimale et valeur maximale En définissant un domaine de valeur. Dans l exemple ci-dessous, on définit un domaine de valeurs pour la propriété quotitepersonne, stipulant que cette propriété ne peut prendre qu une parmi les valeurs suivantes : 50, 60, 70, 80, 90, 100. Si le domaine contient plus de quelques valeurs (une dizaine), on préfèrera construire une entité. 2.6.1.6. Contrainte de stabilité Cette contrainte exprime le fait que la valeur d une propriété ne change pas dans le temps. Les propriétés identifiables possèdent en général des valeurs stables. Infotique - 18 -

2.6.2. Contraintes d intégrité référentielle Bases de données relationnelles & SQL La contrainte d intégrité référentielle entre deux entités stipule que si une occurrence de la première entité est associée à une occurrence de la deuxième entité, la modification ou la suppression de cette dernière ne doit pas entrainer la survenue d une association «vide». Par exemple, si plusieurs personnes sont affectées à un site, il doit être impossible de supprimer le site sans soit «recaser» les personnes dans un site existant, soit supprimer les personnes concernées (ceci n est qu un point de vue informatique). Il y a contrainte d intégrité référentielle pour chacune des associations. Cette question est traitée plus en détail au chapitre consacré au modèle relationnel. 2.6.3. Contraintes sur les pattes d associations Une patte d association peut être «verrouillée», c'est-à-dire que les associations entre les occurrences de deux entités ne peuvent être mises à jour, c'est-à-dire ni modifiées ni supprimées. Dans l exemple ci-dessous, on exprime que si un règlement est noté comme effectué par une société, cette information ne peut pas être modifiée ni supprimée. 2.6.4. Les contraintes entre associations De même qu il est possible d exprimer des contraintes afférentes à des propriétés d entités, il est possible d exprimer des contraintes entre associations. Les contraintes entre association peuvent décrire une des situations suivantes : Aucune contrainte (c est le cas général) Partition (Totalité et Exclusion) : XT Totalité sans Exclusion : T Pas de totalité et Exclusion : X Inclusion : I ) Dans l exemple ci-dessous, on exprime le fait que l on ne peut être à la fois propriétaire et locataire d une même habitation. On peut en revanche occuper une autre position vis-à-vis de son habitation («hébergé à titre gratuite» ). Il y a donc une contrainte d exclusion mais pas de totalité. Infotique - 19 -

Dans l exemple ci-dessous, on exprime le fait qu un règlement peut s opérer soit (exclusif) en espèces, en chèque ou en carte bancaire. Il y a donc une double contrainte : de totalité (pas d autre modalité de règlement) et d exclusion (un règlement ne peut s opérer en espèces et en chèque). La contrainte est de type «X» et «T», il s agit d une contrainte de partition. Ce modèle n est donné qu au titre d exemple pédagogique. En réalité, une représentation de type «généralisation / spécialisation» (voir plus haut) aurait été préférable. Dans l exemple ci-dessous, on exprime le fait que le responsable d une unité est nécessairement affecté à l unité. Le «I» désigne une inclusion. Infotique - 20 -

SYSTEMES DE GESTION DE BASES DE DONNEES Le terme «base de données» est lié à la notion de «persistance des données». Une donnée est dite «persistante» si sa durée de vie excède la durée d exécution du programme qui l a créée. Une donnée persistante peut être rechargée en mémoire principale à tout instant. En pratique la persistance de données est assurée par leur stockage sur un support permanent (disque ). De ce point de vue, le terme de base de données mérite précision. Deux acceptions peuvent être proposées : Une acception générale : une base de données est un ensemble de données électroniques stockées sur support permanent Une acception plus restrictive : une base de données est un ensemble de données électroniques stockées sur support permanent et manipulées par un logiciel spécialisé : un Système de Gestion de Base de Données Les Systèmes de Gestion de Base de Données imposent un certain nombre de règles de structuration des données, notamment des règles de représentation sous forme tabulaire, règles de non redondance, de non répétitivité... 1. Indépendance des niveaux physique / interne / externe Le niveau physique désigne le mode de stockage matériel des données sur mémoire permanente : types de fichiers, méthodes d accès, modes de placement, procédés de chainage, les données d une base de données étant, comme toutes les données informatiques stockées dans des fichiers organisés suivant des modalités de placement, d accès Le niveau logique désigne une perception des données sous forme tabulaire exprimant la sémantique des informations du domaine couvert par la base de données. La fourniture d une vision «logique» ou «niveau logique» des données permet de masquer totalement les détails de stockage physique des données : noms et emplacements des fichiers, Infotique - 21 -

organisation des fichiers : méthodes de placement, méthodes d accès et présente les données comme étant organisées en tables. Il est ainsi possible qu une modification de l organisation physique des données, dans le but d optimiser l occupation mémoire ou les temps d accès aux données, n ait aucune incidence sur le niveau physique. Réciproquement, il est également possible qu une modification du schéma logique consécutif au changement d une règle de gestion n ait aucune d incidence sur l organisation physique des fichiers de stockage. Le niveau externe désigne le niveau des applications, c'est-à-dire la vision particulière des applications sur le schéma canonique de la base. Un schéma externe est obtenu par un réarrangement des données du schéma interne, quitte à introduire des synonymes, un certain niveau de redondance Grâce aux mécanismes de production de schémas externes, il est possible qu une modification applicative laisse inchangés les autres schémas externes et le schéma interne (ou presque). Il faut bien comprendre qu une base de données ne doit pas être liée à une utilisation particulière des données, c'est-à-dire à une application. Une base de données organise les données suivant leur sémantique sous forme d un schéma «canonique» auquel les applications viendront s alimenter. 2. Manipulation des données par des langages non procéduraux L accès aux données à une base de données doit pouvoir s effectuer d une façon totalement indépendante des structures de stockage physique (organisation en fichiers). L accès aux données doit pouvoir être réalisé en formant des prédicats sur la valeur des données contenues dans la base. Les langages de manipulation doivent être relativement proches du langage naturel. Ces langages doivent pouvoir être utilisés aussi bien en mode intercatif qu intégré à des programmes procéduraux. 3. Partage des données Un des objectifs majeurs des SGBD est de permettre le partage des données contenues entre plusieurs utilisateurs, plusieurs applications successivement et simultanément. Tout doit se passer comme si chaque utilisateur, chaque application était seul à utiliser (consultation et mise à jour de la base). Infotique - 22 -

4. Sécurité des données La sécurité des données doit être envisagée sous deux aspects : Bases de données relationnelles & SQL La protection contre les accès non autorisés est assurée par des mécanismes d attribution explicite d autorisations (lecture, écriture ) à des d utilisateurs identifiés sur certains objets de la base. La tolérance aux pannes La tolérance aux pannes est assurée par un certain nombre de mécanismes tels que la restauration de données sauvegardées, journalisation des transactions, reprise à chaud, à froid 5. Principales fonctions assurées par les SGBD Les principales fonctions d un SGBD peuvent être présentées de façon synthétique : La définition des schémas La recherche de données La mise à jour des données La transformation des données (schémas externes) Le contrôle de l intégrité des données La gestion de la sécurité Infotique - 23 -

LE MODELE RELATIONNEL 1. Objectifs du modèle relationnel Le «modèle relationnel» est un ensemble de concepts et de règles de structuration de données, essentiellement alphanumériques, sous forme tabulaire. Ces règles, énoncées par CODD au début des années 70, associées à un langage de requête basé sur des prédicats en logique du premier ordre (des énoncés sur les données) visent à représenter de façon assez simple la sémantique d objets de gestion tout en évitant les anomalies de mise à jour. 2. Les concepts principaux 2.1. DOMAINE Un domaine est un ensemble de valeurs (essentiellement alphanumériques). Comme en théorie des ensembles, un domaine peut être défini «en compréhension» et / ou «en extension». Le plus souvent un domaine est défini par un type de données : numérique (entier, réel, caractère, date ) et par des valeurs. Exemple : Domaine (noms de personnes) : DUPONT, DUPOND, DURAND, DURANT Domaine (prénoms de personnes) : Emile, Berthe, Joseph, Amélie Domaine (années de naissances de personnes) : 1923, 1920, 1937, 2005 Les domaines sont caractérisés par un nom : nom de personne, prénom de personne 2.2. RELATION Une relation est un sous-ensemble du produit cartésien de plusieurs domaines. Exemple : Infotique - 24 -

Relation Personne : (DUPONT, Emile, 1923), (DUPOND, Berthe, 1920), (DURAND, Joseph, 1937), (DURANT, Amélie, 2005) Une relation est donc composée de vecteurs. Le terme consacré est celui de tuples. D une façon moins savante et plus courante, on parle : De table plutôt que de relation De ligne plutôt que de tuple 2.3. ATTRIBUT Un attribut est une colonne d une relation. Le nom d une colonne doit être évocateur de sa sémantique. Le nom d une colonne peut obéir à des restrictions de caractères et à une convention de nommage. 2.4. CLEFS 2.4.1. Clefs primaires Le concept de clef primaire est équivalent à celui d identifiant conceptuel. Les qualités d une clef primaire sont les suivantes : Valeur obligatoire et unicité par définition Stabilité de valeur dans le temps Compacité : les clefs primaires étant utilisées pour rapprocher des tables en consultation (jointures), plus les clefs sont compactes et de petite taille, plus les temps de traitement seront courts. Une clef primaire est soit une des propriétés (ou une collection des propriétés) de la table, soit un élément artificiel (numéro d ordre). En pratique, l exigence de stabilité de valeur dans le temps interdit l utilisation d une propriété significative et entraine l utilisation systématique d un numéro d ordre (un entier autoincrémenté). 2.4.2. Clefs étrangères Une clef étrangère est la duplication de la clef primaire d une table dans une autre table dans le but de traduire une association conceptuelle entre les deux entités représentées par les deux tables. Le concept de clef étrangère est un des concepts majeurs du modèle relationnel. Infotique - 25 -

2.5. VUES Une vue est un assemblage des données du schéma d une base de données (appelé souvent «schéma canonique) visant à satisfaire les besoins d une application en informations. Dit autrement, un ensemble de vues liées à une application constitue un «sous schéma» relationnel, déduit du schéma de la base de données et représentant le «point de vue» de cette application sur l ensemble des données. Le schéma constitué des vues liées à une application peut différer sensiblement du schéma canonique : Les vues peuvent être construites par projection (seulement certaines colonnes) et par restriction (seulement certaines lignes) des tables de base. Les colonnes peuvent ne pas être nommées de la même façon Des données réparties entre plusieurs tables dans le schéma canonique peuvent être assemblées en une seule vue Les règles de structuration du modèle canonique peuvent ne pas être respectées dans les vues qui ne sont en définitive qu une présentation des tables de base (qui doivent respecter les règles d intégrité). Les principaux intérêts de ce mécanisme sont : La possibilité de masquer la complexité du schéma canonique aux applications L apport d un haut niveau d indépendance schéma canonique / vues : une modification du schéma interne n entraine pas de changements profonds des applications et réciproquement, un changement applicatif n entraine pas nécessairement une modification profonde du schéma canonique. 2.6. LES TYPES DE COLONNES Pour des motifs de représentation des données en mémoire, il est indispensable de décrire chacune des colonnes d une base de données par un type prédéfini. Ces types sont alphanumériques ou binaires. Aucun SGBD ne respectant scrupuleusement les normes SQL, il convient de s intéresser aux idiomes de chacun de ceux-ci. Les types principaux sont les suivants : Chaines de caractères Types numériques Types temporels Types binaires Infotique - 26 -

2.6.1. Types chaines de caractères Bases de données relationnelles & SQL Une colonne de type chaine de caractères permet de stocker des caractères sous forme d un octet (ASCII ou codes ISO 88-59-n) ou de plusieurs octets (UNICODE dans ses implémentations UTF-8 ou UTF-16 notamment). Les principaux types chaines de caractères sont les suivants : CHAR(n) : chaîne de longueur fixe n et d une longueur maximum de 255 caractères. Une option permet de préciser le jeu de caractères : binaire, ASCII, UNICODE. Si le nombre de caractères effectif est inférieur à la taille fixée, ceux-ci seront complétés par des caractères «blancs» (par exemple des espaces) non restitués par les extractions. VARCHAR(n) : chaîne de longueur variable de maximum n caractères (jusqu à 65 535 caractères dans MySQL). Les caractères sont codés en UNICODE. D autres types permettent de stocker des caractères sur une taille plus importante : TEXT (n) jusqu à 65 535 caractères pour MySQL), MEDIUMTEXT(n) : 16 MO, LONGTEXT(n) : 4,29 GO. 2.6.2. Types numériques Les deux types principaux sont : Le type entier qui se subdivise généralement lui-même en sous types : SMALLINT entier non signé sur 2 octets MEDIUMINT (pas dans la norme SQL, utilisable avec MySQL) entier signé sur 3 octets INTEGER entier signé sur 4 octets BIGINT (pas dans la norme SQL, utilisable avec MySQL) entier signé sur 8 octets Le type réel qui se subdivise généralement lui-même en sous types : FLOAT réel entre 4 et 8 octets précision simple (7 décimales) DOUBLE réel sur 8 octets - précision double (15 décimales) 2.6.3. Types temporels Les principaux types temporels sont : DATE - sur 3 octets stocke les dates comprises entre 1 er janvier de l an 1 000 jusqu au 31 décembre 999. Le format est YYYY-MM-DD (MySQL) DATETIME sur 8 octets date et heure (MySQL) TIME sur 3 octets stocke les heures de 839 heures 59 minutes et 59 secondes à + 839 heures 59 minutes et 59 secondes (MySQL) TIMESTAMP : sur 4 octets instants écoulés du 1 er janvier 1970 à 0h 0m jusqu à l année 2037. Mise à jour à chaque modification de la table (MySQL) 2.6.4. Types binaires Les colonnes binaires contiennent des chaînes de bits, sans référence à un jeu de caractères. Peuvent être stockés dans une colonne de ce type des éléments multimédia, des applications Le type BLOB permet de stocker jusqu à 65 535 octets (MySQL) Infotique - 27 -

Le type MEDIUMBLOB (n) permet de stocker jusqu à 16 MO (MySQL) Le type LONGBLOB (n) permet de stocker jusqu à 4,29 GO (MySQL) 3. Les opérateurs relationnels Les SGBDR fournissent un ensemble d opérateurs dits relationnels dont les opérandes sont des relations (des tables) et les résultats des relations (des tables). Les opérateurs relationnels peuvent être classés en deux catégories : Les opérateurs «unaires» qui n utilisent qu un opérande Les opérateurs «n-aires» qui utilisent plusieurs opérandes Le modèle de référence permettant de présenter les opérateurs relationnels est le suivant : Table Personne (nom, prénom, date de naissance, quotité, code établissement) Table Etablissement (code établissement, nom établissement, adresse établissement)les opérateurs unaires Personne nom prénom date de naissance quotité code établissement MARTIN ALBERT 1950-11-01 80 2 DUPOND MARCEL 1978-10-12 100 1 DURAND ADOLPHE 1968-08-13 100 1 DUPUY ELIANE 1965-12-12 80 2 DUPONT ARMELLE 1985-04-05 100 1 EPICURE DANTE 1985-12-25 50 Etablissement Code établissement Nom établissement Adresse établissement 1 BEAU CAMPUS 12 rue de la recherche 2 CHEZ GERMAINE 33 rue des fayots 3 LE BON COIN 6 rue Cartier Bresson Infotique - 28 -

3.1. LES OPERATEURS UNAIRES 3.1.1. La projection Créé à partir d une première table une deuxième table contenant les colonnes spécifiées de la première table. Exemple Projection Personne (nom, quotité) nom quotité MARTIN 80 DUPOND 100 DURAND 100 DUPUY 80 DUPONT 100 EPICURE 50 3.1.2. La restriction Créé à partir d une première table une deuxième table contenant les lignes spécifiées par un prédicat (vérifiant une condition). Exemple Restriction Personne (quotité <100) nom prénom date de naissance quotité code établissement MARTIN ALBERT 01/01/1950 80 2 DUPUY ELIANE 12/12/1965 80 2 EPICURE DANTE 25/12/1955 50 3.2. LES OPERATEURS N-AIRES 3.2.1. La jointure Création d une table en associant deux tables sur une condition d égalité de valeurs entre une colonne de la première table et une colonne de la deuxième table. Infotique - 29 -

Exemple Join (Personne, Etablissement (Personne.code établissement = Etablissement.code établissement)) La jointure peut être : Interne (ou naturelle) : la table résultat est composée des lignes de Personnes et des lignes de Etablissement pour lesquelles l égalité est vérifiée. Externe (gauche ou droite) : le résultat est celui de la jointure interne auquel sont ajoutées soit les lignes de la table Personne sans correspondance dans Etablissement, soit les lignes de la table Etablissement sans correspondance dans la table Personne. Jointure interne nom prénom date de naissance quotité Code établiss ement Code établiss ement. Nom établissement Adresse établisse ment MARTIN ALBERT 01/01/195 0 80 2 2 CHEZ GERMAINE 33 rue des fayots DUPOND MARCEL 12/10/197 8 DURAND ADOLPHE 13/08/196 8 100 1 1 BEAU CAMPUS 12 rue de la recherche 100 1 1 BEAU CAMPUS 12 rue de la recherche DUPUY ELIANE 12/12/196 5 80 2 2 CHEZ GERMAINE 33 rue des fayots DUPONT ARMELLE 05/04/198 5 100 1 1 BEAU CAMPUS 12 rue de la recherche 3.2.2. L union Création d une table contenant les lignes présentes dans au moins une table parmi deux, les deux tables ayant même schéma. Exemple Soit la table Worker (last name, first name) Last name SMITH DUPUY KRUGER EPICURE First name JOHN ELIANE HANS DANTE Infotique - 30 -

Personne(nom, prénom) UNION Worker (last name, first name) nom MARTIN DUPOND DURAND DUPUY DUPONT EPICURE SMITH KRUGER prénom ALBERT MARCEL ADOLPHE ELIANE ARMELLE DANTE JOHN HANS Le résultat est compose des colonnes nom et prénom et des lignes présentes dans au moins une des deux table. En général, l opération d union s effectue sur deux projections. 3.2.3. L intersection Création d une table contenant les lignes présentes dans deux tables ayant mêmesschéma. Exemple Soit la table Worker (last name, first name) Personne(nom, prénom) INTERSECT Worker (last name, first name) nom DUPUY EPICURE prénom ELIANE DANTE Le résultat est compose des colonnes nom et prénom et des lignes présentes dans les deux tables (nom = last name et prénom = first name). En général, l opération d intersection s effectue sur deux projections. 3.2.4. La différence Création d une table contenant les lignes présentes dans une table parmi deux mais pas dans la seconde, les deux tables ayant même schéma. Infotique - 31 -

Exemple Soit la table Worker (last name, first name) Personne(nom, prénom) MINUS Worker (last name, first name) nom MARTIN DUPOND DURAND DUPONT prénom ALBERT MARCEL ADOLPHE ARMELLE Le résultat est composé des colonnes nom et prénom et des lignes présentes dans la table Personne et pas dans la table Worker. En général, l opération différence s effectue sur deux projections. 3.3. LES AGREGATS Création d une table par «agrégation» des lignes de la table sur les valeurs d une colonne. La fonction d agrégat s utilise généralement avec une fonction de synthèse : somme, compte, moyenne Exemple Agrégat (Personne, quotité, nombre (personnes)) quotité Nombre personnes 50 1 80 2 100 3 4. Les contraintes Cette question a été traitée en partie dans les chapitres consacrés aux modèles conceptuels des données. La qualité des données stockées dans une base de données est étroitement liée au respect des règles de gestion par celles-ci représentées par des contraintes déclarées par le concepteur et prises en charge par le SGBD lui-même ou par des procédures ad hoc (triggers et procédures stockées). Les contraintes présentées ci-dessous doivent être associées aux descriptions de table afin d être prise en charge par le SGBD plutôt que par des programmes ad hoc. Infotique - 32 -

4.1. L INTEGRITE DES BASES DE DONNEES Une base de données est dite intègre si les données contenues respectent l ensemble des règles de gestion régissant les valeurs de celles-ci ainsi que leurs associations. Une opération de mise à jour doit prendre la base dans un état d intégrité 1 et la rendre dans un état d intégrité 2. 4.2. CONTRAINTES SUR UNE COLONNE 4.2.1. Contrainte d existence La colonne doit posséder une valeur. Cette contrainte s implémente de la façon suivante : Colonne NOT NULL Cette contrainte est notamment utilisée sur les clefs étrangères implémentant une patte d association dont la cardinalité minimum est de 1. 4.2.2. Contrainte d unicité La colonne ne doit pas contenir deux fois la même valeur. Cette contrainte s implémente de la façon suivante : UNIQUE (colonne1, colonne2 ) 4.2.3. Contrainte de clef primaire Cette contrainte s implémente de la façon suivante : Colonne PRIMARY KEY Ou : PRIMARY KEY (colonne) Infotique - 33 -

4.2.4. Contraintes de domaine La colonne obéit à certaines restrictions de valeurs : plage de valeurs. Cette contrainte s implémente avec la clause CHECK Cette contrainte s implémente de la façon suivante : CHECK (condition de validité) La clause CHECK peut indiquer par exemple une valeur numérique minimale et maximale Colonne CHECK (Colonne > 0 AND Colonne <1000 Ou : Colonne CHECK (VALUE > 0 AND VALUE <1000) VALUE peut être utilisée à la place du nom de la colonne lorsqu il n y a pas d ambiguïté (lorsque la contrainte ne porte que sur la colonne en cours de déclaration. La clause CHECK peut indiquer par exemple un domaine Colonne CHECK (VALUE IN(50,60,70,80,90,100)) Il est possible de déclarer une contrainte plus générale, portant sur plusieurs colonnes, avec la clause CHECK à condition de créer une contrainte nommée à l aide de la déclaration CONSTRAINT. CONSTRAINT nom contrainte CHECK ( ) La clause CHECK permet d utiliser: les opérateurs booléens AND, OR, NOT les opérateurs arithmétiques +, -, *, / les opérateurs de comparaison >, < >=, <= le marqueur NULL des expressions SQL : BETWEEN, IN Tous les SGBD n implémentent pas la clause CHECK. En particulier, la version 5.1 de MySQL permet de déclarer ce type de contraintes mais celles-ci ne sont pas opérationnelles. 4.2.5. Contrainte de stabilité La valeur affectée à une colonne ne peut être mise à jour. Infotique - 34 -

4.3. CONTRAINTES D INTEGRITE REFERENTIELLE Cette contrainte concerne la valeur des clefs étrangères qui doivent être présentes dans les colonnes clefs primaires qu elles réfèrent. Soit les deux relations : Personne (idpersonne, nompersonne, idunité) Unité (idunité, codeunité, titreunité) Par exemple : une personne ne peut être affectée à un service que dans la mesure où celui-ci existe. Il existe une contrainte d intégrité référentielle entre la clef étrangère idunité dans la relation Personne et la clef primaire idunité de la table Unité : toutes les valeurs de idunité dans la relation Personne doivent exister dans idunité de la table Unité. Toutes les clefs étrangères sont concernées par cette contrainte. La contrainte d intégrité référentielle doit être examinée vis-à-vis des trois opération de mise à jour des données : L insertion La modification La suppression La question est triviale vis-à-vis de l insertion : l intégrité référentielle est assimilée à une contrainte de domaine : la valeur d une clef étrangère doit être prise dans la liste des valeurs d une clef primaire référencée. La syntaxe normalisée pour implémenter une contrainte d intégrité référentielle entre une clef étrangère et une clef primaire est : FOREIGN KEY(colonne clef étrangère) REFERENCES Table(colonne clef primaire) Vis-à-vis des opérations de modification et de suppression, deux options sont possibles : Empêcher l opération de modification ou de suppression d une valeur de clef primaire si celle-ci est utilisée par une clef étrangère : interdiction de modifier le code d un site ou de supprimer un site auquel sont affectés des personnes. La syntaxe normalisée est : ON UPDATE NO ACTION et ON DELETE NO ACTION. Propager la modification ou la suppression d une clef primaire dans la table contenant une clef étrangère référençant cette même clef primaire : si l on modifie la clef primaire d une table site (ce qui ne devrait jamais se produire), on modifie automatiquement les valeurs correspondantes de clefs étrangères utilisées pour décrire les affectations ; si l on supprime un site, on supprime également toutes les affectations à ce site. La syntaxe normalisée est : ON UPDATE CASCADE et ON DELETE CASCADE. Infotique - 35 -

5. Les règles de normalisation Les règles de normalisation sont des règles applicables à la structuration d une base de données dans le but de se prémunir de certaines anomalies de lecture, d écriture, de redondance de données et de garantir la cohérence des données et un bon niveau de performance. La normalisation des bases de données correspond en partie aux règles de non redondance et de non multivaluation appliquées aux modèles conceptuels de données. Ne sont examinées ci-dessous que les trois premières formes normales. 5.1. PREMIERE FORME NORMALE Une base de données est en première forme normale si les colonnes contiennent toutes des valeurs : Atomiques du point de vue des choix de gestion Non répétitives Par exemple, une colonne nompersonne peut être considérée comme une propriété atomique si on ne s intéresse pas au nom d usage des femmes mariées ou non atomique sinon. 5.2. DEUXIEME FORME NORMALE Une base de données est en deuxième forme normale si elle est en première forme normale et si toutes les colonnes non clefs dépendent de la totalité de la clef. Cette règle ne s applique qu aux tables dont la clef primaire est une collection de plusieurs propriétés. Exemple Une table Classe (niveau, numéro, âge d entrée) dont un exemple serait (6 ème, A2, 11 ans) et dont la clef primaire serait (niveau, numéro) n est pas en deuxième forme normale car l âge d entrée ne dépend que du niveau et pas du numéro de la classe. Cette structure impliquerait que l on répète le même âge d entrée (11 ans) pour toutes les 6 ème et impliquerait d éventuelles anomalies de mise à jour si l âge d entrée des 6 ème était modifié. 5.3. TROISIEME FORME NORMALE Une base de données est en troisième forme normale si elle est en deuxième forme normale et si toutes les colonnes n appartenant pas à la clef ne dépendent pas d une colonne non clef. Cette règle interdit les dépendances transitives sources de redondances de données. Une table Site (code site, nom du site, ville, pays) et dont la clef primaire est code site n est pas en troisième forme normale car pays est en dépendance de ville (ou en dépendance transitive de la clef code site). Infotique - 36 -

Cette structure impliquerait que l on répète le même pays pour la même ville et impliquerait d éventuelles anomalies de mise à jour si une ville changeait de pays. 6. Les règles de traduction modèles conceptuels de données -> schémas relationnels 6.1. TRADUCTION DES ENTITES Les règles de traduction d une entité sont plutôt triviales : Une entité se traduit par une table Une propriété se traduit par une colonne Un identifiant se traduit par une clef primaire 6.2. TRADUCTION DES ASSOCIATIONS Les règles de traduction des associations sont à peine moins triviales Une association peut se traduire de deux façons différentes selon la situation. 6.2.1. Association binaire, cardinalité maximum de 1 Dans le cas d une association binaire où une patte porte une cardinalité maximum de A, l association se traduit par la création d une clef étrangère dans la table «source», c'est-à-dire la table dont la patte d association porte la cardinalité maximum de 1. Exemple Ce modèle se traduit par deux tables : Personne (numéro agent, nom agent, code grade) Grade (code grade, intitulé grade) Infotique - 37 -

Les clefs primaires sont soulignées. 6.2.2. Autres associations Dans tous les autres cas, l association se traduit par une table contenant autant de clefs étrangères que d entités participant à l association. Exemple Ce modèle est traduit par trois tables : Unité (code unité, titre unité) Ville (code ville, nom ville) Implantation (code unité, code ville) 7. Exemple récapitulatif Il s agit de modéliser les données correspondant au dictionnaire des données et au dictionnaire des règles présentées ci-dessous : Domaine : affectation de personnes à des sites. 7.1. DICTIONNAIRE DES DONNEES Nom de personne Prénom de personne Date d entrée dans l organisme (pas dans le site) Statut : permanent ou non permanent Quotité de travail Nom du supérieur hiérarchique (n+1) Prénom du supérieur hiérarchique Nom du site d affectation Adresse du site Infotique - 38 -

Surface du site Pays du site 7.2. DICTIONNAIRE DES REGLES Une personne a aucun ou un supérieur hiérarchique Une personne est le supérieur hiérarchique d aucune, d une ou de plusieurs personnes Une personne est affectée à aucun site, un site ou plusieurs sites Un site est entièrement situé dans un pays 7.3. ENONCE Il est demandé : 1) De construire le modèle Entités / Associations 2) D installer DBDesigner v 4 3) De construire le modèle avec DBDesigner 4) D examiner la traduction modèle conceptuel -> schéma relationnel 5) De générer le script SQL de génération des tables avec les options : ranger les tables par FK, définir clé primaire, définir les préférences FK autorisées par l éditeur de relations, option sortie de table, sortie d insertion standard, sans les options créer indices et sortir commentaires. 7.4. SOLUTION Sont présentées ci-dessous : Un modèle conceptuel des données «pur» (WinDesign) Un diagramme de classe UML limité aux données Un modèle logique (ou schéma relationnel) Le script de création de la base de données 7.4.1. Modèle Conceptuel des Données (Entités / Associations) complet Ce modèle prévoit d introduire une date d affectation et de conserver l historique de celles-ci. Une personne pouvant être affectée successivement plusieurs fois à la même unité, date constitue une entité participant à l association affecté. Infotique - 39 -

7.4.2. Diagramme de classe UML 7.4.3. Modèle logique des données Infotique - 40 -

7.4.4. Modèle de données avec DBDesigner La présentation proposée par DBDesigner est intermédiaire entre les modèles conceptuels des données (Entités / Association) qui ne font pas apparaitre les clefs étrangères et les modèles logiques. L intérêt du produit est d être open source et gratuit et de permettre la génération de code SQL de bonne qualité pour la création de la base de doonées.. Infotique - 41 -

7.4.5. Script de création des tables CREATE TABLE Personne ( idpersonne INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Personne_idPersonne INTEGER UNSIGNED NOT NULL, nompersonne VARCHAR(255) NULL, prenompersonne VARCHAR(255) NULL, dateentree DATE NULL, statutpersonne BOOL NULL, quotitepersonne INTEGER UNSIGNED NULL, PRIMARY KEY(idPersonne), FOREIGN KEY(Personne_idPersonne) REFERENCES Personne(idPersonne) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE Pays ( idpays INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, nompays VARCHAR(255) NULL, PRIMARY KEY(idPays) ); CREATE TABLE Site ( idsite INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Pays_idPays INTEGER UNSIGNED NOT NULL, nomsite VARCHAR(255) NULL, adressesite VARCHAR(255) NULL, surfacesite INTEGER UNSIGNED NULL, PRIMARY KEY(idSite), FOREIGN KEY(Pays_idPays) REFERENCES Pays(idPays) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE Affectations ( Personne_idPersonne INTEGER UNSIGNED NOT NULL, Site_idSite INTEGER UNSIGNED NOT NULL, PRIMARY KEY(Personne_idPersonne, Site_idSite), FOREIGN KEY(Personne_idPersonne) REFERENCES Personne(idPersonne) ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY(Site_idSite) REFERENCES Site(idSite) ON DELETE NO ACTION Infotique - 42 -

); ON UPDATE NO ACTION Infotique - 43 -

SQL 1. Préambule 1.1. OBJECTIFS DE SQL L objectif de SQL est d implémenter les opérateurs relationnels dans un langage proche du langage naturel. SQL = Structured Query Language 1.2. NORMES Il existe trois normes successives de SQL : 1) SQL1 (ou SQL 89) représentant la norme de base sur laquelle s alignent la quasi-totalité des SGBDR 2) SQL2 (ou SQL 92) divisé en trois ensemble : Entrée (équivalent à SQL1), Intermédiaire qui ajoute la possibilité de modifier des schémas et enrichit le langage de contraintes, Complet. La plupart des SGBDR récents implémentent SQL2 intermédiaire. 3) SQL3 qui étend SQL2 avec l intégration d instructions procédurales et une approche objet. Cette norme a fait l objet de plusieurs révisions, n est implémentée aujourd hui par aucun SGBDR et demeure contestée. 1.3. UTILISATION DE SQL SQL s utilise soit en mode interactif, soit intégré dans un programme procédural ou objet. Le langage SQL se divise en trois ensembles : Le langage de description de schémas (LDD) Le langage de manipulation des données (mise à jour et accès aux données) Le langage de contrôle des données Infotique - 44 -

2. La création et la modification de schémas 2.1. CREATION DE SCHEMA CREATE DATABASE nom de base ; Exemple CREATE DATABASE Personnel ; 2.2. CREATION DE TABLE CREATE TABLE nom de table (nom de colonne1 type, nom de colonne2 type,, nom de colonnen type) ; Des contraintes peuvent être associées à la table Valeur obligatoire : colonne NOT NULL Clef primaire : PRIMARY KEY Unicité : UNIQUE (colonne1, ) Validation générale: CHECK prédicat Clef étrangère et intégrité référentielle : FOREIGN KEY REFERENCES nom de table (nom de colonne) Intégrité référentielle vis-à-vis des opération de mise à jour : ON DELETE ou ON UPDATE NO ACTION, CASCADE ou SET NULL Autres contraintes sur une colonne : CHECK (prédicat) Contraintes générales : CONSTRAINT nom contrainte CHECK (prédicat) Exemple Création de la Table Personne (voir modèle de référence plus haut) CREATE TABLE Personne ( idpersonne INTEGER NOT NULL AUTO_INCREMENT, nompersonne VARCHAR(255) NULL, prenompersonne VARCHAR(255) NULL, datenaissance DATE NULL, Infotique - 45 -

quotitepersonne INTEGER UNSIGNED NULL CHECK (quotitepersonne IN(50,60,70,80,90,100)), Personne_idEtablissement INTEGER, PRIMARY KEY(idPersonne), FOREIGN KEY(Personne_idEtablissement) REFERENCES Etablissement(idEtablissement) ON DELETE NO ACTION ON UPDATE NO ACTION ); La clause CHECK. N est pas opérationnelle avec les versions actuelles (juillet 2009) de MySQL Une table peut être créée à partir d une requête de sélection. CREATE TABLE Travailleurs AS (SELECT nompersonne, prenompersonne, dateentree,statutpersonne WHERE quotitepersonne>70) WITH DATA 2.3. MODIFICATION DE TABLE 2.3.1. Ajouter une colonne ALTER TABLE nom de table ADD COLUMN nom colonne type ; 2.3.2. Modifier le nom d une colonne ALTER TABLE nom de table CHANGE ancien nom colonne nouveau nom colonne type 2.3.3. Modifier le type d une colonne ALTER TABLE nom de table MODIFY nom colonne nouveau type Exemple 2.3.4. Supprimer une colonne ALTER TABLE nom de table DROP COLUMN nom colonne ; Exemple Ajout d une colonne «indice» à la table Personne ALTER TABLE Personne Infotique - 46 -

ADD COLUMN indice INTEGER ; Renommer la table indice en indicepaie ALTER TABLE Personne CHANGE COLUMN indice indicepaie INTEGER ; Modifier le type de la colonne indiciepaie en FLOAT ALTER TABLE Personne MODIFY COLUMN indicepaie FLOAT; Supprimer la colonne» indice» ALTER TABLE Personne DROP COLUMN indice; 2.4. AJOUTER DES CONTRAINTES ALTER TABLE nom table ADD CONSTRAINT nom contrainte CHECK ( ) 2.5. SUPPRESSION DE TABLE DROP TABLE nom de table ; 2.6. CREATION DE VUES CREATE VIEW nom vue AS (SELECT col1, FROM Table WHERE prédicat) Exemple Création d une vue «TP» des personnels (nom, prénom, quotité) pour les personnes travaillant à temps partiel. Infotique - 47 -

CREATE VIEW TP AS (SELECT nompersonne AS nom, prenompersonne AS prenom, quotitepersonne AS quotite FROM personne WHERE quotitepersonne < 100) 3. La mise à jour des données 3.1. INSERTION DE LIGNES INSERT INTO nom de table (col1, col2,, coln) VALUES (val11, val12,, val1n), (val21, val22,, val2n), (val31, val32,, val3n), (val41, val42,, val4n) ; Ou INSERT INTO nom de table (col1, col2,, coln) SELECT col1, col2,, coln FROM nom de table Exemple Insertion d une nouvelle personne. INSERT INTO personne (nompersonne,prenompersonne,datenaissancepersonne,quotitepersonne,idetablis sement) VALUES ('JEANOT','FREDERIQUE','1970-10-20',100,2) ; 3.2. MODIFICATION UPDATE nom de table SET col = val Infotique - 48 -

WHERE prédicat ; Exemple Ajouter à nouveau une colonne indice de type entier. Mettre l indice à 1000 pour ceux dont la quotité est supérieure ou égale à 80. UPDATE Personne SET indicepersonne = 1000 WHERE quotitepersonne >=80 Modification utilisant une sous-requête On veut augmenter de 50% l indice des personnes dont la quotité est la plus élevée. UPDATE Personne SET indicepersonne = indice*1.5 WHERE quotitepersonne = (SELECT MAX(quotitePersonne) FROM personne) Suivant les SGBD, il n est pas toujours possible d exécuter une requête de modification en utilisant une sous-requête portant sur cette même table. On veut augmenter de 100% l indice des personnes travaillant dans un établissement dont le nom contient l expression CAMPUS. UPDATE personne SET `indicepersonne`=`indicepersonne`*2 WHERE `idetablissement` IN (SELECT idetablissement FROM etablissement WHERE nometablissement LIKE '%CAMPUS%') On veut modifier remplacer l indice d une personne par l indice de la même personne que l on trouve dans la table promus UPDATE personne, promus SET personne.indicepaie = promus.indicepaie WHERE personne.nompersonne = promus.nompromu Infotique - 49 -

3.3. SUPPRESSION DE LIGNES DELETE FROM nom table WHERE prédicat ; 4. La consultation des données 4.1. FORME CANONIQUE DES REQUETES SELECT SELECT [DISTINCT ou ALL] * ou liste de colonnes FROM nom de table ou de la vue [WHERE prédicats] [GROUP BY ordre des groupes] [HAVING condition] [ORDER BY ] liste de colonnes Le délimiteur de chaîne est l apostrophe (simple quote). Exemple Afficher toutes les colonnes de la table personne triées par ordre décroissant des quotités. SELECT * FROM personne ORDER BY quotitepersonne DESC; 4.2. LES OPÉRATEURS : BOOLÉENS, BETWEEN, LIKE 4.2.1. Opérateurs booléens AND, OR, NOT Utilisation de parenthèses Exemple Afficher les personnes née savant 1970 et dont la quotité est 50 ou 100. Infotique - 50 -

SELECT * FROM personne WHERE datenaissancepersonne <'1970-01-01' AND (quotitepersonne = 50 OR quotitepersonne = 100) 4.2.2. BETWEEN Recherche entre deux valeurs SELECT * FROM Table1 WHERE colonne BETWEEN valeur1 AND valeur2 Exemple Afficher le nom et la date de naissance des personnes nées en 1985. SELECT * FROM `personne` WHERE datenaissancepersonne BETWEEN '1985-01-01' AND '1985-12-31' 4.2.3. La valeur NULL NULL représente l absence de valeur. SELECT * FROM Table WHERE col IS NULL ; Exemple Afficher les personnes n étant pas affectées à un établissement SELECT * FROM personne WHERE idetablissement IS NULL 4.2.4. LIKE Recherche par troncature (caractère % ) SELECT * FROM nom de table WHERE colonne LIKE valeur% Exemple Afficher le nom des personnes dont le nom commence par la lettre «D» Infotique - 51 -

SELECT * FROM `personne` WHERE nompersonne LIKE 'D%' 4.2.5. Utilisation d Alias Une colonne peut être associée à un alias : SELECT col AS nouvellecol Exemple Afficher le nom et le prénom des personnes (en utilisant «NOM» et «PRENOM» comme titre de colonne). SELECT nompersonne as NOM, prenompersonne AS PRENOM FROM personne 4.3. UTILISATION DE FONCTIONS SQL SQL permet d utiliser un grand nombre de fonctions de type chaine de caractères, numérique et date. 4.3.1. Fonctions chaînes de caractères 4.3.1.1. Concaténation CONCAT(c1, c2, ) Exemple SELECT CONCAT (nompersonne,,prenompersonne) AS identite FROM personne 4.3.1.2. Extractions de chaînes de caractères SUBSTR(c, position de début, nombre de caratères) Exemple Afficher les 3 premières lettres du nom de chacune des personnes. Infotique - 52 -

SELECT SUBSTR(nomPersonne, 1, 3) as Code FROM personne Peuvent être également utilisées les fonctions LEFT, RIGHT, MID, 4.3.1.3. Longueur de caractères CHAR_LENGTH 4.3.1.4. Minuscules et majuscules LOWER(c) : transforme les majuscules en minuscules UPPER(c) : transforme les minuscules en majuscules 4.3.1.5. Suppression des espaces inutiles TRIM() : supprime les espaces à gauche et à droire RTRIM() : supprime les espaces à droite LTRIM() : supprime les espaces à gauche 4.3.2. Fonctions numériques Les principales fonctions numériques sont les suivantes : ABS() : valeur absolue CEILING() : arrondit à l entier supérieur FLOOR() : retourne l entier inférieur MOD() : modulo POW() : puissance ROUND() : arrondit à l entier supérieur ou inférieur SQRT() : racine carré 4.3.3. Fonctions date CURDATE() : date courante CURTIME() : heure courante NOW() : date et heure courantes ADDDate(d, n) : ajoute n jours à la date d ADDATE( ) : ajoute un intervalle à la date initiale DATEDIFF(d1, d2) : nombre de jours entre d1 et d2 Infotique - 53 -

DATE_FORMAT(d, format) : formate la date DAYNAME(d) : nom (anglais) du jour DAYOFMONTH(d) DAYOFWEEK() DAYOFYEAR() MONTH() MONTHNAME() TIMESTAMP() WEEK() WEEKDAY() YEAR() Exemple On veut ajouter 3 mois à une date donnée SELECT ADDDATE('2008-12-31', INTERVAL 3 MONTH) 4.3.4. Formats de date et d heure d% : numéro du jour sur 2 chiffres D% : nom du jour avec suffixe anglais W% : nom du jour de la semaine (anglais) m% : numéro du mois sur 2 chiffres M% : nom du mois (anglais) y% : année sur 2 chiffres Y% : année sur 4 chiffres Exemple SELECT DATE_FORMAT('2008-12-31', '%d/%m/%y') 4.4. LES AGREGATS SELECT col, fonction(s) de synthèse FROM Table GROUP BY col HAVING prédicat Infotique - 54 -

Les fonctions de synthèse sont : SUM, COUNT, AVG, MIN, MAX Exemple Compter le nombre de personnes travaillent à temps partiel par quotités SELECT quotitepersonne AS Quotite, COUNT(*) AS Effectifs FROM personne GROUP BY quotitepersonne HAVING quotitepersonne < 100 4.5. LES JOINTURES 4.5.1. Jointure naturelle SELECT col1, col2 FROM Table1 INNER JOIN Table2 ON FK = PK FK désigne une clef étrangère, PK une clef primaire. Exemple Afficher le nom des personnes et le nom du site auquel elles sont affectées. SELECT nompersonne, nometablissement FROM personne INNER JOIN etablissement ON Personne.idEtablissement = etablissement.idetablissement Autre syntaxe L ancienne syntaxe SQL est toujours utilisable SELECT nompersonne, nometablissement FROM personne, etablissement WHERE personne.idetablissement = etablissement.idetablissement 4.5.2. Jointures externes SELECT col1, col2 FROM Table1 LEFT (RIGHT) OUTER JOIN Table2 ON FK = PK FK désigne une clef étrangère, PK une clef primaire. Exemple Infotique - 55 -

Afficher le nom des personnes (y compris les personnes n étant affectées nulle part) et le nom du site auquel elles sont affectées. SELECT nompersonne, nometablissement FROM personne LEFT OUTER JOIN etablissement ON Personne.idEtablissement = etablissement.idetablissement 4.6. LES OPERATEURS ENSEMBLISTES 4.6.1. L union SELECT col1, col2 FROM Table1 UNION SELECT col1, col2 FROM Table2; Exemple Afficher le nom des personnes présentes dans la table personne ou (inclusif) dans la table workers. SELECT nompersonne, prenompersonne FROM personne UNION SELECT lastnameworker, firstnameworker FROM worker 4.6.2. L intersection SELECT col1, col2 FROM Table1 INTERSECT SELECT col1, col2 FROM Table2; Exemple Afficher le nom des personnes présentes dans la table personne et aussi dans la table workers. SELECT nompersonne, prenompersonne FROM personne WHERE nompersonne IN (SELECT lastnameworker FROM workers) AND prenompersonne IN (SELECT firstnameworker FROM workers) 4.6.3. La différence SELECT col1, col2 FROM Table1 MINUS SELECT col1, col2 FROM Table2; Exemple Infotique - 56 -

Afficher le nom des personnes présentes dans la table personne et pas dans la table workers SELECT nompersonne, prenompersonne FROM personne WHERE nompersonne NOT IN (SELECT lastnameworker FROM workers) 4.7. LES SOUS-REQUETES Les requêtes contenant des sous-requêtes doivent être distinguées suivant que celle-ci est susceptible de ne renvoyer qu une seule ligne de résultat ou plusieurs lignes de résultat. Si la sous-requête ne renvoie à coup sur (structurellement) qu une seule ligne, la sous-requête peut être introduite par les opérateurs : =, >, >= Exemple Afficher les noms dont la quotité est inférieure à la moyenne des quotités. SELECT nompersonne FROM personne WHERE quotitepersonne < (SELECT AVG(quotitePersonne) FROM personne) Les opérateurs ANY et ALL permettent d introduire une sous-requête avec les opérateurs : =, >, >= Exemple Afficher les noms des personnes présentes dans la table personne et dans la table workers (intersection) SELECT nompersonne FROM personne WHERE nompersonne = ANY (SELECT lastnameworker FROM workers) Si la requête est susceptible de renvoyer plusieurs valeurs, la sous-requête doit être introduite par les opérateurs : IN, NOT IN, EXISTS SELECT * FROM Table1 WHERE col IN (SELECT col FROM Table2 WHERE prédicat) Afficher le nom et la quotité des personnes ayant la même quotité qu une personne du site «BEAU CAMPUS» Infotique - 57 -

SELECT `nompersonne`,`quotitepersonne` FROM `personne` WHERE quotitepersonne IN (SELECT `quotitepersonne` FROM personne INNER JOIN etablissement ON personne.idetablissement = etablissement.idetablissement WHERE nometablissement = 'BEAU CAMPUS') 5. Le contrôle des autorisations 5.1. ACCORDER UNE AUTORISATION GRANT privilèges TO utilisateur ON WITH GRANT OPTIONS Privilèges : INSERT, UPDATE, DELETE, ALL La clause WITH GRANT OPTIONS optionnelle permet à l utilisateur de transmettre les privilèges reçus. 5.2. REVOQUER UNE AUTORISATION REVOKE privilèges TO utilisateur ON Infotique - 58 -

MYSQL ET PHP 1. MySQL brève présentation MySQL est un Système de Gestion de Base de Données Relationnelles multithreads et multiutilisateurs. MySQL est fortement couplé au serveur web Apache et à PHP via notamment les quatuors LAMP, WAMP et MAMP (Macintosh). MySQL est supporté par la grande majorité des hébergeurs Web. Depuis le rachat de MySQL par Sun puis par Oracle, MySQL est présenté comme le SGBD devant être utilisé conjointement à Java. MySQL est un SGBD qui suivant son usage est en licence libre ou propriétaire. MySQL est un SGBD orienté davantage «fournisseur de données» (efficacité en consultation) que gestion de grandes quantités de transactions simultanées. MySQL supporte la norme SQL2. MySQL peut gérer les transactions et les contraintes d intégrité référentielles. 2. Utilisation de MySQL Une base de données peut être manipulée avec MySQL : En mode commande Via l utilitaire PHPMYADMIN Via un programme (par exemple un programme PHP) 2.1. L UTILISATION EN MODE COMMANDE Infotique - 59 -

2.1.1. Connexion au serveur et manipulation des données Bases de données relationnelles & SQL Après avoir éventuellement modifié la variable d environnement, il faut exécuter la commande de connexion au serveur de la façon suivante (le serveur ayant été préalablement lancé). La syntaxe générale est : mysql u nom utilisateur pmot de passe (pas d espace entre le p et le mot de passe éventuel). Une autre syntaxe est possible : mysql u nom utilisateur p Le serveur MySQL demandera alors un mot de passe. Il est alors possible de : Créer une base de données Créer, modifier, supprimer des tables Créer, modifier, supprimer des données Sélectionner des données Créer de nouveaux utilisateurs et leur accorder des privilèges Il est aussi possible, plutôt que d exécuter des commandes au clavier, d exécuter un script SQL. La syntaxe est la suivante : mysql u nom utilisateur pmot de passe <fichier de script Infotique - 60 -

2.1.2. Exercices en mode commande Pour traiter les exercices qui suivent, il est indispensable de posséder les autorisations nécessaires sur la base de données. Première partie création d une base de données 1) Examiner le script généré par DBDesigner sur le modèle Annuaire 2) Exécuter ce script 3) Afficher la liste des bases de données sur le serveur MySQL 4) Afficher la liste des tables de la base annuaire 5) Examiner le script fourni et interpréter les différences (IF EXISTS, nouvelle colonne dans Personne ) 6) Exécuter le script Deuxième partie écriture de requêtes SQL Modifications du schéma 1) Ajouter la colonne indicepersonne de type entier dans la table Personne 2) Ajouter la colonne dateaffectation de type date dans la table Affectations 3) Modifier le nom de la colonne Personne_idPersonne par Personne_idChef 4) Ajouter une table worker (lastname, firstname, indicepaie) Mises à jour 5) Attribuer un indice à chacune des personnes 6) Renseigner la table worker en y plaçant deux personnes figurant dans la table personne mais avec un indice supérieur 7) Modifier le nom du site «Guten Tag Schule» par «Wunderbar Schule» 8) Augmenter tous les indices de 15% 9) Modifier l indice des deux personnes présents dans les deux tables en changeant l indice de la table personne par celui de la table worker 10) Remplacer le grand chef par SMITH. L ancien grand chef devient le subordonné de SMITH Sélections 11) Afficher le contenu de la table personne trié par ordre alphabétique des noms Infotique - 61 -

12) Afficher le nom et le prénom dont la quotité est inférieur à 100 13) Afficher le nom et le prénom des personnes entrées avant 2004 et dont la quotité est inférieure à 100 14) Afficher le nom et le prénom des personnes entrées en 2005 15) Afficher les noms de personnes commençant par la lettre D 16) Afficher les noms de personnes ne contenant pas la lettre e 17) Afficher le nom et le prénom du grand chef 18) Afficher le nombre de jour passés dans l entreprise pour chacune des personnes 19) Afficher la date du 20 ème anniversaire de présence dans l entreprise pour chacune des personnes 20) Afficher la concaténation du nom et du prénom de chacune des personnes, le nom et le prénom commençant par une majuscule, les autres caractères en minuscules, un espace de séparation 21) Afficher le nom des personnes et l adresse de leur site 22) Afficher le nom des personnes et l adresse de leur site pour les sites dont la surface est inférieure à 5000 23) Afficher le nom et la quotité des personnes en regard du nom et de la quotité de leur supérieur 24) Afficher le nombre de personnes par quotité, le titre de la colonne de comptage est Effectifs (utiliser un alias) 25) Calculer le nombre d ETP par pays (jointure et regroupement) 26) Afficher le nom des personnes se trouvant soit dans la table personne, soit dans le table worker 27) Afficher le nom des personnes se trouvant dans la table personne et dans le table worker 28) Afficher le nom des personnes se trouvant dans la table personne et pas dans la table worker 29) Afficher le nom des personnes travaillant sur un site sur lequel travaillent au moins 3 personnes (sous-requête) 30) Afficher le nom et la quotité des personnes dont la quotité est inférieure ou égale à toutes les quotités des personnes affectées au site «BEAU CAMPUS» 31) Afficher le nom des personnes travaillant dans le même site que leur supérieur hiérarchique 32) Créer une vue affichant toutes les colonnes des personnes travaillant en France 33) Afficher le nom de toutes les personnes travaillant en France à temps partiel (à partir de la vue précédente) Solution de la requête 31. Il s agit d une requête corrélée Une colonne de la sous requête est associée à une colonne de la requête extérieure Chaque ligne de la requête extérieure est évaluée par rapport à chacune des lignes de la requête intérieure (double boucle). SELECT E.nomPersonne FROM personne E INNER JOIN affectations ON E.idPersonne= affectations.personne_idpersonne WHERE affectations.site_idsite NOT IN (SELECT affectations.site_idsite FROM affectations INNER JOIN personne C ON affectations.personne_idpersonne = C.idPersonne WHERE E.Personne_idchef=C.idPersonne) Infotique - 62 -

Solution pour la première partie 1) Voir les bases 2) Afficher les tables de la base annuaire 3) Exécuter le script 2.2. UTILISATION VIA L UTILITAIRE PHPMYADMIN L utilitaire PHPMYADMIN permet d effectuer les mêmes opérations en mode moins austère. Voir le chapitre ci-dessous 2.3. UTILISATION VIA UN PROGRAMME PHP La manipulation des données d une base de données hébergée par un serveur MySQL se fait en plusieurs étapes : 1) Obtention d une connexion au serveur MySQL 2) Accès à la base de données 3) Préparation de la requête 4) Exécution de la requête Infotique - 63 -

2.3.1. La connexion au serveur Bases de données relationnelles & SQL La connexion au serveur MySQL est obtenue en utilisant la fonction suivante : mysql_connect (hostname, utilisateur, mot de passe) La fonction renvoie un identifiant de connexion en cas de succès, FALSE accompagnée d un message d alerte en cas d échec. La déconnexion s exécute en utilisant la fonction : mysql_close(identifiant de connexion) La fonction renvoie True en cas de succès, False autrement 2.3.2. L accès à la base de données L accès à une base de données est obtenu en utilisant la fonction suivante : Mysql_select_db (identifiant connexion, nom de la base) La fonction renvoie True en cas de succès, False autrement 2.3.3. Préparation et exécution d une requête La requête (du texte SQL) est tout d abord placée dans une variable. La requête est exécutée par la fonction suivante : mysql_query (texte de la requête, identifiant de connexion) La fonction renvoie un identifiant de résultat de requête en cas de succès, FALSE en cas d échec lorsque la requête est prévue pour renvoyer un résultat (SELECT ). La fonction renvoie True en cas de succès, FALSE en cas d échec lorsque la requête est prévue pour ne pas renvoyer de résultat (requête de mise à jour). La fonction mysql_query() ne renvoie pas de donnée. Exemple Ecrire un script qui : 1. Etablisse une connexion le serveur MySQL 2. Accède à la base annuaire 3. Exécute une requête de type SELECT sur la table Personne (on ne demande pas de renvoyer le résultat) 4. Ajoute une ligne à la table Pays (Mali) 5. Ferme la connexion au serveur Le script devra tester le succès de chacune des opérations. Infotique - 64 -

<?php $nom_hote='localhost'; $user='infotique'; $password='agathe'; //connexion au serveur MySQL $connexion=mysql_connect($nom_hote,$user,$password); //0 = false, autres valeurs = true if($connexion) echo "Connexion au serveur $nom_hote établie<br>"; else echo "La tentative de connexion au serveur $nom_hote a échoué<br>"; //Accès à la base de données $db='annuaire'; $ok=mysql_select_db($db,$connexion); if($ok) echo "Accès à la base $db établi<br>"; else echo "La tentative d'accès àla base $db a échoué"; //préparation et exécution d'une requête $requete = "INSERT INTO Pays(nomPays) VALUES ('Mali')"; $resultat_requete = mysql_query($requete,$connexion); if($resultat_requete) echo "Requête exécutée<br>"; else echo "La requête a echoué<br>"; Infotique - 65 -

//déconnexion $ok=mysql_close($connexion); if($ok) echo "Déconnexion réussie<br>"; else echo "La tentative de déconnexion a échoué"; //déconnexion $ok=mysql_close($connexion); if($ok) else echo "Déconnexion réussie<br>"; echo "La tentative de déconnexion a échoué";?> Résultat Connexion au serveur localhost établie Accès à la base annuaire établi Requête exécutée Déconnexion réussie Suite Modifier la requête afin que le pays soit donné en paramètre. $nouveau_pays='belgique'; //préparation et exécution d'une requête $requete = "INSERT INTO Pays(nomPays) VALUES ('".$nouveau_pays."')"; Suite Tenter la même opération avec la république d Abkhazie Infotique - 66 -

$nouveau_pays=mysql_escape_string("rébublique d'abkhazie"); //préparation et exécution d'une requête $requete = "INSERT INTO Pays(nomPays) VALUES ('".$nouveau_pays."')"; $resultat_requete = mysql_query($requete,$connexion); On constate que l apostrophe figurant dans le nom du pays doit être échappée. L échappement des caractères pour MySQL est réalisé par la fonction : mysql_escape_string() 2.3.4. Affichage du résultat d une requête renvoyant un résultat (SELECT) Le principe d affichage des résultats d une requête est le suivant : 1) La requête SQL renvoie, en cas de succès, un identifiant de résultat 2) Le résultat est extrait ligne à ligne jusqu à la dernière ligne Les données renvoyées par la requête sont extraites ligne à ligne en exécutant une des fonctions suivantes : mysql_fetch_assoc(résultat de la requête) mysql_fetch_row(résultat de la requête) mysql_fetch_array(résultat de la requête, type) Ces fonctions retournent la ligne courante du curseur sous la forme d un tableau, chaque ligne du tableau correspondant à une colonne du curseur. Lorsque le curseur a été entièrement parcouru, la fonction renvoie NULL. La fonction Mysql_fetch_assoc (résultat de la requête) renvoie un tableau associatif dont la clef est les nom des colonnes renvoyées par la requête. Mysql_fetch_row (résultat de la requête) renvoie un tableau à indices entiers Mysql_fetch_array (résultat de la requête) renvoie un tableau dont le type est déterminé par un paramètre : MYSQL_NUM, MYSQL_ASSOC, MYSQL_BOTH. Exemple Afficher le nom de chaque personne, sa date d entrée, le nom du site et le pays dans lequel il travaille. Infotique - 67 -

3. Eléments d administration de MySQL L administration de MySQL peut s opérer par l utilitaire PHPMYADMIN 3.1. ADMINISTRER COMPTES UTILISATEURS ET AUTORISATION 3.1.1. Création d un nouvel utilisateur Pour accéder à la gestion des comptes utilisateurs, il faut sélectionner l onglet «Privilèges» Puis sélectionner la fonction «Ajouter un utilisateur», renseigner les rubriques et valider (exécuter). Infotique - 68 -

L utilisateur concerné a alors le privilège «USAGE», c'est-à-dire qu il peut obtenir une connexion au serveur MySQL. Il est possible d attribuer des privilèges globaux explicites pour l ensemble des bases de données ou de créer une base de données pour l utilisateur. L attribution de privilèges globaux à ce niveau est inutile. 3.1.2. Attribuer des autorisations pour une base de données Après l ajout d un utilisateur, il est possible de lui attribuer des autorisations sur une base existante. Un premier écran permet de sélectionner la base. L écran suivant permet de spécifier d une part les autorisations accordées et d autre part leur étendue, soit la base entière Infotique - 69 -

Soit une table de la base Il est vivement conseillé de ne pas attribuer le privilège «GRANT» (possibilité de transmettre les privilèges que l on possède) sans discernement. Il est possible de modifier les autorisations d un utilisateur. Il est possible de supprimer un utilisateur. 3.2. CREER UNE BASE DE DONNEES Nous allons créer une base de données «Personnel» composé de deux tables Personne (idpersonne, nompersonne, salaire, codeetablissement) Etablissement (idetablissement, nometablissement, adresseetablissement, surfaceetablissement) Infotique - 70 -

L utilitaire PHPMYADMIN permet de créer une base de données. L opération de création s effectue en deux temps : Création de la base de données Création du schéma (c'est-à-dire des tab les) 3.2.1. Création de la base de données 3.2.2. Création des tables Infotique - 71 -

La colonne idpersonne est de type «auto incrément» et constitue la clef primaire. Le résultat est le suivant : Pour la seconde table, le résultat est le suivant : Il est bien sur possible de modifier ou de supprimer des tables. 3.2.3. Créer une contrainte de clef étrangère (contrainte d intégrité référentielle) Infotique - 72 -

Pour créer une contrainte de clef étrangère avec MySQL, il est nécessaire que les données soient stockées au format «inno DB». Si cela n est pas le cas, il faut sélectionner la table, cliquer sur «Structure» puis sur l onglet «Opérations» puis changer le moteur de stockage. La colonne clef étrangère doit d autre part être indexée. Après avoir sélectionné la table contenant la clef étrangère concernée, cliquez sur le lien «Gestion des relations». Vous pouvez désigner la clef primaire associée à la clef étrangère et décider de l action à entreprendre en cas de suppression ou de modification de celle-ci. Le choix NO ACTION garantit qu il sera impossible de supprimer ou de modifier la clef primaire associé. La colonne clef étrangère doit impérativement être indexée. Le résultat de l action est le suivant : Infotique - 73 -

3.3. AFFICHER, INSERER, MODIFIER, SUPPRIMER DES DONNEES Dès qu une table contient une ligne, il est possible d insérer de nouvelles lignes, d en supprimer, d en modifier en passant par la fonction d affichage de la table. 3.4. EXECUTER DES REQUETES SQL L éditeur SQL permet de saisir du code SQL : Le résultat est présenté de la façon suivante : Infotique - 74 -

3.5. SAUVEGARDER, IMPORTER ET EXPORTER Il est possible de sauvegarder, d importer ou d exporter des bases de données ou des tables 3.5.1. Sauvegarder une base de données Après avoir sélectionné la base à sauvegarder, il faut cliquer sur l onglet «Exporter» pour obtenir l écran suivant : Dans cet écran, l exportation SQL est sélectionnée par défaut, elle est à conserver pour l opération de sauvegarde de la base de données. La sauvegarde concerne (c est heureux) à la fois la structure et à la fois les données. Le résultat (partiel) est le suivant : -- phpmyadmin SQL Dump -- version 3.1.1 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mer 17 Juin 2009 à 12:30 -- Version du serveur: 5.1.30 -- Version de PHP: 5.2.8 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `annuaire` -- Infotique - 75 -

-- -------------------------------------------------------- -- -- Structure de la table `pays` -- CREATE TABLE IF NOT EXISTS `pays` ( `idpays` int(10) unsigned NOT NULL AUTO_INCREMENT, `nompays` varchar(255) DEFAULT NULL, PRIMARY KEY (`idpays`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; -- -- Contenu de la table `pays` -- INSERT INTO `pays` (`idpays`, `nompays`) VALUES (1, 'France'), (2, 'Allemagne'), (3, 'Italie'); -- -------------------------------------------------------- Il s agit d un code SQL constitué principalement de requêtes CREATE TABLE et INSERT INTO qui pourra être exécutée sur la même machine ou une autre machine pour recréer la base de données (structure et données). 4. Exemple récapitulatif 4.1. PREMIER EXEMPLE RECHERCHE DANS UNE BASE DE DONNEES ET AFFICHAGE DU RESULTAT DANS UN FORMULAIRE Enoncé Infotique - 76 -

On souhaite construire un formulaire permettant d afficher les personnes (nom, prénom, date d entrée et quotité) travaillant dans un pays donné (c'est-à-dire dans un site implanté dans un pays donné). 1. Construire un formulaire qui affiche les pays dans une liste. Solution <?php $nom_hote='localhost'; $user='infotique'; $password='agathe'; //connexion au serveur MySQL $connexion=mysql_connect($nom_hote,$user,$password); //0 = false, autres valeurs = true if(!$connexion) exit( "La tentative de connexion au serveur $nom_hote a échoué"); //Accès à la base de données $db='annuaire'; $ok=mysql_select_db($db,$connexion); if(!$ok) exit( "La tentative d'accès àla base $db a échoué"); //préparation et exécution d'une requête sélectionnant les pays $requete = "SELECT * FROM Pays"; $resultat_requete = mysql_query($requete,$connexion); if(!$resultat_requete) exit("la requête a echoué<br>"); //déconnexion $ok=mysql_close($connexion); if(!$ok) exit("la tentative de déconnexion a échoué"); Infotique - 77 -

?> <html> <head><title>recherche par pays</title></head> <body> <form action="rechercheparpays.php" method="post"> <select name="liste_pays"> <!--affichage du contenu de la liste - utilisation de htmlentities pour obtenir un affichage correct dans n'importe quel navigateur--> <?php while ($row = mysql_fetch_row($resultat_requete)) echo "<OPTION>".htmlentities($row[1])."</OPTION>";?> </select> </form> </body> </html> 1) Modifier le script pour que si un pays est choisi, il soit affiché. Solution if (sizeof($_post)>0) echo "Le pays sélectionné est : $_POST[liste_pays]"; 2) Modifier le script de façon à afficher les personnes (nom, prénom, date d entrée et quotité) travaillant dans le pays sélectionné (c'est-à-dire dans un site implanté dans le pays sélectionné). Solution <?php Infotique - 78 -

$nom_hote='localhost'; $user='infotique'; $password='agathe'; //connexion au serveur MySQL $connexion=mysql_connect($nom_hote,$user,$password); //0 = false, autres valeurs = true if(!$connexion) exit( "La tentative de connexion au serveur $nom_hote a échoué"); //Accès à la base de données $db='annuaire'; $ok=mysql_select_db($db,$connexion); if(!$ok) exit( "La tentative d'accès àla base $db a échoué"); //préparation et exécution d'une requête sélectionnant les pays $requete = "SELECT * FROM Pays"; $resultat_requete = mysql_query($requete,$connexion); if(!$resultat_requete) exit("la requête a echoué<br>"); if (sizeof($_post)>0) //on recherche les personnes travaillant dans le pays $pays=$_post["liste_pays"]; $requete="select nompersonne, prenompersonne, dateentreepersonne,quotitepersonne FROM (personne INNER JOIN site ON personne.site_idsite = site.idsite) INNER JOIN Pays ON site.pays_idpays = Pays.idPays WHERE nompays = '".$pays."'"; $resultat_recherche_personne=mysql_query($requete,$connexion); if(!$resultat_recherche_personne) exit("la recherche a echoué<br>"); Infotique - 79 -

//déconnexion $ok=mysql_close($connexion); if(!$ok) exit("la tentative de déconnexion a échoué");?> <html> <head><title>recherche par pays</title></head> <body> <form action="rechercheparpays.php" method="post"> <select name="liste_pays"> <!--affichage du contenu de la liste - utilisation de htmlentities pour obtenir un affichage correct dans n'importe quel navigateur--> <?php while ($row = mysql_fetch_row($resultat_requete)) echo "<OPTION>".htmlentities($row[1])."</OPTION>";?> </select> <input type="submit" name="ok" value="ok"> </form> <?php //affichage des résultats if (sizeof($_post)>0 and $resultat_recherche_personne) //on construit un tableau echo "<TABLE BORDER>"; while ($row = mysql_fetch_row($resultat_recherche_personne)) echo "<TR>"; echo "<TD>$row[0]</TD>"; echo "<TD>$row[1]</TD>"; echo "<TD>$row[2]</TD>"; echo "<TD>$row[3]</TD>"; echo "</TR>"; Infotique - 80 -

echo "</TABLE BORDER>";?> </body> </html> Résultat 4.2. IDENTIFICATION, AUTHENTIFICATION ET OUVERTURE D UNE SESSION Enoncé 1) Créer dans la base annuaire une table Utilisateurs définie par la relation (id_utilisateur, login, mot_de_passe). 2) Ecrire un script qui permette d ajouter des utilisateurs dans la table 3) Insérer quelques lignes 4) Ecrire un script PHP qui : 5) Initialise un formulaire de demande de connexion 6) Recherche dans la base la présence du couple (login mot de passe) saisi par l utilisateur Infotique - 81 -

7) Accepte ou refuse la connexion 8) Démarre une session en cas de succès en stockant le login de l utilisateur dans la variable de session Vérifier la bonne gestion de la session en faisant afficher le login de l utilisateur dans une autre page. Script d ajout d utilisateurs <?php $nom_hote='localhost'; $user='infotique'; $password='agathe'; //connexion au serveur MySQL $connexion=mysql_connect($nom_hote,$user,$password); //0 = false, autres valeurs = true if(!$connexion) exit( "La tentative de connexion au serveur $nom_hote a échoué"); //Accès à la base de données $db='annuaire'; $ok=mysql_select_db($db,$connexion); if(!$ok) exit( "La tentative d'accès à la base $db a échoué"); if(!empty($_post)) if (!empty($_post['login'])and!empty($_post['mot_de_passe'])) //on recherche le login dans la base $login=$_post["login"]; Infotique - 82 -

= '".$login."'"; $requete="select * FROM utilisateur WHERE nom_utilisateur $resultat_recherche_personne=mysql_query($requete,$connexion); if(!$resultat_recherche_personne) exit("la requête a échoué<br>"); if(mysql_num_rows($resultat_recherche_personne)>0) exit ("Utilisateur déjà enregistré"); $heure_connexion=time(); $requete="insert INTO utilisateur(nom_utilisateur,mot_de_passe,heure_connexion) VALUES('".$login."','".$pwd."',".$heure_connexion.")"; $resultat_recherche_personne=mysql_query($requete,$connexion); else if(!$resultat_recherche_personne) exit("l' enregistrement a échoué <br>"); else echo "l'enregistrement a réussi"; $erreur=array(); $msg=array(); if(empty($_post['login'])) $erreur['login']=true; $msg['login']="nom utilisateur obligatoire"; if(empty($_post['mot_de_passe'])) $erreur['pwd']=true; $msg['pwd']="mot de passe obligatoire"; Infotique - 83 -

//déconnexion $ok=mysql_close($connexion); if(!$ok) exit("la tentative de déconnexion a échoué");?> <html> <head><title>ajout utilisateur</title></head> <body> <form action="saisieutilisateur.php" method="post"> <br> Nom utilisateur : <input type="text" name="login"> * <?php if(isset($erreur['login']))echo $msg['login'];?> <br> Mot de passe : <input type="password" name="mot_de_passe"> * <?php if(isset($erreur['pwd']))echo $msg['pwd'];?> <br> <input type="submit" name="ok" value="ok"> </form> </body> </html> Script de connexion <?php $nom_hote='localhost'; $user='infotique'; $password='agathe'; //connexion au serveur MySQL $connexion=mysql_connect($nom_hote,$user,$password); //0 = false, autres valeurs = true Infotique - 84 -

if(!$connexion) exit( "La tentative de connexion au serveur $nom_hote a échoué"); //Accès à la base de données $db='annuaire'; $ok=mysql_select_db($db,$connexion); if(!$ok) exit( "La tentative d'accès à la base $db a échoué"); if(!empty($_post)) if (!empty($_post['login'])and!empty($_post['mot_de_passe'])) //on recherche le login et le mot de passe $login=$_post["login"]; $pwd=$_post["mot_de_passe"]; $requete="select * FROM utilisateurs WHERE nom_utilisateur = '".$login."' AND mot_de_passe = '".$pwd."'"; $resultat_recherche_personne=mysql_query($requete,$connexion); avec la base <br>"); if(!$resultat_recherche_personne) exit("la connexion ne peut être établie if(mysql_num_rows($resultat_recherche_personne)==0) echo "Erreur de connexion"; else session_start(); $_SESSION['login']=$login; //redirection vers une page de bienvenue header('location:bienvenue.php'); Infotique - 85 -

else $erreur=array(); $msg=array(); if(empty($_post['login'])) $erreur['login']=true; $msg['login']="nom utilisateur obligatoire"; if(empty($_post['mot_de_passe'])) $erreur['pwd']=true; $msg['pwd']="mot de passe obligatoire"; //déconnexion $ok=mysql_close($connexion); if(!$ok) exit("la tentative de déconnexion a échoué");?> <html> <head><title>connexion</title></head> <body> <form action="saisieconnexion.php" method="post"> <br> Nom utilisateur : <input type="text" name="login"> * <?php if(isset($erreur['login']))echo $msg['login'];?> <br> Mot de passe : <input type="password" name="mot_de_passe"> * <?php if(isset($erreur['pwd']))echo $msg['pwd'];?> <br> <input type="submit" name="ok" value="ok"> </form> Infotique - 86 -

</body> </html> Script de création de la page de bienvenue <?php session_start(); echo "Bienvenue $_SESSION[login]";?> Résultat Après validation : Infotique - 87 -

Infotique - 88 -