Bases de données PostgreSQL sous Linux
Bases de données PostgreSQL sous Linux
org/bdd
Conception des bases de
données III :
Applications de bases de
données
bdd3.pdf
STÉPHANE CROZAT
A. Cours..............................................................................................................4
1. Introduction à Linux...............................................................................................................4
2. Introduction à PostgreSQL : présentation, installation, manipulations de base................................8
3. Éléments complémentaires indispensables à l'utilisation de PostgreSQL.......................................10
B. Exercices.......................................................................................................17
1. Découverte de la ligne de commande sous Linux......................................................................17
2. Découverte d'un SGBDR avec PostgreSQL...............................................................................20
A. Cours............................................................................................................24
1. Applications et bases de données...........................................................................................24
2. Architecture Web.................................................................................................................31
B. Exercice.........................................................................................................35
1. Tester un environnement LAPP sur son ordinateur personnel.....................................................35
C. Devoir...........................................................................................................38
1. Déployez un site web sur Internet avec Filezilla........................................................................38
2. Déployez un site web sur un serveur de l'UTC..........................................................................40
A. Cours............................................................................................................41
1. Introduction à HTML et XHTML...............................................................................................41
2. Introduction à PHP...............................................................................................................43
B. Exercices.......................................................................................................49
1. Population...........................................................................................................................49
2. Hello PHP !..........................................................................................................................50
C. Devoirs..........................................................................................................50
1. Deux fois deux.....................................................................................................................50
A. Cours............................................................................................................51
1. Utiliser une machine Linux....................................................................................................51
2. Introduction au protocole HTTP..............................................................................................56
3. Requêtes HTTP avec une page web.........................................................................................58
4. Complément........................................................................................................................60
B. Exercices.......................................................................................................64
1. Linux..................................................................................................................................64
Stéphane Crozat
2
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
2. HTTP..................................................................................................................................65
3. XHTML, HTTP, PHP...............................................................................................................66
A. Cours............................................................................................................68
1. Connexion d'une page PHP à une base de données PostgreSQL avec PDO....................................68
2. Complément........................................................................................................................71
B. Exercices.......................................................................................................77
1. Super-transferts..................................................................................................................77
2. À l'école de musique.............................................................................................................78
C. Devoirs..........................................................................................................80
1. Recensement.......................................................................................................................80
2. Devoirs en ligne...................................................................................................................81
Glossaire 84
Références 87
Bibliographie 88
Webographie 89
Index 90
Stéphane Crozat
3
Implémentation
I -
I
de bases de
données
relationnelles avec
PostgreSQL sous
Linux
A. Cours
1. Introduction à Linux
Stéphane Crozat
4
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
...
b) Utiliser Linux
Pour utiliser Linux, il y a plusieurs possibilité :
Avoir accès à un PC sur lequel Linux est déjà installé (il suffit de disposer d'un compte
utilisateur sur cet ordinateur).
Installer Linux sur son ordinateur :
- En téléchargeant en installant une distribution (il faut savoir préalablement graver
un DVD ou créer une clé USB bootable) ;
- En commandant un DVD ou une clé USB (coût de quelques euros) ;
- En participant à une install party (organisées par des associations, elles permettent
de se faire aider dans le processus d'installation et la prise en main initiale de
l'environnement).
Installer Linux sur son ordinateur en double-boot (à coté de son OS initial, on choisit au
démarrage quel système on utilise).
Installer Linux sur son ordinateur dans une machine virtuelle (par exemple : on peut
utiliser Linux dans un fenêtre Windows).
Installer Linux sur une clé en version live USB persistant.
Exemple : Installer Ubuntu dans une machine virtuelle sous VirtualBox sous
Windows
https://openclassrooms.com/courses/reprenez-le-controle-a-l-aide-de-linux/installez-linux-
dans-une-machine-virtuelle2
c) Le terminal
Les distributions Linux comportent souvent un mode graphique, pratique pour de nombreuses
opérations.
Savoir utiliser un terminal en lignes de commandes n'est donc pas indispensable, mais cela
présente des avantages comme :
connaître des opérations qui seront reproductibles sur toutes les distributions (voire sur
d'autres Unix) ;
savoir utiliser un serveur à distance (via SSH) ;
savoir échanger ou reproduire des procédures (sans avoir besoin de refaire une
succession de manipulations à la souris).
Fondamental
Dès lors qu'on se connecte à un système Linux on peut ouvrir un terminal et faire de
nombreuses opérations, telles que :
lancer des applications,
1 - http://xubuntu.fr/
2 - https://openclassrooms.com/courses/reprenez-le-controle-a-l-aide-de-linux/installez-linux-dans-une-machine-
virtuelle
Stéphane Crozat
5
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Méthode
Le plus générique pour lancer une application sous Linux consiste à :
1. ouvrir un terminal,
2. écrire le nom de l'application, par exemple firefox,
3. saisir le caractère & et appuyer sur entrée.
e) Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat,
nano...
Le manuel !
La commande man permet d'afficher le manuel d'une autre commande.
Par exemple man ls permet d'afficher les option de la commande ls, et man man est l'affichage
du manuel du manuel.
Stéphane Crozat
6
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Gestion de fichiers
pwd savoir où je me situe dans l'arborescence
cd aller quelque part dans l'arborescence
- cd /home aller dans /home (déplacement absolu)
- cd me aller dans le répertoire me fils de mon répertoire courant (déplacement
relatif)
- cd .. remonter dans l'arborescence (déplacement vers son père)
- cd ~ permet de retourner dans son dossier initial (retour au domicile)
ls voir les fichiers et dossiers dans mon dossier actuel (sauf les fichiers cachés
commençant par un .)
ls -al voir tous les fichiers et dossiers dans mon dossier actuel avec leurs informations
associées (vue détaillée)
touch file créer un fichier file
rm file supprimer le fichier file dans mon dossier actuel
mkdir dir créer un nouveau dossier dir dans mon dossier actuel
rm * supprimer tous les fichiers de mon dossier actuel
rm -R dir supprimer le dossier dir dans mon dossier actuel
cat file afficher le contenu du fichier file
more afficher le contenu du fichier file en mode paginé
less afficher le contenu du fichier file en mode défilement
Édition de fichiers
nano file
- Éditeur dans le terminal (simple d'utilisation)
- Les commandes sont indiqués en bas de l'éditeur
gedit file &
- Éditeur graphique
- Utiliser une extension de fichier standard ou le menu Affichage > Mode de
coloration pour obtenir une visualisation adapté au type de fichier édité (par
exemple .sql pour un fichier SQL)
Rechercher un fichier
find / -name '*test*' permet de rechercher un fichier contenant la chaîne test sur
tout le disque
find ~ -name '*test*' permet de rechercher un fichier contenant la chaîne test dans
son espace personnel
Complément
Agir en tant que root (su / sudo)
Installer des applications sous Linux
f) Éteindre sa machine
Exemple
La commande shutdown permet d'éteindre sa machine en ligne de commande :
shutdown -h now (éteindre tout de suite)
shutdown -h 23:00 (éteindre à 23h00)
shutdown -h +60 (éteindre dans 60 minutes)
Stéphane Crozat
7
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
a) Présentation de PostgreSQL
PostgreSQL est :
un SGBDR
libre (licence BSD)
multi-plate-formes (Unix, Linux, Windows, MacOS, ...)
puissant
très respectueux du standard
très bien documenté
Fonctionnement général
PostgreSQL comme la grande majorité des SGBD est un logiciel client-serveur. Il faut donc
pour l'utiliser un serveur (programme postgresql sous Linux) et un client.
Il existe plusieurs clients, les deux plus utilisés sont le client textuel psql et le client graphique
PgAdmin III.
Complément
http://www.postgresql.org/5
http://www.postgresql.fr/6
b) Installation de PostgreSQL
Attention
Nous présentons ici une installation a minima de PostgreSQL uniquement à des fins
de test et d'apprentissage, et pour un usage local. Pour mettre en production une
base de données PostgreSQL sur le réseau, il faut suivre des directives
supplémentaires, notamment pour assurer la sécurité du système, sa sauvegarde...
Ces thèmes ne sont pas abordés dans le cadre de ce cours.
PostgreSQL est à l'origine une base de données conçue pour Unix, son installation et son
fonctionnement sont possibles aujourd'hui sur les trois OS, mais Linux reste son
environnement de prédilection. C'est l'architecture PostgreSQL sur Linux qui est étudiée ici.
https://www.postgresql.org/download/7
3- https://www.postgresql.org/docs/
4- http://docs.postgresqlfr.org/
5- http://www.postgresql.org/
6- http://www.postgresql.fr/
7- https://www.postgresql.org/download/
Stéphane Crozat
8
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Complément
https://doc.ubuntu-fr.org/postgresql8
Définition : psql
psql est le client textuel de PostgreSQL.
Complément
La commande psql utilisée sans paramètre se connecte au serveur localhost avec pour nom de
database et pour nom de user le nom de l'utilisateur du système qui invoque la commande
(utilisateur Linux typiquement).
me@mypc:~$ psql équivaut à : me@mypc:~$ psql -h localhost -d me -U me
8 - https://doc.ubuntu-fr.org/postgresql
9 - http://www.enterprisedb.com/products-services-training/pgdownload#windows
Stéphane Crozat
9
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
1 dbnf17p015=> SELECT *
2 dbnf17p015-> FROM maTable
3 dbnf17p015-> ;
On notera dans psql la différence entre les caractères => et -> selon que l'on a ou pas effectué
un retour chariot.
Complément
http://www.postgresql.org/docs/current/static/app-psql.html 10
d) Types de données
Types standards
numériques : integer (int2, int4, int8), real (float4, float8)
dates : date (time, timestamp)
chaînes : char, varchar, text
autres : boolean
Complément : Documentation
http://docs.postgresqlfr.org/8.1/datatype.html 11
10 - http://www.postgresql.org/docs/current/static/app-psql.html
11 - http://docs.postgresqlfr.org/8.1/datatype.html
Stéphane Crozat
10
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Syntaxe
Pour exécuter un fichier contenant du code SQL utiliser la commande PostgreSQL \i
chemin/fichier.sql
chemin désigne le répertoire dans lequel est le fichier fichier.sql
le dossier de travail de psql est le dossier dans lequel il a été lancé, le script peut être
lancé à partir de son dossier home pour en être indépendant (~/.../fichier.sql)
chaque commande doit être terminée par un ;
1 dbnf17p015=> \i /home/me/bdd.sql
Syntaxe
1 \copy nom_table (att1, att2, ...) FROM 'fichier.csv' WITH CSV DELIMITER ';'
QUOTE '"'
Remarque
La table nom_table doit déjà exister
Le nombre de colonnes spécifié doit correspondre au nombre de colonnes du fichier CSV
Les types doivent être compatibles
Remarque
Ajouter l'option HEADER après WITH CSV si le fichier CSV contient une ligne s'entête.
1 \copy nom_table (att1, att2, ...) FROM 'fichier.csv' WITH CSV HEADER DELIMITER
';' QUOTE '"'
Complément
PostgreSQL sous Linux
Fichier CSV
Stéphane Crozat
11
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
c) Notion de schéma
Définition
«
A PostgreSQL database cluster contains one or more named databases. Users and
groups of users are shared across the entire cluster, but no other data is shared
across databases. Any given client connection to the server can access only the
data in a single database, the one specified in the connection request.
A database contains one or more named schemas, which in turn contain tables.
Schemas also contain other kinds of named objects, including data types,
functions, and operators. The same object name can be used in different schemas
without conflict; for example, both schema1 and myschema can contain tables
named mytable. Unlike databases, schemas are not rigidly separated: a user can
access objects in any of the schemas in the database he is connected to, if he has
privileges to do so.
http://www.postgresql.org/docs/8.4/static/ddl-schemas.html 12 »
connexion
database cluster
db2
db1
sch1 sch2
tab2
db3
tab1
tab3 sch3
1 SELECT ...
12 - http://www.postgresql.org/docs/8.4/static/ddl-schemas.html
Stéphane Crozat
12
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
2 FROM myschema.mytable
Exemple
Cette instruction définit le schéma myschema comme schéma par défaut pour la création de
table et le requêtage, puis public pour le requêtage, le premier étant prioritaire sur le
second :
CREATE mytable créera ma mytable dans le schéma mychema.
SELECT FROM mytable cherchera la table dans la schéma mychema, puis dans le schéma
public si la table n'existe pas dans le premier schéma.
Stéphane Crozat
13
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Remarque : Catalogue : \d
La liste des tables retournée par \d dépend du search_path. Pour que \d retourne les tables de
schema1, il faut donc exécuter l'instruction :
SET search_path TO public, schema1
1 #!/bin/sh
2 psql -c "DROP DATABASE mydb"
3 psql -c "CREATE DATABASE mydb"
4 psql -c "GRANT ALL PRIVILEGES ON DATABASE mydb TO user1"
13 - http://www.postgresql.org/docs/8.4/static/ddl-schemas.html
Stéphane Crozat
14
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Stéphane Crozat
15
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Image 3 pgAdminIII
Complément : phpPgAdmin
http://phppgadmin.sourceforge.net14
g) Compléments
Complément : PL/pgSQL
http://www.postgresql.org/docs/current/static/plpgsql.html 16
14 - http://phppgadmin.sourceforge.net
15 - http://www.postgresql.org/docs/current/static/sql-createtable.html
16 - http://www.postgresql.org/docs/current/static/plpgsql.html
Stéphane Crozat
16
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Complément : Triggers
http://www.postgresql.org/docs/current/static/sql-createtrigger.html 19
(http://www.postgresql.org/docs/current/static/triggers.html20)
B. Exercices
Exercice
Comment s'appelle la section qui résume la syntaxe d'une commande dans le
manuel.
Exercice
Quelle touche doit-on utiliser pour convoquer l'aide de man ?
Exercice
Quelle touche doit-on utiliser pour sortir de man ?
17 - http://www.postgresql.org/docs/current/static/xplang.html
18 - http://www.postgresql.org/docs/current/static/server-programming.html
19 - http://www.postgresql.org/docs/current/static/sql-createtrigger.html
20 - http://www.postgresql.org/docs/current/static/triggers.html
Stéphane Crozat
17
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
b) Exercice
Trouvez ce que signifient dans le manuel :
les termes en gras
les termes soulignés ou italiques
les termes entre crochets [...]
la barre |
les trois petits points ...
1 - italique ou souligné
2 - |
3 - []
4 - gras
5 - ...
c) Exercice : ls
Exercice
Quelle commande devez-vous exécuter pour visualiser le manuel de la commande
ls ?
Exercice
En lisant le manuel, trouvez comment afficher le contenu du répertoire courant en
mode listing.
Exercice
Déplacez-vous dans le répertoire tmp situé à la racine du système de fichier.
Stéphane Crozat
18
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Exercice
Vérifiez que vous êtes bien au bon endroit.
Exercice
Créez un répertoire hello.
Exercice
Déplacez-vous dans ce répertoire.
Exercice
Créez un fichier world dans ce répertoire.
Exercice
Afficher la liste des fichiers de ce répertoire en mode listing.
Exercice
Éditer le fichier world avec l'éditeur nano, et saisissez le texte de votre choix.
Exercice
Après être sorti de l'éditeur, affichez le contenu de votre fichier (avec cat, more ou
less)
Exercice
Rechercher dans votre répertoire courant tous les fichiers dont le nom contient orl.
Stéphane Crozat
19
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Exercice
Supprimer le fichier world.
Exercice
Retournez dans votre dossier personnel initial.
Exercice
Supprimer le dossier hello que vous avez créé dans /tmp.
Rappel
Présentation
Le client textuel "psql"
Installation (du serveur PostgreSQL et du client psql)
Stéphane Crozat
20
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
1 psql (9.x.x)
2 Saisissez « help » pour l'aide.
3
4 mydb=>
Demander de l'aide
Demander de l'aide en testant :
help
\?
\h
\h CREATE TABLE
\h SELECT
1 CREATE TABLE uv (
2 pkcode CHAR(4) NOT NULL,
3 fketu CHAR(13) NOT NULL,
4 PRIMARY KEY (pkcode, fketu),
5 FOREIGN KEY (fketu) REFERENCES etu(pknumsecu));
Question 1
Utiliser le catalogue pour vérifier la création de la table.
Question 2
Utiliser deux instructions SELECT pour vérifier le contenu de la table.
Stéphane Crozat
21
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
Question 1
Exécuter les instructions nécessaires afin de supprimer les données existantes dans les tables
(instruction DELETE du SQL LMD). Vérifier que les tables sont vides.
Question 2
Créer les deux fichiers de données suivants, respectivement etus.csv et uvs.csv. Regarder le
contenu des fichiers. Pourquoi les appelle-t-on des fichiers CSV ?
1 1;A;Dupont;Pierre
2 2;B;Durand;Georges
3 3;C;Duchemin;Paul
4 4;D;Dugenou;Alain
5 5;E;Dupied;Albert
1 1;NF17
2 1;NF18
3 1;NF19
4 1;NF20
5 1;LA13
6 1;PH01
7 2;NF17
8 2;NF18
9 2;NF19
10 2;TN01
11 2;LA14
12 2;PH01
13 3;NF17
14 3;NF18
15 3;NF19
16 3;NF21
17 3;LA14
18 3;PH01
19 4;NF17
20 4;NF20
21 4;NF21
22 4;GE10
23 4;LA14
24 4;PH01
25 5;NF17
26 5;NF18
27 5;NF20
28 5;GE10
29 5;PH01
30 5;PH02
Indice :
Fichier CSV
Question 3
Insérer les données en complétant les instructions suivantes.
Indice :
Importer un fichier CSV
Question 4
Écrivez les requêtes permettant d'obtenir le nombre d'UV suivies par un étudiant et le nombre
d'étudiants inscrits par UV.
Stéphane Crozat
22
Implémentation de bases de données relationnelles avec PostgreSQL sous Linux
e) Manipulation de schémas
Question 1
Visualiser la liste des schémas existants dans votre base de données.
Indice :
Notion de schéma
Question 2
Créer un second schéma loisir.
Question 3
Créer une table sport dans le schéma loisir ; l'objectif est d'indiquer pour chaque étudiant, la
liste des sports qu'il pratique, par exemple : Tennis, Karaté, Aviron...
Vérifier votre création dans le dictionnaire.
Question 1
Exécuter ce fichier depuis psql.
Indice :
Exécuter des instructions SQL depuis un fichier
Question 2
Exécuter ce fichier depuis un script Linux.
Indice :
PostgreSQL sous Linux
g) Test de pgAdminIII
Stéphane Crozat
23
Application de
II -
II
bases de données,
principes et
exemples avec
LAPP
A. Cours
Définition
Une application de base de données comporte :
1. Une base de données : Elle pose le modèle de données, stocke les données, définit des
vues sur les données (préparation des modalités de lecture)
2. Une application : Elle définit les interfaces homme-machine pour écrire et lire les
données et contient le programme informatique de traitement des données avant
insertion dans la base ou présentation à l'utilisateur.
Stéphane Crozat
24
Application de bases de données, principes et exemples avec LAPP
Fondamental
Base de données
Modèle Vue
Application
Stockage et contrôle Lecture et manipulation
des données des données
Tables Vues
Entrées Triggers Méthodes (RO) Sorties
IHM Types (RO) Fonctions stockées
IHM
SQL, PL/SQL, PL/pgSQL SQL, PL/SQL, PL/pgSQL, VBA
Interface de saisie Affichage graphique
des données des données
Formulaires États
Stéphane Crozat
25
Stéphane Crozat
Base de données
26
Application de bases de données, principes et exemples avec LAPP
Application de bases de données, principes et exemples avec LAPP
Méthode : Pseudo-code
1 // Écriture de la requête
2 $vSql = "insert into t (a) values (1) ;"
1 // Exécution de la requête
2 $vResult = QUERY($vConn, $vSql)
1 // Test du résultat
2 IF (NOT $vResult) THEN MESSAGE("Échec de l'exécution")
1 // Clôture de la connexion
2 CLOSE ($vConn)
Remarque
La connexion est bien entendu inutile dans le cas de procédure stockées, qui se trouvent par
définition déjà associées à une BD en particulier.
1 <?php
2 function fInsert ($pValue) {
3 // Connexion à la base de données
4 $vHost = "foo.fr" ;
5 $vPort = "5432" ;
6 $vData = "myDatabase" ;
7 $vUser = "me" ;
8 $vPass = "secret" ;
9 $vConn = new PDO('pgsql:host=$vHost;port=$vPort;dbname=$vData', '$vUser',
'$vPass');
10 // Écriture, exécution et test de la requête
11 $vSql = "INSERT INTO t (a) VALUES ($pValue)" ;
12 $vResult=$vConn->query($vSql);
13 if (! $vResult) then {
14 echo "Échec de l'insertion" ;
15 return 0 ;
16 }
17 else {
18 return 1 ;
19 }
Stéphane Crozat
27
Application de bases de données, principes et exemples avec LAPP
20 // Clôture de la connexion
21 $vConn = null ;
22 }
23 ?>
1 class fInsert {
2 public static void main(String[] args) {
3 try {
4 // Connexion
5 DriverManager.registerDriver (new OracleDriver());
6 Connection vCon =
DriverManager.getConnection("jdbc:oracle:thin:nf17/nf17@localhost:1521:test");
7 // Exécution de la requête
8 Statement vSt = vCon.createStatement();
9 vSt.execute("INSERT INTO t (a) VALUES ('" + args[0] + "')");
10 }
11 catch (Exception e) {
12 e.printStackTrace();
13 }
14 }
15 }
Stéphane Crozat
28
Application de bases de données, principes et exemples avec LAPP
SELECT A, B, C, D FROM T
A A B C D
Pointeur
ligne 1
ligne 2
...
...
...
...
...
...
ligne N
Graphique 4 Pointeur sur un résultat de requête
Méthode
1. Connexion à la base de données et récupération d'un identifiant de connexion
2. Écriture de la requête de sélection
3. Exécution de la requête sur la connexion ouverte et récupération d'un pointeur sur un
résultat de requête
4. Parcours du pointeur dans une boucle permettant rapporter (fetch) et traiter (afficher
par exemple) le tableau ligne par ligne
5. Clôture de la connexion
Méthode : Pseudo-code
1 // Écriture de la requête
2 $vSql = "select a, b from t;"
1 // Exécution de la requête
2 $vPointeur = QUERY ($vConn, $vSql)
1 // Traitement du résultat
2 IF (NOT $vPointeur) THEN MESSAGE("Échec de l'exécution")
3 ELSE
4 WHILE ($vPointeur)
5 FETCH $vPointeur IN $vResult[]
6 PRINT $vResult[1]
7 PRINT $vResult[2]
8 NEXT $vPointeur
9 END WHILE
10 END IF
1 // Clôture de la connexion
2 CLOSE ($vConn)
Stéphane Crozat
29
Application de bases de données, principes et exemples avec LAPP
1 <?php
2 function fSelect () {
3 // Connexion à la base de données
4 $vHost = "foo.fr" ;
5 $vPort = "5432" ;
6 $vData = "myDatabase" ;
7 $vUser = "me" ;
8 $vPass = "secret" ;
9 $vConn = new PDO('pgsql:host=$vHost;port=$vPort;dbname=$vData', '$vUser',
'$vPass');
10 // Écriture, préparation et exécution de la requête
11 $vSql = "SELECT a, b FROM t;"
12 $vResultSet = $connexion->prepare($vSql);
13 $vResultSet->execute();
14 // Traitement du résultat
15 while ($vRow = $vResultSet->fetch(PDO::FETCH_ASSOC)) {
16 echo $row['a'];
17 echo " ";
18 echo $row['b'];
19 }
20 // Clôture de la connexion
21 pg_close($vConn)
22 }
23 ?>
1 Sub fSelect()
2 vSql = "select a, b from t"
3 Set vRs = CurrentDb.CreateQueryDef("", vSql).OpenRecordset
4 Do While Not vRs.EOF
5 Debug.Print vRs.Fields(0)
6 Debug.Print vRs.Fields(1)
7 vRs.MoveNext
8 Loop
9 End Sub
1 class fInsert {
2 public static void main(String[] args) {
3 try {
4 // Connexion
5 DriverManager.registerDriver (new OracleDriver());
6 Connection vCon =
DriverManager.getConnection("jdbc:oracle:thin:nf17/nf17@localhost:1521:test");
7 // Exécution de la requête
8 Statement vSt = vCon.createStatement();
9 ResultSet vRs = vSt.executeQuery("SELECT a, b FROM t");
10 // Affichage du résultat
11 while(vRs.next()){
12 String vA = vRs.getString(1);
13 String vB = vRs.getString(2);
14 System.out.println(vA + " - " + vB));
15 }
16 }
17 catch (Exception e) {
18 e.printStackTrace();
19 }
20 }
21 }
Stéphane Crozat
30
Application de bases de données, principes et exemples avec LAPP
2. Architecture Web
Objectifs
Comprendre les principes des architectures d'application de bases
de données (en particulier 3-tier et web)
21 - www.commentcamarche.net
Stéphane Crozat
31
Application de bases de données, principes et exemples avec LAPP
Stéphane Crozat
32
Application de bases de données, principes et exemples avec LAPP
Remarque
Étant donné l'emploi massif du terme d'architecture à 3 niveaux, celui-ci peut parfois désigner
aussi les architectures suivantes :
Partage d'application entre client, serveur intermédiaire, et serveur d'entreprise
Partage d'application entre client, base de données intermédiaire, et base de données
d'entreprise
Stéphane Crozat
33
Application de bases de données, principes et exemples avec LAPP
Fondamental
Un serveur web sert à rendre accessibles des pages web sur internet via le protocole
HTTP.
Remarque
Un serveur web répond par défaut sur le port 80.
Exemple
Apache : logiciel libre fondation Apache, la moitié des sites web au monde
Nginx : logiciel libre BSD, en croissance
IIS : logiciel propriétaire Microsoft
22 - www.commentcamarche.net
Stéphane Crozat
34
Application de bases de données, principes et exemples avec LAPP
e) Architecture LAPP
Définition : Définition
On appelle une architecture LAPP une architecture qui s'appuie sur :
Linux pour le système d'exploitation
Apache pour le serveur Web
PostgreSQL pour la base de données
PHP pour le langage applicatif
B. Exercice
Pré-requis
La réalisation de cet exercice nécessite un ordinateur sous Linux avec un accès root et un
serveur PostgreSQL installé. Les commandes sont spécifiées pour une distribution Ubuntu.
Rappels Linux
Utiliser Linux
Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat, nano...
Rappels Postgres
Présentation de PostgreSQL
Installation de PostgreSQL
Le client textuel "psql"
Stéphane Crozat
35
Application de bases de données, principes et exemples avec LAPP
Serveur web
L'objectif de cette partie est d'avoir un serveur web capable de distribuer des page HTML.
Installez le serveur web Apache.
Tester l'accès au serveur Web en entrant l'adresse web dans un navigateur : http://localhost23
Question 1
L'installation par défaut du serveur web permet de servir les fichiers situés dans le dossier
/var/www/html.
Déposez un fichier HTML de votre choix dans ce dossier et accédez-y via votre navigateur Web.
Indices :
Un exemple de fichier XHTML
Si votre fichier s'appelle example.html et qu'il se trouve à la racine du serveur web
/var/www/html vous y accéderez par l'adresse http://localhost/example.html24.
PHP
L'objectif de cette partie est d'avoir un interpréteur PHP en mode développement, c'est à dire
qui affiche les erreurs quand il y en a.
Installez l'interpréteur PHP pour Apache.
Question 2
Créez le fichier example.php ci-après et déposez-le sur votre serveur web. Faites un test
d'accès.
1 <?php
2 echo "Hello world";
3 ?>
Question 3
Créez et testez le fichier test.php ci-après. Ce fichier permet de visualiser la configuration
PHP du serveur.
1 <?php
2 phpinfo();
3 ?>
Question 4
Par défaut l'installation d'un interpréteur PHP est en mode production et il n'affiche pas les
erreurs. Il faut donc changer la configuration pour passer en mode développement.
1. À l'aide du fichier test.php précédent trouvez l'endroit où est stocké sur votre
ordinateur le fichier de configuration php.ini.
Par exemple : /etc/php/7.0/apache2/php.ini
2. Éditez ce fichier en tant que root: sudo nano php.ini
3. Remplacez le paramètre display_errors = Off par display_errors = On
4. Relancez le serveur web : sudo service apache2 reload
23 - http://localhost
24 - http://localhost/example.html
Stéphane Crozat
36
Application de bases de données, principes et exemples avec LAPP
Question 5
Il est également nécessaire d'installer un complément à PHP pour qu'il se connecte à
PostgreSQL.
PostgreSQL
L'objectif de cette partie est d'avoir une base PostgreSQL prête à être utilisée par un
programme PHP.
Question 6
Connectez vous en tant qu'utilisateur postgres (su postgres).
Créez un utilisateur test et une base test. Connectez-vous à la base.
L'objectif de cette partie est d'exécuter un programme PHP capable de lire le contenu de la
table medicament de notre base de données test.
Question 7
Créez le fichier select.php suivant (avec l'éditeur gedit par exemple) et déposez-le sur votre
serveur web. Accédez-y avec un client web pour exécuter le programme.
1 <?php
2
3 /** Connexion **/
4 $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=test', 'test',
'test');
5
6 /** Préparation et exécution de la requête **/
7 $sql = "SELECT nom FROM medicament;";
8 $resultset = $connexion->prepare($sql);
9 $resultset->execute();
10
11 /** Traitement du résultat **/
12 while ($row = $resultset->fetch(PDO::FETCH_ASSOC)) {
13 echo $row['nom'];
14 echo " ";
15 }
16
17 /** Déconnexion **/
18 $connexion=null;
19
20 ?>
Stéphane Crozat
37
Application de bases de données, principes et exemples avec LAPP
L'objectif de cette partie est d'exécuter un programme PHP capable de modifier le contenu de
la table medicament de notre base de données test.
Question 8
Créez le fichier insert.php et testez-le (exécutez-le au moins deux fois).
1 <?php
2
3 /** Connexion **/
4 $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=test', 'test',
'test');
5
6 /** Préparation et exécution de la requête **/
7 $sql = "INSERT INTO medicament (nom) VALUES ('Nouveau')";
8 $result = $connexion->prepare($sql);
9 $result->execute();
10
11 /** Traitement du résultat **/
12 if ($result) {
13 echo "'Nouveau' inséré";
14 }
15 else {
16 echo "Erreur lors de l'insertion";
17 }
18
19 /** Déconnexion **/
20 $connexion=null;
21
22 ?>
Question 9
Vérifiez que l'insertion a fonctionné en appelant select.php.
C. Devoir
Préambule
Ce devoir propose d'utiliser un site web gratuit chez 000webhost.com, n'importe quel autre
hébergeur peut être librement utilisé pour l'exercice.
Remarque : ce cours ne traite pas de sécurité informatique, mais notez que si, comme dans
cet exercice, vous utilisez le protocole FTP pour transmettre des informations, tout passe en
clair sur le réseau, y compris le mots de passe d'accès. Il est donc impératif de choisir un mot
de passe unique pour ce compte.
25 - https://000webhost.com
26 - http://filezilla-project.org/
Stéphane Crozat
38
Application de bases de données, principes et exemples avec LAPP
- Port :
- Protocol : FTP
- Encryption : Use plain FTP
- Logon type : Normal
- User : votre compte
- Password : votre mot de passe
- Account :
7. Cliquez sur : Connect
Stéphane Crozat
39
Application de bases de données, principes et exemples avec LAPP
Stéphane Crozat
40
Introduction à
III -
III
HTML et PHP
A. Cours
Objectifs
Savoir écrire une page simple en HTML
Savoir créer des formulaires en HTML
a) HTML
Définition : HTML
HTML est un langage inventé à partir de 1989 pour coder des pages de contenu sur le Web.
Il est standardisé par le W3C.
Les balises p et b ont une signification dans le langage HTML : Créer un paragraphe et mettre
en gras.
Remarque : HTML5
La version courante de HTML et la version 4.01 de 1999. Le HTML5 en cours de spécification
est déjà dans un état avancé de spécification et d'implémentation, il peut d'ors et déjà être
employé et est prévu pour 2014.
Stéphane Crozat
41
Introduction à HTML et PHP
b) XHTML
Définition : XHTML
XHTML est une réécriture du HTML : tandis que HTML est fondé sur SGML, XHTML est fondé
sur XML, plus récent et plus rigoureux. XHTML et HTML ne présentent pas de différence
fonctionnelle, uniquement des différences syntaxiques.
Dans le cas du HTML les balises fermantes sont optionnelles, en XHTML c'est obligatoire. Les
deux exemples sont donc équivalents, mais dans l'exemple HTML, il existait en fait plusieurs
interprétations possibles, par exemple :
<ul><li>Ceci est un extrait de contenu</li></ul><i>XHTML</i>
Remarque : XHTML5
La version actuelle de XHTML est la version 1, correspondant à HTML4. XHTML5 est le pendant
de HTML5.
Complément
Définition du XML
Historique : de SGML à XML
Discussion : HTML et XML
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head> ... </head>
3 <body> ... </body>
4 </html>
Syntaxe : Entête
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title>...</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
5 </head>
6 <body> ... </body>
7 </html>
Syntaxe : Corps
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title>...</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5 </head>
6 <body>
7 <h1>...</h1>
8 <h2>...</h2>
9 <p>...</p>
10 </body>
Stéphane Crozat
42
Introduction à HTML et PHP
11 </html>
Complément
Tutoriel XHTML : http://fr.html.net/tutorials/html/27
Brillant07, pp107-108 [Brillant07]
Syntaxe
Complément
Pour une description des balises de base : Brillant07, pp108-112 [Brillant07].
Complément
Introduction à CSS
2. Introduction à PHP
a) Présentation de PHP
PHP est un langage interprété (un langage de script) exécuté du côté serveur (comme les
scripts CGI, ASP, ...) et non du côté client (un script écrit en JavaScript ou une applet Java
s'exécute au contraire sur l'ordinateur où se trouve le navigateur). La syntaxe du langage
provient de celles du langage C, du Perl et de Java.
Ses principaux atouts sont :
La gratuité et la disponibilité du code source (PHP est distribué sous licence GNU GPL)
La simplicité d'écriture de scripts
La possibilité d'inclure le script PHP au sein d'une page HTML (contrairement aux scripts
CGi, pour lesquels il faut écrire des lignes de code pour afficher chaque ligne en langage
HTML)
La simplicité d'interfaçage avec des bases de données (de nombreux SGBD sont
supportés, le plus utilisé avec ce langage est MySQL).
L'intégration au sein de nombreux serveurs web (Apache...)
27 - http://fr.html.net/tutorials/html/
Stéphane Crozat
43
Introduction à HTML et PHP
b) Principes de PHP
Stéphane Crozat
44
Introduction à HTML et PHP
1 <?php
2 echo "Hello world";
3 ?>
Syntaxe
Pour que le script soit interprété par le serveur deux conditions sont nécessaires :
Le fichier contenant le code doit avoir l'extension .php et non .html (selon la
configuration du serveur Web)
Le code PHP contenu dans le code HTML doit être délimité par les balises "<?php" et "?
>"
Complément
Tutoriel PHP : http://fr.html.net/tutorials/php/28
Syntaxe
1 echo Expression;
28 - http://fr.html.net/tutorials/php/
Stéphane Crozat
45
Introduction à HTML et PHP
Remarque : Print
La fonction print est iso-fonctionnelle avec echo et printf plus complexe permet en plus le
formatage des données (peu utilisée).
1 <html>
2 <head><title>Exemple</title></head>
3 <body>
4 <?php
5 echo "Hello world";
6 ?>
7 </body>
8 </html>
e) Syntaxe PHP
Exemple
1 <?php
2 $i=0 ;
3 while($i<6) {
4 echo $i ;
5 $i=rand(1,6) ;
6 }
7 ?>
Attention : Généralités
Une instruction se termine par un ;
Les espaces, retours chariot et tabulation ne sont pas pris en compte par
l'interpréteur
Les commentaires sont écrits entre les délimiteurs /* et */ ou // sur une seule
ligne.
Le langage est case-sensitive (sauf pour les fonctions).
29 - http://php.net/manual/
Stéphane Crozat
46
Introduction à HTML et PHP
Complément : IDE
Eclipse PDT (PHP Development Tools)
http://www.zend.com/fr/community/pdt30
Zend Studio
http://www.zend.com/fr/products/studio/ 31
f) Variables en PHP
Les variables ne sont pas déclarées
Les variables commencent pas un $
Les variables ne sont pas typées
Les variables en langage PHP peuvent être de trois types :
Scalaires (entiers, chaîne, réels)
Tableaux (un tableau pouvant être multidimensionnel et stocker des scalaires de types
différents)
Tableaux associatifs (indexés par des chaînes)
Exemple
1 $Entier=1;
2 $Reel=1.0;
3 $Chaine="1";
4 $Tableau[0]=1
5 $Tableau[1]="1"
6 $TableauMulti[0][0]="1.0"
7 $TableauAssoc[Age]=18
Complément : isset()
1 if (isset($var)) {
2 echo $var;
3 }
Complément
Formulaires HTML et PHP
Syntaxe : Alternative IF
1 if (condition réalisée) {
2 liste d'instructions
3 }
4 elseif (autre condition réalisée) {
5 autre série d'instructions
6 }
7 ...
8 else (dernière condition réalisée) {
9 série d'instructions
10 }
30 - http://www.zend.com/fr/community/pdt
31 - http://www.zend.com/fr/products/studio/
Stéphane Crozat
47
Introduction à HTML et PHP
Rappel
Requête GET ou POST par formulaire HTML (balise <form>)
Traiter les requêtes HTTP avec un serveur PHP
1 <html>
2 <body>
3 <form method="get" action="test.php">
4 <input type="text" size="20" name="MaVar"/>
5 <input type="submit"/>
6 </form>
7 </body>
8 </html>
1 <?php
2 echo $_GET["MaVar"];
3 ?>
1 <html>
2 <body>
3 <p>
4 <?php
5 echo $_GET["MaVar"];
6 ?>
7 </p>
8 </body>
9 </html>
Attention : Cache
Les navigateurs disposent d'un cache, c'est à dire d'une copie locale des fichiers qui
leur évite de recharger plusieurs fois un fichier identique. Lorsque l'on développe
32 - http://php.net/manual/fr/language.control-structures.php
Stéphane Crozat
48
Introduction à HTML et PHP
une application PHP, les fichiers changent fréquemment, il est alors nécessaire de
vider le cache pour que le navigateur recharge bien la nouvelle version du code.
Sous Firefox, faire CTRL+F5.
B. Exercices
1. Population
[20 min]
Soit la page HTML suivante, visualisée sous le navigateur Web Firefox.
Question 1
Écrivez le code HTML source de cette page en utilisant un éditeur de texte, comme notepad++
sous Windows ou gedit sous Linux.
Indice :
Procédez par étape et vérifiez au fur et à mesure le résultat dans un navigateur Web.
Question 2
Déposez le fichier HTML sur un serveur web une fois finalisé et accédez-y avec un navigateur
pour vérifier.
Indice :
Mise en ligne d'un fichier HTML sur le serveur tuxa.sme.utc de l'UTC
Stéphane Crozat
49
Introduction à HTML et PHP
2. Hello PHP !
Question 1
Créer un fichier test.php utilisant la fonction phpinfo et le tester (la fonction renvoie les
informations techniques sur le module PHP installé sur le serveur).
Créer un fichier hello.php et le tester en accédant à la page.
1
2 <?php
3 echo "Hello world !";
4 ?>
5
Question 2
Transformer le fichier PHP pour qu'il renvoie une page HTML.
C. Devoirs
Question 1
Écrire un programme PHP qui permet d'afficher la table des 2 en HTML.
Indices :
Penser à implanter le code PHP dans le code HTML
On utilisera une boucle for
Question 2
Écrire une page HTML et une page PHP telles que :
1. la page HTML permet de saisir un nombre inférieur à 9 dans un formulaire ;
2. la page PHP affiche la table de ce nombre.
Indice :
Formulaires HTML et PHP
Stéphane Crozat
50
Requêtes HTTP
IV -
IV
avec Apache sous
Linux
A. Cours
Cette section a pour objectif de présenter une partie des commandes utiles pour utiliser un
ordinateur sous Linux. Elle suppose l'usage du terminal et des commandes de base (cd, ls, cat,
nano...) acquise.
On s'appuiera sur une distribution Ubuntu ou Debian.
https://www.debian.org/doc/manuals/debian-reference/ch01.fr.html 33
Rappel
Le terminal
L'usage de Linux en ligne de commande permet de travailler sur une machine à distance.
On utilise pour cela le protocole SSH. Il permet à un client SSH de se connecter à un serveur
SSH.
Exemple
ssh [email protected] permet de se connecter à la machine apollon.utc.fr en tant
qu'utilisateur nf17.
33 - https://www.debian.org/doc/manuals/debian-reference/ch01.fr.html
Stéphane Crozat
51
Requêtes HTTP avec Apache sous Linux
Complément : hostname
Si l'on veut savoir sur quelle machine est actuellement connecté notre terminal, on utilise la
commande hostname.
Exemple
scp monfichier.txt [email protected]:~/mondir permet de copier le fichier
monfichier.txt vers le répertoire mondir situé dans le dossier personnel de nf17 sur la machine
apolon.utc.fr.
Rappel
Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat, nano...
Sous Linux, chaque dossier et chaque fichier :
appartient à un utilisateur et à un groupe ;
possède des droits.
Ces droits se divisent en trois :
1. Les droits pour l'utilisateur propriétaire
2. Les droits pour les utilisateurs membres du groupe propriétaire
3. Les droits pour tous les autres utilisateurs
Fondamental : ls -al
La commande ls -al affiche tous les fichiers et dossiers d'un répertoire, avec leurs
propriétaires et leurs droits.
Le premier caractère indique sur l'élément est un dossier (d) ou un fichier (-).
Les trois caractères suivants indiquent les droits de l'utilisateur propriétaire
(ici stc a les droits rwx : lire, écrire, parcourir)
Les trois caractères suivants indiquent les droits des utilisateur membres du
groupe propriétaire (ici les membres de friends ont les droits r-x : lire et
parcourir, mais pas écrire)
Les trois caractères suivants indiquent les droits des autres utilisateurs (ici
--- : aucun droit)
Le nombre suivant indique le nombre de sous-dossiers dans le dossier listé (ici
.dir a 3 sous-dossiers, dont . et .. donc un seul vrai sous-dossier)
La chaîne suivante indique l'utilisateur propriétaire (ici l'utilisateur stc)
Stéphane Crozat
52
Requêtes HTTP avec Apache sous Linux
Exemple
Complément
http://www.linuxcertif.com/doc/keyword/ls/34
http://www.linux-france.org/article/sys/fichiers/35
Rappel
Affichage des droits sous Linux
Fondamental : chmod
La commande chmod permet de modifier l'attribution des droits d'un fichier ou d'un
dossier.
Pour cela on attribue 3 nombres de 0 à 7 correspondant aux 3 droits : utilisateur
propriétaire (u), utilisateurs membres du groupe propriétaire (g), autres utilisateurs
(o), sachant que :
1. r vaut 4, w vaut 2, x vaut 1 ;
2. on somme les droits que l'on veut cumuler.
Exemple
chmod 640 file donne les droits rw (4+2) à user, r (4) à group et aucun droit (0) à
others.
chmod 775 file donne les droits rwx (4+2+1) à user et group et rx (4+1) à others.
34 - http://www.linuxcertif.com/doc/keyword/ls/
35 - http://www.linux-france.org/article/sys/fichiers/
Stéphane Crozat
53
Requêtes HTTP avec Apache sous Linux
Définition : Processus
Un processus est un programme en cours d'exécution.
Stéphane Crozat
54
Requêtes HTTP avec Apache sous Linux
Complément
pkill xxx (pkill -9 xxx) permet d'arrêter le processus de nom xxx.
killall xxx (killall -9 xxx) permet d'arrêter tous les processus de nom xxx.
Attention : Démontage
Une mémoire doit être démontée afin d'être débranchée, cela permet d'être certain
que le système n'est plus en train d'agir sur la mémoire. Une déconnexion sans
démontage peut entraîner la corruption des données stockées sur la mémoire :
umount point-de-montage.
Par exemple : umount /media/stc/MYUSB01.
Stéphane Crozat
55
Requêtes HTTP avec Apache sous Linux
cups-pdf et pdftk
pdftk permet de manipuler des fichiers PDF. Par exemple :
pdftk input.pdf cat 1-3 5 output output.pdf permet de créer un fichier
output.pdf avec les pages 1,2,3 et 5 du fichier input.pdf
pdftk t1.pdf t2.pdf output output.pdf permet de créer un fichier output.pdf par
concaténation des fichiers t1.pdf et t2.pdf.
cups-pdf permet d'imprimer dans un fichier PDF.
a) HTTP
Définition
HTTP est un protocole de communication permettant à un client web d'interroger un serveur
web.
Stéphane Crozat
56
Requêtes HTTP avec Apache sous Linux
b) HTTP GET
Fondamental
La requête GET est la requête de base en HTTP, elle permet de demander une
ressource au serveur.
C'est la requête que formule un navigateur web quand on tape une adresse web dans
la barre d'adresse ou que l'on clic sur un lien .
Exemple
https://commons.wikimedia.org/w/index.php?curid=27753015
1 POST /mapage.php
2 Host: monsite.fr
3 login=moi&password=monsecret
Stéphane Crozat
57
Requêtes HTTP avec Apache sous Linux
Rappel
Requête GET ou POST par formulaire HTML (balise <form>)
Lorsqu'une requête HTTP envoie des données au serveur web, par exemple grâce à un lien <a>
ou un formulaire <form> en HTML, les données envoyées doivent être traitées par un
programme que l'on écrit spécifiquement sur le serveur.
Fondamental
Un serveur web/PHP peut gérer les données envoyées par une requête HTTP.
Lors de son chargement une page PHP contient un tableau de variables pour les
données envoyées par la méthode GET et un autre pour les données envoyées par
POST.
Syntaxe
On accède à ses données en utilisant la syntaxe :
$_GET["var1"]
$_GET["var2"]
ou
$_POST["var1"]
$_POST["var2"]
où var1 et var2 sont des noms de données dans la requête HTTP (par exemple le nom des
contrôles dans le formulaire HTML à l'origine de la requête).
Exemple
1 <?php
2 echo 'Hello ' . $_POST["name"] ;
3 ?>
Complément
http://php.net/manual/en/reserved.variables.get.php 36
http://php.net/manual/en/reserved.variables.post.php37
Exemple
Lorsque l'utilisateur clique sur le lien Ceci est mon lien le navigateur envoi une requête GET
pour récupérer page.html au serveur.
36 - http://php.net/manual/en/reserved.variables.get.php
37 - http://php.net/manual/en/reserved.variables.post.php
Stéphane Crozat
58
Requêtes HTTP avec Apache sous Linux
Exemple
Lorsque l'utilisateur clique sur le lien Ceci est mon lien le navigateur envoi une requête GET
pour récupérer page.php au serveur et envoi les données d et x avec leurs valeurs respectives.
Attention
Les données qui sont envoyées sur le serveur doivent être traitées par une couche
web applicative, par exemple en PHP.
Complément
Traiter les requêtes HTTP avec un serveur PHP
Rappel
Un exemple de fichier XHTML
Définition : Formulaire
On appelle formulaire une interface permettant à un utilisateur humaine de saisir des données
en vue dans une application informatique.
Définition : Contrôle
On appelle contrôle un élément d'un formulaire permettant d'effectuer une action : saisir une
donnée, exécuter une requête...
La balise form du langage HTML permet de :
créer un formulaire avec des contrôles,
envoyer le contenu du formulaire à un serveur web grâce à une requête GET ou POST.
Exemple : Formulaire
Cf. "Exemple de formulaire HTML"
Animation 1 Exemple de formulaire HTML
Stéphane Crozat
59
Requêtes HTTP avec Apache sous Linux
5 <p><input type="submit"></p>
6 </form>
Complément
https://developer.mozilla.org/fr/docs/Web/HTML/Element/Form 38
4. Complément
Cette section a pour objectif de présenter une partie des commandes utiles pour administrer
un ordinateur sous Linux. Elle suppose l'accès en mode root à la machine.
Syntaxe : su
Pour se connecter en tant qu'utilisateur root (et pouvoir faire les opérations qui lui sont
réservées) : su root.
Le mot de passe de utilisateur root est demandé par le système.
Syntaxe : sudo
Pour exécuter une commande en tant que root sans changer d'user : sudo commande.
Le mot de passe de utilisateur lançant sudo est demandé par le système.
Seuls certains utilisateurs appelés sudoers ont le droit d'exécuter la commande sudo.
Pour ajouter un utilisateur dans la liste des sudoers, excéuté en tant que root (ou via un
autre utilisateur sudoers) :
- adduser user sudo (en tant que root)
- sudo adduser user sudo (avec un utilisateur déjà membre des sudoers)
38 - https://developer.mozilla.org/fr/docs/Web/HTML/Element/Form
Stéphane Crozat
60
Requêtes HTTP avec Apache sous Linux
1 sudo apt-get install virtualbox lftp cups-pdf pdftk dia gimp git
Remarque
Seul l'utilisateur root (ou les sudoers) peuvent exécuter ces commandes.
Syntaxe : Utilisateurs
adduser user ajouter un utilisateur user.
deluser user supprimer un utilisateur user.
passwd user changer le mot de passe de user.
cat /etc/passwd lister les utilisateurs.
Syntaxe : Groupes
addgroup group ajouter un groupe group.
usermod -aG group user ajouter user à group.
deluser user group enlever user de group
cat /etc/group lister les utilisateurs avec leurs groupes.
groups user lister les groupes de user (cette commande est accessible aux utilisateurs non
root)
b) Apache
i Installer Apache
Rappel
Notions de serveur et de client web
Complément
http://httpd.apache.org/docs40
39 - http://localhost
40 - http://httpd.apache.org/docs
Stéphane Crozat
61
Requêtes HTTP avec Apache sous Linux
http://httpd.apache.org/docs/current/getting-started.html41
ii Piloter Apache
Méthode
Le serveur web Apache sous Linux peut-être invoqué par la commande apache2, mais on
utilise une commande plus haut niveau : apache2ctl.
Syntaxe
Remarque
apachectl est un alias pour apache2ctl sur les systèmes actuels.
Remarque
Les processus lancés par le serveur web se nomment apache2.
Complément
https://httpd.apache.org/docs/current/programs/apachectl.html42
iii Configurer Apache
La fichier de configuration standard d'Apache est : httpd.conf.
Sous Debian il s'agit du dossier /etc/apache2 (lire le fichier /etc/apache2/apache2.conf en
premier)
.htaccess
Outre la configuration centrale au niveau du serveur, Apache permet une configuration
décentralisée par le bais de fichiers .htaccess.
Complément
https://httpd.apache.org/docs/current/configuring.html43
http://httpd.apache.org/docs/current/howto/htaccess.html 44
Méthode
41 - http://httpd.apache.org/docs/current/getting-started.html
42 - https://httpd.apache.org/docs/current/programs/apachectl.html
43 - https://httpd.apache.org/docs/current/configuring.html
44 - http://httpd.apache.org/docs/current/howto/htaccess.html
45 - http://httpd.apache.org/docs/current/vhosts
Stéphane Crozat
62
Requêtes HTTP avec Apache sous Linux
Tester l'accès au module PHP en déployant le fichier PHP contenant le code suivant :
1 <?php
2 phpinfo();
3 ?>
Attention
Par défaut l'installation d'un interpréteur PHP est en mode production et il n'affiche
pas les erreurs. Il faut donc changer la configuration pour passer en mode
développement.
1. Le fichier de configuration de PHP est php.ini, situé par exemple dans :
/etc/php/7.0/apache2/php.ini
2. Éditez ce fichier et remplacez le paramètre display_errors = Off par
display_errors = On
3. Relancez le serveur web : sudo service apache2 reload
Complément
Il est également nécessaire d'installer un complément à PHP pour qu'il se connecte à
PostgreSQL.
Méthode : Transférer des fichiers depuis un client vers le serveur auquel il est
associé
Les clients Windows de l'UTC sont configurés pour proposer un disque virtuel Z qui
pointe sur l'espace du serveur Linux : les données déposées sur le disque Z sont donc
physiquement stockées sur le serveur Linux.
Les clients Linux de l'UTC sont configurés pour que le dossier home sur le client
corresponde à un répertoire sur le serveur.
Quelque soit le client il est possible d'utiliser un client SFTP (Filezilla par exemple) en se
connectant au serveur (par exemple tuxa.sme.utc) avec son compte UTC (par exemple
nf17p001).
Stéphane Crozat
63
Requêtes HTTP avec Apache sous Linux
Rappel
Connexion à un serveur Linux avec SSH
ii Mise en ligne d'un fichier HTML sur le serveur tuxa.sme.utc de
l'UTC
Les fichiers déposés dans un dossier ~/public_html seront accessibles par le serveur
web qui tourne sur tuxa.sme.utc.
Les fichiers sont ensuite accessibles sur le Web via une adresse telle que :
http://tuxa.sme.utc/~nf17pXXX/monfichier.html
Il faut les droits en lecture sur les fichiers (chmod 644) et sur les dossiers (chmod 755).
B. Exercices
1. Linux
[20 min]
L'objectif de cet exercice est de se rappeler les commandes de base pour utiliser un compte
Linux.
Question 1
Ouvrir une connexion SSH sur un serveur Linux de votre choix (proposant un accès SSH).
Indices :
Connexion à un serveur Linux avec SSH
À l'UTC vous pouvez vous connecter avec votre compte personnel au serveur
kappa.utc.fr ou avec votre compte d'UV au serveur tuxa.sme.utc.
Question 2
Rendez-vous dans votre répertoire home.
Indice :
Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat, nano...
Question 3
Affichez le chemin de l'endroit où vous vous trouvez.
Indice :
Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat, nano...
Question 4
Créez un fichier texte README contenant votre nom dans votre répertoire home.
Indice :
Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat, nano...
Question 5
Affichez les droits qui ont été attribués par défaut à ce fichier.
Indice :
Affichage des droits sous Linux (ls -al)
Stéphane Crozat
64
Requêtes HTTP avec Apache sous Linux
Question 6
Changez les droits du fichier README pour les donner en lecture à tout le monde (en
conservant les droits en modification de votre côté).
Indice :
Gestion des droits sous Linux (chmod)
Question 7
Vérifiez que les droits ont bien été attribués comme vous le souhaitiez.
Indice :
Affichage des droits sous Linux (ls -al)
Question 8
Regardez le contenu du fichier README d'un autre utilisateur.
Indice :
Commandes de bases sous Linux : cd, ls, mkdir, rm, find, cat, nano...
Question 9
Ouvrez votre fichier README avec gedit.
Ajoutez une ligne, sans enregistrer la modification.
Indice :
Lancer des applications sous Linux
Question 10
Trouvez le PID du processus gedit
Indice :
Gestion des processus sous Linux (ps et kill)
Question 11
Arrêtez votre processus gedit.
Indice :
Gestion des processus sous Linux (ps et kill)
2. HTTP
Question 1
Créer un fichier test.txt à la racine de l'espace de publication de votre serveur HTTP.
Indice :
1 nano /dossier-web/test.txt
Question 2
Accédez à votre serveur web en vous connectant sur le port 80 avec le client telnet (telnet est
un client TCP/IP généraliste fonctionnant en envoyant et recevant des lignes de texte).
Stéphane Crozat
65
Requêtes HTTP avec Apache sous Linux
Indice :
1 telnet nom-du-serveur 80
Question 3
Exécutez la requête HTTP 1.0 permettant de récupérer le fichier test.txt.
Indice :
Question 4
Exécutez à nouveau la même requête en utilisant le client wget.
Indice :
1 wget serveur:port/fichier
1 <?php
2 $pName=$_GET['name'];
3 echo "Votre nom est " . $pName;
4 ?>
Question 1
Testez ce fichier en y accédant avec un navigateur web, qu'obtenez-vous ?
Indice :
Entrez l'adresse web du fichier dans votre navigateur, par exemple
http://monserveur.fr/action.php.
Question 2
Testez ce fichier en envoyant la donnée name=Nobody avec un navigateur web en passant une
requête HTTP GET.
Indice :
Requête HTTP avec envoi de données au serveur
Question 3
Créez le fichier form.html ci-après, déployez-le dans le même dossier que action.php.
Testez-le en entrant une valeur dans le formulaire, afin de vérifier la mécanique du passage de
variable.
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title>Formulaire</title>
4 </head>
5 <body>
6 <form method="get" action="action.php">
7 <p><label>Entrez votre nom </label> <input type="text" name="name"
/></p>
8 <p><input type="submit" /></p>
Stéphane Crozat
66
Requêtes HTTP avec Apache sous Linux
9 </form>
10 </body>
11 </html>
Question 4
Transformez form.html et action.php afin que :
la méthode utilisée soit POST et non GET,
le fichier renvoyé soit un fichier XHTML et non une simple chaîne de caractère.
Indice :
Un exemple de fichier XHTML
Stéphane Crozat
67
Requêtes SQL
V -
V
avec PHP et
PostgreSQL
A. Cours
a) Architecture PHP/BD
Exemple
Définition
« PDO fournit une interface d'abstraction à l'accès de données, ce qui signifie que vous utilisez
les mêmes fonctions pour exécuter des requêtes ou récupérer les données quelque soit la base
de données utilisée. »
Stéphane Crozat
68
Requêtes SQL avec PHP et PostgreSQL
http://www.php.net/manual/fr/intro.pdo.php46
1 $sql = "...";
2 $resultset = $connexion->prepare($sql);
3 $resultset->execute();
Complément
http://php.net/manual/fr/book.pdo.php47
Exemple
1 <?php
2
3 /** Connexion **/
4 $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=test', 'test',
'test');
5
6 /** Préparation et exécution de la requête **/
7 $sql = "INSERT INTO medicament (nom) VALUES ('Nouveau')";
8 $result = $connexion->prepare($sql);
9 $result->execute();
10
11 /** Traitement du résultat **/
12 if ($result) {
13 echo "'Nouveau' inséré";
14 }
15 else {
16 echo "Erreur lors de l'insertion";
17 }
18
19 /** Déconnexion **/
20 $connexion=null;
21
22 ?>
46 - http://www.php.net/manual/fr/intro.pdo.php
47 - http://php.net/manual/fr/book.pdo.php
Stéphane Crozat
69
Requêtes SQL avec PHP et PostgreSQL
1 <?php
2
3 /** Connexion **/
4 $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=test', 'test',
'test');
5
6 /** Préparation et exécution de la requête **/
7 $sql = "SELECT nom FROM medicament;";
8 $resultset = $connexion->prepare($sql);
9 $resultset->execute();
10
11 /** Traitement du résultat **/
12 while ($row = $resultset->fetch(PDO::FETCH_ASSOC)) {
13 echo $row['nom'];
14 echo " ";
15 }
16
17 /** Déconnexion **/
18 $connexion=null;
19
20 ?>
e) Requêtes préparées
L'étape de préparation de requête permet de précompiler une requête SQL côté serveur. Cela
permet d'optimiser les performances lorsqu'une requête est utilisée plusieurs fois. Cela permet
également de paramétrer les requêtes au niveau d'un langage applicatif (comme PHP).
Conseil
Utiliser des requêtes paramétrées au niveau des langages applicatifs.
48 - http://php.net/manual/fr/pdo.prepared-statements.php
Stéphane Crozat
70
Requêtes SQL avec PHP et PostgreSQL
2. Complément
Syntaxe
Complément
http://www.php.net/manual/fr/language.functions.php50
ii Variables de session
Ce code permet de charger le fichier contenant les variables de session sur le serveur, ou s'il
n'existe pas de la créer.
Remarque
Ce code est à placer au début de toutes les pages PHP qui souhaitent utiliser les variables de
sessions, avant tout autre code PHP ou HTML.
1 <?php
2 ...
3 $_SESSION['variable'] = valeur ;
4 ...
49 - http://docs.postgresql.fr/current/sql-prepare.html
50 - http://www.php.net/manual/fr/language.functions.php
Stéphane Crozat
71
Requêtes SQL avec PHP et PostgreSQL
5 ?>
Un tableau association $_SESSION est alors mis à disposition pour gérer des variables.
Exemple
1 <?php
2 // page1.php
3 session_start();
4 ?>
5 <html>
6 <body>
7 <h1>Page 1</h1>
8 <?php
9 $_SESSION['login'] = 'me';
10 $_SESSION['mdp'] = 'secret';
11 ?>
12 <a href="page2.php">page 2</a>
13 </body>
14 </html>
1 <?php
2 // page2.php
3 session_start();
4 ?>
5 <html>
6 <body>
7 <h1>Page 2</h1>
8 <?php
9 echo $_SESSION['login'] ;
10 echo "<br/>" ;
11 echo $_SESSION['mdp'] ;
12 ?>
13 </body>
14 </html>
Complément : Sources
http://www.phpsources.org/tutoriel-SESSIONS.htm51
http://www.php.net/manual/fr/book.session.php52
Complément : Cookies
Les sessions s'appuient sur les cookies, fichiers de données gérés côté client par le navigateur
Web, pour stocker l'identifiant de session. Il est possible d'utiliser des sessions sans cookie, en
passant l'identifiant de session dans l'URL.
http://www.phpsources.org/tutoriel-cookies.htm53
51 - http://www.phpsources.org/tutoriel-SESSIONS.htm
52 - http://www.php.net/manual/fr/book.session.php
53 - http://www.phpsources.org/tutoriel-cookies.htm
Stéphane Crozat
72
Requêtes SQL avec PHP et PostgreSQL
1 class NomClasse {
2 // Déclarations des attributs
3 public $donneeMembre1;
4 public $donneeMembre2;
5 ...
6 // Déclarations du constructeur
7 function __construct () {
8 ...
9 }
10 // Déclarations des méthodes
11 public function Nom_de_la_fonction_membre1(parametres) {
12 ...
13 }
14 ...
15 }
Remarque : This
Le mot clé $this permet d'accéder à l'objet en cours lors de la déclaration des méthodes.
1 $Nom_de_l_objet->Nom_de_la_propriété = Valeur;
1 $Nom_de_l_objet->Nom_de_la_méthode (parametre1,parametre2,...);
1 <?php
2 class Connect {
3 var $fHost;
4 var $fPort;
5 var $fDbname;
6 var $fUser;
7 var $fPassword;
8 var $fConn;
9 function __construct () {
10 $this->fHost="foo.fr";
11 $this->fPort="5432";
12 $this->fDbname="myDb";
13 $this->fUser="Me";
14 $this->fPassword="Secret";
15 }
16 function mConnect () {
17 $this->fConn = pg_connect("host=$this->fHost port=$this->fPort
dbname=$this->fDbname user=$this->fUser password=$this->fPassword") or die('Échec
de la connexion : ' . pg_last_error());
18 }
19 function mClose () {
20 pg_close($this->fConn);
21 }
22 }
23 ?>
Stéphane Crozat
73
Requêtes SQL avec PHP et PostgreSQL
1 <?php
2 include "connect_class.php";
3 $vConnect = new Connect;
4 $vConnect->mConnect();
5 ?>
Complément
http://www.php.net/manual/fr/language.oop5.php 54
iv Include
b) Interfaces dédiées
i Interfaçage avec PostgreSQL
Syntaxe : Connexion à la BD
Syntaxe : Interrogation de la BD
Syntaxe : Alimentation de la BD
1 $vSql="INSERT ...";
2 $vQuery=pg_query($vConn, $vSql);
1 pg_close($conn)
Remarque
L'API OCI a remplacé l'ancienne API ORA (qui n'est plus supportée dans PHP).
Exemple
54 - http://www.php.net/manual/fr/language.oop5.php
55 - http://www.php.net/manual/en/ref.oci8.php
Stéphane Crozat
74
Requêtes SQL avec PHP et PostgreSQL
Exemple
$mode permet de paramétrer le commit (par défaut, le commit est envoyé automatiquement si
l'exécution est correcte).
Exemple
Exemple
1 if(! oci_commit($conn)) {
2 echo "Impossible de valider la transaction";
3 exit;
4 }
Remarque : Rollback
oci_rollback permet d'annuler une transaction.
Stéphane Crozat
75
Requêtes SQL avec PHP et PostgreSQL
Exemple
1 while ($row=oci_fetch_array($statement)) {
2 echo $results[0];
3 echo $results[1];
4 ...
5 }
Exemple
1 if (! oci_close($conn)) {
2 echo "Impossible de fermer la connexion ";
3 exit;
4 }
Connexion au serveur
1 mysql_connect($host,$user,$passwd);
1 mysql_select_db($bdd);
1 $result=mysql_query($query)
1 mysql_close();
56 - www.commentcamarche.net
Stéphane Crozat
76
Requêtes SQL avec PHP et PostgreSQL
B. Exercices
1. Super-transferts
[30 minutes]
L'entreprise de ventes de figurines de super-héros GARVEL a monté un partenariat avec les
deux sites de ventes en ligne makemoney.com et dobusiness.com. Chaque entreprise lui
demande de mettre à disposition respectivement un fichier CSV et un fichier XML pour le
transfert du catalogue, stocké dans une base de données PostgreSQL.
Le code devra être exécuté et testé.
1 Superman;15
2 Batman;12
3 Superchild;12
4 ...
1 <catalogue>
2 <figurine designation='Superman' prix='1555'/>
3 <figurine designation='Batman' prix='12'/>
4 <figurine designation='Superchild' prix='12'/>
5 ...
6 </catalogue>
Question 1
Créer la base de données correspondant à ce modèle.
Créer une vue vfigurine permettant de retourner les champs designation et prix.
Créer un utilisateur customer permettant de lire la vue figurine.
Stéphane Crozat
77
Requêtes SQL avec PHP et PostgreSQL
Question 2
Réaliser un script PHP csv.php permettant de se connecter à la base PosgreSQL et d'afficher la
désignation et le prix au format CSV, en suivant l'exemple ci-après.
Indice :
Accès à une BD en lecture (SELECT)
Question 3
Réaliser un script PHP permettant de se connecter à la base et d'afficher la désignation et le
prix selon un schéma XML, en suivant l'exemple ci-après.
2. À l'école de musique
[30 min]
Une école de musique souhaite gérer les inscriptions aux différentes classes d'instrument et
aux orchestres à l'aide d'une base de données.
Schéma conceptuel
1 Famille (#nom:chaîne)
2 Instrument (#lib:chaîne, lib_long:chaîne, famille=>Famille(nom))
3 Professeur (#num:entier, nom:chaîne, prénom:chaîne, tâche:chaîne)
4 Eleve (#num:entier, nom:chaîne, prénom:chaîne, date_naissance:date,
inst=>Instrument(lib))
5 Orchestre (#lib:chaîne, min:entier, max:entier)
6 Enseigne (#num=>Professeur(num), #lib=>Instrument(lib))
7 Participe (#num=>Eleve(num), #lib=>Orchestre(lib))
Question 1
Créer la base de données permettant de gérer les élèves et les instruments (sans les
familles). Insérer des données exemple.
Question 2
Écrire le code SQL qui permet d'afficher la liste des élèves (nom et prénom) triés par
instrument.
Question 3
Écrire le code SQL qui permet d'afficher la liste des instruments avec le nombre d'élèves
associés (on affichera même les instruments dont personne ne joue).
Stéphane Crozat
78
Requêtes SQL avec PHP et PostgreSQL
Question 4
Écrire le code SQL qui permet d'afficher la liste des instruments avec le nombre de places
restantes par instruments, sachant qu'il y a 20 places disponibles par instrument.
Question 5
Compléter le code PHP ci-dessous pour afficher le nombre de places disponibles par
instruments listés par leur libellé long.
On utilisera une requête paramétrée.
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title>École de musique</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5 </head>
6
7 <body>
8 <h2>Liste des places disponibles par instrument</h2>
9 <table border="1">
10 <tr> <td><b>Instruments</b></td> <td><b>Places disponibles</b></td> </tr>
11
12 <?php
13 /* Nombre maximum d'élèves autorisé par instrument */
14 $max_eleves = 20;
15
16 /* Nombre maximum d'élèves autorisé par instrument */
17 $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=musique', 'me',
'mypassword');
18
19 /** Préparation et exécution de la requête **/
20 $sql = "SELECT I.lib AS lib, ? - COUNT(E.inst) AS dispo ...";
21 $resultset = $connexion->prepare($sql);
22 $resultset->bindParam(1, ...);
23 $resultset->execute();
24
25 while ($row = $resultset->fetch(PDO::FETCH_ASSOC)) {
26 echo "<tr>";
27 echo "<td>" . $row[...] . "</td>";
28 echo "<td>" . $row[...] . "</td>";
29 echo "</tr>";
30 }
31
32 /** Déconnexion **/
33 $connexion=null;
34 ?>
35
36 </table>
37 </body>
38 </html>
Indice :
Requêtes préparées
Stéphane Crozat
79
Requêtes SQL avec PHP et PostgreSQL
C. Devoirs
1. Recensement
[45 min]
Soit le fichier CSV suivant :
1 "departement";"nbhabitants"
2 "01 - Ain";529378
3 "02 - Aisne";552320
4 "03 - Allier";357110
5 "04 - Alpes-de-Haute-Provence";144809
6 "05 - Hautes-Alpes";126636
7 "06 - Alpes-Maritimes";1022710
8 "07 - Ardèche";294522
9 "08 - Ardennes";299166
10 "09 - Ariège";142834
11 "10 - Aube";301388
Question 1
Établir un modèle relationnel et un code SQL permettant d'accueillir le contenu de ce fichier
(on nommera la table dpt1).
Question 2
Implémenter ce modèle sous Postgres et importer le fichier CSV.
Indice :
Importer un fichier CSV
Question 3
En quelle forme normale est le modèle ? Normalisez le en 3NF (on nommera la table dpt2).
Question 4
Écrivez et exécuter la requête SQL permettant de migrer dpt1 dans dpt2.
Indices :
Question 5
Écrivez le programme PHP permettant d'afficher le contenu de la table normalisée, tel que
présenté ci-dessous.
Stéphane Crozat
80
Requêtes SQL avec PHP et PostgreSQL
2. Devoirs en ligne
[45 min]
Une université propose des formations pour ses étudiants via une plate-forme d'enseignement
en ligne. Plusieurs devoirs sont proposés, chacun ayant une description et une même date de
rendu pour tous les étudiants souhaitant le faire. Le but de cet exercice est de réaliser un site
Web permettant aux étudiants de consulter leurs notes.
Base de données
On vous donne ci-dessous le code SQL LDD de la base de données sous PostgreSQL ainsi qu'un
exemple de code SQL LMD pour l'insertion de données.
Stéphane Crozat
81
Requêtes SQL avec PHP et PostgreSQL
Site Web
Le site Web sera composé :
d'une page d'accueil (accueil.html) comportant un formulaire où l'étudiant doit entrer
son login ;
d'une page présentant les notes d'un étudiant pour chaque devoir qu'il a rendu ainsi
que sa moyenne générale (notes.php).
La seconde page (notes.php) est appelée à partir de la première (accueil.html). On
supposera dans le reste de l'exercice que tous les fichiers sont situés directement dans le
répertoire public_html du serveur (sans sous-répertoires).
Question 1
Écrivez le formulaire HTML de la page d'accueil (accueil.html). On utilisera la méthode HTTP
POST.
Indice :
Requête GET ou POST par formulaire HTML (balise <form>)
Dans les questions suivantes, on supposera que le login spécifié dans le formulaire de
accueil.html existe effectivement dans la base de données (on ne fera donc pas de test pour
le vérifier) et on se référera à l'exemple d'affichage pour notes.php pour le résultat souhaité.
Question 2
Écrivez le code PHP permettant de générer le code HTML du titre de la page "Notes de
l'étudiant..." pour le login en question.
Indices :
Traiter les requêtes HTTP avec un serveur PHP
1 echo "<h1>Notes de l'étudiant " . $vPrenom . " " . $vNom . " (<i>" .
$vLogin . "</i>)</h1>";
Question 3
Écrivez le code PHP permettant de générer le code HTML du tableau des notes de l'étudiant.
Les devoirs seront affichés par ordre croissant de date de rendu.
Stéphane Crozat
82
Requêtes SQL avec PHP et PostgreSQL
Question 4
Écrivez le code PHP permettant de calculer la moyenne générale de l'étudiant.
Question 5
Écrivez le code HTML du lien hypertexte "Retour à l'accueil" et finalisez la page notes.php.
Indice :
Stéphane Crozat
83
Glossaire
Client
Un client est un programme informatique qui a pour fonction d'envoyer des requêtes à un
autre programme informatique, appelé serveur, d'attendre le résultat de cette requête et de
traiter le résultat de la requête. Notons qu'un programme peut-être client vis à vis d'un
programme et serveur vis à vis d'un autre. On ne prend pas ici le terme client dans son
acception matérielle, qui signifie alors un ordinateur qui a pour fonction d'héberger des
programmes clients.
Logiciel libre
Aujourd'hui, un logiciel est considéré comme libre, au sens de la Free Software Foundation, s'il
confère à son utilisateur quatre libertés (numérotées de 0 à 3)7 :
0. la liberté d'exécuter le programme, pour tous les usages ;
1. la liberté d'étudier le fonctionnement du programme et de l'adapter à ses besoins ;
2. la liberté de redistribuer des copies du programme (ce qui implique la possibilité
aussi bien de donner que de vendre des copies) ;
3. la liberté d'améliorer le programme et de distribuer ces améliorations au public, pour
en faire profiter toute la communauté.
L'accès au code source est une condition d'exercice des libertés 1 et 3.
(Wikipédia ; fsf.org)
RAID
La technologie RAID permet de repartir de l'information à stocker sur plusieurs "petits"
disques, au lieu de la concentrer sur un seul "gros" disque. Cette technologie permet donc
d'améliorer les performances (les accès disques pouvant être parallélisés) et d'améliorer la
sûreté (en repartissant les risques de crash et en jouant sur une redondance des données). Il
Stéphane Crozat
84
Glossaire
Sérialisation
Processus consistant à enregistrer des données en mémoire vive (par exemple des objets)
sous une forme permettant leur persistance, typiquement sur une mémoire secondaire.
Serveur
Un serveur est un programme informatique qui a pour fonction de recevoir des requêtes d'un
autre programme, appelé client, de traiter ces requêtes et de renvoyer en retour une réponse.
Notons qu'un programme peut-être serveur vis à vis d'un programme et client vis à vis d'un
autre. On ne prend pas ici le terme serveur dans son acception matérielle, qui signifie alors un
ordinateur qui a pour fonction d'héberger des programmes serveurs.
XSL-FO
XSL-FO (FO pour Formatting Objects) est la seconde partie du standard W3C « Extensible
Stylesheet Language Family ». Il propose un langage XML de mise en forme de documents
imprimables.
Exemple d'extrait de code FO :
<fo:block font-family="Times" font-size="12pt">Ceci est un paragraphe en police
Times de taille 12pt</fo:block>.
Stéphane Crozat
85
Signification des
abréviations
- BD Base de Données
- CSV Comma Separated Values
- E-A Entité-Association
- HTML HyperText Markup Language
- OS Operating Système (Système d'Exploitation)
- R Relationnel
- RO Relationnel-Objet
- SGBD Système de Gestion de Bases de Données
- SGML Standard Generalized Markup Language
- SQL Structured Query Language
- UML Unified Modeling Language
- W3C World Wide Web Consortium
- XML eXtensible Markup Language
Stéphane Crozat
86
Références
[Putty] PuTTy est utile si vous êtes sur un système Windows, pour obtenir
une connexion SSH et une console sur un serveur Linux.
C'est un exécutable qui ne nécessite pas d'installation, il peut donc
être téléchargé sur n'importe quel disque et lancé directement.
http://www.putty.org/57
http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 58
57 - http://www.putty.org/
58 - http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Stéphane Crozat
87
Bibliographie
[(Dupoirier, 1995)] GÉRARD DUPOIRIER, Technologie de la GED : Techniques et management des documents
électroniques, Hermes, 1995.
[André89] JACQUES ANDRÉ, RICHARD FURUTA, VINCENT QUINT, Structured documents, Cambridge University Press, 1989.
[Brillant07] ALEXANDRE BRILLANT, XML : Cours et exercices, Eyrolles, 2007 [ISBN 978-2212126914]
[Shea06] DAVE SHEA, MOLLY HOLZSCHLAG, Le Zen des CSS, Eyrolles, 2006.
[Thibaud03] THIBAUD CYRIL. MySQL 4 : Installation, mise en oeuvre et programmation. Editions ENI, 2003. Collection
Ressources Informatiques.
Stéphane Crozat
88
Webographie
Stéphane Crozat
89
Index
Stéphane Crozat
90