Tutoriel MySQL Complet Pour Les Débutants - IONOS

Aller au contenu principalDigital GuideChercher Produits IONOS Produits IONOSClose
  • Domaines
    • Noms de Domaine
    • Transfert de domaine
    • Domaine .fr
    • Nom de domaine gratuit
    • Nouvelles ex­ten­sions
    • Cer­ti­fi­cats SSL
    • Sécurité de domaine
  • Sites Internet & e-Commerce
    • Créer un site Internet
    • Nous créons votre site Internet
    • Ré­fé­ren­ce­ment SEO
    • Gestion de la ré­pu­ta­tion par IA
    • Créer une boutique en ligne
    • Service de con­cep­tion e-commerce
    • Plugin e-commerce
    • Bouton d'achat pour les réseaux sociaux
  • Hé­ber­ge­ment & WordPress
    • Hé­ber­ge­ment Web
    • Hé­ber­ge­ment pour WordPress
    • Hé­ber­ge­ment pour Woo­Com­merce
    • Jamstack
    • Hé­ber­ge­ment Joomla!
    • Deploy Now
    • Hé­ber­ge­ment virtuel (VPS)
  • Office
    • Adresse email pro­fes­sion­nelle
    • Email marketing
    • Archivage d’emails
    • Email Microsoft Exchange
    • Microsoft 365 / Office 365
    • Google Workspace
    • Stockage en ligne HiDrive
    • HiDrive Share
    • Managed Nextcloud
    • My­De­fen­der
  • Serveurs
    • Bare Metal Serveur
    • Cloud Backup
    • Cloud GPU VM
    • Serveurs Cloud
    • Dedicated Server
    • Object Storage
    • VPS Windows
    • Serveurs virtuels (VPS)
    • IONOS Cloud
    • IONOS Cloud Object Storage
  • Outils
    • Gé­né­ra­teur de nom d’en­tre­prise
    • Gé­né­ra­teur de noms de domaine par IA
    • Gé­né­ra­teur de logo
    • Favicon Generator
    • Vé­ri­fi­ca­teur Whois
    • Analyse de Site Web
    • Audit SEO
    • Test SSL
    • Vé­ri­fi­ca­teur d'adresse IP
Menu principalCloseChercherProduits IONOS
  • Sites internet
    • Création de sites internet
    • Web design
    • Dé­ve­lop­pe­ment web
    • Droit d'in­ter­net
  • Hé­ber­ge­ment
    • CMS
    • Blogs
    • Aspects tech­niques
  • Serveur
    • Know-how
    • Con­fi­gu­ra­tion
    • Sécurité
    • Outils
  • Domaines
    • Ex­ten­sions de domaine
    • Gestion de domaine
    • Ac­tua­li­tés sur le domaine
    • Conseils sur le domaine
  • Web marketing
    • Vendre sur internet
    • Search Engine Marketing
    • Les média sociaux
    • Analyse web
  • Email
    • Marketing email
    • Sécurité email
    • Aspects tech­niques
  • Startup
    • Création
    • Gestion
    • Pro­duc­ti­vité
Image: ION_FR_VPS_Fallback_1200x628.pngImage: ION_FR_VPS_Fallback_960x1200.pngVoir les serveursClose
  1. IONOS
  2. Digital Guide
  3. Serveur
  4. Know-how
  5. Apprendre MySQL en toute sim­pli­cité
Tutoriel MySQL complet pour les débutants
  • L'équipe édi­to­riale IONOS08/01/2020
    • Partager sur Facebook
    • Partager sur Twitter
    • Partager sur LinkedIn
  • MySQL
  • SQL
Image: Tutoriel MySQL complet pour les débutantsstoat­photoshut­ters­tock
Sommaire
  • Qu’est-ce que MySQL?
  • Ins­tal­la­tion du système de gestion de base de données
  • Gestion de bases de données avec php­MyAd­min
  • Etablir la connexion de base de données
  • Requêtes de données avec SELECT, INSERT, UPDATE et DELETE
  • Prepared Sta­te­ments
  • Fonctions de date et d’heure dans MySQL
  • Rapports d’erreurs MySQL
  • JOIN
  • De débutant à pro­fes­sion­nel

Le fondement de notre univers digital est une montagne de données sans cesse en expansion. Les systèmes de gestion de bases de données tels que MySQL sont des éléments centraux de la Toile et du monde connecté. Ces derniers per­met­tent de traiter une grande quantité de données en ligne et de manière durable. Des ensembles de données complexes sont découpés en sous-ensembles maniables et sont mis en relation si besoin pour cela. Nous allons vous présenter les fon­de­ments de la gestion de base de données dans notre tutoriel MySQL et vous montrer des exemples de la façon dont vous pouvez optimiser le stockage de données pour votre projet Web avec MySQL.

Qu’est-ce que MySQL?

MySQL fait partie des systèmes de gestion de bases de données re­la­tion­nelles les plus po­pu­laires au monde avec Oracle et Microsoft SQL Server (vous pouvez consulter un aperçu du clas­se­ment de ces systèmes en termes de po­pu­la­rité sur db-engines.com. Le logiciel développé par la société suédoise MySQL AB en 1994 est désormais sous le patronage d’Oracle Cor­po­ra­tion et est distribué sur la base d’un système de double licence. En dehors de la version pro­prié­taire en­tre­prise, Oracle offre une licence GPL open source. Cette double licence donne aux en­tre­prises la pos­si­bi­lité de dé­ve­lop­per leurs propres pro­grammes sur la base de MySQL, sans avoir à les soumettre à la licence. Cependant, l’ac­qui­si­tion de MySQL par Oracle soulève des critiques dans la com­mu­nauté open source. MySQL est écrit en C et en C++ et dispose d’un analyseur SQL basé sur Yacc avec Tokenizer (scanner lexical). Le système de gestion de base de données se ca­rac­té­rise de plus via une grande com­pa­ti­bi­lité avec les dif­fé­rents systèmes d’ex­ploi­ta­tion.

Fait

l’abré­via­tion SQL signifie « Struc­tu­red Query Language », un langage in­for­ma­tique servant à l’ad­mi­nis­tra­tion de struc­tures de bases de données. Les opé­ra­tions possibles com­pren­nent des requêtes, des in­ser­tions, mises à jour et sup­pres­sions de fichiers de données.

MariaDB, fork de MySQL au fort potentiel

L’in­té­gra­tion du projet MySQL dans le por­te­feuille de produits Oracle suscite critiques et méfiances comme nous l’avons déjà évoqué. Cela doit surtout être dû aux dif­fé­rences entre la version MySQL sous licence GPL et le produit payant En­tre­prise. De plus en plus de nouvelles fonctions sont seulement dis­po­nibles sur la version pro­prié­taire payante. Des bases de données erronées non publiques et le manque de tests ont donné une image d’un programme négligé auprès de sa com­mu­nauté. Le soutien de la com­mu­nauté open source est par con­sé­quent en baisse constante.

Dès 2009, l’équipe de dé­ve­lop­pe­ment et le fondateur de MySQL Michael Monty Widenius tournait le dos au populaire système de base de données et a lancé le fork à source ouverte MariaDB. Fin 2012, Fedora, OpenSUSE, Slackware et Arch Linux pré­sen­taient les premières dis­tri­bu­tions Linux pour passer de MySQL à MariaDB comme ins­tal­la­tion standard. De nombreux projets open source, ainsi que les sociétés de logiciels bien connus et pla­te­formes Web ont suivi cet exemple, à l’image de Mozilla, Ubuntu, Google, Red Hat En­tre­prise Linux, Web of Trust, TeamSpeak, la fondation Wikimedia ainsi que le projet de logiciels XAMPP.

MariaDB se ca­rac­té­rise déjà par un dé­ve­lop­pe­ment continu, en com­pa­rai­son avec d’autres systèmes MySQL open source. Il est donc probable que ce fork dépasse un jour son projet-mère.

Conseil

on appelle fork la branche de dé­ve­lop­pe­ment de l’industrie des logiciels résultant de l’arrêt d’un projet (gé­né­ra­le­ment open source). Il est basé sur le code source du projet-mère et peut être développé davantage au sein d’un projet in­dé­pen­dant.

Système de base de données

La gestion élec­tro­nique des données est aujourd’hui détenue en grande partie par les systèmes de gestion de bases de données (DBS). Ceux-ci se composent de deux éléments prin­ci­paux : la base de données (DB) elle-même et le système de gestion cor­res­pon­dant.

  • Le système de gestion de base de données : le DBMS est un logiciel comme MySQL, utilisé pour gérer la base de données. Parmi les tâches de ce logiciel d’ad­mi­nis­tra­tion, on compte la struc­tu­ra­tion des données selon un modèle prédéfini de base de données. En outre, le DBMS contrôle les accès à la lecture et l’écriture de la base de données pour gérer de grandes quantités de données ainsi que l’accès à une base de données parallèle. Il fait en sorte que les lignes di­rec­trices pour l’intégrité des données, la con­fi­den­tia­lité et la sécurité des données soient res­pec­tées.
  • La base de données : une base de données est une base de données relative au contenu tel que les données relatives aux clients (CMS). Un DBMS peut gérer plusieurs bases de données en même temps.

Le graphique suivant sert de re­pré­sen­ta­tion sché­ma­tique d’un système de gestion de base de données:

Image: Représentation schématique d’un système de gestion de bases de données avec trois bases de données
Un système de bases de données est composé d’un système de gestion de bases de données et de nom­breuses bases de données.
Image: Représentation schématique d’un système de gestion de bases de données avec trois bases de données
Un système de bases de données est composé d’un système de gestion de bases de données et de nom­breuses bases de données.
Close

Le modèle de base de données re­la­tion­nelle

MySQL se définit comme un DBMS re­la­tion­nel. Cela signifie que la gestion des données est basée sur un modèle de base de données basé sur des tableaux. Toutes les données traitées sur MySQL sont stockées dans des tableaux pouvant être reliés les uns aux autres via des clés.

Nous vous il­lus­trons cela avec un exemple simple. Vous trouverez ci-dessous deux tableaux avec des auteurs et leurs œuvres:

Image: Le modèle de base de données relationnelleImage: Le modèle de base de données relationnelleClose Image: Le modèle de base de données relationnelle-2Image: Le modèle de base de données relationnelle-2Close

Tous les tableaux d’une base de données re­la­tion­nelle se composent de colonnes et de lignes. Chaque colonne d’un tableau renvoie à un attribut précis. Dans le tableau auteurs se trouvent par exemple les attributs id, prénom et nom de famille. Les lignes d’un tableau sont ca­rac­té­ri­sées de rangées com­por­tant chacune un ensemble de données. Ce dernier est en général identifié (numéroté) clai­re­ment à travers une clé primaire. On définit lors de la con­cep­tion du tableau quel attribut fait fonction de clé primaire. La condition pour cela est que la clé primaire permette un clas­se­ment clair. Une clé primaire ne peut pour cette raison être utilisée qu’une seule fois au sein d’une colonne. Une nu­mé­ro­ta­tion avec des IDs (iden­ti­fiants) est re­com­man­dée.

Le tableau oeuvres, en dehors du fait d’intégrer la clé primaire oeuvres_id, contient aussi des clés étran­gères comme auteurs_id. Ce tableau établit une relation entre les deux tableaux et permet de nouer les articles d’un tableau avec ceux des autres. On parle d’un join (jointure) lorsqu’on met en contact deux tableaux d’une base de données re­la­tion­nelle. Une telle jointure peut par exemple induire la requête suivante : « Charger toutes les valeurs de l’auteur John Ronald Reue Tolkien incluant la date de première pu­bli­ca­tion ».

Image: Le modèle de base de données relationnelle-3Image: Le modèle de base de données relationnelle-3Close

Tolkien est listé dans le tableau auteurs avec la clé primaire auteurs_id1. Pour extraire ces valeurs de l’auteur, des valeurs de clés étran­gères entrent en jeu. Toutes les rangées reliées à auteurs_id1 sont ici chargées.

Dans la pratique, les opé­ra­tions de bases de données MySQL sont réalisées avec des commandes SQL stan­dar­di­sées telles que SELECT, INSERT, UPDATE et DELETE. Nous abor­de­rons plus en détail ce sujet dans les chapitres suivants de notre tutoriel MySQL.

Vous pouvez bien sûr stocker toutes les données à la fois dans un seul tableau (les auteurs et leurs œuvres). Une telle gestion de données entraîne cependant de nom­breuses re­don­dances sup­plé­men­taires, étant donné que les colonnes « prénom » et « nom » devraient plutôt être saisies comme une seule donnée dans ce cas précis. Une telle re­don­dance consomme de la mémoire, mais signifie également que toutes les mises à jour doivent être faites à dif­fé­rents niveaux de la base de données. Lorsque vous tra­vail­lez avec des bases de données re­la­tion­nelles, il convient de ne dé­ter­mi­ner qu’un seul motif par tableau. On parle dans ce cas de nor­ma­li­sa­tion des données.

Le champ d‘ap­pli­ca­tion central de MySQL est le stockage de données dans le cadre d’offres Web dy­na­miques. La com­bi­nai­son de MySQL avec le logiciel de serveur Web Apache et le langage script PHP ou Perl s’est établie comme le squelette de base dans tout dé­ve­lop­pe­ment Web. Cette pile de pro­grammes Web peut être utilisé comme LAMP (Linux), MAMP (Mac OS) ou WAMP (Windows) avec les dif­fé­rents prin­ci­paux systèmes d’ex­ploi­ta­tion.

Nous re­com­man­dons l’en­vi­ron­ne­ment texte local XAMPP aux débutants avec MySQL pour une première ex­pé­rience avec le système de gestion de base de données. Ce dernier se trouve dans la version actuelle de MariaDB.

Ins­tal­la­tion du système de gestion de base de données

Afin de vous apporter les bases de MySQL, nous tra­vail­le­rons avec des exemples pratiques. Notre in­tro­duc­tion à MySQL est basée sur un en­vi­ron­ne­ment de test, XAMPP. Les extraits de code et im­pres­sions écrans se con­centrent sur les opé­ra­tions de bases de données pouvant être réalisées via PHP à l’aide d’un serveur Apache http local sur un or­di­na­teur Windows. Au lieu de la classique base de données MySQL, c’est plutôt le fork MariaDB qui est mis en œuvre. En tant qu’uti­li­sa­teur, il n’y a pas de dif­fé­rence pour apprendre à utiliser MySQL ou MariaDB. Notre tutoriel XAMPP peut vous permettre d’installer un tel en­vi­ron­ne­ment de logiciels de test local sur votre or­di­na­teur sous Windows. Si vous voulez apprendre à utiliser les bases de données re­la­tion­nelles à partir de zéro, nous vous re­com­man­dons de commencer avec MariaDB. AMPPS re­pré­sente une al­ter­na­tive gratuite pour créer un en­vi­ron­ne­ment de test sur la base de MySQL. Il est par ailleurs possible de mettre en place un Web Stack, ou pile de pro­grammes Web. MySQL et MariaDB peuvent au besoin être combinés avec dif­fé­rents systèmes d’ex­ploi­ta­tion, serveurs Web et langages scripts. Des packs de licences GPL à té­lé­char­ger sont dis­po­nibles gra­tui­te­ment sur mysql.de et mariadb.com. Vous trouverez également de la do­cu­men­ta­tion en anglais sur MySQL ainsi que MariaDB.

Gestion de bases de données avec php­MyAd­min

Vous pouvez utiliser l’ap­pli­ca­tion Web libre php­MyAd­min pour de la gestion MySQL. Elle est d’ailleurs comprise dans la suite lo­gi­cielle XAMPP, mais aussi proposée in­dé­pen­dam­ment sur le site Web officiel du projet. Php­MyAd­min est un logiciel standard pour l’ad­mi­nis­tra­tion de bases de données MySQL sur le World Wide Web. L’ap­pli­ca­tion Web écrite en PHP et Ja­vaS­cript permet de mener des opé­ra­tions sur des bases de données via une interface uti­li­sa­teur graphique. Vous pouvez ainsi créer et gérer les tableaux de vos bases de données re­la­tion­nelles par clic sur votre na­vi­ga­teur Web. Connaître les commandes SQL ap­pro­priées n’est ini­tia­le­ment pas né­ces­saire.

Charger php­MyAd­min

Une fois l’ensemble de logiciels XAMPP installé, démarrez le système de gestion de base de données (MySQL ou MariaDB) de manière similaire aux autres com­po­sants des test-stacks via le panneau de con­fi­gu­ra­tion. Utilisez pour cela le bouton « Start » ou démarrer sous « Actions ». Afin de charger php­MyAd­min via le na­vi­ga­teur Web, vous devez également re­dé­mar­rer le serveur Web Apache. Les modules activés ap­pa­rais­sent en vert sur le panneau de con­fi­gu­ra­tion XAMPP. Vous obtenez de plus l’état actuel des modules XAMPP par mes­sa­ge­rie.

Image: Panneau de configuration XAMPP
Démarrez MySQL ainsi que le serveur http Apache via le panneau de con­fi­gu­ra­tion XAMPP
Image: Panneau de configuration XAMPP
Démarrez MySQL ainsi que le serveur http Apache via le panneau de con­fi­gu­ra­tion XAMPP
Close Fait

XAMPP a été conçu dans le cadre du projet de logiciel Apache Friends en tant que système de test compact pour une mise en œuvre sur un or­di­na­teur local. La suite de logiciels n’est n’a ainsi pas été prévue pour mettre des services Web à dis­po­si­tion sur Internet. XAMPP n’est donc pas adapté en tant que système de pro­duc­tion en raison de nom­breuses li­mi­ta­tions dans le domaine de la sécurité.

Vous trouverez le mode de test local de l’interface Web du programme d’ad­mi­nis­tra­tion http://localhost/php­myad­min/.

Après avoir défini un mot de passe pour le compte racine (root-Account) lors de l’ins­tal­la­tion de MySQL, php­MyAd­min demande ces données d’iden­ti­fi­ca­tion via une fenêtre prévue à cet effet. Si vous utilisez php­MyAd­min dans le cadre d’un produit d’hé­ber­ge­ment Web, les données de connexion ap­pro­priées sur le four­nis­seur seront at­tri­buées. Vous ne disposez en général pas des droits racine dans ce cas.

Après une connexion réussie, php­MyAd­min vous présente la page d’accueil de l’ap­pli­ca­tion. Celle-ci vous offre la pos­si­bi­lité de modifier les pa­ra­mètres de base de la police de la connexion MySQL ainsi que de choisir les modalités d’affichage (langue, design, et taille de la police). Vous trouverez également un aperçu des pa­ra­mètres de base de votre serveur de base de données, le logiciel de serveur Web utilisé ainsi que des in­for­ma­tions sur la version actuelle de php­MyAd­min sur la partie droite. La barre de menu de la page d’accueil est conçue comme toutes les autres barres de menus de l’ap­pli­ca­tion, sous la forme d’onglets. Vous avez le choix entre les onglets, base de données, SQL, état, comptes uti­li­sa­teurs, im­por­ta­tion, ex­por­ta­tion, pa­ra­mètres, et autres.

Image: Page d’accueil du logiciel d’administration MySQL phpMyAdmin
La page d’accueil php­MyAd­min apparaît en chargeant l’URL http://localhost/php­myad­min/
Image: Page d’accueil du logiciel d’administration MySQL phpMyAdmin
La page d’accueil php­MyAd­min apparaît en chargeant l’URL http://localhost/php­myad­min/
Close

Le panneau de con­fi­gu­ra­tion se trouve sur le bord gauche de l’interface. Tous les tableaux y sont ré­per­to­riés et vous pouvez même y accéder à l’aide de votre banque de données de php­MyAd­min. Sous le logo du programme dans le coin supérieur gauche se trouvent les liens vers la page d’accueil ainsi que de la do­cu­men­ta­tion qui est mise à votre dis­po­si­tion. Vous avez par ailleurs la pos­si­bi­lité de con­fi­gu­rer votre zone de na­vi­ga­tion et d’ac­tua­li­ser son apparence.

Com­men­çons notre cours intensif MySQL pour vous apprendre à établir une première base de données.

Mettre en place une base de données

Pour concevoir votre base de données avec php­MyAd­min, choi­sis­sez l’onglet « Databases » (bases de données) dans la barre de menu de la page d’accueil.

Image: phpMyAdmin : onglet « Bases de données »
Les bases de données se trouvent dans l’onglet « Databases » avec php­MyAd­min
Image: phpMyAdmin : onglet « Bases de données »
Les bases de données se trouvent dans l’onglet « Databases » avec php­MyAd­min
Close

Choi­sis­sez un nom pour votre base de données dans le champ « Create database » (créer une nouvelle base de données). Nous re­com­man­dons la police utf8mb4_unicode_ci. Le choix de cette dernière permet d’indiquer au serveur de base de données quel codage appliquer pour l’envoi et la réception de données. Les variantes mb4 per­met­tent aussi des ca­rac­tères exotiques tels que des symboles ou des emojis, sortant du niveau de base Unicode (plan mul­ti­lingue de base), et sont donc re­com­man­dées.

Image: Créer une base de données : définir le nom et la police
Afin de créer une base de données, choi­sis­sez un nom et dé­ter­mi­nez une police sous-jacente
Image: Créer une base de données : définir le nom et la police
Afin de créer une base de données, choi­sis­sez un nom et dé­ter­mi­nez une police sous-jacente
Close

Confirmez votre saisie en cliquant sur « Create » (créer). La base de données ainsi créée apparaît désormais sur le panneau de na­vi­ga­tion sur le côté gauche de l’écran. Les bases de données nou­vel­le­ment créées ne con­tien­nent pas de contenu ini­tia­le­ment. Afin d’ajouter des données, créez un tableau lors de l’étape suivante.

Concevoir des tableaux

Pour concevoir un nouveau tableau, choi­sis­sez la base de données souhaitée et rendez-vous sur l’onglet « structure » de la barre de menu.

Image: Concevoir des tableaux avec phpMyAdminagsandrewshut­ters­tock
Créez un nouveau tableau de données via « Create table »
Image: Concevoir des tableaux avec phpMyAdmin
Créez un nouveau tableau de données via « Create table »
Close

Concevez un tableau dans lequel vous indiquez un nom (uti­li­sa­teurs par exemple) ainsi que le nombre souhaité de colonnes dans l’interface « create table » (créer un tableau). Gardez bien en tête que chaque colonne sert d’attribut de police. Si vous avez besoin de colonnes sup­plé­men­taires, vous pouvez les ajouter plus tard.

Si vous souhaitez par exemple créer une base de données uti­li­sa­teur pour votre site Web, les ca­rac­té­ris­tiques suivantes devraient ap­pa­raître dans les dif­fé­rentes colonnes du tableau :

Colonne Des­crip­tion
id Un numéro d’iden­ti­fi­ca­tion unique pour chaque uti­li­sa­teur
forename Le prénom de l’uti­li­sa­teur
surname Le nom de famille de l’uti­li­sa­teur
email L’adresse email de l’uti­li­sa­teur
password Le mot de passe de l’uti­li­sa­teur
created_at L’heure à laquelle l’entrée a été créée
updated_at L’heure à laquelle l’entrée a été ac­tua­li­sée

Pour établir un tel tableau uti­li­sa­teurs (users), créez sept colonnes. Vous pouvez valider la saisie en cliquant sur « Go ».

Image: Concevoir des tableaux via « Create Table »
Dé­fi­nis­sez un nom pour le tableau ainsi que le nombre de colonnes souhaité
Image: Concevoir des tableaux via « Create Table »
Dé­fi­nis­sez un nom pour le tableau ainsi que le nombre de colonnes souhaité
Close

Une fois le tableau créé, php­MyAd­min vous offre la pos­si­bi­lité de définir des ca­rac­té­ris­tiques pour des colonnes du tableau ainsi que des pa­ra­mètres de format pour les données attendues.

Image: Tableau exemple utilisateurs (users) avec sept colonnes
Le tableau exemple « users » : ini­tia­le­ment sans attributs
Image: Tableau exemple utilisateurs (users) avec sept colonnes
Le tableau exemple « users » : ini­tia­le­ment sans attributs
Close

Le tableau suivant vous donne une des­crip­tion de la structure des tableaux et des formats possibles.

Option Des­crip­tion
Name Chaque colonne d’un tableau de base de données se voit attribuer un nom. Des res­tric­tions peuvent y être ajoutées. Les ca­rac­tères latins (en majuscule ou minuscule, mais sans tréma), les chiffres, les icones des dif­fé­rentes monnaies, et tirets ne posent aucun problème pour cela. Ces derniers peuvent être utilisés comme al­ter­na­tive aux espaces vides non autorisés (faux : user id; correct : user_id). Les noms de colonnes ne doivent pas contenir que des chiffres. Par ailleurs, il existe divers mots-clés réservés pour dif­fé­rentes tâches dans le langage de base de données SQL. Une liste se trouve dans la do­cu­men­ta­tion mySQL. Vous pouvez con­tour­ner la plupart de ces res­tric­tions mais vous devez mettre la colonne res­pec­tive entre guil­le­mets pour ce faire. Les mêmes règles sont aussi valables pour les. Nous vous re­com­man­dons d’utiliser des noms de colonnes clairs qui cor­res­pon­dent à l’attribut respectif.
Type Le type de données spécifie quel type de données est stocké dans une colonne. MySQL et MariaDB vous per­met­tent de définir des données comme des nombres entiers à virgule flottante, l’heure et la date ainsi que des chaînes de texte et des données binaires. Une des­crip­tion se trouve dans le tableau des types de données.
Length/values Avec certains types de données (par exemple des chaînes de ca­rac­tères) vous pouvez affecter des valeurs pour la longueur maximale d’une colonne. Ceci est fa­cul­ta­tif.
Default L’option « Default » vous permet de définir une valeur standard pour une colonne. Celle-ci est toujours au­to­ma­ti­que­ment ajoutée lorsqu’un paquet de données ne contient pas de valeur pour la colonne res­pec­tive.
Collation Avec l’option « Collation », vous dé­fi­nis­sez un type de ca­rac­tères par­ti­cu­lier pour une colonne, pouvant différer des pa­ra­mètres de bases globaux de bases de données. Vous pouvez modifier le codage au niveau du tableau pour toutes les colonnes.
At­tri­butes Certains types de données peuvent être dé­ter­mi­nés de manière plus détaillée par attributs fa­cul­ta­tifs. Vous pouvez par exemple ainsi spécifier avec les attributs signed et unsigned, si un nombre entier ou à virgule flottante peut aussi prendre des valeurs négatives, et non uni­que­ment positives.
Index Vous pouvez définir des règles d’in­dexa­tion via l’option « Index ». Sé­lec­tion­nez un paramètre d’in­dexa­tion PRIMARY pour une colonne. Ce dernier est considéré comme la clé primaire du tableau. Le paramètre UNIQUE spécifie que les valeurs ne peuvent être stockées qu’une fois dans cette colonne. Ainsi, les du­pli­ca­tions peuvent être évitées si besoin.
A_I L’abré­via­tion « A_I » signifie AUTO_INCREMENT et indique au système de gestion de base de données de compter une valeur au­to­ma­ti­que­ment lorsqu’un paquet n’a pas été spécifié. Cette option est utilisée pour l’in­dexa­tion de paquets.
Comments Le champ « comments » vous permet de fournir des colonnes dotées de com­men­taires.

Les options pré­sen­tées ici sont les pa­ra­mètres les plus im­por­tants pour le formatage de colonnes. En utilisant la barre de dé­fi­le­ment vers la droite, vous trouverez encore plus de pa­ra­mètres que nous ne pouvons décrire dans notre guide MySQL pour débutants.

Le tableau suivant ré­per­to­rie les dif­fé­rents types de données qui peuvent être traitées avec MySQL et MariaDB, ainsi que les dif­fé­rentes tranches de valeurs et de mémoire requise.

Type Des­crip­tion Valeur Besoin de mémoire
TINYINT Un nombre entier très faible Sans signe : 0 à 255 Avec signe : -128 à +127 1 Byte
SMALLINT Un nombre entier faible Sans signe : 0 à 65.535 Avec signe : -32.768 à +32.767 2 Bytes
MEDIUMINT Un nombre entier moyen Sans signe : 0 à 16.777.215 Avec signe : -8.388.608 à +8.388.607 3 Bytes
INT/INTEGER Un nombre entier de taille normale Sans signe : 0 à 4.294.967.295 Avec signe : -2.147.483.648 à +2.147.483.647 4 Bytes
BIGINT Un nombre entier élevé Sans signe : 0 à 18.446.744.073.709.551.615 Avec signe : -9.223.372.036.854.775.808 à +9.223.372.036.854.775.807 8 Bytes
FLOAT Un nombre à virgule flottante à précision simple Sans signe : 0 à 3,4e+38 Avec signe : -3,4e+38 à 3,4e+38 4 Bytes
DOUBLE Un nombre à virgule flottante avec double précision Sans signe : 0 à 3,4e+38 Avec signe : -3,4e+38 à 3,4e+38 8 Bytes
DATE Date au format 'YYYY-MM-DD' '1000-01-01' à '9999-12-31' 3 Bytes
TIME In­di­ca­tion de l’heure au format 'HH:MM:SS.ssssss' '-838:59:59.999999' à '838:59:59.999999' 3 Bytes
DATETIME Date au format 'YYYY-MM-DD HH:MM:SS.ssssss' Indique la date et l’heure (jusqu’à 23:59:59.999999 heures) 8 Bytes
TIMESTAMP Ho­ro­da­tage au format 'YYYY-MM-DD HH:MM:DD' '1970-01-01 00:00:01' (UTC) à '2038-01-19 05:14:07' (UTC) 4 Bytes
YEAR Année entre 1901 et 2155 1901 à 2155 et 0000 1 Byte
CHAR Chaîne de ca­rac­tères à longueur fixe ; nombre de ca­rac­tères cor­res­pon­dant à M pour M: 0 à 255 ca­rac­tères M Byte
VARCHAR Chaîne de ca­rac­tères à longueur variable ; nombre de ca­rac­tères cor­res­pon­dant à M pour M: 0 à 65.535 ca­rac­tères Max. M + 2 Bytes
TINYTEXT Très petite chaîne de ca­rac­tères à longueur variable ; nombre de ca­rac­tères cor­res­pon­dant à M pour M: 0 à 255 ca­rac­tères M + 1 Byte
TEXT Chaîne de ca­rac­tères à longueur variable ; nombre de ca­rac­tères cor­res­pon­dant à M pour M: 0 à 65.535 ca­rac­tères M + 2 Bytes
ME­DIUM­TEXT Chaînes de ca­rac­tères de taille moyenne ; nombre de ca­rac­tères cor­res­pon­dant à M pour M: 0 à 16.777.215 ca­rac­tères M + 3 Bytes
LONGTEXT Longue chaîne de ca­rac­tères à longueur variable, nombre de ca­rac­tères cor­res­pon­dant à M Pour M: 0 à 4.294.967.295 ca­rac­tères (4 GB) M + 4 Bytes
BLOB Un BLOB (Binary Large Object) est un objet binaire avec des données à longueur variable (des images ou fichiers audio par exemple) Longueur max : 65.535 Bytes M + 2 Bytes
TINYBLOB Petit objet binaire avec des données à longueur variable Longueur max M: 255 Bytes M + 1 Byte
ME­DIUM­BLOB Objet binaire moyen avec des données à longueur variable Longueur Max M : 16.777.215 Bytes M + 3 Bytes
LONGBLOB Objet binaire grand avec des données à longueur variable Longueur max : 4.294.967.295 Bytes (4 GB). M + 4 Bytes
ENUM (énu­mé­ra­tion) Un objet de chaîne dont les valeurs ad­mis­sibles sont définies lors de la création de la colonne Max. 65,535 dif­fé­rents éléments au plus 1 ou 2 Bytes, selon le nombre de valeurs possibles
SET Un objet de chaîne dont les valeurs ad­mis­sibles sont définies lors de la création du tableau. Pos­si­bi­lité de sélection multiple. Maximum de 64 dif­fé­rentes valeurs 1, 2, 3, 4, ou 8, en fonction du nombre de valeurs possibles

Nous avons par exemple choisi les pa­ra­mètres suivants pour le tableau « users » :

Les valeurs possibles pour la colonne ID ont été définies comme étant des nombres entiers (nombre entier, INT) et portent l’attribut UNSIGNED. L’ID ne peut ainsi accepter que des chiffres aux valeurs positives. Nous avons sé­lec­tionné le réglage PRIMARY pour ce qui est de l’Index. Le numéro d’iden­ti­fi­ca­tion fonc­tionne donc comme une clé primaire pour le tableau uti­li­sa­teurs. Décocher la case a_i (AUTO_INCREMENT) signale au système de gestion de base de données que les IDs doivent être générés au­to­ma­ti­que­ment pour chaque entrée sous forme de nombres con­sé­cu­tifs. Les valeurs des colonnes prénom, nom, email et mot de passe ont été définies comme type de données VARCHAR. Il s’agit de chaînes de ca­rac­tères variables, dont la longueur (M) est limitée à 50 ca­rac­tères avec l’option « Length/Value ». L’option index UNIQUE est aussi activée pour la colonne email. Vous vous assurez ainsi que toutes les adresses email ne soient en­re­gis­trées qu’une seule fois dans votre tableau.

Pour les colonnes created_at et updated_at, nous avons choisi le type de données TIMESTAMP. Le système de gestion de base de données stocke les données tem­po­relles lors de la création et de l’ac­tua­li­sa­tion de paquets au format AAAA-MM-JJ HH:MM:SS. Etant donné que le système génère au­to­ma­ti­que­ment un ho­ro­da­tage pour chaque nouvelle entrée, nous choi­sis­sons pour la colonne created_at la valeur standard CURRENT_TIMESTAMP par défaut. La colonne updated_at n’est per­ti­nente que si nous mettons à jour les entrées. Les valeurs nulles sont permises pour cette colonne, dotées de la valeur standard NULL par défaut.

Fait

la valeur NULL re­pré­sente une entrée vide avec PHP. Un champ de données possède la valeur NULL si aucune valeur n’a été attribuée.

Image: Formatage des colonnes du tableau
Exemple du tableau « users » selon le formatage
Image: Formatage des colonnes du tableau
Exemple du tableau « users » selon le formatage
Close

Le format de tableau standard InnoBD est utilisé en tant que machine de stockage avec MySQL.

Tous les pa­ra­mètres de tableaux que vous entrez via l’interface uti­li­sa­teur graphique sont traduits par php­MyAd­min dans le code SQL. Vous pouvez les consulter via le bouton « aperçu SQL ».

CREATE TABLE test.users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT , forename VARCHAR(50) NOT NULL , surname VARCHAR(50) NOT NULL , email VARCHAR(50) NOT NULL , password VARCHAR(50) NOT NULL , created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , updated_at TIMESTAMP NULL DEFAULT NULL , PRIMARY KEY (id), UNIQUE (email)) ENGINE = InnoDB;

Vous trouverez une des­crip­tion détaillée de la syntaxe SQL dans le chapitre sur les requêtes de bases de données.

En­re­gis­trez vos pa­ra­mètres en cliquant sur « save ». Le tableau uti­li­sa­teurs s’affiche dans le panneau de na­vi­ga­tion sous la base de données de test.

Gérer des tableaux

Pour gérer un tableau créé, cliquez sur le nom du tableau dans le panneau de na­vi­ga­tion. php­MyAd­min vous affiche sur l’onglet « Browse » un aperçu du tableau respectif avec les données en­re­gis­trées. Dans le cas de notre tableau exemple, la requête livre un résultat vide. Il n’y a pas encore de paquets de données dans le tableau users.

Image: phpMyAdmin : aperçu du tableauVadim Georgievshut­ters­tock
L’onglet « Browse » affiche un aperçu des données en­re­gis­trées dans le tableau
Image: phpMyAdmin : aperçu du tableau
L’onglet « Browse » affiche un aperçu des données en­re­gis­trées dans le tableau
Close

Dif­fé­rents onglets sont à votre dis­po­si­tion dans la barre de menu pour la gestion de tableaux de données. Si vous souhaitez modifier la structure d’un tableau de données, choi­sis­sez l’onglet « structure ». Vous pouvez ajouter de nouveaux paquets au tableau via l’onglet « Insert » (Insertion). Php­MyAd­min permet par ailleurs de parcourir des tableaux, de gérer les au­to­ri­sa­tions ou encore d’importer ou exporter des paquets ou autres tableaux.

Modifier la structure de tableaux

Si vous souhaitez compléter votre tableau en incluant des colonnes sup­plé­men­taires, modifier ou supprimer des colonnes exis­tantes, rendez-vous sur l’onglet « Structure ».

Complétez des colonnes via le bouton « Add columns », en spé­ci­fiant le nombre souhaité de nouvelles colonnes et leur position res­pec­tive.

Une nouvelle colonne est ajoutée selon updated_at dans l’exemple suivant :

Image: bouton phpMyAdmin : Add columns
Décidez du nombre de colonnes à ajouter avec le bouton « add columns »
Image: bouton phpMyAdmin : Add columns
Décidez du nombre de colonnes à ajouter avec le bouton « add columns »
Close

Si vous voulez supprimer des colonnes exis­tantes, sé­lec­tion­nez les en cochant la case cor­res­pon­dante et cliquez sur « Drop ».

Image: phpMyAdmin: onglet pour la gestion de la structure de tableaux
Colonnes sé­lec­tion­nées pouvant être sup­pri­mées ou modifiées selon votre souhait
Image: phpMyAdmin: onglet pour la gestion de la structure de tableaux
Colonnes sé­lec­tion­nées pouvant être sup­pri­mées ou modifiées selon votre souhait
Close

La mo­di­fi­ca­tion d’une colonne se fait via le bouton « modifier ». Il affiche une interface similaire à celui de la création de tableaux :

Image: phpMyAdmin : bouton pour la modification de colonnespat­pit­chayaShut­ters­tock
Les colonnes sé­lec­tion­nées sont traitées via un point de vue différent
Image: phpMyAdmin : bouton pour la modification de colonnes
Les colonnes sé­lec­tion­nées sont traitées via un point de vue différent
Close

Les mo­di­fi­ca­tions apportées à la structure du tableau peuvent conduire à la perte de données dans certaines cir­cons­tances. Avant de traiter ou supprimer des colonnes de tableaux déjà exis­tantes, vous devriez dans tous les cas effectuer une sau­ve­garde de votre base de données. Rendez-vous pour cela sur l’onglet « Export », choi­sis­sez le format de données de votre choix pour la sau­ve­garde et confirmez en appuyant sur « Go ». Une fenêtre s’ouvre, dans laquelle votre na­vi­ga­teur Web interroge l’espace de stockage cible pour le té­lé­char­ge­ment. Une al­ter­na­tive à la sau­ve­garde de bases de données via php­MyAd­min est le programme de sau­ve­garde gratuit MyS­QL­Dum­per.

Créer des entrées de tableaux

Pour remplir votre tableau avec php­MyAd­min avec des données, vous avez deux pos­si­bi­li­tés : soit vous importez les paquets depuis un fichier externe (comme une sau­ve­garde par exemple), soit vous créez les entrées du tableau ma­nuel­le­ment. Pour ce faire, choi­sis­sez le tableau exemple uti­li­sa­teurs (users) et naviguez sur l’onglet « insert ».

php­MyAd­min vous affiche main­te­nant l’écran de saisie de données suivant :

Image: phpMyAdmin : écran de saisie de données pour la création d’entrées de tableauxunewindShut­ters­tock
Créer des entrées de tableaux via php­MyAd­min sur l’onglet « Insert »
Image: phpMyAdmin : écran de saisie de données pour la création d’entrées de tableaux
Créer des entrées de tableaux via php­MyAd­min sur l’onglet « Insert »
Close

Les colonnes définies pour le tableau uti­li­sa­teurs sont listées sous « Column ». Vous trouverez sous « Type » les in­for­ma­tions sur le type de données pour les colonnes res­pec­tives, ainsi que la limite de ca­rac­tères entre pa­ren­thèses. Nous mettons vo­lon­tai­re­ment la partie « Function » entre pa­ren­thèses et passons di­rec­te­ment à « Value ». Dans ce domaine, on définit les valeurs pour certaines colonnes de notre tableau exemple.

Dans le chapitre précédent, nous avons configuré le tableau uti­li­sa­teurs (users) de telle sorte que les champs de données pour les colonnes ID, created_at et updated_at soient au­to­ma­ti­que­ment dotés de contenu par le système de gestion de base de données. Dans la colonne ID nous at­tri­buons via AUTO_INCREMENT un numéro d’iden­ti­fi­ca­tion pour chaque nouvelle entrée en cours. Le champ created_at est au­to­ma­ti­que­ment rempli via l’ho­ro­da­tage actuel. Le système attribue ensuite pour updated_at la valeur par défaut NULL. Nous ne devons ainsi que saisir les données pour les colonnes forename, surname, email et password ma­nuel­le­ment. Nous il­lus­trons ceci avec des données uti­li­sa­teurs fictives :

Image: ColumnsImage: ColumnsClose
Image: exemples de données dans le masque de saisie
Ajoutez les données à l’écran de saisie de données et confirmez avec « Go »
Image: exemples de données dans le masque de saisie
Ajoutez les données à l’écran de saisie de données et confirmez avec « Go »
Close

Cliquez sur « Go » pour trans­fé­rer les données vers votre tableau. Php­MyAd­min passe au­to­ma­ti­que­ment à l’onglet « SQL » et indique l’opération de base de données effectuée en tant que dé­cla­ra­tion selon la syntaxe SQL :

INSERT INTO users (id, forename, surname, email, password, created_at, updated_at) VALUES (NULL, 'John', 'Doe', '[email protected]', 'qwertz', CURRENT_TIMESTAMP, NULL);
Image: Commande INSERT en tant que code selon la syntaxe SQL
Php­MyAd­min vous donne des relevés pour chaque opération de base de données
Image: Commande INSERT en tant que code selon la syntaxe SQL
Php­MyAd­min vous donne des relevés pour chaque opération de base de données
Close

En principe, toutes les opé­ra­tions de bases de données peuvent être réalisées con­for­ta­ble­ment via php­MyAd­min sur une interface graphique, mais aussi dans le langage de base de données SQL. Ceci fait partie des pro­cé­dures standard de dé­ve­lop­pe­ment Web.

Ces requêtes SQL se trouvent dans le code source de toutes les ap­pli­ca­tions Web dy­na­miques et per­met­tent au serveur Web d’interagir avec la base de données. Le langage de base de données SQL repose sur des commandes dont le but est par exemple de récupérer des données et de les utiliser dans le cadre de l‘exécution du programme. Nous abordons dans le chapitre suivant de notre tutoriel MySQL les prin­ci­pales commandes SQL, à savoir SELECT, INSERT, DELETE et UPDATE ainsi que la syntaxe des opé­ra­tions de bases de données fon­da­men­tales.

Mais d’abord, rem­plis­sons notre tableau uti­li­sa­teurs (users) avec d’autres données uti­li­sa­teurs et regardons la vue d’ensemble du tableau dans l’onglet « Browse » (Parcourir) :

Image: phpMyAdmin : Aperçu du tableau dans l’onglet « Browse ».
Toutes les entrées du tableau sont triées selon la clé primaire dans l’aperçu de l’onglet « Browse ».
Image: phpMyAdmin : Aperçu du tableau dans l’onglet « Browse ».
Toutes les entrées du tableau sont triées selon la clé primaire dans l’aperçu de l’onglet « Browse ».
Close

Un clic sur le nom de la colonne res­pec­tive trie le tableau dans l’ordre souhaité.

Etablir la connexion de base de données

Main­te­nant que nous avons rempli notre tableau exemple uti­li­sa­teurs avec des entrées, nous exa­mi­ne­rons dans les chapitres suivants comment les données stockées via PHP peuvent être con­sul­tées en utilisant un serveur Web Apache.

Il est pour cela demandé dès la première étape d’établir une connexion de base de données. Trois in­ter­faces sont dis­po­nibles : MySQL Extension, MySQL Improved Extension (MySQLi) et PHP Data Objects (PDO).

  • MySQL-Extension : MySQL-Extension est une interface MySQL qui était très populaire, mais main­te­nant con­si­dé­rée comme obsolète. En com­pa­rai­son avec MySQLi et PDO, MySQL-Extension présente l’in­con­vé­nient qu’il ne supporte pas les Prepared Sta­te­ments , ni les pa­ra­mètres désignés.
  • MySQLi : MySQLi est une version améliorée de l’extension classique PHP pour l’accès à des bases de données MySQL. L’interface fonc­tionne aussi bien de manière orientée objet que de manière pro­cé­du­rale. L’uti­li­sa­tion est limitée aux bases de données MySQL et MariaDB.
  • PDO : PHP Data Objects (PDO) est une interface orientée vers l’objet qui fournit un niveau abstrait pour l’accès aux données. Ainsi, les bases de données MySQL, mais aussi d’autres systèmes tels que Post­greSQL, Oracle, MSSQL ou SQLite peuvent être intégrés à PHP.

Nous nous li­mi­te­rons par la suite aux con­nexions à la base de données via PDO.

Pour effectuer une demande avec une base de données dans le cadre d’un script PHP, il doit d’abord être au­then­ti­fié. Une connexion à la base de données par l’in­ter­mé­diaire de PDO se fait en utilisant la ligne de code suivante :

<?php $pdo = new PDO('DSN', 'username', 'password'); ?>

Il est re­com­mandé d’ajouter ceci au début de chaque script contenant des opé­ra­tions de base de données.

Nous utilisons le mot de passe PHP new pour créer une instance de la classe de base PDO. Son cons­truc­teur attend trois pa­ra­mètres de base. Le Data Source Name (DSN) ainsi qu’un nom d’uti­li­sa­teur et un mot de passe pour la base de données. Le DSN comprend dans notre cas les pa­ra­mètres suivants :

  • Pilote de base de données PDO : mysql
  • Serveur de base de données (host=) : localhost
  • nom de base de données (dbname=) : test
  • Paquet (charset=): utf8

Si vous n’avez pas défini de données d’accès pour votre base de données, utiliser le nom d’uti­li­sa­teur root ainsi qu’un mot de passe vide :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); ?>

La connexion à la base de données est stockée dans la variable $pdo. Cela vous permet d’établir la connexion dans les dernières étapes du code du programme.

Si une connexion à la base de données a été établie, vous pouvez envoyer un certain nombre de requêtes à la base de données via le script de code. Terminez le script pour in­ter­rompre la connexion à la base de données.

Requêtes de données avec SELECT, INSERT, UPDATE et DELETE

Afin de récupérer les données de notre base de données, nous recourons au langage de base de données SQL. Ce dernier est sé­man­ti­que­ment similaire à la langue anglaise et reste dé­li­bé­ré­ment simple. La syntaxe SQL est par ailleurs explicite.

Dans SQL, on travaille avec ce qu’on appelle Sta­te­ments, autrement dit ex­trac­tions ou demandes.

Un SELECT-Query simple se compose par exemple des éléments suivants :

SELECT colonne FROM tableau;

Dé­fi­nis­sez tout d’abord la commande SQL SELECT puis les colonnes et tableaux res­pec­tifs, sur lesquels la commande doit fonc­tion­ner. Un point-virgule conclut ce Statement.

Vous avez également la pos­si­bi­lité d’étendre la dé­cla­ra­tion (Statement) à une condition fa­cul­ta­tive telle qu’un tri ou un re­grou­pe­ment :

SELECT colonne FROM tableau WHERE condition ORDER BY données dans un ordre de tri;

Les commandes SQL sont con­ven­tion­nel­le­ment en lettres ma­jus­cules, tandis que les bases de données, tableaux et autres sont en minuscule. Cela s’explique uni­que­ment pour des raisons de li­si­bi­lité. SQL en principe un langage sans format et ne fait donc pas de dis­tinc­tion entre les ma­jus­cules et les mi­nus­cules.

Si vous utilisez des noms de tableaux et de colonnes qui com­por­tent déjà des mots-clés pré­dé­fi­nis (ce qui n’est pas re­com­mandé), placez ces derniers entre guil­le­mets.

Nous il­lus­trons la syntaxe des SQL-Sta­te­ments simples avec comme exemples les commandes SELECT, INSERT, UPDATE et DELETE.

SELECT

Utilisez la commande SELECT pour récupérer les séries de données sé­lec­tion­nées (rangées) d’un nombre quel­conque de tableaux. Si vous souhaitez par exemple utiliser les prénoms et noms ainsi que les adresses email de tous les uti­li­sa­teurs dans le tableau exemple créé au­pa­ra­vant, créez un fichier PHP text.php dans le dossier htdocs de votre en­vi­ron­ne­ment XAMPP et ajoutez le script suivant :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT forename, surname, email FROM users"; foreach ($pdo->query($sql) as $row) { echo $row['forename'] . " " . $row['surname'] . "<br />"; echo "E-Mail: " . $row['email'] . "<br /><br />"; } ?>

L’exemple de code se lit de la manière suivante : tout d’abord, nous com­men­çons le script avec la balise PHP-Start <?php. Dans la ligne deux, nous nous con­nec­tons à notre base de données de test sur l’hébergeur local et nous la stockons dans la variable $pdo. Le Statement SQL avec la commande SELECT se trouve sur la ligne trois. Ici, le système de gestion de base de données indique de charger les colonnes forename, surname et email depuis le tableau uti­li­sa­teurs (users). Nous en­re­gis­trons ce Statement dans la variable $sql.

Les lignes 4 à 7 affichent une boucle foreach. Cela nous donne la pos­si­bi­lité de parcourir tout tableau, par exemple, de passer par une structure de données pro­gres­si­ve­ment. Nous dé­fi­nis­sons entre pa­ren­thèses derrière la cons­truc­tion foreach les séries du tableau à itérer et la façon dont les données demandées sont sau­ve­gar­dées :

$pdo->query($sql) as $row

La variable $pdo porte sur la base de données désirée sur la ligne 2 de la connexion définie. Nous l’envoyons avec la fonction query() de la variable $sql du Statement SQL.

Le serveur Web récupère ainsi les colonnes forename, surname et email du tableau uti­li­sa­teur depuis la base de données test et passe chaque ligne du tableau en boucle foreach. Lorsque les données passées en revue sont stockées, le mot-clé PHP définit la série variable $row.

Lors du premier passage de la boucle Foreach, le tableau ap­pa­raî­trait comme tel :

$row = array ( forename => John, surname => Doe, email => [email protected] )

Nous passons en revue chaque ligne du tableau uti­li­sa­teurs in­di­vi­duel­le­ment, lisons les données stockées pour les colonnes définies dans le Statement SQL et les faisons passer sur le na­vi­ga­teur Web.

Image: Script PHP avec le Statement SQL SELECT sur Notepad++ et lecture sur navigateur Web via localhost
La fenêtre du na­vi­ga­teur affiche le résultat de l’exécution du script
Image: Script PHP avec le Statement SQL SELECT sur Notepad++ et lecture sur navigateur Web via localhost
La fenêtre du na­vi­ga­teur affiche le résultat de l’exécution du script
Close

Si toutes les colonnes d’un tableau de données sont passées en revue, utilisez un as­té­risque (*) comme valeur de code dans le Statement SQL.

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT * FROM users"; foreach ($pdo->query($sql) as $row) { echo $row['forename'] . " " . $row['surname'] . "<br />"; echo "E-Mail: " . $row['email'] . "<br />"; echo "Created at: " . $row['created_at'] . "<br /><br />"; } ?>

Nous avons ainsi la pos­si­bi­lité d’utiliser toutes les données stockées dans le tableau uti­li­sa­teurs (users) dans le cadre du script. On peut observer sur la capture d’écran ci-dessous l’ajout d’un ho­ro­da­tage :

Image: Script PHP avec Statement SQL incluant des valeurs de code et la lecture sur navigateur via localhost
Lecture de texte incluant un ho­ro­da­tage sur na­vi­ga­teur
Image: Script PHP avec Statement SQL incluant des valeurs de code et la lecture sur navigateur via localhost
Lecture de texte incluant un ho­ro­da­tage sur na­vi­ga­teur
Close

Dans les deux exemples pré­cé­dents, le serveur Web nous donne des données uti­li­sa­teur dans l’ordre dans lequel nous avons entré les dif­fé­rents uti­li­sa­teurs dans le tableau (avec l’ID cor­res­pon­dante). Si vous souhaitez afficher des données triées, dé­fi­nis­sez un ordre à l’aide du mot-clé SQL ORDER BY. Les données sont ainsi triées par ordre al­pha­bé­tique dans l’exemple ci-dessous :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT forename, surname, email FROM users ORDER BY forename"; foreach ($pdo->query($sql) as $row) { echo $row['forename'] . " " . $row['surname'] . "<br />"; echo "E-Mail: " . $row['email'] . "<br /><br />"; } ?>
Image: Données triées avec ORDER BY
Avec ORDER BY vous pouvez effectuer les tris de votre choix pour vos données
Image: Données triées avec ORDER BY
Avec ORDER BY vous pouvez effectuer les tris de votre choix pour vos données
Close

INSERT

La création d’entrées de bases de données se fait rarement ma­nuel­le­ment via php­MyAd­min. En règle générale, les données sont écrites dans le cadre de l’exécution du script à partir du serveur Web de la base de données : si un in­ter­naute remplit par exemple un for­mu­laire en ligne sur un site Web ou s’il laisse un com­men­taire sur une boutique en ligne. Dans les deux cas, la commande SQL INSERT est utilisée en arrière-plan. Le statement SQL avec la commande INSERT sera créé selon le schéma suivant.

INSERT INTO tableau (colonne1, colonne2, colonne3) VALUES (valeur1, valeur2, valeur3);

Cela se lit comme suit : char­ge­ment du tableau et ajout des valeurs 1, 2 et 3 aux tableaux 1, 2 et 3.

Un script PHP simple pour ajouter un autre paquet à notre tableau uti­li­sa­teurs (users) pourrait res­sem­bler à ceci :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "INSERT INTO users (forename, surname, email, password) VALUES ('Paddy', 'Irish', '[email protected]', 'qaywsx')"; if ($pdo->exec($sql) === 1) echo "New record created successfully"; ?>

Nous éta­blis­sons tout d’abord la connexion à la base de données et en­re­gis­trons cette dernière dans la variable $pdo. Nous dé­fi­nis­sons ensuite le Statement SQL et l’en­re­gis­trons dans la variable $sql. Sur la ligne 5, nous utilisons la flèche (->) pour accéder à la variable $pdo et exécuter le Statement SQL en­re­gis­tré dans $sql à l’aide de la fonction exec().

Pour s’assurer que le script ajoute un paquet dans le tableau uti­li­sa­teurs (users), nous vérifions le nombre de lignes con­cer­nées à l’aide de la condition if. Cela garantit que le String New Record a été créé avec succès et affiché via le na­vi­ga­teur Web, lorsque le nombre de paquets ajouté est égal à 1. Si le script est à nouveau exécuté, le message est manquant. On évite par ailleurs les doublons en dé­fi­nis­sant la valeur email avec l’attribut UNIQUE.

Image: La commande SQL INSERT
Ajoutez de nouveaux paquets de données à votre tableau à l’aide de la commande SQL INSERT
Image: La commande SQL INSERT
Ajoutez de nouveaux paquets de données à votre tableau à l’aide de la commande SQL INSERT
Close

Nous chargeons l’aperçu de notre tableau exemple uti­li­sa­teurs dans la base de données test, et observons que le tableau a été étendu avec un cinquième paquet. Le numéro d’iden­ti­fi­ca­tion ainsi que l’ho­ro­da­tage sont ajoutés au­to­ma­ti­que­ment comme prévu.

Image: phpMyAdmin : aperçu du tableau actualisé selon l’opération de base de données INSERT
Un aperçu actualisé de votre tableau de données peut être chargé si besoin via php­MyAd­min (les nouvelles données sont marquées en rouge)
Image: phpMyAdmin : aperçu du tableau actualisé selon l’opération de base de données INSERT
Un aperçu actualisé de votre tableau de données peut être chargé si besoin via php­MyAd­min (les nouvelles données sont marquées en rouge)
Close

UPDATE

Pour mettre à jour une des données exis­tantes, utilisez la commande SQL UPDATE selon le schéma suivant :

UPDATE tableau SET colonne1 = valeur1, colonne2 = valeur2 WHERE colonne3 = valeur3

En d’autres termes, ce Statement-SQL signifie : sé­lec­tion­nez le tableau spécifié et remplacez la valeur colonne1 par valeur1 et la valeur dans la colonne2 par la valeur2 si la colonne3 contient la valeur3. Attention à ne pas oublier que la condition MySQL remplace les champs concernés dans tous les dossiers.

Nous avons donc à faire avec un Statement SQL qui relie une opération de base de données à une condition. Appliqué à notre tableau exemple, l’adresse email de l’uti­li­sa­teur John Doe pourrait être ac­tua­li­sée avec le script suivant :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "UPDATE users SET email = '[email protected]', updated_at = NOW() WHERE id = 1"; if ($pdo->exec($sql) === 1) echo "Update successful"; ?>

Nous dé­fi­nis­sons dans le Statement SQL que la valeur actuelle dans la colonne email doit être remplacée par la nouvelle valeur [email protected], dans la mesure où la colonne ID contient la valeur 1. Nous ne modifions ainsi que le paquet de données avec la clé primaire 1. De plus, nous mettons à jour la valeur pour la colonne updated_at dans le même SQL-Statement à l’aide de la fonction MySQL now(), qui indique l’ho­ro­da­tage actuel. L’ins­truc­tion SQL est exécutée comme pré­cé­dem­ment avec la ligne de code $pdo->exec($sql) dans le cadre d’une condition if.

Image: La commande SQL UPDATE
SQL-Statement avec commande UPDATE et la fonction TIMESTAMP NOW()
Image: La commande SQL UPDATE
SQL-Statement avec commande UPDATE et la fonction TIMESTAMP NOW()
Close

Si la mise à jour est un succès, php­MyAd­min devrait afficher le tableau actualisé dans l’onglet « Browse » :

Image: phpMyAdmin : aperçu actualisé du tableau selon l’opération de base de données UPDATE
La fonction NOW () remplace le champ de données avec l’ho­ro­da­tage actuel updated_at (les données ac­tua­li­sées sont marquées en rouge)
Image: phpMyAdmin : aperçu actualisé du tableau selon l’opération de base de données UPDATE
La fonction NOW () remplace le champ de données avec l’ho­ro­da­tage actuel updated_at (les données ac­tua­li­sées sont marquées en rouge)
Close

Dans cet exemple nous avons actualisé l’adresse email et remplacé la valeur standard NULL dans la colonne updated_at par un ho­ro­da­tage. La commande UPDATE permet par ailleurs de trans­fé­rer des valeurs d’une colonne à l’autre. Cette opération peut par exemple être utilisée lorsqu’on veut élargir le tableau uti­li­sa­teurs avec la colonne email_re­gis­tra­tion. Cela nous donne la pos­si­bi­lité de faire la dis­tinc­tion entre les deux adresses email : celle utilisée lors de l’en­re­gis­tre­ment, et celle de contact actuelle, qui peut changer au fil du temps. Cependant, les deux adresses sont ini­tia­le­ment les mêmes, afin que les valeurs d’un champ puissent être trans­mises à l’autre. Nous ajoutons pour ce faire les nouvelles colonnes email_re­gis­tra­tion avec php­MyAd­min via « Add columns » dans l’onglet « Structure » :

Image: phpMyAdmin : Tab « Structure »
Ajoutez de nouvelles colonnes de tableau là où vous le souhaitez via Add columns dans l’onglet structure.
Image: phpMyAdmin : Tab « Structure »
Ajoutez de nouvelles colonnes de tableau là où vous le souhaitez via Add columns dans l’onglet structure.
Close

Pour trans­mettre les valeurs, nous utilisons le Statement UPDATE suivant :

UPDATE users SET email_registration = email

Etant donné que nous voulons mettre à jour tous les paquets de données, nous ne formulons pas de condition de mise à jour.

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "UPDATE users SET email_registration = email"; $affected = $pdo->exec($sql); echo "$affected rows updated<br>"; ?>

Si le script est exécuté via le serveur Web, le système de gestion de base de données transmet les valeurs de la colonne à tous les paquets de données dans la colonne email_re­gis­tra­tion.

Image: La commande SQL UPDATE pour la transmission de contenu de colonnes
Le script transmet toutes les valeurs de la colonne email dans la colonne email-re­gis­tra­tion et indique le nombre de colonnes con­cer­nées au na­vi­ga­teur Web.
Image: La commande SQL UPDATE pour la transmission de contenu de colonnes
Le script transmet toutes les valeurs de la colonne email dans la colonne email-re­gis­tra­tion et indique le nombre de colonnes con­cer­nées au na­vi­ga­teur Web.
Close

DELETE

Image: phpMyAdmin : Aperçu des tableaux actualisés selon UPDATE
L’adresse email des paquets de données choisies a été copiée de la colonne email vers email_re­gis­tra­tion
Image: phpMyAdmin : Aperçu des tableaux actualisés selon UPDATE
L’adresse email des paquets de données choisies a été copiée de la colonne email vers email_re­gis­tra­tion
Close

Les saisies sur une base de données peuvent être sup­pri­mées avec la commande SQL DELETE. Vous pouvez utiliser cette dernière selon le schéma suivant :

DELETE FROM tableau WHERE colonne = wert

Si vous tra­vail­lez avec des IDs dans votre base de données, il faut s’iden­ti­fier pour pouvoir supprimer des données. Si vous souhaitez supprimer la saisie 5 de notre tableau exemple, cela se fait comme ceci :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "DELETE FROM users WHERE id = 5"; $affected = $pdo->exec($sql); echo "$affected rows updated<br>"; ?>

La commande SQL DELETE efface toujours une ligne entière d’une base de données. Pour supprimer uni­que­ment les valeurs spé­ci­fiées dans une colonne, il faut effectuer l’ins­truc­tion SQL cor­res­pon­dante. Avec UPDATE tableau SET colonne = NULL WHERE, vous pouvez attribuer la valeur NULL à une colonne, à condition bien sûr que vous ayez permis la valeur NULL pour cette colonne.

Prepared Sta­te­ments

Avec PDO, vous pouvez mettre en œuvre des opé­ra­tions de bases de données en tant que Prepared Sta­te­ments. Ces pré-ins­truc­tions sont main­te­nant pratique courante dans le dé­ve­lop­pe­ment Web et sont prises en charge par tous les systèmes de gestion de bases de données modernes.

Dans les exemples pré­cé­dents, nous avons entré les valeurs des pa­ra­mètres di­rec­te­ment dans l’ins­truc­tion SQL (SQL Statement). Les Prepared Sta­te­ments au contraire fonc­tion­nent avec des espaces libres, qui vont être remplis avec des valeurs par la suite. Cela permet au système de gestion de base de données de vérifier la validité des pa­ra­mètres avant leur mise en place. Les ins­truc­tions préparées, à condition qu’elles soient mises en œuvre de manière cohérente dans le code source, sont une pro­tec­tion efficace contre des in­jec­tions SQL. Dans ce modèle d’attaque, les cy­ber­cri­mi­nels créent ou modifient des commandes SQL afin d’accéder à des données sensibles, écraser des données ou ajouter leurs propres commandes au système.

Les in­jec­tions SQL sont basées sur des failles de sécurité bien connues en relation avec les bases de données SQL : si les saisies uti­li­sa­teur sont ef­fec­tuées avec des pa­ra­mètres statiques via $_GET par exemple, cela donne l’occasion aux cy­ber­cri­mi­nels d’enrichir leur intrusion avec des mé­ta­don­nées pouvant conduire à des effets in­dé­si­rables si elles entrent sans masquage dans le SQL-In­ter­pre­ter. Ces in­tru­sions peuvent être ef­fi­ca­ce­ment empêchées avec des prepared Sta­te­ments. Ces derniers agissent en tant que modèles pour les commandes SQL trans­mises sé­pa­ré­ment des pa­ra­mètres réels de la base de données. Ils valident les données trans­fé­rées, masquent les ca­rac­tères méta au­to­ma­ti­que­ment et ajoutent des pa­ra­mètres à la place des champs libres dans le Statement SQL.

Les Prepared Sta­te­ments proposent l’avantage de la per­for­mance en dehors des aspects relatifs à la sécurité. Cela se confirme lorsque la même commande SQL est exécutée en boucle avec des pa­ra­mètres dif­fé­rents. Une fois le Prepared Statement analysé, il est placé dans le système de base de données et doit seulement y être exécuté avec de nouveaux pa­ra­mètres. Les requêtes les plus complexes peuvent ainsi être sen­si­ble­ment ac­cé­lé­rées.

Les Prepared Sta­te­ments sont mis en place dans PDO à l’aide de la fonction prepare(). Ceci prépare une dé­cla­ra­tion pour l’exécution et renvoie un objet de ce statement. Le point d’in­ter­ro­ga­tion (?) ou bien un paramètre nommé par vous-même (Named Parameter) est affiché pour ca­rac­té­ri­ser les champs vides.

Prepared Sta­te­ments avec des pa­ra­mètres sans intitulé

L’exemple de code suivant affiche l’opération de base de données INSERT en tant que Prepared Statement avec des pa­ra­mètres sans intitulé :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); // prepare SQL statement $statement = $pdo->prepare("INSERT INTO users (forename, surname, email, password) VALUES (?, ?, ?, ?)"); // bind parameter $statement ->bindParam(1, $forename); $statement ->bindParam(2, $surname); $statement ->bindParam(3, $email); $statement ->bindParam(4, $password); // insert data sets $forename = "Anders"; $surname = "Andersen"; $email = "[email protected]"; $password = "mnbvc"; if ($statement->execute()) echo "New record $forename created successfully<br>"; $forename = "Matti"; $surname = "Meikäläinen"; $email = "matti@meikäläinen.com"; $password = "jhgfd"; // display status if ($statement->execute()) echo "New record $forename created successfully<br>"; ?>

Nous créons tout d’abord un objet de Statement à l’aide de la fonction prepare() pour la requête souhaitée et nous l’en­re­gis­trons dans la série $statement. Le point d’in­ter­ro­ga­tion apparaît au niveau de l’espace vide plutôt que des valeurs de pa­ra­mètres concrètes.

Si le statement SQL ne comporte que des champs libres, les valeurs doivent être trans­mises sé­pa­ré­ment dans le code ci-dessous. C’est là que la fonction PHP bindParam() entre en scène. Nous utilisons l’opération « flèche » (->) pour accéder à la méthode de L’objet du statement ainsi que pour lui attribuer des variables (1 cor­res­pond à la première question, 2 à la deuxième, etc.).

Le template SQL ainsi créé peut main­te­nant être exécuté ar­bi­trai­re­ment avec les pa­ra­mètres souhaités. Dans cet exemple, nous dé­fi­nis­sons des valeurs variables pour deux paquets de données. L’exécution des pré-ins­truc­tions SQL s’effectue via execute() pour chaque paquet de données.

Prepared Sta­te­ments dotés de pa­ra­mètres avec intitulés

Les pa­ra­mètres dotés d’intitulés sont plus clairs que des points d’in­ter­ro­ga­tion sur des champs libres. Ce sont des espaces réservés per­son­na­li­sés que vous pouvez nommer au besoin selon le schéma suivant :

:example

Les pa­ra­mètres dotés d’intitulés ne doivent pas comporter d’espace ou de traits d’union (-). Utilisez au lieu de cela des tirets bas (_).

L’exemple suivant montre l’opération de base de données INSERT comme une pré-ins­truc­tion avec des pa­ra­mètres dotés d’intitulés :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); // prepare SQL statement $statement = $pdo->prepare("INSERT INTO users (forename, surname, email, password) VALUES (:forename, :surname, :email, :password)"); // bind parameter $statement ->bindParam(':forename', $forename); $statement ->bindParam(':surname', $surname); $statement ->bindParam(':email', $email); $statement ->bindParam(':password', $password); // insert data sets $forename = "Anders"; $surname = "Andersen"; $email = "[email protected]"; $password = "mnbvc"; if ($statement->execute()) echo "New record $forename created successfully<br>"; $forename = "Matti"; $surname = "Meikäläinen"; $email = "matti@meikäläinen.com"; $password = "jhgfd"; $statement->execute(); // display status if ($statement->execute()) echo "New record $forename created successfully<br>"; ?>

Dans le Prepared Statement vous trouverez des pa­ra­mètres avec intitulé tels que :forename, :surname, :email et :password. Nous relions ces derniers aux variables $forename, $surname, $email et $password via bindParam(). Dans cet exemple nous avons nommé aussi bien les pa­ra­mètres que les variables des noms de colonnes du tableau cor­res­pon­dant. Cela n’est pas dicté par la syntaxe. Cependant, une ap­pel­la­tion cohérente et uniforme est re­com­man­dée pour des questions de li­si­bi­lité du code. L’af­fec­ta­tion des valeurs variables ainsi que l’exécution de l’ins­truc­tion SQL se fait par analogie de la même manière que l’exemple précédent.

Fonctions de date et d’heure dans MySQL

MySQL et MariaDB sou­tien­nent diverses fonctions pour tra­vail­ler avec les dates et heures. En voici une liste complète. Nous nous limitons à une sélection dans notre tutoriel MySQL pour débutants.

Fonctions de date et heure Des­crip­tion
CURRENT_TIMESTAMP() / NOW() Vous con­nais­sez déjà la fonction NOW() de notre exemple de commande SQL UPDATE. Il s’agit ici seulement d’un synonyme de la fonction CURRENT_TIMESTAMP() qui donne la date actuelle ainsi que l’heure dans le cadre d’une opération de base de données.
CURDATE() / CURRENT_DATE() La fonction CURDATE() vous donne la date actuelle.
CURTIME() / CURRENT_TIME() La fonction CURTIME() vous donne l’heure actuelle.
DAY() / DAYOF­MONTH() Vous donne le jour et le mois (0-31) ; vous avez besoin d’une date ou d’un Timestamp (ho­ro­da­tage) comme argument.
DAYOFWEEK() Vous donne le jour et la semaine (1=dimanche) ; vous avez besoin de la date ou d’un Timestamp (ho­ro­da­tage) comme argument.
MONTH() Vous donne le mois (1-12) ; nécessite une date ou un timestamp comme argument.
YEAR() Donne un numéro d’année (1000-9999, 0) ; nécessite une date ou un Timestamp comme argument.
DATE() Extrait la date d’une in­di­ca­tion de date ou d’heure ; exige une date ou un ho­ro­da­tage comme argument.
TIME() Extrait l’heure d’une heure ou d’une date définie ; exige une date ou un ho­ro­da­tage comme argument.
DATE_FORMAT() Formate une in­di­ca­tion d’heure ou de date selon les pa­ra­mètres ren­seig­nés ; nécessite une date ou un ho­ro­da­tage comme argument.

Un scénario d’ap­pli­ca­tion possible pour des fonctions de date et d’heure dans MySQL est par exemple des requêtes de bases de données avec les­quelles tous les paquets de données qui ont été créés un jour précis doivent être lus.

Le script suivant nous donne tous les paquets de données qui ont été créés dans notre exemple de tableau :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT forename, surname, email FROM users WHERE DATE(created_at) = CURDATE()"; foreach ($pdo->query($sql) as $row) { echo $row['forename'] . " " . $row['surname'] . "<br />"; echo "E-Mail: " . $row['email'] . "<br /><br />"; } ?>

Afin de limiter la sortie des éléments à ceux créés aujourd’hui, on utilise l’ins­truc­tion SQL suivante (condition) :

DATE(created_at) = CURDATE()

On extrait tout d’abord la date de la colonne où est placé l‘ho­ro­da­tage (created_at) à l’aide de la fonction DATE(), puis on actualise cette date lors de l’étape suivante. La commande SELECT sé­lec­tionne uni­que­ment les entrées dont l’ho­ro­da­tage cor­res­pond à la date actuelle.

Sinon, il est aussi possible de sé­lec­tion­ner l’entrée qui a été mise à jour le 16/12/2016. Il faut pour cela adapter la condition de notre SQL Statement :

SELECT forename, surname, email FROM users WHERE DATE(updated_at) = '2016-12-16'

Dans ce cas, la date extraite de l‘ho­ro­da­tage est ajustée avec une date cible spé­ci­fique. De plus, vous pouvez limiter des requêtes sur une année donnée, un mois, ou une journée précise.

Le Statement suivant s’applique à toutes les entrées des uti­li­sa­teurs du tableau qui ont été ajoutés en décembre :

SELECT forename, surname, email FROM users WHERE month(created_at) = 12";

En dehors du signe égal (=), MySQL prend aussi en charge les opé­ra­tions de con­di­tions suivantes :

Opération de com­pa­rai­son des­crip­tion
= équi­valent
< Plus petit que
> Plus grand que
<= Inférieur ou égal
>= Supérieur ou égal
!= différent

Plusieurs autres opé­ra­tions peuvent être liées à des opé­ra­tions de logique :

Opération de logique Des­crip­tion
OR ou || ou
AND ou && et

L’ins­truc­tion suivante sé­lec­tionne par exemple toutes les entrées qui ont été créées après février et avant avril :

SELECT forename, surname, email FROM users WHERE MONTH(created_at) > 2 AND MONTH(created_at) < 4";

Jusqu’ici, les in­for­ma­tions de dates et heures sont stockées dans notre base de données au format spécifié. Celles-ci ne sont pas dé­ter­mi­nées avec MySQL et MariaDB. La fonction DATE_FORMAT() vous donne la pos­si­bi­lité, de formater les dates et heures avec des pa­ra­mètres op­tion­nels selon vos souhaits.

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT forename, surname, DATE_FORMAT(created_at,'%D %M %Y') AS created_at FROM users WHERE id=1"; foreach ($pdo->query($sql) as $row) { echo $row['forename'] . " " . $row['surname'] . " your profile was created at: " . $row['created_at'] . ".<br /><br />"; } ?>

Le tableau suivant montre les pa­ra­mètres possibles pour la fonction DATE_FORMAT() selon la do­cu­men­ta­tion MySQL.

Paramètre Des­crip­tion Zone de valeurs/exemples
%c In­di­ca­tion numérique du mois avec 1 ou 2 chiffres 0 à 12
%d In­di­ca­tion numérique du jour du mois avec deux chiffres 00 à 31
%e In­di­ca­tion numérique du jour dans le mois avec un ou deux chiffres 0 à 31
%H Affichage de l’heure à deux chiffres 00 à 23
%i In­di­ca­tion numérique des minutes avec deux chiffres 00 à 59
%j In­di­ca­tion numérique du jour avec un ou deux chiffres 001 à 366
%k In­di­ca­tion numérique de l’heure avec un ou deux chiffres 0 à 23
%M Nom du mois avec les pa­ra­mètres régionaux en vigueur Janvier, Février, Mars, etc.
%m In­di­ca­tion numérique du mois avec deux chiffres 00 à 12
%s Affichage numérique des secondes avec deux chiffres 00 à 59
%T Heure au format 24 heures (forme rac­cour­cie de '%H:%i:%S') HH:MM:SS
%u Numéro de la semaine dans l’année, commence par lundi 00 à 53
%W Nom du jour de la semaine dans le schéma en vigueur Lundi, Mardi etc.
%w Jour de la semaine 0 = dimanche, 6 = samedi
%Y Année avec quatre chiffres 2016 par ex.
%y Nombre d’années avec deux chiffres 16 par ex.

Rapports d’erreurs MySQL

Si un script ne fonc­tionne pas comme désiré, cela est gé­né­ra­le­ment dû à des erreurs de syntaxe dans le code source ou bien à des tableaux, colonnes et variables mal nommées. Toutefois, le serveur de base de données n’affiche pas toujours un message d’erreur dans ce cas. L’absence du résultat souhaité n’est en effet souvent pas ac­com­pag­née d’un tel rapport d’erreur.

PDO fournit donc une nouvelle fonc­tio­na­lité avec errorInfo(), avec laquelle des rapports d’erreurs détaillés des dernières opé­ra­tions de bases de données peuvent être chargés : par exemple en les délivrant via le na­vi­ga­teur Web.

Dans le script suivant servant à l’ac­tua­li­sa­tion de l’adresse email, la fonction errorinfo() est combinée avec une boucle if. La seule condition est l’exécution correcte du Statement SQL. S’il est exécuté sans erreur, le serveur Web délivre un message de mise à jour réussie. Dans le cas contraire, le code ci-dessous reste en cours d’exécution.

Dans l’exemple actuel, nous informons l’uti­li­sa­teur qu’une erreur SQL s’est produite et qu’elle concerne le SQL Statement. De plus amples in­for­ma­tions sont par ailleurs com­mu­ni­quées avec errorinfo() :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $statement = $pdo -> prepare("UPDATE user SET password = :password, updated_at = NOW() WHERE id = 1"); $statement ->bindParam(':password', $password); $password = "YXDli_89%s"; if ($statement ->execute()){ echo "Update successful"; } else { echo "SQL Error <br />"; echo $statement->queryString."<br />"; echo $statement->errorInfo()[2]; } ?>

Si nous lançons le script via le serveur Web, nous recevons les in­for­ma­tions suivantes :

SQL Error UPDATE user SET password = :password, updated_at = NOW() WHERE id = 1 Table 'test.user' doesn't exist

La commande SQL UPDATE fait référence à un tableau portant le nom uti­li­sa­teur (user). Nous avons cependant nommé notre tableau exemple uti­li­sa­teurs (users). Le serveur SQL ne peut pas trouver le tableau demandé et fait ap­pa­raître le message Table 'test.user' doesn't exist. La cause de cette erreur est donc seulement une faute de frappe dans le SQL statement, qui peut être ra­pi­de­ment résolue.

La fonction errorinfo() renvoie des valeurs sous la forme d’une série composée de trois éléments :

[0] = Code d’erreur SQL

[1] = Code d’erreur relatif au pilote

[2] = Message d’erreur relatif au pilote

Dé­fi­nis­sez via la saisie des éléments souhaités entre crochets quelles in­for­ma­tions délivrer via errorInfo().

Image: Livraison d’un rapport d’erreur SQL
Livraison d’un message d’erreur via le na­vi­ga­teur Web
Image: Livraison d’un rapport d’erreur SQL
Livraison d’un message d’erreur via le na­vi­ga­teur Web
Close

Dans la pratique, les in­for­ma­tions dé­tail­lées sur les erreurs sont rarement émises via le na­vi­ga­teur Web. Les uti­li­sa­teurs finaux peuvent gé­né­ra­le­ment faire peu de choses avec ces in­for­ma­tions. Les cy­ber­cri­mi­nels po­ten­tiels cependant, utilisent parfois des messages d’erreur pour suivre les requêtes SQL et iden­ti­fier les points faibles d’une ap­pli­ca­tion. Il est par con­sé­quent re­com­mandé d’informer les uti­li­sa­teurs sur les cas d’erreurs et se stocker leurs in­for­ma­tions relatives à ces erreurs en interne. En pratique, cela donne ceci :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $statement = $pdo->prepare("UPDATE user SET password = :password, updated_at = NOW() WHERE id = 1"); $statement->bindParam(':password', $password); $password = "YXDli_89%s"; if ($statement->execute()) { echo "Update successful"; } else { echo "Une erreur est malheureusement survenue lors de l’actualisation de votre mot de passe. Veuillez contacter notre administrateur à l’adresse suivante : [email protected]."; $error = DATE("Y-m-d H:i:s") . " - " . __FILE__ . " - " . $statement->queryString . " - " . $statement->errorInfo()[2] . " \r\n"; file_put_contents("sqlerrors.log", $error, FILE_APPEND); } ?>

Au lieu de la valeur renvoyée de la fonction errorinfo() par écho dans le na­vi­ga­teur Web, nous stockons cette dernière avec l’ho­ro­da­tage actuel ainsi qu’avec le chemin vers le fichier et le Statement SQL concerné dans la variable $error.

La fonction PHP DATE() indique l’ho­ro­da­tage Unix dans le format spécifié. La soi-disant constante magique _FILE_ nous donne le chemin complet vers le fichier test.php. Le SQL statement actuel est chargé comme dans l’exemple précédent via $statement->que­ryS­tring. Par la suite les données stockées dans $error à l’aide de la fonction file_put_contents() comme texte du fichier sqlerrors.log dans le dossier htdocs.

Image: Les informations d’erreurs stockées dans le fichier sqlerrors.log
Vous trouverez les in­for­ma­tions d’erreurs dans le fichier sqlerrors.log
Image: Les informations d’erreurs stockées dans le fichier sqlerrors.log
Vous trouverez les in­for­ma­tions d’erreurs dans le fichier sqlerrors.log
Close

JOIN

Comme mentionné dans le chapitre sur les bases de données re­la­tion­nelles, nous pouvons in­ter­ro­ger les données de plusieurs tableaux si­mul­ta­né­ment. Une fois fa­mi­lia­risé avec les opé­ra­tions basiques de bases de données, nous vous dé­mon­trons comment relier dif­fé­rents tableaux de votre base de données (Join en anglais).

La fusion des tableaux dans une requête se fait en utilisant la commande SQL JOIN. Dans ce cas, deux (ou plus) tableaux nor­ma­li­sés sont reliés via des colonnes communes. Ceci peut être réalisé par l’in­ter­mé­diaire de clés étran­gères.

Nous dé­mon­trons cette liaison entre les tableaux de base de données avec l’exemple suivant :

Image: SQL JOINImage: SQL JOINClose

Le tableau présente une sélection de nos chansons préférées des années 1960 et est destiné à servir d’exemple négatif d’une mauvaise con­cep­tion de base de données.

À première vue, notez que le tableau a de nombreux champs de données re­don­dants. Nous sup­pri­mons ces dernières en ré­par­tis­sant les données dans le cadre d’une nor­ma­li­sa­tion dans des tableaux séparés et reliés à l’aide de clés étran­gères.

Formes normales

Une con­cep­tion de base de données réussie se ca­rac­té­rise par un minimum de re­don­dance. La nor­ma­li­sa­tion de tableaux de données permet d’éviter de dupliquer les entrées. Trois formes normales se sont établies dans le cadre des modèles de bases de données re­la­tion­nelles pour que vous puissiez mettre en place des règles pour une struc­tu­ra­tion optimale des données.

1. forme normale

Un tableau cor­res­pond à la première forme normale si toutes les valeurs d’attributs sont atomiques. Les valeurs d’attributs sont con­si­dé­rées comme atomiques si elles ne con­tien­nent que des in­for­ma­tions. Nous il­lus­trons cela plus cela plus clai­re­ment avec un exemple négatif.

In­té­res­sons-nous par exemple les colonnes album_title et interpret du tableau album. Au lieu d’exécuter chaque in­for­ma­tion contenue dans le tableau dans une colonne séparée, nous avons inscrit les in­for­ma­tions sur l’année de l’album entre pa­ren­thèses après le titre de l’album ou dé­cla­ra­tion de l’artiste. Cela ne s’utilise que lorsque nous voulons in­ter­ro­ger tous les titres par exemple, qui ont été publiés dans une année donnée.

Nous vous re­com­man­dons de créer des tableaux de données toujours selon les règles de la première forme normale. Pour notre exemple, le tableau se présente de la manière suivante :

Image: 1. forme normaleImage: 1. forme normaleClose

Toutes les données sont main­te­nant séparées et donc fa­ci­le­ment lisibles. Cependant, notre tableau contient encore des re­don­dances. Découvrez comment surmonter ces dernières dans les pro­chaines étapes.

2. forme normale

Un tableau cor­res­pond à la deuxième forme normale lorsque toutes les con­di­tions de la première forme normale sont remplies et que chaque attribut non clé est plei­ne­ment dépendant de l’ensemble de la clé primaire du tableau.

Les tableaux de données ne con­tien­nent souvent qu’une seule colonne, faisant office de clé primaire. Les tableaux de ce type sont au­to­ma­ti­que­ment réglés sur la deuxième forme normale, si les con­di­tions de la première forme normale sont remplies. Il arrive cependant parfois que la clé primaire d’un tableau découle de deux colonnes. C’est le cas dans notre tableau exemple.

Pour charger le titre souhaité de la colonne titre du tableau, nous avons besoin d’un album_id mais aussi du numéro de titre de la colonne track. Le titre Sympathy for the Devil peut par exemple être chargé via la clé primaire album_ID = 3 et track = 1. Nous avons donc affaire à une clé primaire composite. Ce dernier n’est cependant que né­ces­saire pour les requêtes liées à la colonne title. Les colonnes album_title, released, interpret et years_active sont ex­clu­si­ve­ment dé­pen­dantes d’album_id. Il n’y a donc pas de dé­pen­dance fonc­tion­nelle pour ces deux colonnes avec l’ensemble de la clé primaire. Les con­di­tions de la deuxième forme normale ne sont pas remplies.

Cela peut être modifié en stockant la colonne title dans un nouveau tableau et en la reliant à une clé étrangère (album_id) avec le tableau de sortie.

Image: 2. forme normaleImage: 2. forme normaleClose Image: 2. forme normale-2fizkesShut­ters­tockImage: 2. forme normale-2fizkesShut­ters­tockClose

Le tableau re­tra­vaillé album comporte seulement une clé primaire d’une seule pièce et remplit donc au­to­ma­ti­que­ment les con­di­tions pour la deuxième forme normale. Le nouveau tableau title ne comprend que le titre de la colonne non-clé. Ce dernier est dépendant (fonc­tion­nel­le­ment) des deux parties des clés primaires (album_id und track) et cor­res­pond donc à la deuxième forme normale.

Mais des entrées re­don­dantes sont présentes dans la deuxième forme normale de notre tableau de données album.

3. forme normale

Un tableau de la troisième forme normale se conforme à toutes les con­di­tions de la deuxième forme normale, et donc aussi de la première forme normale. De plus, il ne doit pas y avoir d’attribut non-clé en dé­pen­dance tran­si­tive. Cette condition peut sembler com­pli­quée, mais peut être expliquée en quelques mots : une dé­pen­dance tran­si­tive existe toujours quand un attribut non-clé dépend d’un autre attribut non-clé. De plus, un attribut non-clé ne doit pas être en dé­pen­dance tran­si­tive avec un attribut clé.

C’est exac­te­ment ce qui s’applique à notre tableau exemple album. Vous y trouverez les colonnes interpret et years_active. Tandis que l’in­ter­prète peut être déterminé par album_id, l’in­di­ca­tion de l’année de la bande existante dépend tran­si­ti­ve­ment de album_id. Cela présente l’in­con­vé­nient que le système de gestion de base de données stocke au­to­ma­ti­que­ment une valeur re­don­dante dans la colonne years_active à chaque fois qu’un nouvel album d’un artiste est entré.

Afin de remplir les con­di­tions de la troisième forme normale et ainsi retirer toutes les re­don­dances de notre tableau, nous devons aussi stocker la colonne interpret incluant years_active dans un tableau séparé et le relier avec un tableau de sortie album via une clé étrangère (interpret_id).

Nous obtenons ainsi trois tableaux nor­ma­li­sés : interpret, album et title.

Image: 3. forme normale-1Image: 3. forme normale-1Close Image: 3. forme normale-2Image: 3. forme normale-2Close Image: 3. forme normale-3Image: 3. forme normale-3Close

Si nous voulons main­te­nant dis­tri­buer un titre précis incluant les in­for­ma­tions de l’album ainsi que de l’in­ter­prète, nous devons relier les trois tableaux séparés à l’aide de la commande SQL JOIN et de la clé étrangère res­pec­tive.

Définir une clé étrangère via php­MyAd­min

Dans la mesure où vous avez choisi InnoDB comme moteur de base de données, dé­fi­nis­sez des relations de clés étran­gères via l’interface graphique de votre programme d’ad­mi­nis­tra­tion php­MyAd­min. La clé primaire d’un tableau peut ici être mise en œuvre comme clé étrangère d’un certain nombre d’autres tableaux.

Dans notre exemple, nous avons besoin de deux con­nexions pour relier les trois tableaux nor­ma­li­sés album, interpret et title :

  • Nous utilisons comme première connexion la clé primaire album_id du tableau album en tant que clé étrangère dans le tableau title.
  • Nous utilisons pour la deuxième connexion la clé primaire interpret_id du tableau interpret en tant que clé étrangère dans le tableau album.

Les relations des clés étran­gères peuvent être il­lus­trées par le graphique suivant :

Image: Tableaux de données normalisés reliés avec des clés étrangères
Les tableaux nor­ma­li­sés album, title et interpret, reliés par des clés étran­gères
Image: Tableaux de données normalisés reliés avec des clés étrangères
Les tableaux nor­ma­li­sés album, title et interpret, reliés par des clés étran­gères
Close

Ceci vaut pour la liaison de tableaux de données : une colonne, qui agira comme une clé étrangère, doit être fournie avec les attributs ou un index unique.

La relation entre clé primaire et clé étrangère cor­res­pond en général au type de relation 1:n. Chaque champ de données dans la colonne de clé primaire du tableau A se trouve avec un nombre quel­conque (n) de champs de saisie dans la colonne de clé étrangère du tableau B. Cependant, chaque champ de données dans la colonne de clé étrangère du tableau B se réfère toujours à un seul champ de données dans la colonne de clé primaire du tableau A. Nous avons par exemple quatre entrées dans la colonne de clé primaire album_id du tableau, qui sont reliées via des clés étran­gères title.album_id avec huit entrées du tableau title.

Image: Relation 1:n entre la clé primaire et la clé étrangère
Clé primaire et clé étrangère se trouvent dans une relation 1:n
Image: Relation 1:n entre la clé primaire et la clé étrangère
Clé primaire et clé étrangère se trouvent dans une relation 1:n
Close

Pour mettre en place les liens souhaités, nous avons placé les tableaux album, interpret et title dans php­MyAd­min et nous avons défini nos clés primaires dans le cadre de la création de tableau comme décrit dans l’option « Index ». Faites également attention au fait que les colonnes qui font ensuite office de clés étran­gères sont également marquées via l’option Index en tant que INDEX ou UNIQUE. Seul INDEX s’avère adapté pour les relations 1:n car les valeurs dans le champ UNIQUE ne doivent pas être répétées par la suite.

Nous dé­fi­nis­sons lors de l’étape suivante la clé étrangère. Dé­mon­trons ceci avec l’exemple du tableau album. Nous sé­lec­tion­nons pour cela le tableau dans le panneau de na­vi­ga­tion et chargeons l’onglet structure depuis la barre de menu. C’est ici que se trouve le bouton « Relation View » (aperçu des relations) :

Image: onglet « Structure » et Bouton Relation view
Le bouton Relation view de l‘onglet « Structure » (marqué en rouge)
Image: onglet « Structure » et Bouton Relation view
Le bouton Relation view de l‘onglet « Structure » (marqué en rouge)
Close

Les relations de clés étran­gères sont définies dans l’aperçu des relations d’un tableau de données via le champ de saisie « Foreign key cons­traints » :

Image: phpMyAdmin : barre de saisie « Foreign key constraints »BrAt82Shut­ters­tock
Les relations de clés étran­gères sont définies dans le masque de saisie « Foreign key con­traints »
Image: phpMyAdmin : barre de saisie « Foreign key constraints »
Les relations de clés étran­gères sont définies dans le masque de saisie « Foreign key con­traints »
Close

La colonne Interpret_id du tableau album doit faire office de clé étrangère, qui repose sur la clé primaire interpret_id du tableau interpret.

Image: phpMyAdmin : masque de saisie « Foreign key contraints » avec des valeurs exemple
Sous « Foreign key cons­traint (INNODB) «, vous dé­fi­nis­sez à quelles clés primaires les clés étran­gères font référence
Image: phpMyAdmin : masque de saisie « Foreign key contraints » avec des valeurs exemple
Sous « Foreign key cons­traint (INNODB) «, vous dé­fi­nis­sez à quelles clés primaires les clés étran­gères font référence
Close

Nous sé­lec­tion­nons par con­sé­quent le menu déroulant sous « Column » la colonne interpret_id en tant que clé étrangère. Notez que seules les colonnes qui ont été marquées comme INDEX, UNIQUE ou PRIMARY sont ré­per­to­riées. Dans le champ de saisie en trois partie « Foreign key cons­traint (InnoDB) », nous choi­sis­sons quelle clé primaire de quel tableau repose sur quelle base de données de notre clé étrangère. Nous avons fait les choix suivants :

Base de données : test

Tableau : interpret

Clé primaire : interpret_id

Le champ « Cons­traint name » peut rester vide. Le système de gestion de base de données attribue au­to­ma­ti­que­ment un nom à cet endroit. Vous devez cependant définir, comment un tableau avec une clé étrangère se comporte lorsque la clé étrangère sous-jacente à la clé primaire est modifiée ou supprimée.

Si un artiste par exemple est supprimé du tableau-parent Interpret, la clé primaire également associée disparait. Il s’agit ainsi de clarifier ce qu’il peut se produire avec les entrées qui se rap­por­tent à cette entrée via clé étrangère : les albums d’un artiste, dans notre exemple.

Pour dé­ter­mi­ner le com­por­te­ment d’un tableau avec une clé étrangère en cas d’un UPDATE ou DELETE, quatre options sont à votre dis­po­si­tion sur MySQL ou MariaDB.

  • RESTRICT: l’option RESTRICT comprend un chan­ge­ment dans le tableau-parent, dans la mesure où d’autres tableaux existants y font référence. Dans notre cas, un paquet de données dans le tableau interpret ne peut être supprimé, car les paquets de données du tableau album y sont reliés.
  • CASCADE : l’option CASCADE assure qu’un chan­ge­ment de tableau-parent sera transmis dans tous les autres tableaux se référant à ce tableau-parent. Si nous déplaçons par exemple l’interpret_id de The Rolling Stones de 2 à 8, ce chan­ge­ment se reflète dans l’option Foreign-Key CASCADE, ainsi que dans tous les tableaux qui utilisent interpret_id comme clé étrangère. Si une entrée dans un tableau-parent est supprimée, cela signifie que tous les paquets de données reliés à cette entrée dans d’autres tableaux seront supprimés. Attention : de cette façon, la sup­pres­sion d’une seule entrée peut entraîner la dis­pa­ri­tion de nombreux paquets de données.
  • SET NULL : sé­lec­tion­nez l’option SET NULL pour que la valeur dans la colonne de clé étrangère soit placée sur NULL, dès que la clé primaire est modifiée ou supprimée dans le tableau-parent.
  • NO ACTION : l’option MySQL NO ACTION est équi­va­lente à l’option RESTRICT.

Si vous avez défini l’option souhaitée pour la relation de clé étrangère, vous pouvez confirmer la saisie en cliquant sur « en­re­gis­trer ». Le système de gestion de base de données attribue au­to­ma­ti­que­ment un nom pour la relation nou­vel­le­ment créée.

Image: phpMyAdmin : relation de clé étrangère définie
Toutes les relations de clés étran­gères définies sont ré­per­to­riées sous « Foreign key cons­traints » dans l’onglet « Structure »
Image: phpMyAdmin : relation de clé étrangère définie
Toutes les relations de clés étran­gères définies sont ré­per­to­riées sous « Foreign key cons­traints » dans l’onglet « Structure »
Close

Types de JOIN-Typen dans MySQL et MariaDB

Les relations de clés étran­gères vous per­met­tent des données de dif­fé­rents tableaux si­mul­ta­né­ment, et ce seulement à l’aide d’une ins­truc­tion SQL. Vous avez pour cela quatre types de JOIN à dis­po­si­tion sur MySQL et MariaDB :

  • INNER JOIN : avec un INNER JOIN, le système de gestion de base de données cherche des entrées communes dans les tableaux joints par JOIN. Seuls les paquets de données com­por­tant des matchs, disons, dans lesquels les valeurs cor­res­pon­dent aux colonnes de liaison (clé primaire et clé étrangère) dans les deux tableaux.
  • OUTER JOIN : avec un OUTER JOIN, on dif­fé­ren­cie des tableaux de gauche ainsi que des tableaux de droite. A la dif­fé­rence d’un INNER JOIN, non seulement les paquets de données com­por­tant des si­mi­li­tudes dans les deux tableaux sont entrés, mais aussi tous les paquets de données restants du tableau de droite ou de gauche.
  • LEFT JOIN : tous les paquets de données du tableau de gauche sont entrés ainsi que tous les paquets de données du tableau de droite dans lesquels se trouvent des con­cor­dances.
  • RIGHT JOIN : tous les paquets de données du tableau de droite sont entrés ainsi que tous les paquets de données du tableau de gauche dans lesquels se trouvent des con­cor­dances.

Nous nous li­mi­te­rons à INNER JOIN dans le cadre de notre tutoriel MySQL pour débutants.

La syntaxe d’un INNER JOIN suit le schéma de base suivant :

SELECT * FROM tableau1 INNER JOIN tableau2 ON tableau1.cléétrangère = tableau2.cléprimaire WHERE colonne = valeur

La commande SQL SELECT, en com­bi­nai­son avec le bouton *, indique au système de gestion de base de données de sé­lec­tion­ner les valeurs de toutes les colonnes pour les­quelles les con­di­tions ON et WHERE sont en vigueur.

Etant donné qu’il s’agit d’un INNER JOIN, seuls les paquets de données qui pré­sen­tent des con­cor­dances entre la clé étrangère du tableau1 et la clé primaire du tableau2 sont extraits de la base de données. On peut par ailleurs définir une fonction fa­cul­ta­tive de filtre à l’aide de la clause WHERE.

Nous il­lus­trons ceci avec un exemple faisant référence à nos tableaux nor­ma­li­sés album, interpret et title :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT * FROM album INNER JOIN interpret ON album.interpret_id = interpret.interpret_id"; foreach ($pdo->query($sql) as $row) { echo $row['album_title'] . " was released by " . $row['interpret'] . " in " . $row['released'] . ".<br /><br />"; } ?>

Le script exemple montre un INNER JOIN dans lequel le tableau album est relié au tableau interpret. Nous lisons seulement les paquets de données avec lesquels il y a des con­cor­dances entre clé primaire et clé étrangère.

album.interpret_id = interpret.interpret_id

Dans notre tableau de données, choisir entre LEFT et RIGHT JOIN n’en­traî­ne­rait pas de dif­fé­rence. Nous entrons alors les valeurs lues à l’aide d’une boucle foreach et la cons­truc­tion de langue echo dans le na­vi­ga­teur.

Image: Exemple de code INNER JOIN
L’exemple de script nous donne tous les albums stockés dans la base de données, incluant les artistes et l’année de la première pu­bli­ca­tion
Image: Exemple de code INNER JOIN
L’exemple de script nous donne tous les albums stockés dans la base de données, incluant les artistes et l’année de la première pu­bli­ca­tion
Close

Dans le cadre d’une ins­truc­tion SQL, nous avons ainsi sé­lec­tionné l’in­di­ca­tion de l’artiste du tableau interpret et les données des titres des albums ainsi que la date de première pu­bli­ca­tion du tableau album.

La condition dans la clause WHERE permet de dé­ter­mi­ner quels paquets de données dis­tri­buer. Si nous voulons nous limiter aux albums publiés en 1968 seulement, nous pouvons utiliser le script suivant :

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT * FROM album INNER JOIN interpret ON album.interpret_id = interpret.interpret_id WHERE released = 1968"; foreach ($pdo->query($sql) as $row) { echo $row['album_title'] . " was released by " . $row['interpret'] . " in " . $row['released'] . ".<br /><br />"; } ?>

La condition WHERE released = 1968 limite les sorties à un album dans le na­vi­ga­teur. Beggars Banquet des Rolling Stones est le seul album de notre base de données qui a été publié en 1968.

Image: Exemple de code : INNER JOIN avec condition
Avec la condition dans la clause WHERE, nous limitons la dis­tri­bu­tion à un paquet de données
Image: Exemple de code : INNER JOIN avec condition
Avec la condition dans la clause WHERE, nous limitons la dis­tri­bu­tion à un paquet de données
Close

A l’aide de la commande JOIN, vous pouvez fusionner un certain nombre de tableaux en une jonction de données. Dans l’exemple suivant, nous relions le tableau album avec le tableau interpret et title via INNER JOIN afin de délivrer l’ensemble des in­for­ma­tions sur les données stockées dans les bases de données de chansons.

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT * FROM album INNER JOIN interpret ON album.interpret_id = interpret.interpret_id INNER JOIN title ON album.album_id = title.album_id"; foreach ($pdo->query($sql) as $row) { echo $row['title'] . " was released by " . $row['interpret'] . " as Track " . $row['track'] . " on " . $row['album_title'] . " in " . $row['released'] . ".<br /><br />"; } ?>
Image: INNER JOIN de trois tableauxGraskoShut­ters­tock
Reliez des tableaux de données selon vos souhaits avec la commande SQL JOIN
Image: INNER JOIN de trois tableaux
Reliez des tableaux de données selon vos souhaits avec la commande SQL JOIN
Close

Les clauses WHERE peuvent ici aussi être définies selon le besoin avec une fonction de filtre : si nous sou­hai­tons uni­que­ment récolter seulement les in­for­ma­tions de la 7ème piste sur l’album « Abbey Road » par exemple.

<?php $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); $sql = "SELECT * FROM album INNER JOIN interpret ON album.interpret_id = interpret.interpret_id INNER JOIN title ON album.album_id = title.album_id WHERE track = 7 AND album_title = 'Abbey Road'"; foreach ($pdo->query($sql) as $row) { echo $row['title'] . " was released by " . $row['interpret'] . " as Track " . $row['track'] . " on " . $row['album_title'] . " in " . $row['released'] . ".<br /><br />"; } ?>
Image: INNER JOIN de trois tableaux avec condition
INNER JOIN avec deux con­di­tions ana­lo­giques AND
Image: INNER JOIN de trois tableaux avec condition
INNER JOIN avec deux con­di­tions ana­lo­giques AND
Close

Notez que nous devons effectuer ceci avec une clé primaire en plusieurs parties sur le tableau title. Si nous voulons faire référence à un titre par­ti­cu­lier, nous avons besoins, en dehors du numéro de piste, de l’album_id, qui est stocké avec le titre de l’album dans le tableau album.

De débutant à pro­fes­sion­nel

Notre tutoriel MySQL pour débutants doit être considéré comme un cours intensif vous per­met­tant d’apprendre les bases relatives aux systèmes de gestion de bases de données SQL grâce à des exemples concrets et pratiques d’opé­ra­tions de bases de données. Si vous portez un intérêt pour les sujets illustrés dans cet article, nous vous re­com­man­dons la lecture de la do­cu­men­ta­tion DBMS de MySQL et MariaDB men­tion­née plus haut. Vous trouverez par ailleurs de nombreux sites Internet qui offrent des tutoriels et des exemples sur des systèmes de gestion de bases de données po­pu­laires. La pla­te­forme Stack Overflow est par ailleurs re­com­man­dée, comporte une com­mu­nauté d’uti­li­sa­teurs de plus de 6,5 millions de dé­ve­lop­peurs et traite les questions et les problèmes actuels de pro­grammes de dé­ve­lop­pe­ment. Vous trouverez bien sûr aussi de nombreux articles sur d’autres bases de données dis­po­nibles : vous les trouverez via les balises ci-dessous.

Tags associés
  • MySQL
  • SQL
Aller au menu principal

Produits associés

Image: cloud-server.svg Serveurs Cloud Voir les packs Image: ION_FR_VPS_Fallback_1200x1200.pngImage: ION_FR_VPS_Fallback_1200x1200.png

Tout savoir sur l’IA

Inscrivez-vous à notre news­let­ter pour découvrir les dernières tendances de l’IA et recevoir des conseils pratiques.

Je m’inscris

Tout savoir sur l’IA

Close

Inscrivez-vous à notre news­let­ter pour découvrir les dernières tendances de l’IA et recevoir des conseils pratiques.

Articles Po­pu­laires

Revente de nom de domaine : comment gagner de l’argent avec les noms de domaines ?

Acheter et vendre des noms de domaines peut être lucratif, à condition toutefois de savoir…

Lire la suite
5 al­ter­na­tives à Nextcloud en com­pa­rai­son directe

À la recherche d’une al­ter­na­tive à Nextcloud per­for­mante ? Découvrez les meil­leures…

Lire la suite
Com­pa­rai­son des 7 meilleurs services de sau­ve­garde en ligne

Sau­ve­gar­dez vos données de manière fiable dans le Cloud ! Vos données sont en sécurité…

Lire la suite
Debian 13 Upgrade : comment mettre à niveau vers Debian 13 étape par étape ?

Ce guide vous aide à mettre à niveau Debian 13 en toute sécurité, à préparer votre système…

Lire la suite
4 al­ter­na­tives gratuites à Adobe InDesign

La pu­bli­ca­tion assistée par or­di­na­teur (PAO) avec Adobe est trop chère ? Il existe des…

Lire la suite

Articles si­mi­laires

Image: Tutoriel CSS : introduction aux feuilles de style en cascadeKaspars GrinvaldsShut­ters­tock

Tutoriel CSS : in­tro­duc­tion aux feuilles de style en cascade

Sans le CSS, les pages Web ne cons­ti­tue­raient qu’un ensemble d’éléments de texte divisés grosso modo en sections par titres et pa­ra­graphes. Seule la pos­si­bi­lité de formater HTML via des feuilles de style en cascade fait du World Wide Web ce qu’il est aujourd’hui : un mélange…

  • CSS
  • Tutoriels
Lire la suite Image: Apprendre le HTML : faire ses premiers pas avec ce langage Web standardRawpixel.comShut­ters­tock

Apprendre le HTML : faire ses premiers pas avec ce langage Web standard

Avec la mul­ti­pli­ca­tion des systèmes de gestion de contenu et systèmes mo­du­laires pour sites Web, on a vite l'im­pres­sion qu’apprendre du HTML est une perte de temps. Mais tôt ou tard, si une page de votre site ne fonc­tionne plus ou si des éléments dy­na­miques doivent être ajoutés,…

  • HTML
  • CSS
  • Ja­vaS­cript
  • Tutoriels
Lire la suite Image: Qu’est-ce que MongoDB ?Andrey VPshut­ters­tock

Qu’est-ce que MongoDB ?

Les bases de données NoSQL sont devenues depuis longtemps une al­ter­na­tive populaire aux bases de données re­la­tion­nelles clas­siques comme MySQL. La structure de mé­mo­ri­sa­tion non flexible des modèles tra­di­tion­nels y est adaptable et permet leur sé­cu­ri­sa­tion. Ainsi, la base de…

  • Base de Données
  • SQL
  • MongoDB
Lire la suite Image: MariaDB vs MySQLkentohShut­ters­tock

MariaDB vs MySQL

MySQL est l’un des systèmes de gestion de bases de données les plus utilisés au monde. Le logiciel est considéré par de nombreux uti­li­sa­teurs comme la solution standard pour les bases de données re­la­tion­nelles. Mais MariaDB constitue une al­ter­na­tive de plus en plus sé­dui­sante à…

  • Base de Données
  • MySQL
  • SQL
  • MariaDB
  • Com­pa­ra­tif
Lire la suite

Tag » Apprendre Mysql - Créer Une Base De Données