RAPPORT DE PROGRAMMATION :

 

TER - PHP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LUROIS Frédéric

GRATIEN Xavier                                                                              Maîtrise Informatique


SOMMAIRE

 

 

 

 

 

 

 

 

 

1.  INTRODUCTION.. 3

2.  LA BASE DE DONNEES. 4

2.1. HYPOTHESES DE TRAVAIL. 4

2.2. SCHEMA ENTITES / ASSOCIATION.. 4

2.3. SCHEMA RELATIONNEL. 6

2.4. DICTIONNAIRE DES DONNEES. 8

3.  LA PROGRAMMATION PHP. 12

3.1. Les modèles HTML (Templates) 12

3.2. Les pages PHP. 12

3.3. Javascripts 13

4.  ANNEXE. 14

 


1.               INTRODUCTION

Pour réaliser ce ter - php, nous avons décidé de créer un site permettant aux internautes de louer et d’acheter des films (en VHS ou en DVD), ainsi que des produits dérivés tels que les bandes originales ou les affiches de films, et également de télécharger les bandes annonces ou les chansons des bandes originales.

Ce document décrit de manière précise les différentes étapes et éléments qui nous ont permis de créer le site.


2.               LA BASE DE DONNEES

 

2.1.        HYPOTHESES DE TRAVAIL

 

La première étape fut la mise en place du « cahier des charges » du site en définissant les hypothèses de travail suivantes :

§         Un film est défini par un titre, une description, son année de sortie, sa durée, son genre, le type de public auquel il s’adresse, sa note (fixé par le webmaster), et l’adresse de son site officiel

§         Le site propose les films en DVD ou VHS (et peut évoluer vers d’autres supports futurs)

§         Le site propose les bandes originales en CD ou K7 (et peut évoluer vers d’autres supports futurs)

§         Un film est composé d’un ou de plusieurs acteurs, d’un ou de plusieurs producteurs, et d’un ou de plusieurs réalisateurs

§         Le site permet d’obtenir des informations relatives aux acteurs, producteurs, et réalisateurs tels que leur biographie ou leur filmographie

§         Le site permet d’acheter les affiches, les bandes originales (le téléchargement est également possible), et de télécharger les bandes annonces des films

§         Un internaute qui désire louer ou acheter un film doit d’abord s’inscrire. Ceci fait il aura alors accès à son compte, qui lui permet d’avoir un historique de toutes les transactions effectuées depuis qu’il est inscrit

§         Le prix d’achat d’un film est fonction du film, de son support (VHS ou DVD) et de la langue, alors que le prix de location est fonction de la durée de location, qui dépend elle-même du support du film (le prix de location ne dépend donc pas du film lui-même)

§         Le prix des bandes originales dépend de la BOF elle-même et du support (K7 ou CD)

§         Le prix des affiches dépend de l’affiche elle-même et de leur dimension

§         Les différentes copies des films loués sont identifiées et les différentes langues disponibles pour les films (essentiellement pour les VHS) dépendent des copies

 

2.2.        SCHEMA ENTITES / ASSOCIATION

 

Ces hypothèses de travail nous ont permis de créer le schéma entités / association suivant :

 

 


 

 


2.3.        SCHEMA RELATIONNEL

 

A partir du schéma entités / association nous avons défini le schéma relationnel

Suivant (les clés sont en gras et les clés étrangères précédées par des ‘#’) :

 

 

LOGIN (login, password)

 

CLIENT (num_client, nom, prenom, adresse, num_cb, num_rib,

date_expiration, email, date_inscription, #login)

 

FILM (num_film, titre, description, année, durée, note,

site_officiel, url, #lib_genre, #type_public)

 

GENRE (lib_genre)

 

PUBLIC (type_public)

 

LANGUE (lib_langue)

 

SUPPORT_FILM (lib_support_film)

 

ACTEUR (num_acteur, nom, prénom, biographie, filmographie)

 

REALISATEUR (num_realisateur, nom, prénom, biographie,

filmographie)

 

PRODUCTEUR (num_producteur, nom, prénom, biographie,

filmographie)

 

VERSION (num_version, #num_film, #lib_langue)

 

ACHAT (num_achat, date, état, cout_total, #num_client)

 

LOCATION (num_location, date, #num_client)

 

PRIX_LOCATION (durée_loc, prix)

 

DIMENSION (lib_dimension)

 

AFFICHE (num_affiche, prix, #lib_dimension, #num_film)

 

BANDE_ANNONCE (num_ba, nom_ba, taille, #num_film)

 

BANDE_ORIGINALE (num_bo, titre_bo, #num_film)

 

SUPPORT_BO (lib_support_bo)

 

CHANSON (id_chanson, num_chanson, titre, durée, #num_bo)

 

ACHAT_BO (#num_achat, #num_bo, #lib_support_bo, quantite, prix)

 

ACHAT_AFFICHE (#num_achat, #num_affiche, quantite, prix)

 

ACHAT_FILM (#num_achat, #num_version, #lib_support_film

quantite, prix)

 

LOCATION_VERSION (#num_location, #num_version, etat, duree)

 

PRIX_BO (#num_bo, #lib_support_bo, prix)

 

PRIX_LOC_SUPPORT_FILM (#lib_support_film, #durée_loc, #prix)

 

PRIX_VERSION (#num_version, #lib_support_film, prix)

 

TELECHARGE_CHANSON (date, #num_client, # id_chanson) 

 

TELECHARGE_BA (date, #num_client, #num_ba)

 

ACTEUR_FILM (#num_acteur, #num_film, rang)

 

PRODUCTEUR_FILM (#num_producteur, # num_film)

 

REALISATEUR_FILM (#num_realisateur, # num_film)

 

CRITIQUE_FILM (date, #num_client, #num_film, critique, note)

 

CRITIQUE_BO (date, #num_client, #num_bo, critique, note)

 

 

Remarque :

 

            Le  SGBD relationnel utilisé (à savoir MySQL) ne gère pas les clés étrangères (« foreign key »), ainsi que certaines contraintes d’intégrités (les « references »). C’est pour cette raison que dans notre script de création de la base (fournit en annexe), les clés étrangères n’apparaissent pas et les attributs « references » sont utilisés comme clés primaires.

L’intégrité de notre base de données est tout de même conservée car tous les formulaires qui permettent d’ajouter des éléments dans la base se servent de liste déroulante et de numéro automatique (ce qui permet de n’afficher que des éléments réellement présent dans la base).

 


2.4.        DICTIONNAIRE DES DONNEES

 

Table LOGIN :

-         login : le login utilisé par un internaute pour accéder à son compte

-         password : son mot de passe

 

Table FILM :

-         num_film : le numero du film

-         titre : son titre

-         description : sa description

-         année : son année de sortie

-         durée : sa durée

-         note : la note que nous lui avons donné

-         site_officiel : l’url du site officiel du film

-         url : l’url de stockage de toutes les données concernant ce film (pour les webmaster)

-         lib_genre : le genre du film (ex : « action »)

-         type_public : le type de public auquel il s’adresse

 

Table CLIENT :

-         num_client : le numéro du client

-         nom : son nom

-         prénom : son prénom

-         adresse : son adresse

-         num_cb : le n° de la carte bleu (pour les achats et locations)

-         date_expiration : la date d’expiration de la carte bleu

-         num_rib : le n° de rib (pour les achats et locations)

-         email : son email

-         date_inscription : la date à laquelle il s’est inscrit sur le site

 

Table PUBLIC :

-         type_public : le type de public auquel un film est destiné (ex : « interdit aux- 12 ans »)

 

Table GENRE :

-         lib_genre : le genre d’un film (ex : « action »)

 

Table LANGUE :

-         la langue d’une copie d’un film

 

Table SUPPORT_FILM :

-         lib_support_film : le support d’un film (ex : “DVD”)

 

Table ACTEUR :

-         num_acteur : l’id d’un acteur

-         nom : son nom

-         prénom : son prénom

-         biographie : sa biographie

-         filmographie : sa filmographie

 


Table REALISATEUR :

-         num_acteur : l’id d’un réalisateur

-         nom : son nom

-         prénom : son prénom

-         biographie : sa biographie

-         filmographie : sa filmographie

 

Table PRODUCTEUR :

-         num_acteur : l’id d’un producteur

-         nom : son nom

-         prénom : son prénom

-         biographie : sa biographie

-         filmographie : sa filmographie

 

Table VERSION :

-         num_version : l’id de la version d’un film

-         num_film : l’id du film auquel la version correspond

-         lib_langue : la langue de la version

 

Table Achat :

-         num_achat : le numéro d’une commande d’achat d’un film

-         date : la date à laquelle est effectuée la commande d’achat

-         etat : l’etat de la commande (ex : « en attente, terminé, en cours de livraison »)

-         cout_total : le coût total d’une commande d’achat de films

-         num_client : le numéro du client qui a effectué cet commande d’achat

 

Table Location :

-         num_location : le numéro d’une commande de location d’un film

-         date : la date a laquelle est effectuée la commande de location

-         num_client : le numéro du client qui a effectué cet commande de location

 

Table Prix_Location :

-         duree_loc : la durée d’une location

-         prix : le coût d’une location d’une telle durée

 

Table DIMENSION :

-         lib_dimension : les dimensions d’une affiche

 

Table Affiche :

-         num_affiche : l’id de l’affiche

-         prix : le prix de l’affiche

-         lib_dimension : les dimensions de l’affiche

-         num_film : le numéro du film auquel elle fait référence

 

Table Bande_Annonce :

-         num_ba : l’id d’une bande annonce

-         nom_ba : le nom de la bande annonce

-         taille : sa taille (en Mo)

-         num_film : le numéro du film auquel elle fait référence

 

Table Bande_Originale :

-         num_bo : l’id de la BOF

-         titre_bo : le titre de la BOF

-         num_film : le numéro du film auquel elle fait reference

 

Table Support_Bo :

-         lib_support_bo : le support d’une BOF (ex : K7 ou CD)

 

Table Chanson :

-         id_chanson : l’id d’une chanson

-         num_chanson : le numéro de piste d’une chanson (sur un album)

-         titre : le titre de la chanson

-         duree : la duree de la chanson

-         num_bo : le numéro de la BOF auquelle la chanson appartient

 

Table Achat_Bo :

-         num_achat : le numéro de la commande d’achat

-         num_bo : le numéro de la BOF achetée

-         lib_support_bo : le support de la BOF achetée

-         quantité : le nombre d’exemplaire de la BOF achetée

-         prix : le prix unitaire de la BOF (pour gestion historique)

 

Table Achat_Affiche :

-         num_achat : le numéro de la commande d’achat

-         num_affiche : le numéro de l’affiche achetée

-         quantité : le nombre d’exemplaire de l’affiche achetée

-         prix : le prix unitaire de l’affiche (pour gestion historique)

 

Table Achat_Film :

-         num_achat : le numéro de la commande d’achat

-         num_version : le numéro de la version achetée

-         lib_support_film : le support de la version achetée

-         quantité : le nombre d’exemplaire de la version achetée

-         prix : le prix unitaire de la version (pour gestion historique)

 

Table Location_VERSION :

-         num_location : le numéro de la commande de location

-         num_version : numéro de la version louée

-         etat : l’etat de la commande de location (ex : en cours, en attente, terminée)

-         duree : la durée de la location

 

Table PRIX_BO :

-         num_bo : le numéro de la BOF

-         lib_support_bo : le support de la BOF

-         prix : le prix de la BOF

 

Table PRIX_LOC_SUPPORT_FILM :

-         lib_support_film : le support du film

-         duree_loc : la durée de location

-         prix : le prix de la location


Table PRIX_VERSION :

-         num_version : le numéro de la version

-         lib_support_film : le support du film

-         prix : le prix de la version

 

Table TELECHARGE_CHANSON :

-         date : la date du téléchargement

-         num_client : le numéro du client qui a téléchargé la chanson

-         id_chanson : l’id de la chanson téléchargée

 

Table TELECHARGE_BA :

-         date : la date du téléchargement

-         num_client : le numéro du client qui a téléchargé la chanson

-         num_ba : le numéro de la bande annonce téléchargée

 

Table ACTEUR_FILM :

-         num_acteur : le numéro de l’acteur

-         num_film : le numéro du film

-         rang : le rang de l’acteur dans le film (plus le rang est petit, plus son rôle est important)

 

Table PRODUCTEUR_FILM :

-         num_producteur : le numéro du producteur

-         num_film : le numéro du film

 

Table REALISATEUR_FILM :

-         num_réalisateur : le numéro du réalisateur

-         num_film : le numéro du film

 

Table CRITIQUE_FILM :

-         date : la date de rédaction de la critique

-         num_client : le numéro du client qui laisse la critique ( = 0 si c’est un visiteur)

-         num_film : le numéro du film concerné par la critique

-         critique : la critique du film

-         note : la note attribuée par le client

 

Table CRITIQUE_BO :

-         date : la date de rédaction de la critique

-         num_client : le numéro du client qui laisse la critique (= 0 si c’est un visiteur)

-         num_bo : le numéro de la BOF concernée par la critique

-         critique : la critique de la BOF

-         note : la note attribuée par le client

 

Remarque :

 

            La base de données a été conçu de manière à ce que l’ajout (ou la mise a jour et la suppression) d’éléments important ne remettent pas en cause toute la base. Par exemple, imaginons qu’un nouveau support de film apparaisse ; on l’appellera le XVZF4. L’ajout de film sur ce nouveau format est très simple : il suffit d’ajouter un nouveau support de film dans la table support_film, puis d’indiquer quels sont les films qui sont sur ce format en utilisant la table prix_version


3.               LA PROGRAMMATION PHP

De manière analogue à la partie précédente, dans notre programmation en php, nous

avons fait en sorte que l’ajout de nouveaux éléments (donc parfois de nouvelles pages) soit simplifié au maximum.

 

3.1.        Les modèles HTML (Templates)

 

Nous avons donc, dans un premier temps, créer en HTML les modèles des différentes

pages du site. Cela nous a permis de pouvoir toujours garder une trace visuel de « l’allure » du site, et ce même si la base de données est vide, de travailler exclusivement sur le design des pages du site et de réutiliser des modèles existant pour créer d’autre modèles.

Toutes les données, résultat de requêtes SQL, à afficher, ont été placées dans des tableaux – qui ont la capacité de s’agrandir automatiquement en fonction des informations qu’ils contiennent – ce qui nous a permis de tester différentes « configuration » d’une même page (selon qu’elle contienne peu, beaucoup ou pas de données à afficher) et de créer toutes les pages du site en gardant comme objectif que le nombre d’information à afficher ne devait pas altérer la lisibilité et l’ergonomie des pages.

 

 

3.2.        Les pages PHP

 

Une fois les modèles définis, nous avons crées les pages php en remplacant les

données écrites « en dur » dans les modèles, par les variables php appropriées.

 

v     Les cadres

 

Les différentes pages du site sont toutes dessinées de la même façon. C'est-à-dire

qu’elles possèdent toutes :

-         un cadre horizontal supérieur qui contient le nom du site

-         un cadre vertical gauche qui contient le menu et la fonction de recherche

-         un cadre vertical droit qui contient la gestion de l’inscription

-         le cadre principal qui contient la page courante

Ces différentes parties d’une page sont en fait générées et affichées par des fonctions php, ce qui permet au site d’avoir une grande modularité et une grande facilité de mise à jour.

 

 

v     Les boutons de menu « auto générés »

 

            Une autre caractéristique du site est la génération automatique des boutons de certains menus, grâce à l’utilisation de la bibliothèque GD de php. En effet, il est par exemple possible dans le site, de rechercher un film en fonction de son genre (action, comédie, science-fiction, etc.), en cliquant sur le bouton correspondant. Or si le webmaster ajoute un nouveau genre de film, un nouveau bouton sera automatiquement créé. Il portera le nom du nouveau genre créé, et le fait de cliquer sur ce bouton, affichera tous les films de ce nouveau genre.


 

v     Les Sessions

 

Pour pouvoir acheter ou louer un film, un internaute doit d’abord s’inscrire sur le site.

Pour pouvoir conserver de manière simple le login de l’internaute tout au long de sa visite le site, nous avons utilisé le système des sessions. Les sessions permettent de passer en paramètre « masqué », le login de l’internaute à toutes les pages qui en ont besoin.

 

3.3.        Javascripts


Le javascript a souvent été utilisé lors de la réalisation de formulaires, car ce langage

permet de modifier et de lire les valeurs des différents champs d’une page, après qu’elle ait été chargée dans le navigateur Web, ce que ne permet pas le php.

Le javascript a été principalement utilisé afin de vérifier que les différents champs d’un formulaire étaient convenablement remplis, ou encore pour effectuer des redirections (retour à la page précédente avec ou sans timer). Mais également afin de bloquer l’accès à certains champs ou encore stocker des variables dans la page afin d’accéder à ces valeurs après le chargement de la page, pour exemple la page ‘acheterLouerFilmForm.php’.

Dans cette page on peut choisir entre différents supports de films et différentes langues pour chaque. Le javascript a permis ici de bloquer le choix de la langue et de la quantité pour les supports non sélectionnés. Ainsi quand on choisit un support, les autres voient leurs champs devenir inaccessibles. De plus, le prix unitaire étant fonction de la langue, il faut pour chaque langue de chaque support, connaître son prix et le mettre à jour dans la page lors de la sélection d’un langue ou d’une autre. Le problème est que la page ne peut pas, une fois chargé dans le navigateur, accéder aux prix en fonction de la langue et du support. Il a donc fallu stocker ces valeurs dans la page elle-même. Pour cela nous avons créé une variable javascript ‘tableau à 2 dimensions’ que l’on remplit grâce au php.

 


4.               ANNEXE

DROP DATABASE IF EXISTS lurois;

CREATE DATABASE lurois;

 

use lurois;

 

DROP TABLE IF EXISTS Login;

CREATE TABLE Login

(

 login VARCHAR(20) NOT NULL, password VARCHAR(32) NOT NULL,

 PRIMARY KEY (login)

);

 

 

DROP TABLE IF EXISTS Client;

CREATE TABLE Client

(

 num_client INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, nom VARCHAR(50), prenom VARCHAR(50), adresse VARCHAR(50), email VARCHAR(50),

 num_cb INTEGER(15) UNSIGNED, num_rib INTEGER(15) UNSIGNED, date_expiration DATE, date_inscription DATE NOT NULL,

 PRIMARY KEY (num_client),

 login VARCHAR(20) NOT NULL REFERENCES Login(login)

);

 

DROP TABLE IF EXISTS Dimension;

CREATE TABLE Dimension

(

 lib_dimension VARCHAR(20) NOT NULL,

 PRIMARY KEY (lib_dimension)

);

 

DROP TABLE IF EXISTS Genre;

CREATE TABLE Genre

(

 lib_genre VARCHAR(20) NOT NULL,

 PRIMARY KEY (lib_genre)

);

 

DROP TABLE IF EXISTS Public;

CREATE TABLE Public

(

 type_public VARCHAR(20) NOT NULL,

 PRIMARY KEY (type_public)

);

 


DROP TABLE IF EXISTS Realisateur;

CREATE TABLE Realisateur

(

 num_realisateur INTEGER UNSIGNED NOT NULL , nom VARCHAR(50) NOT NULL, prenom VARCHAR(50), biographie BLOB, filmographie BLOB,

 PRIMARY KEY (num_realisateur)

);

 

 

DROP TABLE IF EXISTS Film;

CREATE TABLE Film

(

 num_film INTEGER UNSIGNED NOT NULL , titre VARCHAR(50) NOT NULL, description BLOB, annee YEAR NOT NULL,

 duree TIME NOT NULL, note TINYINT(1) UNSIGNED NOT NULL DEFAULT 2, site_officiel VARCHAR(50), url VARCHAR(50) NOT NULL,

 PRIMARY KEY (num_film),

 lib_genre VARCHAR(20) NOT NULL REFERENCES Genre(lib_genre),

 type_public VARCHAR(20) NOT NULL REFERENCES Public(type_public) 

);

 

DROP TABLE IF EXISTS Langue;

CREATE TABLE Langue

(

 lib_langue VARCHAR(20) NOT NULL,

 PRIMARY KEY (lib_langue)

);

 

DROP TABLE IF EXISTS Support_Film;

CREATE TABLE Support_Film

(

 lib_support_film VARCHAR(20) NOT NULL,

 PRIMARY KEY (lib_support_film)

);

 

DROP TABLE IF EXISTS Acteur;

CREATE TABLE Acteur

(

 num_acteur INTEGER UNSIGNED NOT NULL , nom VARCHAR(50) NOT NULL, prenom VARCHAR(50), biographie BLOB, filmographie BLOB,

 PRIMARY KEY (num_acteur)

);

 

DROP TABLE IF EXISTS Producteur;

CREATE TABLE Producteur

(

 num_producteur INTEGER UNSIGNED NOT NULL , nom VARCHAR(50) NOT NULL, prenom VARCHAR(50), biographie BLOB, filmographie BLOB,

 PRIMARY KEY (num_producteur)

);

DROP TABLE IF EXISTS Versions;

CREATE TABLE Versions

(

 num_version INTEGER UNSIGNED NOT NULL,

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film),

 lib_langue VARCHAR(20) NOT NULL REFERENCES Langue(lib_langue),

 PRIMARY KEY (num_version)

);

 

 

DROP TABLE IF EXISTS Achat;

CREATE TABLE Achat

(

 num_achat INTEGER UNSIGNED NOT NULL , date DATE NOT NULL, etat VARCHAR(20) NOT NULL, cout_total FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (num_achat),

 num_client INTEGER UNSIGNED NOT NULL REFERENCES Client(num_client)

);

 

DROP TABLE IF EXISTS Location;

CREATE TABLE Location

(

 num_location INTEGER UNSIGNED NOT NULL , date DATE NOT NULL,

 PRIMARY KEY (num_location),

 num_client INTEGER UNSIGNED NOT NULL REFERENCES Client(num_client)

);

 

DROP TABLE IF EXISTS Prix_Location;

CREATE TABLE Prix_Location

(

 duree_location INTEGER UNSIGNED NOT NULL, prix FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (duree_location, prix)

);

 

DROP TABLE IF EXISTS Affiche;

CREATE TABLE Affiche

(

 num_affiche INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

 lib_dimension VARCHAR(20) NOT NULL REFERENCES Dimension(lib_dimension),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film),

 prix FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (num_affiche)

);

 


DROP TABLE IF EXISTS Bande_Annonce;

CREATE TABLE Bande_Annonce

(

 num_ba INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

 nom_ba VARCHAR(50) NOT NULL, taille INTEGER UNSIGNED NOT NULL,

 PRIMARY KEY (num_ba),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film)

);

 

DROP TABLE IF EXISTS Bande_Originale;

CREATE TABLE Bande_Originale

(

 num_bo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

 titre_bo VARCHAR(50) NOT NULL,

 PRIMARY KEY (num_bo),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film)

);

 

DROP TABLE IF EXISTS Support_Bo;

CREATE TABLE Support_Bo

(

 lib_support_bo VARCHAR(20) NOT NULL,

 PRIMARY KEY (lib_support_bo)

);

 

DROP TABLE IF EXISTS Chanson;

CREATE TABLE Chanson

(

 id_chanson INTEGER UNSIGNED NOT NULL , num_chanson INTEGER UNSIGNED NOT NULL, titre VARCHAR(50) NOT NULL,

 PRIMARY KEY (id_chanson),

 num_bo INTEGER UNSIGNED NOT NULL REFERENCES Bande_Originale(num_bo)

);

 

DROP TABLE IF EXISTS Achat_Bo;

CREATE TABLE Achat_Bo

(

 num_achat INTEGER UNSIGNED NOT NULL REFERENCES Achat(num_achat),

 num_bo INTEGER UNSIGNED NOT NULL REFERENCES Bande_Originale(num_bo),

 lib_support_bo VARCHAR(20) NOT NULL REFERENCES Support_Bo(lib_suport_bo),

 quantite INTEGER UNSIGNED NOT NULL,

 prix FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (num_achat, num_bo, lib_support_bo)

);

 


DROP TABLE IF EXISTS Achat_Affiche;

CREATE TABLE Achat_Affiche

(

 num_achat INTEGER UNSIGNED NOT NULL REFERENCES Achat(num_achat),

 num_affiche INTEGER UNSIGNED NOT NULL REFERENCES Affiche(num_affiche),

 quantite INTEGER UNSIGNED NOT NULL,

 prix FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (num_achat, num_affiche)

);

 

DROP TABLE IF EXISTS Achat_Film;

CREATE TABLE Achat_Film

(

 num_achat INTEGER UNSIGNED NOT NULL REFERENCES Achat(num_achat),

 num_version INTEGER UNSIGNED NOT NULL REFERENCES Versions(num_version),

 lib_support_film VARCHAR(20) NOT NULL REFERENCES Support_Film(lib_support_film),

 quantite INTEGER UNSIGNED NOT NULL,

 prix FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (num_achat, num_version)

);

 

DROP TABLE IF EXISTS Location_Version;

CREATE TABLE Location_Version

(

 num_location INTEGER UNSIGNED NOT NULL REFERENCES Location(num_location),

 num_version INTEGER UNSIGNED NOT NULL REFERENCES Versions(num_version),

 etat VARCHAR(20) NOT NULL,

 duree INTEGER UNSIGNED NOT NULL,

 PRIMARY KEY (num_location, num_version)

);

 

DROP TABLE IF EXISTS Prix_Bo;

CREATE TABLE Prix_Bo

(

 num_bo INTEGER UNSIGNED NOT NULL REFERENCES Bande_Originale(num_bo),

 lib_support_bo VARCHAR(20) NOT NULL REFERENCES Support_Bo(lib_support_bo),

 prix FLOAT UNSIGNED NOT NULL,

 PRIMARY KEY (num_bo, lib_support_bo)

 

);

 


DROP TABLE IF EXISTS Prix_Loc_Support_Film;

CREATE TABLE Prix_Loc_Support_Film

(

 duree_location INTEGER UNSIGNED NOT NULL REFERENCES Prix_Location(duree_location),

 prix FLOAT UNSIGNED NOT NULL REFERENCES Prix_Location(prix),

 lib_support_film VARCHAR(20) NOT NULL REFERENCES Support_Film(lib_support_film),

 PRIMARY KEY (duree_location, prix, lib_support_film)

);

 

 

DROP TABLE IF EXISTS Telecharge_Chanson;

CREATE TABLE Telecharge_Chanson

(

 date DATETIME NOT NULL,

 num_client INTEGER UNSIGNED NOT NULL REFERENCES Client(num_client),

 id_chanson INTEGER UNSIGNED NOT NULL REFERENCES Chanson(id_chanson),

 PRIMARY KEY (date, num_client, id_chanson)

);

 

DROP TABLE IF EXISTS Telecharge_Ba;

CREATE TABLE Telecharge_Ba

(

 date DATETIME NOT NULL,

 num_client INTEGER UNSIGNED NOT NULL REFERENCES Client(num_client),

 num_ba INTEGER UNSIGNED NOT NULL REFERENCES Bande_Annonce(num_ba),

 PRIMARY KEY (date, num_client, num_ba)

);

 

 

DROP TABLE IF EXISTS Prix_Version;

CREATE TABLE Prix_Version

(

 num_version INTEGER UNSIGNED NOT NULL REFERENCES Versions(num_version),

 lib_support_film VARCHAR(20) NOT NULL REFERENCES Support_Film(lib_support_film),

 prix FLOAT UNSIGNED NOT NULL

);

 

DROP TABLE IF EXISTS Realisateur_Film;

CREATE TABLE Realisateur_Film

(

 num_realisateur INTEGER UNSIGNED NOT NULL REFERENCES Realisateur(num_realisateur),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film),

 PRIMARY KEY (num_realisateur, num_film)

);

 


DROP TABLE IF EXISTS Acteur_Film;

CREATE TABLE Acteur_Film

(

 num_acteur INTEGER UNSIGNED NOT NULL REFERENCES Acteur(num_acteur),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film),

 rang INTEGER UNSIGNED NOT NULL,

 PRIMARY KEY (num_acteur, num_film)

);

 

DROP TABLE IF EXISTS Producteur_Film;

CREATE TABLE Producteur_Film

(

 num_producteur INTEGER UNSIGNED NOT NULL REFERENCES Producteur(num_producteur),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film),

 PRIMARY KEY (num_producteur, num_film)

);

 

DROP TABLE IF EXISTS Critique_Film;

CREATE TABLE Critique_Film

(

 date DATETIME NOT NULL, critique BLOB NOT NULL, note TINYINT(1) UNSIGNED NOT NULL DEFAULT 2,

 num_client INTEGER UNSIGNED NOT NULL REFERENCES Client(num_client),

 num_film INTEGER UNSIGNED NOT NULL REFERENCES Film(num_film),

 PRIMARY KEY (date, num_client, num_film)

);

 

DROP TABLE IF EXISTS Critique_Bo;

CREATE TABLE Critique_Bo

(

 date DATETIME NOT NULL, critique BLOB NOT NULL, note TINYINT(1) UNSIGNED NOT NULL DEFAULT 2,

 num_client INTEGER UNSIGNED NOT NULL REFERENCES Client(num_client),

 num_bo INTEGER UNSIGNED NOT NULL REFERENCES Bande_Originale(num_bo),

 PRIMARY KEY (date, num_client, num_bo)

);