Source de cours/bases_donnees.php
<?
require ("../page.inc");
require ("lessons.inc");
$currentPage = new LessonPage("bases_donnees");
$currentPage->setContent('');
$currentPage->addChapter('utility', 'Utilité', '
<p>
Lors du développement d\'une application, on peut être ammené à devoir manipuler de nombreuses données. Il faudra les enregistrer, les mettre à jour, et bien sûr y accéder. Cet accès se fera à l\'aide de critères de recherche.
</p><p>
Un exemple courant est celui d\'un programme de gestion d\'un carnet de contacts. Il doit permettre d\'ajouter une nouvelle personne avec son numéro de téléphone et son adresse mail, et ensuite de la retrouver. On recherchera une personne par son nom le plus souvent, mais on peut aussi imaginer la possibilité de la retrouver par son numéro de téléphone.
</p><p>
Les bases de données permettent de remplir ce rôle de stockage des informations. Elles fournissent aussi des mécanismes permettant d\'y accéder dans les programmes et de facilement faire des recherches par critères.
</p><p>
En plus de cela, un système de gestion de bases de données propose des mécanismes de vérification des droits. Ceux-ci permettent d\'autoriser ou non l\'accès aux données selon l\'utilisateur qui en fait la demande.
</p><p>
On trouve aussi des fonctions plus avancées, comme le traitement d\'accès simultanés par plusieurs utilisateurs ou des possibilités pour ne pas perdre d\'informations en cas de problème. De manière plus générale est garantie l\'<strong>intégrité</strong> des données.
</p>
');
$currentPage->addChapter('base', 'Principes de base', '
<p>
Dans une base de données, le stockage se fait de manière organisée. On distingue plusieurs éléments constitutifs.
</p><p>
Il y a tout d\'abord des <strong>tables</strong>. Elles portent un nom qui généralement correspondra aux informations contenues. Pour reprendre l\'exemple du carnet de contacts, on aura une table appelée Contacts qui contiendra toutes les personnes que l\'on connait.
</p><p>
Une table contient des <strong>enregistrements</strong>. En voyant la table comme un tableau, un enregistrement correspond à une ligne. On pourra dire dans notre exemple, que les différentes personnes constituent les enregistrements de notre table Contacts.
</p><p>
Un enregistrement est fait de plusieurs <strong>champs</strong>. Ces derniers correspondent aux informations contenues. Ce sont les enregistrement qui contiennent effectivement des données. Ils correspondront aux colonnes d\'un tableau. Un champ est de plus défini par un <strong>type</strong> selon les données qui pourront y être enregistrées. Celui-ci indiquera par exemple que le contenu du champs pourra être un ou plusieurs caractères, un ou plusieurs chiffres, une date, ...
</p><p>
Voici sous forme d\'un tableau la représentation de l\'exemple abordé jusqu\'ici :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Exemple du carnet de contacts">
<caption>Contacts</caption>
<tr>
<th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Téléphone">Numéro de téléphone</th><th scope="col" abbr="Mail">Adresse mail</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Tian</td><td>7777</td><td>tian@c-sait.net</td>
</tr>
<tr>
<td>Nait</td><td>8888</td><td>nait@c-sait.net</td>
</tr>
<tr>
<td>Tux</td><td>9999</td><td>tux@c-sait.net</td>
</tr>
<tr>
<td>M. Winter</td><td>0000</td><td>winter@c-sait.net</td>
</tr>
</table>
</div>
<p>
Contacts est donc le nom de la table. Elle contient ici quatre enregistrements. Chacun est composé de trois champs correspondant au nom, au numéro de téléphone et à l\'adresse mail de la personne.
</p><p>
Le plus souvent pour une table est définie une <strong>clé primaire</strong>. Il s\'agit d\'un ou plusieurs champs qui définissent de manière unique un enregistrement. Pour les contacts, si l\'on suppose qu\'il ne peut y avoir deux personnes avec le même nom, ce dernier peut faire office de clé primaire.
</p><p>
Les systèmes de base de données utilisés sont le plus souvent de type <strong>relationnel</strong>. Par ce terme est exprimé le fait que des relations entre les tables vont exister. On aura alors la présence de <strong>clés étrangères</strong>. Une clé étrangère est une clé primaire pour une table qui est stockée dans une autre table afin d\'établir un lien entre les deux.
</p><p>
Reprenons alors l\'exemple précédent. On ne conservera que l\'adresse mail. On considéra qu\'une personne peut avoir plusieurs adresses mail. Mais aussi que pour chaque personne, on souhaite connaître en plus son âge. On aura alors tout d\'abord une table Contacts avec ces personnes :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="La table des contacts pour illustrer les clés étrangères">
<caption>Contacts</caption>
<tr>
<th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Age">Age</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Tian</td><td>25</td>
</tr>
<tr>
<td>Nait</td><td>52</td>
</tr>
<tr>
<td>Tux</td><td>7</td>
</tr>
<tr>
<td>M. Winter</td><td>34</td>
</tr>
</table>
</div>
<p>
On crée ensuite une autre table, Mails, pour stocker les adresses mail. Si une personne a plusieurs adresses mail, plusieurs lignes apparaîtront dans la table.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="La table des mails pour illustrer les clés étrangères">
<caption>Mails</caption>
<tr>
<th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Mail">Adresse mail</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Tian</td><td>tian@c-sait.net</td>
</tr>
<tr>
<td>Tian</td><td>webmaster@c-sait.net</td>
</tr>
<tr>
<td>Nait</td><td>nait@c-sait.net</td>
</tr>
<tr>
<td>Tux</td><td>tux@c-sait.net</td>
</tr>
<tr>
<td>M. Winter</td><td>winter@c-sait.net</td>
</tr>
</table>
</div>
<p>
Dans ce cas-ci, Tian a plusieurs adresses électroniques. Pour cette table, l\'adresse peut très bien faire office de clé primaire. En effet une telle adresse est forcément unique (même au-delà de cet exemple). Et la première colonne correspond à une clé étrangère. Il s\'agit de la clé primaire de la table Contacts qui est ici présente. Grâce à cela, on peut facilement déterminer l\'âge de la personne dont l\'adresse mail est webmaster@c-sait.net. On recherche tout d\'abord dans la table Mails l\'enregistrement correspondant à cette valeur. Le nom associé est Tian. On peut ensuite grâce à cette clé retrouver l\'enregistrement correspondant dans la table Contacts. Il ne reste plus alors qu\'à regarder le champs Age.
</p><p>
On vient donc ici de créer une relation entre deux tables. Leur nombre pourra être plus important, et les relations plus complexes. On pourra aussi avoir des clés sur plusieurs colonnes (par exemple Nom et Prénom).
</p><p>
Il est aussi possible de définir des <strong>contraintes</strong> sur les différents champs en plus du type. Une contrainte permet de spécifier quelles sont les valeurs possibles pour le champ sur laquelle elle porte. La clé étrangère est un cas particulier de contrainte. Mais on pourra aussi définir des conditions de validité.
</p><p>
Pour le carnet de contacts, l\'âge, qui sera de type numérique, pourrait avoir une contrainte limitant les valeurs possibles à celles de l\'intervalle allant de 0 à 130 ans. L\'adresse mail, qui est une chaîne de caractères, devra contenir un @ (arobase). D\'autres contrainte pourraient bien sûr être imposées.
</p><p>
Le simple exemple que nous venons de voir nous a ammené à déterminer les différentes tables et relations nécessaires pour appréhender un problème donné. Ceci constitue l\'établissement du <strong>modèle de données</strong>.
</p>
');
$currentPage->addChapter('use', 'Utilisation', '
<p>
Tout ce qui a été vu jusqu\'à présent restait plutôt théorique. Mais à présent il s\'agit de voir comment se présente un système de gestion de bases de données pour un utilisateur.
</p><p>
Il existe plusieurs systèmes disponibles. On peut citer <a rel="external" href="http://www.mysql.com" lang="en" xml:lang="en" hreflang="en">MySQL</a> ou <a rel="external" xml:lang="en" lang="en" href="http://www.oracle.com" hreflang="en">Oracle</a>. L\'utilisateur souhaitant installer un de ces systèmes de gestion de bases de données se retrouve avec plusieurs éléments.
</p><p>
Tout d\'abord la partie serveur. C\'est le coeur du système qui va gérer la base de données elle-même. On peut lui donner des opérations à effectuer, soit depuis un programme fonctionnant sur la même machine, soit depuis un programme s\'exécutant sur une machine distante au travers du réseau. On a alors un fonctionnement <strong>client/serveur</strong> où les clients sont les programme qui vont demander au serveur d\'effectuer des traitements sur les données.
</p><p>
Il y a ensuite généralement des outils d\'administration. Ils sont plus ou moins évolués selon les logiciels et peuvent être graphiques ou non. Ils vont permettre par exemple de gérer les utilisateurs ayant le droit d\'accéder à la base ou de créer les tables.
</p><p>
On trouve enfin l\'<strong>interface de programmation</strong>. C\'est ce qui permettra à l\'application de dialoguer avec le système de gestion de la base de données. Concrètement, cela se présente sous forme de <a href="programmation.php#lib">librairies</a> qui contiennent des fonctions pouvant être appelées dans les programmes. Dans le domaine des applications web, MySQL est connu pour pouvoir facilement être utilisé à partir de programmes <acronym lang="en" xml:lang="en" title="PHP: Hypertext Preprocessor">PHP</acronym>.
</p><p>
Afin que tout de même les accès aux données soient normalisés, un langage a été créé, le <acronym lang="en" xml:lang="en" title="Structured Query Language">SQL</acronym>. Il est utilisé dans les programmes, au travers de l\'interface de programmation, pour manipuler et retrouver les données stockées.
</p><p>
Ce langage permet d\'écrire des requêtes qui seront ensuite interprétées par le serveur. La syntaxe du SQL ne sera pas donnée ici, mais voici tout de même un exemple de requête pour se faire une idée :
</p>
<code>
SELECT Age FROM Contacts WHERE Nom = \'Tian\'
</code>
<p>
Les mots entièrement écrits en majuscules sont des mots-clés du langage. Le SQL n\'est pas sensible à la casse. C\'est donc uniquement par soucis de clarté que cela a été présenté ainsi.
</p><p>
Cette requête se lit comme ceci : "Selectionne le champ Age dans la table Contacts pour les enregistrements dont le champ Nom vaut Tian". Elle va retourner donc dans ce cas la valeur 25. La manière dont on pourra récupérer cette valeur dépendra du contexte dans lequel cette requête a été exécutée. Si on l\'a utilisée dans un outil d\'administration, elle s\'affichera à l\'écran. Dans une application, à l\'aide de l\'interface de programmation, elle sera généralement disponible dans une variable.
</p><p>
Ce langage permet aussi de créer les différents éléments utilisés dans la base de données. On peut notamment créer les tables. Par exemple pour créer la table Contacts, on pourrait procéder comme suit :
</p>
<code>
CREATE TABLE Contacts (<br />
Nom char(30),<br />
Age int<br />
)
</code>
<p>
Ce qui se lit : "Crée la table Contacts avec comme champs Nom, qui sera une chaîne de 30 caractères, et Age, qui sera un entier".
</p><p>
On peut juste citer aussi INSERT qui permet d\'ajouter un ou plusieurs enregistrements et DELETE qui permet d\'en supprimer.
</p>
');
$currentPage->display();
?>
require ("../page.inc");
require ("lessons.inc");
$currentPage = new LessonPage("bases_donnees");
$currentPage->setContent('');
$currentPage->addChapter('utility', 'Utilité', '
<p>
Lors du développement d\'une application, on peut être ammené à devoir manipuler de nombreuses données. Il faudra les enregistrer, les mettre à jour, et bien sûr y accéder. Cet accès se fera à l\'aide de critères de recherche.
</p><p>
Un exemple courant est celui d\'un programme de gestion d\'un carnet de contacts. Il doit permettre d\'ajouter une nouvelle personne avec son numéro de téléphone et son adresse mail, et ensuite de la retrouver. On recherchera une personne par son nom le plus souvent, mais on peut aussi imaginer la possibilité de la retrouver par son numéro de téléphone.
</p><p>
Les bases de données permettent de remplir ce rôle de stockage des informations. Elles fournissent aussi des mécanismes permettant d\'y accéder dans les programmes et de facilement faire des recherches par critères.
</p><p>
En plus de cela, un système de gestion de bases de données propose des mécanismes de vérification des droits. Ceux-ci permettent d\'autoriser ou non l\'accès aux données selon l\'utilisateur qui en fait la demande.
</p><p>
On trouve aussi des fonctions plus avancées, comme le traitement d\'accès simultanés par plusieurs utilisateurs ou des possibilités pour ne pas perdre d\'informations en cas de problème. De manière plus générale est garantie l\'<strong>intégrité</strong> des données.
</p>
');
$currentPage->addChapter('base', 'Principes de base', '
<p>
Dans une base de données, le stockage se fait de manière organisée. On distingue plusieurs éléments constitutifs.
</p><p>
Il y a tout d\'abord des <strong>tables</strong>. Elles portent un nom qui généralement correspondra aux informations contenues. Pour reprendre l\'exemple du carnet de contacts, on aura une table appelée Contacts qui contiendra toutes les personnes que l\'on connait.
</p><p>
Une table contient des <strong>enregistrements</strong>. En voyant la table comme un tableau, un enregistrement correspond à une ligne. On pourra dire dans notre exemple, que les différentes personnes constituent les enregistrements de notre table Contacts.
</p><p>
Un enregistrement est fait de plusieurs <strong>champs</strong>. Ces derniers correspondent aux informations contenues. Ce sont les enregistrement qui contiennent effectivement des données. Ils correspondront aux colonnes d\'un tableau. Un champ est de plus défini par un <strong>type</strong> selon les données qui pourront y être enregistrées. Celui-ci indiquera par exemple que le contenu du champs pourra être un ou plusieurs caractères, un ou plusieurs chiffres, une date, ...
</p><p>
Voici sous forme d\'un tableau la représentation de l\'exemple abordé jusqu\'ici :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Exemple du carnet de contacts">
<caption>Contacts</caption>
<tr>
<th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Téléphone">Numéro de téléphone</th><th scope="col" abbr="Mail">Adresse mail</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Tian</td><td>7777</td><td>tian@c-sait.net</td>
</tr>
<tr>
<td>Nait</td><td>8888</td><td>nait@c-sait.net</td>
</tr>
<tr>
<td>Tux</td><td>9999</td><td>tux@c-sait.net</td>
</tr>
<tr>
<td>M. Winter</td><td>0000</td><td>winter@c-sait.net</td>
</tr>
</table>
</div>
<p>
Contacts est donc le nom de la table. Elle contient ici quatre enregistrements. Chacun est composé de trois champs correspondant au nom, au numéro de téléphone et à l\'adresse mail de la personne.
</p><p>
Le plus souvent pour une table est définie une <strong>clé primaire</strong>. Il s\'agit d\'un ou plusieurs champs qui définissent de manière unique un enregistrement. Pour les contacts, si l\'on suppose qu\'il ne peut y avoir deux personnes avec le même nom, ce dernier peut faire office de clé primaire.
</p><p>
Les systèmes de base de données utilisés sont le plus souvent de type <strong>relationnel</strong>. Par ce terme est exprimé le fait que des relations entre les tables vont exister. On aura alors la présence de <strong>clés étrangères</strong>. Une clé étrangère est une clé primaire pour une table qui est stockée dans une autre table afin d\'établir un lien entre les deux.
</p><p>
Reprenons alors l\'exemple précédent. On ne conservera que l\'adresse mail. On considéra qu\'une personne peut avoir plusieurs adresses mail. Mais aussi que pour chaque personne, on souhaite connaître en plus son âge. On aura alors tout d\'abord une table Contacts avec ces personnes :
</p>
<div class="lesson-spacer">
<table class="lesson" summary="La table des contacts pour illustrer les clés étrangères">
<caption>Contacts</caption>
<tr>
<th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Age">Age</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Tian</td><td>25</td>
</tr>
<tr>
<td>Nait</td><td>52</td>
</tr>
<tr>
<td>Tux</td><td>7</td>
</tr>
<tr>
<td>M. Winter</td><td>34</td>
</tr>
</table>
</div>
<p>
On crée ensuite une autre table, Mails, pour stocker les adresses mail. Si une personne a plusieurs adresses mail, plusieurs lignes apparaîtront dans la table.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="La table des mails pour illustrer les clés étrangères">
<caption>Mails</caption>
<tr>
<th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Mail">Adresse mail</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>Tian</td><td>tian@c-sait.net</td>
</tr>
<tr>
<td>Tian</td><td>webmaster@c-sait.net</td>
</tr>
<tr>
<td>Nait</td><td>nait@c-sait.net</td>
</tr>
<tr>
<td>Tux</td><td>tux@c-sait.net</td>
</tr>
<tr>
<td>M. Winter</td><td>winter@c-sait.net</td>
</tr>
</table>
</div>
<p>
Dans ce cas-ci, Tian a plusieurs adresses électroniques. Pour cette table, l\'adresse peut très bien faire office de clé primaire. En effet une telle adresse est forcément unique (même au-delà de cet exemple). Et la première colonne correspond à une clé étrangère. Il s\'agit de la clé primaire de la table Contacts qui est ici présente. Grâce à cela, on peut facilement déterminer l\'âge de la personne dont l\'adresse mail est webmaster@c-sait.net. On recherche tout d\'abord dans la table Mails l\'enregistrement correspondant à cette valeur. Le nom associé est Tian. On peut ensuite grâce à cette clé retrouver l\'enregistrement correspondant dans la table Contacts. Il ne reste plus alors qu\'à regarder le champs Age.
</p><p>
On vient donc ici de créer une relation entre deux tables. Leur nombre pourra être plus important, et les relations plus complexes. On pourra aussi avoir des clés sur plusieurs colonnes (par exemple Nom et Prénom).
</p><p>
Il est aussi possible de définir des <strong>contraintes</strong> sur les différents champs en plus du type. Une contrainte permet de spécifier quelles sont les valeurs possibles pour le champ sur laquelle elle porte. La clé étrangère est un cas particulier de contrainte. Mais on pourra aussi définir des conditions de validité.
</p><p>
Pour le carnet de contacts, l\'âge, qui sera de type numérique, pourrait avoir une contrainte limitant les valeurs possibles à celles de l\'intervalle allant de 0 à 130 ans. L\'adresse mail, qui est une chaîne de caractères, devra contenir un @ (arobase). D\'autres contrainte pourraient bien sûr être imposées.
</p><p>
Le simple exemple que nous venons de voir nous a ammené à déterminer les différentes tables et relations nécessaires pour appréhender un problème donné. Ceci constitue l\'établissement du <strong>modèle de données</strong>.
</p>
');
$currentPage->addChapter('use', 'Utilisation', '
<p>
Tout ce qui a été vu jusqu\'à présent restait plutôt théorique. Mais à présent il s\'agit de voir comment se présente un système de gestion de bases de données pour un utilisateur.
</p><p>
Il existe plusieurs systèmes disponibles. On peut citer <a rel="external" href="http://www.mysql.com" lang="en" xml:lang="en" hreflang="en">MySQL</a> ou <a rel="external" xml:lang="en" lang="en" href="http://www.oracle.com" hreflang="en">Oracle</a>. L\'utilisateur souhaitant installer un de ces systèmes de gestion de bases de données se retrouve avec plusieurs éléments.
</p><p>
Tout d\'abord la partie serveur. C\'est le coeur du système qui va gérer la base de données elle-même. On peut lui donner des opérations à effectuer, soit depuis un programme fonctionnant sur la même machine, soit depuis un programme s\'exécutant sur une machine distante au travers du réseau. On a alors un fonctionnement <strong>client/serveur</strong> où les clients sont les programme qui vont demander au serveur d\'effectuer des traitements sur les données.
</p><p>
Il y a ensuite généralement des outils d\'administration. Ils sont plus ou moins évolués selon les logiciels et peuvent être graphiques ou non. Ils vont permettre par exemple de gérer les utilisateurs ayant le droit d\'accéder à la base ou de créer les tables.
</p><p>
On trouve enfin l\'<strong>interface de programmation</strong>. C\'est ce qui permettra à l\'application de dialoguer avec le système de gestion de la base de données. Concrètement, cela se présente sous forme de <a href="programmation.php#lib">librairies</a> qui contiennent des fonctions pouvant être appelées dans les programmes. Dans le domaine des applications web, MySQL est connu pour pouvoir facilement être utilisé à partir de programmes <acronym lang="en" xml:lang="en" title="PHP: Hypertext Preprocessor">PHP</acronym>.
</p><p>
Afin que tout de même les accès aux données soient normalisés, un langage a été créé, le <acronym lang="en" xml:lang="en" title="Structured Query Language">SQL</acronym>. Il est utilisé dans les programmes, au travers de l\'interface de programmation, pour manipuler et retrouver les données stockées.
</p><p>
Ce langage permet d\'écrire des requêtes qui seront ensuite interprétées par le serveur. La syntaxe du SQL ne sera pas donnée ici, mais voici tout de même un exemple de requête pour se faire une idée :
</p>
<code>
SELECT Age FROM Contacts WHERE Nom = \'Tian\'
</code>
<p>
Les mots entièrement écrits en majuscules sont des mots-clés du langage. Le SQL n\'est pas sensible à la casse. C\'est donc uniquement par soucis de clarté que cela a été présenté ainsi.
</p><p>
Cette requête se lit comme ceci : "Selectionne le champ Age dans la table Contacts pour les enregistrements dont le champ Nom vaut Tian". Elle va retourner donc dans ce cas la valeur 25. La manière dont on pourra récupérer cette valeur dépendra du contexte dans lequel cette requête a été exécutée. Si on l\'a utilisée dans un outil d\'administration, elle s\'affichera à l\'écran. Dans une application, à l\'aide de l\'interface de programmation, elle sera généralement disponible dans une variable.
</p><p>
Ce langage permet aussi de créer les différents éléments utilisés dans la base de données. On peut notamment créer les tables. Par exemple pour créer la table Contacts, on pourrait procéder comme suit :
</p>
<code>
CREATE TABLE Contacts (<br />
Nom char(30),<br />
Age int<br />
)
</code>
<p>
Ce qui se lit : "Crée la table Contacts avec comme champs Nom, qui sera une chaîne de 30 caractères, et Age, qui sera un entier".
</p><p>
On peut juste citer aussi INSERT qui permet d\'ajouter un ou plusieurs enregistrements et DELETE qui permet d\'en supprimer.
</p>
');
$currentPage->display();
?>
Si avez des problèmes ou des questions concernant ce fichier source, vous pouvez utiliser le Forum Sources du site