Connecter PHP à une base de données

La base de données

Une BDD, c'est quoi et à quoi ça sert ?

On utilise des bases de données dès que l'on va devoir stocker des données à long terme (liste d'utilisateurs, articles, produits, etc.).

Une base de données est un logiciel capable de stocker des données et d'effectuer des traitements dessus.

Choisir son type de base

On trouve notamment :

- Les bases hiérarchiques

- Les bases clefs valeurs

- Les bases sémentiques

- Les bases relationnels

- Les bases objets

- Les bases graph

- ...

Il existe plusieurs types de bases de données.

Au quotidien, on rencontrera principalement deux familles de bases, les SQL et les NoSQL.

Les bases SQL, utilisent le Structured Query Language et son relationnelles.

Les bases NoSQL, utilisent d'autres langages et sont le plus souvent objet.

Pour 90% de nos usages, les bases SQL sont plus adaptées.

Choisir sa base SQL

Au sein des bases SQL, on retrouve plusieurs bases différentes.

Les principales : Oracle SQL, MySQL, MariaDB, PostgreSQL, SQL Server.

On rejettera systématiquement Oracle SQL et SQL Server, propriétaire et payants.

On rejettera aussi MySQL, développé par Oracle et à l'avenir incertain.

Ne restent que MariaDB et PostgreSQL. Pour des raisons pratiques, on choisira MariaDB.

Installer MariaDB

Installer Mariadb

Dans un premier temps, nous allons installer MariaDB.

Pour cela, on commence par mettre à jour la liste des paquets.

sudo apt update -y
sudo apt install -y mariadb-server

Une fois la liste à jour, on va installer mariadb.

Configurer MariaDB

Une fois installé, par défaut MariaDB créé un compte pourris sans mot de passe, etc.

On va donc commencer par configurer MariaDB de façon interactive avec la commande suivante :

sudo mysql_secure_installation
Enter current password for root (enter for none): <-- Faites ENTREE, vu qu'il n'y en a pas
Set root password? [Y/n] <-- y
New password: <-- Saisissez le mot de passe
Re-enter new password: <-- Retapez le mot de passe
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y

Les réponses à donner :

Après l'installation, le compte Root MySQL, même s'il a un mot de passe n'est utilisable que depuis un compte linux root.

Pour modifier ça, on va se connecter à MySQL avec la commande suivante et en rentrant le mot de passe :

sudo mysql -u root -p

Une fois connecté à MySQL, on lance les deux commandes suivantes et on quitte :

update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;

Installer PHP-MySQL

Une fois MariaDB en place, on va devoir installer le driver MySQL pour PHP.

sudo apt update -y
sudo apt install -y php-mysql
sudo systemctl restart apache2

Une fois le driver installé, on re-démarre Apache.

Utiliser MariaDB avec PHP

PDO, faire des requêtes sécurisées

Depuis PHP 7, pour se connecter à une base de données SQL on utilise PDO, pour PHP Data Object.

PDO est un moyen d’interagir avec une base de données, et notamment de protéger les requêtes.

À noter, PDO ne modifie pas les requêtes SQL, ne permet pas d'en simplifier l'écriture, etc. Ce n'est pas un ORM.

Se connecter à la base de données

Pour pouvoir faire de requêtes sur la base de données, nous allons devoir commencer par nous identifier.

Pour cela, on va créer un objet PDO en lui passant les infos de connexion.

$dsn : permet de définir le chemin de la base

$username : le nom de l'utilisateur mysql

$passwd : le mot de passe de l'utilisateur mysql

$options : options particulières de PDO

Exemple de connexion via PDO

<?php
    $database_host = 'localhost';
    $database_port = '3306';
    $database_dbname = 'test';
    $database_user = 'root';
    $database_password = 'root';
    $database_charset = 'UTF8';
    $database_options = [
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ];

    $pdo = new PDO(
        'mysql:host=' . $database_host . 
        ';port=' . $database_port . 
        ';dbname=' . $database_dbname . 
        ';charset=' . $database_charset, 
        $database_user,
        $database_password,
        $database_options
    );

Écrire et executer une requête

Une fois que nous sommes connectés à la base de données, nous allons chercher à exécuter des requêtes SQL.

Pour faire une requête avec PDO, l'opération est découpée en 3 étapes :

- Préparation de la requête (on écrit le SQL).

- Passage des données et exécution (on fournis les données, et on joue la requête).

- Récupération des résultats.

Préparer une requête.

Pour faire une requête, la première chose à faire est d'écrire la requête SQL.

Pour cela, on utilise la méthode prepare.

<?php
    $query = $pdo->prepare('SELECT id, name FROM user');

Par exemple, pour une requête cherchant à récupérer une liste d'utilisateur (id et name) depuis la table user.

Écrire et executer une requête

Exécuter une requête.

Une fois la requête préparée, on va devoir l'envoyer au SGBD.

Pour cela, on utilise la méthode execute.

<?php
    $query->execute();

Si on reprend à la suite de requête précédente, cela donne :

Écrire et executer une requête

Récupérer les données.

Une fois la requête exécutée, il ne nous reste plus qu'à récupérer les résultats.

Pour cela, on peut les récupérer un par un, avec fetch.

<?php
    while ($user = $query->fetch())
    {
        echo 'User name : ' . $user['name'] . "\n";
    }

Ou tous d'un coup, avec fetchAll.

<?php
    $users = $query->fetchAll();
    foreach ($users as $user)
    {
        echo 'User name : ' . $user['name'] . "\n";
    }

Note : Je conseil de toujours utiliser fetchAll (sauf si on veut 1 seul résultat).

Utiliser des données dans les requêtes

Écrire une requête c'est bien, mais il faut pouvoir utiliser des données dynamiques issues de l'utilisateur.

Avec PDO, on insert pas directement les données dans la requête, mais on utilise des "flag", qui seront remplacés DE FAÇON SÉCURISÉE par les données au moment de l’exécution.

Les flags s'écrivent sous la forme :nom_du_flag

Les données sont transmises dans la méthode execute sous forme d'un tableau au format 'nom_du_flag' => valeure

Imaginons une requête qui insert une adresse dans la table ci-dessous.

<?php
    $city = 'Bordeaux';
    $query = 'INSERT INTO adress (city) VALUES (:city)';
    $datas = [
        'city' => $city,
    ];


    $query = $pdo->prepare($query);
    $query->execute($datas);

Pour insérer la ville de Bordeaux, on pourra faire :

À savoir !

Par défaut, les paramètres passés via execute sont considérés comme des strings et des guillemets seront ajoutés autour.

99% du temps, c'est parfait. Mais pour l'instruction SQL LIMIT, vous aurez besoin d'un VRAI int.

Pour cela, vous devrez utilisez la méthode bindParam.

<?php
    $limit = 10;
    $query = $pdo->prepare('SELECT * FROM user LIMIT :limit');
    $query->bindParam(':limit', $limit, PDO::PARAM_INT);

    $query->execute();

Utiliser une BDD avec PHP

By plebweb

Utiliser une BDD avec PHP

  • 1,483