BRE03

PDO : la base de données côté PHP

Les contenus du cours BRE03 Web Dev Course © 2024 par Mari Doucet sont sous licence CC BY-NC-SA 4.0

Qu’est-ce que PDO ?

PDO c’est une librairie, intégrée à PHP qui permet d’interagir avec la base de données.

Se connecter à la base de données

Pour pouvoir manipuler une base de données, vous allez devoir vous y connecter :

$host = "db.3wa.io";
$port = "3306";
$dbname = "prenomnom_phpj5";
$connexionString = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8";

$user = "votre_username";
$password = "votre_password";

$db = new PDO(
    $connexionString,
    $user,
    $password
);

Pour rappel, vous trouverez vos identifiants de base de données sur la page d’accueil du PHPMyAdmin fourni par la 3WA :

phpmyadmin identifiants

Lire dans la base de données avec SELECT

analyse d’un code d’exemple

$query = $db->prepare('SELECT * FROM users WHERE id = :id');
$parameters = [
    'id' => $_GET['id']
];
$query->execute($parameters);
$query = $db->prepare('SELECT * FROM users WHERE id = :id');

Je prépare ma requête et lui indique si elle va devoir attendre des paramètres (avec :nom_du_parametre).

$parameters = [
    'id' => $_GET['id']
];

Je prépare les paramètres de ma requête s’il y en a.

$query->execute($parameters);

J’exécute ma requête en lui passant les paramètres.

fetch

Si vous n’avez qu’une seule entrée à récupérer, utilisez fetch.

id first_name last_name
1 Steve Rogers
2 Clark Kent
$query = $db->prepare('SELECT * FROM users WHERE id = :id');
$parameters = [
    'id' => $_GET['id']
];
$query->execute($parameters);
$user = $query->fetch(PDO::FETCH_ASSOC);

Si $_GET['id'] vaut 2, le résultat sera :

[
    'id' => 2,
    'first_name' => 'Clark',
    'last_name' => 'Kent'
];

fetchAll

Si vous en avez plusieurs, utilisez fetchAll.

id first_name last_name
1 Steve Rogers
2 Clark Kent
$query = $db->prepare('SELECT * FROM users');
$query->execute();
$users = $query->fetchAll(PDO::FETCH_ASSOC);

Le résultat serait :

[
    [
        'id' => 1,
        'first_name' => 'Steve',
        'last_name' => 'Rogers'
    ],
    [
        'id' => 2,
        'first_name' => 'Clark',
        'last_name' => 'Kent'
    ]
];

Se protéger des injections

N’utilisez jamais directement quelque chose transmis par un utilisateur. Jamais. C’est une énorme faille de sécurité, probablement l’une des pires.

⛔️ Vraiment ne faites jamais ça. ⛔️

'SELECT * FROM users WHERE id = ' . $_GET['id']

⛔️ “Never ever ever !” (Taylor Swift) ⛔️

On utilise donc les paramètres et la préparation de requête. En faisant ça, PDO va se charger de nettoyer les données de ce qui pourrait y être nuisible.

Vous avez un exemple dans la démonstration de fetch, mais je le remets au cas où c’est important :

if (isset($_GET['id'])) {
    // je mets un placeholder dans la requête avec :
    $query = $db->prepare('SELECT * FROM users WHERE id = :id');

    // je prépare ma requête avec les paramètres
    $parameters = [
        'id' => $_GET['id']
    ];

    // PDO va cleaner les paramètres puis exécuter la requête
    $query->execute($parameters);
	
    $user = $query->fetch(PDO::FETCH_ASSOC);
}

Écrire dans la base de données avec INSERT

Le principe sera le même pour utiliser INSERT, mais dans ce cas-là, pas besoin de fetch, simplement de récupérer l’id de notre nouvelle entrée dans la base :

$query = $db->prepare("INSERT INTO user (id, first_name, last_name) VALUES (NULL, :firstname, :lastname)");

$parameters = [
    'firstname' => $_POST['firstname'],
    'lastname' => $_POST['lastname']
];

$query->execute($parameters);

$id = $db->lastInsertId();

Modifier dans la base de données avec UPDATE

$query = $db->prepare("UPDATE user SET firstname = :firstname, lastname = :lastname WHERE id = :id");

$parameters = [
    'id' => $_POST['id'],
    'firstname' => $_POST['firstname'],
    'lastname' => $_POST['lastname']
];

$query->execute($parameters);

Supprimer dans la base de données avec DELETE

$query = $db->prepare("DELETE FROM user WHERE id = :id");
$parameters = [
    'id' => $_POST['id']
];
$query->execute($parameters);

Exercice pratique

Consignes de l’exercice