Réalisation de sites web

Sommaire du site

Présentation
Comment apprendre
L'équipement
La page web
  Styles et CSS
  HTML, structure de la page
  HTML, éléments du corps
Le langage JavaScript
  JavaScript, objets "core"
  JavaScript, DOM, les bases
  JavaScript, DOM, node
  JavaScript, compléments
Le langage PHP, les bases
  PHP, fonctions utiles
  PHP pour le web
  PHP, compléments
SQL, introduction
  MySQL et PHP pour le web
  MySQL, plus loin...
Applications AJAX
Annexes utiles
  Fichier .htaccess
  Sécurité des sites web
  Conception d'un site web
  Référencement, syndication

Sommaire détaillé

Mentions légales.

Chapitres de cette page
Contenu  -> 

Page mise à jour le : 12-08-2015

Haut de la page

Base de données
SQL et MySQL
Interface de gestion
Requêtes SQL  
A suivre...

SQL, introduction

Base de données

Il arrive souvent que l'on ait à traiter des informations organisées sous des structures identiques et organisées en liste.

Un exemple

Les adhérents d'une association sont caractérisés par leur nom, leur adresse, leur rôle dans l'association et la date de leur dernier paiement de cotisation.

On peut représenter cette liste structurée par une table. Pour notre exemple on aura :

Nom Adresse Fonction Date cotisation
Jean Bonnot  5, rue tabaga président 14-11-2024
Marie Tournelle 10, avenue du messie secrétaire 26-01-2024
Charles Atant 3, place Ide adhérent 13-08-2024
Sarah Plik  231, cours toujours adhérente
etc.

Ces informations pourraient être enregistrées dans un fichier, mais le traitement ne sera pas très simple.

Il est préférable d'utiliser un système de gestion de bases de données qui est spécialisé pour traiter ce type d'information structurée. Et il peut faire encore mieux...

En effet, notre exemple précédent ne comporte qu'une table. Or il est probable que d'autres existent.

En effet, cette association organise des activités, voici donc une nouvelle table :

Intitule Lieu Moment
Boxe Anciens abattoirs Lundi 19h-21h
Couture Gymnase Samedi 14h-17h
Spéléologie    Egouts de la ville Samedi 18h à dimanche 23h
etc.

Comme on peut s'en douter, il semble intéressant d'associer les adhérents aux activités qu'ils pratiquent.

Mais un adhérent peut pratiquer plusieurs activités et chaque activité a plusieurs participants. De plus, on souhaite éviter les redondances d'information entre les tables.

Pour cela, on utilise une troisième table qui indique les relations entre les éléments des deux précédentes.

Pour éviter d'éventuels problèmes d'homonymie il est préférable de modifier les deux tables que l'on a vues afin d'ajouter une colonne d'identification.

Celles-ci deviendront :

Table 'adherents'

id Nom Adresse Fonction Date cotisation
1 Jean Bonnot  5, rue tabaga président 14-11-2024
12 Marie Tournelle 10, avenue du messie secrétaire 26-01-2024
35 Charles Atant 3, place Ide adhérent 13-08-2024
83 Sarah Plik  231, cours toujours adhérente
etc.

et

Table 'activites'

id Intitule Lieu Moment
5 Boxe Anciens abattoirs Lundi 19h-21h
8 Couture Gymnase Samedi 14h-17h
3 Spéléologie    Egouts de la ville Samedi 18h à dimanche 23h
etc.

La colonne 'ID' identifie de façon unique chaque ligne.

Alors la table des participations aux activités est :

Table 'participation'

Qui Quoi
35 8
83 5
35 3
12 3
etc.
On voit donc que Charles fait de la couture et de la spéléologie, Sarah de la boxe et Marie de la spéléologie.

Quelques définitions

Une base de données contient des tables dont les éléments peuvent être associés.
Une table contient des enregistrements de structure identique.
Un enregistrement est structure en colonnes ou champs.
A chaque colonne ou champ est associé un type (nombre, texte, date...) et, parfois, une taille maximale.
Le système de gestion de bases de données (SGBD) fourni un ensemble de commandes pour gérer 

Tout cela avec la meilleure efficacité, sécurité, performance, accessibilité, convivialité, puissance...

Pour que l'utilisateur puisse faire réaliser ces fonctions par le système, il est nécessaire de disposer d'un langage informatique de communication. Le langage le plus utilisé est SQL (Structured Query Language). Les commandes de ce langage sont appelées "requêtes".

SQL et MySQL

Il existe différents systèmes de gestion de bases de données. La plupart utilisent le langage de requêtes "SQL".

SQL n'est pas un  langage de programmation car il ne gère pas le déroulement d'un programme. Il est un "langage de requêtes pour bases de données".

Les serveurs web  disposent parfois de plusieurs SGBD. L'un des plus utilisé est "MySQL", il est une des composantes de l'ensemble "LAMP" : Linux, Apache, MySQL, PHP. Et donc, la bibliothèque de fonctions  PHP contient les commandes adaptées à MySQL. (Ou WAMP, MAMP... pour Windows, Mac...)

Pour l'utilisation sur le web, MySQL fonctionne en mode serveur. Cela signifie qu'il est un serveur de bases de données auquel il faudra se connecter.

La documentation de référence de MySQL, donc du langage SQL inclus dans ce SGBD se trouve à :
http://dev.mysql.com/doc/refman/5.0/fr/index.html

Comme il existe plusieurs versions (évolution) de MySQL, il est fortement conseillé de vérifier la version MySQL de son serveur avec la commande PHP : 'phpinfo();'.

Il y a trois façons d'utiliser MySQL :

Interface web de gestion : phpMyAdmin

La version de "phpMyAdmin" présentée ici est la 3.2.1.
Les versions précédentes en différent peu. Et on peut espérer que les suivantes feront de même...

"phpMyAdmin" est une application web pour la gestion des bases de données avec MySQL. Il s'agit d'un "site" web spécifique (un ensemble de pages web) écrit en PHP, d'où son nom.

Pour l'utiliser, il faut lancer un navigateur web et donner l'adresse du site. Celle-ci est indiquée par la documentation du serveur ou par l'hébergeur.

Par exemple, si on utilise un serveur local sous EasyPHP 2.0, on utilise l'adresse (depuis la machine du serveur) : http://127.0.0.1/home/mysql/

Sur un serveur distant, cet accès est soumis à l'acceptation d'un compte d'utilisateur associé à un mot de passe.

phpMyAdmin permet l'administration des bases de données sans connaissance du langage SQL du fait de son fonctionnement interactif.

phpMyAdmin présente trois grands intérêts.

Il est utile pour les commandes qui ne doivent être exécutées qu'une seule fois ou rarement : création de bases et de tables, modifications de structure, remplissage préalable de tables, sauvegarde des contenus...

Il a aussi une vertu d'apprentissage car toute commande lancée sera affichée dans la syntaxe SQL (en haut de la fenêtre), il est même possible d'avoir des informations complémentaires sur la commande et d'obtenir le code PHP équivalent.

De plus il dispose d'une fenêtre SQL, bouton SQL en haut à gauche qui permet de tester des commandes SQL en direct. Il faut toutefois être prudent avec certaines commandes...

Création de la base de données

Si l'on utilise les services d'un serveur mutualisé, l'hébergeur a créé la base de données, cette opération n'est donc pas a réaliser et phpMyAdmin accède directement à la base.

Conseils pour les noms.
Bien que le système admette n'importe quel caractère pour un nom de base, de table, de colonne..., il est judicieux de n'utiliser que les 26 lettres de l'alphabet et les chiffres. Car si ces informations doivent être transférées sur un autre serveur on n'aura pas de problème avec les différents jeux de caractères.

Mais si l'on travaille sur son propre serveur : serveur local ou dédié, il faut créer la base. Comme cette opération n'est à réaliser qu'une fois, le plus simple est de la faire avec phpMyAdmin.

Dans ce cas, sur la première page que l'on obtient au démarrage, on trouve : "Créer une base de données", il suffit de donner un nom (laisser les autres options en l'état) et cliquer sur le bouton 'Créer'. Cette nouvelle base doit apparaitre dans la colonne de gauche.

On pourra ouvrir cette base en cliquant sur ce nom.

Créer une table

Une fois la base ouverte, si celle-ci ne comporte aucune table, la fenêtre principale (de droite) en propose la création, sinon on y trouve la partie "Créer une nouvelle table".

Créer une nouvelle table demande son nom et le nombre de champs (colonnes) à y placer.

On renseigne ces informations et on clique sur le bouton "Exécuter". Il faut maintenant spécifier les champs.

Chaque champ doit bien sûr avoir un nom et un type, il faudra éventuellement spécifier des index. Le reste des informations peut être laissé vide.

La structure des tables ainsi que les noms et types de champs peuvent être modifiés par la suite.

Types de champ

Type SQL Nature Remarques
TINYINT ou BIT ou BOOL Entier [-128, 127] ou [0, 255] Peuvent avoir l'attribut : 'UNSIGNED' : nombres uniquement positifs.
SMALLINT Entier [-32 768, 32 767] ou [0,  65 535]
MEDIUMINT Entier [-8 388 608, 8 388 607]
ou [0,  16 777 215]
INT Entier [-2 147 483 648,  2 147 483 647]
ou [0,   4 294 967 295]
BIGINT Entier [-9 223 372 036 854 775 808,
           9 223 372 036 854 775 807]
ou [0,  18 446 744  073 709 551 615]
FLOAT Virgule flottante 10 chiffres significatifs étendue 1038
DOUBLE Virgule flottante 16 chiffres significatifs étendue 10308
DECIMAL Nombre codé sous forme de chaîne de caractères
CHAR Chaîne taille fixe < 256 caractères La taille maximum doit être spécifiée dans 'Taille / Valeur'
VARCHAR Chaîne taille variable < 256 caractères
TINITEXT ou TINYBLOB Chaîne taille variable < 65 535 caractères Les comparaisons et tris sur le type 'TEXT' ne différencient pas les minuscules des majuscules
Avec 'BLOB', la distinction est faite, ce type est bien adapté aux données binaires.
TEXT ou BLOB Chaîne taille variable < 65 535 caractères
MEDIUMTEXT ou MEDIUMBLOB Chaîne taille variable <  16 777 215 caractères
LONGTEXT ou LONGBLOB Chaîne taille variable < 4 294 967 295 caractères
ENUM Une des valeurs de la liste Les valeurs possibles doivent être spécifiées dans 'Taille / Valeur'
SET Des valeurs de la liste
DATE Une date 'AAAA-MM-JJ' L'année est en premier, le numéro du jour en dernier.
DATETIME Date-heure 'AAAA-MM-JJ HH:MM:SS'
TIMESTAMP Date_heure format UNIX A éviter car changement de format à partir de MySQL 4.1
YEAR Année

En savoir plus

Sur les nombres :
http://dev.mysql.com/doc/refman/5.0/fr/numeric-type-overview.html
Sur les chaînes
http://dev.mysql.com/doc/refman/5.0/fr/string-type-overview.html
Sur les date/heures :
http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-type-overview.html
Pour les tailles occupées :
http://dev.mysql.com/doc/refman/5.0/fr/storage-requirements.html

Indexation

L'indexation d'un champ facilite la recherche dans la table pour une valeur de ce champ.

Un champ peut avoir comme valeur d'index : 'PRIMARY', 'UNIQUE', 'INDEX' ou 'FULLTEXT'

La case 'A_I' cochée indique que le champ est en auto-incrément. Ce doit être un champ de type nombre entier. Un compteur interne à la table est utilisé et est incrémenté à chaque insertion d'enregistrement. L'enregistrement contiendra pour ce champ la valeur de ce compteur.
Les valeurs d'auto-incrément commencent à 1.

Exemple

Dans notre exemple du début, la table 'adherents' pourrait avoir ses champs spécifiés ainsi :

Nom du champ Type Particularités
id MEDIUMINT Attribut : UNSIGNED
Index : PRIMARY
Auto-incrément
nom VARCHAR Taille : 255
Index : UNIQUE
adresse TINYTEXT  
fonction CHAR Taille : 10
date_cotisation DATE Index : INDEX

Exploitation

Les tables apparaissent, dans "phpMyAdmin" dans la colonne de gauche, sous le nom de la base.

En cliquant sur l'une des tables on obtient ses informations dans la partie droite où l'on trouve 10 onglets.

Afficher : liste le contenu de la table. Si la table contient beaucoup d'enregistrements, l'affichage se fait page par page.

Structure : affiche la structure de la table. Il est possible de modifier les champs, de les supprimer et d'en ajouter.

SQL : permet de passer une commande SQL. Analogue au bouton de la colonne de gauche mais n'ouvre pas de fenêtre spécifique.

Rechercher : pour faire des recherches d'enregistrements dans la table.

Insérer : facilite l'ajout d'enregistrements. Il est possible d'associer une fonction à la valeur que l'on place.

Exporter : pour générer une "image' de la structure et/ou du contenu de la table. Différents formats d'exportation sont proposés, les options varient selon les formats.

Importer : opération inverse de la précédente, il y a moins de formats.

Opérations, pour faire sur la table  :

Vider : supprime tous les enregistrements de la table.

Supprimer : efface la table (et donc son contenu) de la base.

Requêtes SQL

Préalables

Avant tout accès, il est indispensable de connecter au serveur de bases de données puis à la base de données concernée.

Si l'on utilise "phpMyAdmin", son lancement correspond à la connexion au serveur. La connexion à la base se fait en cliquant sur le nom de celle-ci dans la colonne de gauche.

En revanche, et on le verra plus tard, si l'on utilise la base de données dans une page web, il faudra réaliser ces opérations par des commandes spécifiques en PHP.

Syntaxe générale des requêtes

SQL ne distingue pas les majuscules des minuscules. Cependant, pour une bonne lisibilité, généralement on écrit les mots-clefs du langage en majuscules et les identifiants en minuscules.

Chaque requête SQL débute par un mot-clef identifiant la commande. Il est suivi d'informations indiquant sur quoi porte la commande : noms de table, de colonne (champ), etc. Le séparateur est l'espace. D'autres mots-clefs interviennent pour indiquer la nature de ces informations.

Parfois on encadre les identifiants (noms) entre accents graves (anti-apostrophes) "`". Cela est nécessaire si l'identifiant contient des caractères spéciaux comme l'espace.

Les valeurs sont placées entre apostrophes.

Voici un exemple de requête sur notre table telle qu'elle à été définie au paragraphe précédent.

SELECT `nom`, `adresse` FROM `adherents` WHERE `date_cotisation` > '2009-12-31'

Cette requête produit le contenu des colonnes 'nom' et 'adresse' de la table 'adherents' pour une valeur de 'date_cotisation' postérieure au 31 décembre 2009.

On peut remarquer le les noms de colonnes et de la table sont encadrés par des accents graves. La valeur de date est encadrée d'apostrophes et donnée sous la forme 'AAAA-MM-JJ'.

Il peut être intéressant d'utiliser "phpMyAdmin", de créer des tables, d'y insérer des enregistrements et, depuis, la fenêtre SQL essayer quelques requêtes.

 

Ci-dessous les requêtes les plus utilisées.

Pour leur présentation nous utiliserons la notation :

MOT_CLEF identifiant valeur [partie optionnelle]

Souvent plusieurs formes existent, seule la forme simple sera donnée sur cette page. Les détails complets seront trouvés sur le site de référence.

Lecture de table

SELECT col [,col...] FROM table [WHERE condition]

SELECT est une requête qui produit un résultat. Comme elle est utilisée la plupart du temps pour faire une recherche dans une table, on précise le nom de celle-ci derrière le mot FROM.

Le nom des champs à obtenir est placé entre SELECT et FROM, s'il y en a plusieurs on les sépare par une virgule. Il est possible d'indiquer comme nom de champ le caractère '*'. Dans ce cas tous les champs seront listés.

La clause WHERE est un filtre introduisant une condition. En l'occurrence, SELECT n'affichera que les informations satisfaisant cette condition. En l'absence de WHERE, SELECT aurait affiché tout le contenu de la table.

En savoir plus :
http://dev.mysql.com/doc/refman/5.0/fr/select.html

Ajout d'enregistrements

INSERT ajoute un nouvel enregistrement ou plus dans la table. Elle accepte plusieurs syntaxes. En voici une :

INSERT INTO table SET colonne= valeur[, colonne= valeur[,...]]

« table » est le nom de la table ou l'ajout se fera, « colonne » est le nom de la colonne où sera placé « valeur ». Si certaines colonnes ne sont pas indiquées, une valeur par défaut leur sera donnée.

Exemple

INSERT INTO `adherents`
SET `nom`='Emma PtitGoute', `Date_cotisation`= NOW()

Remarquons que les valeurs sont données dans le type des colonnes : le nom de la personne est enclos d'apostrophes.

La fonction MySQL NOW() renvoie la date et heure, minute, seconde actuelles. Comme le champ n'accepte que la date, la troncature est automatique.

Une autre syntaxe permet l'ajout simultané de plusieurs enregistrements

En savoir plus :
http://dev.mysql.com/doc/refman/5.0/fr/insert.html

Mise à jour d'enregistrements

La requête « UPDATE » a aussi plusieurs syntaxes dont une très proche de celle de l'ajout. Elle est généralement associée à « WHERE » car sinon la modification serait faite sur toute la table !

UPDATE table SET colonne= valeur[, colonne= valeur[,?]] [WHERE condition]

Les colonnes non spécifiées ne sont pas modifiées.

Il est indispensable de bien vérifier la clause WHERE pour s'assurer que seuls les enregistrements concernés seront modifiés.

UPDATE `adherents`
SET `fonction`= 'Trésorière' WHERE `id`= '20'

En savoir plus :
http://dev.mysql.com/doc/refman/5.0/fr/update.html

Suppression d'enregistrements

Encore plus simple dans la syntaxe, mais radicale, la requête "DELETE". La clause « WHERE » est indispensable sinon la table est vidée entièrement.

DELETE FROM table [WHERE condition] [LIMIT nombre]

Supprime de « table » les enregistrements satisfaisant la condition "condition".

Si la clause LIMIT est indiquée, au plus « nombre » enregistrements seront supprimés. C'est une bonne façon de limiter les problèmes s'il y a une erreur dans la clause WHERE

DELETE FROM `adherents` WHERE `id`= '20' LIMIT 1

En savoir plus :
http://dev.mysql.com/doc/refman/5.0/fr/delete.html

A suivre...

Après cette première approche des bases de données et de MySQL, nous allons voir pourquoi et comment utiliser cela en PHP.

MySQL et PHP pour le web