Base de données
Une base de données, ou BdD, est un service qu'on utilise côté serveur pour stocker des informations afin de les utiliser par la suite. Exemple : les utilisateurs, une liste d'articles, des messages envoyés via un formulaire... Le service qu'on utilise pour gérer la base de données s'appelle un Système de Gestion de Base de Données ou SGBD.
PDO
PDO est une classe PHP. En informatique, une classe est un concept lié à la Programmation Orientée Objet ou POO. La classe est une boîte noire, qui rend disponible un certain nombre d'attributs (équivalent d'une variable) et de méthodes (équivalent d'une fonction).
PDO va fournir tout un ensemble d'outils pour gérer vos BdD : s'y connecter, créer/lire/modifier/supprimer des éléments stockés dedans...
Pour communiquer avec votre SGBD, d'autres classes sont disponibles en PHP comme mysqli, SQLite3... Le souci avec ces dernières, c'est que chacune est spécifique à un SGBD et uniquement pour celui-ci. PDO est, quant à lui, agnostique du SGBD, ce qui veut dire qu'il peut être utilisé avec l'ensemble d'entre eux ! C'est pourquoi on va l'utiliser dans ce cours.
Créer une table
Une table est comme une feuille d'un tableur tel Excel. Elle va avoir un ensemble de colonnes représentant les champs qui stockeront les données et des lignes qui seront les différentes occurrences stockées.
Exemple : on souhaite stocker des utilisateurs dans notre BdD. On va donc créer une table users qui va avoir, par exemple, les colonnes : email, firstName, lastName et password. À chaque fois qu'un nouvel utilisateur va créer un compte sur notre site, une nouvelle ligne sera ajoutée dans notre table, comme on le ferait dans le tableur cité en exemple ci-dessus.
C'est parti ! Utilisons PHP et PDO pour créer cette table users, mais, avant ça, on doit se connecter à notre SGBD.
Connexion
$pdo = new PDO();Quand on utilise des classes en POO, on doit instancier ces dernières pour qu'elles deviennent des objets. Pour ce faire, en PHP, comme dans de nombreux langages qui implémentent la POO, on va utiliser le mot-clé new. Entre parenthèses, on doit mettre les informations qu'on passera au constructeur de la classe pour créer notre objet. PDO demande les informations de connexion dans le constructeur. Si l'on devait se connecter à un SGBD de type MariaDB, en reprenant notre code ci-dessus, cela donnerait :
$pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'johnDoe', '12345678');mysqlpermet d'indiquer le SGBD qu'on souhaite utiliser. On peut indiquerpgsqlpour PostgreSQL,sqlitepour SQLite... Mais pourquoi indique-t-on icmysqlalors qu'on souhaite se connecter àMariaDB? C'est parce que MariaDB est un fork de MySQL réalisé au moment du rachat de MySQL par Oracle. Ce donc deux SGBD très très proches.testdbest le nom de la BdD à laquelle on se connecte.127.0.0.1est l'IP du serveur où est installé le SGBD.127.0.0.1équivaut àlocalhostce qui veut dire que le SGBD est installé sur l'ordinateur sur lequel vous êtes en train de travailler.johnDoeest le nom d'utilisateur pour se connecter au SGBD s'il est sécurisé avec un système d'authentification.12345678est le password avec le même système d'authentification.
J'ai stocké la connexion dans une variable $pdo qui nous permettra d'agir sur la BdD.
Création de la table
Pour faire une requête SQL qui va demander la création de la table, on va utiliser la méthode query. Pour rappel, une méthode est une fonction stockée dans un objet.
$pdo->query();Comme vous pouvez le voir, pour faire appel à une méthode dans un objet, on utilise une flèche -> comme ceci : $monObjet->nomDeLaMethode(). La méthode query prend en paramètre la requête SQL :
$pdo->query('CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(200) NOT NULL UNIQUE,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL
)');Pour commencer on remarque que la personne qui a créer le SQL aime les majuscules 😅. Par convention, les éléments qui dépendent directement de SQL doivent être écrits en majuscules. Pour le reste, décomposons ensemble cette requête :
CREATE TABLEdemande la création de la table.IF NOT EXISTSpermet de mettre cette requête dans un fichier où l'on passe plusieurs fois. Si l'on passe une seconde fois dessus, si la table existe déjà, SQL ne tentera pas de la créer à nouveau ce qui nous évitera toute une flopée d'insultes venant de PDO et MariaDB.usersest le nom de la table. Comme on le soulignait au-dessus, le nom de la table ne fait pas partie des éléments strictement SQL, il n'est donc pas écrit en majuscules.- Les parenthèses permettent de mettre à l'intérieur les éléments qui décriront la table. Chaque ligne ensuite correspond à une colonne différente.
idest un identifiant. On n'a pas listé cette colonne plus haut, quand on décrivait la table. C'est parce que l'idn'est pas directement un élément nécessaire auuser. Il est cependant nécessaire pour SQL. En effet, rappelez-vous, je disais que la force de SQL, c'était sa capacité à lier les tables entre elles. L'idest justement cet élément qui va permettre de lier les tables entre elles, en étant un élément unique discriminant, qui pourra nous permettre de différencier n'importe quel utilisateur d'un autre.INTEGERindique que cette colonne va stocker un nombre entier.PRIMARY KEYest justement ce qui dit à SQL que cette colonne servira à différencier les utilisateurs les uns des autres. En effet, une clé primaire est l'élément d'identification d'un item SQL.AUTO_INCREMENTindique à votre SGBD qu'il va se débrouiller pour gérer cette colonne. En effet, c'est MariaDB qui va s'occuper d'incrémenter automatiquement cette colonne. Le premier utilisateur qui va s'inscrire sur votre site aura le numéro1, puis le deuxième le2, le troisième le3et ainsi de suite. Pas besoin de savoir où vous en êtes, votre SGBD s'occupe de tout pour vous.emailest le nom de la colonne pour l'adresse mail.VARCHAR(200)indique que la colonne va stocker une chaîne de caractères variable. On différencieCHARdeVARCHARpar le fait qu'unCHAR(10)aura toujours 10 caractères, ni plus, ni moins. UnVARCHAR(100)sera donc une chaîne de caractères de 0 à 100 caractères.NOT NULLindique que la colonne ne peut pas être vide. N.B. : quand la colonne est indiquée comme étantPRIMARY KEY, leNOT NULLest sous-entendu.UNIQUEest une option qui permet de lever une erreur si on essaie d'entrer une nouvelle valeur qui existe déjà. Très utile pour les adresses emails afin éviter qu'un utilisateur qui est déjà inscrit essaie de se réinscrire à nouveau avec le même email (idem pour unusername, car l'un ou l'autre est souvent utilisé dans le cadre d'une authentification).
... rien de nouveau sur le reste.
Paramétrage
Pour bien utiliser PDO, je vous conseille d'utiliser les deux lignes suivantes, que l'on ajoute directement après l'instanciation de PDO, comme ceci :
$pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'johnDoe', '12345678');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);On utilise donc la méthode setAttribute dans l'objet PDO avec la synthaxe avec ->. Cette fonction permet de modifier le paramétrage de PDO.
PDO::FETCH_ASSOCpermet de modifier le mode defetch, autre méthode qui permet de récupérer des items dans la BdD, dont on parlera dans un autre chapitre.PDO::ERRMODE_EXCEPTIONpermet de modifier le paramétrage pour la gestion d'erreur. Il est à noter que, par défaut, PDO ne renvoie que les errors, donc pas les warnings et les exceptions, ce qui fait que, pour débugger le code, c'est compliqué car toutes les informations ne sont pas remontées. On modifie donc ce paramétrage pour tout renvoyer et ainsi mieux trouver d'éventuelles erreurs. Par contre, quand on met l'application en production, on enlève cette ligne pour éviter de parasiter les retours que pourrait avoir l'utilisateur de notre site.
PDO::FETCH_ASSOC. Elle permet de récupérer une constante contenue dans une classe. Les deux doubles points permettent de faire appel à quelque chose au sein d'une classe là où la flèche permet de récupérer quelque chose dans un objet.