PHP et les bases de données

Une des premières raisons d'être des langages serveur est de faire le lien entre le serveur et les base de données, ce chapitre est une introduction à ce monde.

Auteur :
Jonathan Marco
Difficulté :
Initiation au rêve (débutant)

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.

Si vous n'êtes pas à l'aise avec les BdD, vous pouvez lire ce chapitre

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).

Pour plus d'infos sur la POO, un cours sortira prochainement pour compléter cette introduction.

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');
  • mysql permet d'indiquer le SGBD qu'on souhaite utiliser. On peut indiquer pgsql pour PostgreSQL, sqlite pour SQLite... Mais pourquoi indique-t-on ic mysql alors 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.
  • testdb est le nom de la BdD à laquelle on se connecte.
  • 127.0.0.1 est l'IP du serveur où est installé le SGBD. 127.0.0.1 équivaut à localhost ce qui veut dire que le SGBD est installé sur l'ordinateur sur lequel vous êtes en train de travailler.
  • johnDoe est le nom d'utilisateur pour se connecter au SGBD s'il est sécurisé avec un système d'authentification.
  • 12345678 est 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 TABLE demande la création de la table.
  • IF NOT EXISTS permet 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.
  • users est 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.
  • id est un identifiant. On n'a pas listé cette colonne plus haut, quand on décrivait la table. C'est parce que l'id n'est pas directement un élément nécessaire au user. 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'id est 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.
  • INTEGER indique que cette colonne va stocker un nombre entier.
  • PRIMARY KEY est 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_INCREMENT indique à 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éro 1, puis le deuxième le 2, le troisième le 3 et ainsi de suite. Pas besoin de savoir où vous en êtes, votre SGBD s'occupe de tout pour vous.
  • email est 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érencie CHAR de VARCHAR par le fait qu'un CHAR(10) aura toujours 10 caractères, ni plus, ni moins. Un VARCHAR(100) sera donc une chaîne de caractères de 0 à 100 caractères.
  • NOT NULL indique que la colonne ne peut pas être vide. N.B. : quand la colonne est indiquée comme étant PRIMARY KEY, le NOT NULL est sous-entendu.
  • UNIQUE est 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 un username, 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_ASSOC permet de modifier le mode de fetch, autre méthode qui permet de récupérer des items dans la BdD, dont on parlera dans un autre chapitre.
  • PDO::ERRMODE_EXCEPTION permet 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.
Vous aurez remarqué la syntaxe : 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.
Pour rappel => class = mode d'emploi pour la construction, object = élément construit avec ce mode d'emploi
  • Cours
  • Tutoriels
  • Aide
  • À Propos