Simplification

Pour simplifier la gestion des futures tables, nous allons créer des fonctions correspondant aux différentes requêtes SQL utilisées.

Ces fonctions seront ajoutées dans un fichier model.php.

1
<?php
2
3
$db = require 'bdd.php';
4
/**
5
 * L’instruction global $db permet d’accéder à la variable $db
6
 * définie dans le fichier bdd.php.
7
 * 
8
 * Cette pratique n’est pas recommandée dans un projet en production,
9
 * car elle crée une dépendance globale.
10
 * 
11
 * Nous l’utilisons ici pour simplifier le code.
12
 * Elle sera supprimée lorsque nous aborderons la programmation orientée objet.
13
 */
14
15
/**
16
 * Récupérer avec une clause personnalisée
17
 * 
18
 * Exemple :
19
 * $admins = where(
20
 *     'utilisateurs',
21
 *     ['email' => 'test@example.com', 'role' => 'admin']
22
 * );
23
 */
24
function where(string $table, array $conditions = []): array
25
{
26
    global $db;
27
28
    $sql = "SELECT * FROM $table";
29
30
    if ($conditions) {
31
        $clauses = array_map(
32
            fn($column) => "$column = :$column",
33
            array_keys($conditions)
34
        );
35
36
        $sql .= ' WHERE ' . implode(' AND ', $clauses);
37
    }
38
39
    $stmt = $db->prepare($sql);
40
    $stmt->execute($conditions);
41
42
    return $stmt->fetchAll(\PDO::FETCH_ASSOC);
43
}
44
45
/**
46
 * Récupérer toutes les lignes d'une table
47
 * 
48
 * Exemple :
49
 * $utilisateurs = all('utilisateurs');
50
 * foreach ($utilisateurs as $u) {
51
 *     echo $u['nom'] . ' ' . $u['prenom'] . "\n";
52
 * }
53
 */
54
function all(string $table): array
55
{
56
    return where($table);
57
}
58
59
/**
60
 * Récupérer une ligne par ID
61
 * 
62
 * Exemple :
63
 * $utilisateur = find('utilisateurs', 3);
64
 * echo $utilisateur['nom'] ?? 'Non trouvé';
65
 */
66
function find(string $table, int $id): ?array
67
{
68
    return where($table, ['id' => $id])[0] ?? null;
69
}
70
71
/**
72
 * Insérer une ligne
73
 * 
74
 * Exemple :
75
 * $id = create('utilisateurs', ['nom' => 'Dupont', 'prenom' => 'Jean', 'email' => 'jean.dupont@example.com', 'role' => 'user']);
76
 * echo "Nouvel utilisateur créé avec l'id $id";
77
 */
78
function create(string $table, array $datas): int
79
{
80
    global $db;
81
82
    $cols = implode(', ', array_keys($datas));
83
    $values = ':' . implode(', :', array_keys($datas));
84
85
    $stmt = $db->prepare("INSERT INTO `$table` ($cols) VALUES ($values)");
86
    $stmt->execute($datas);
87
88
    return (int) $db->lastInsertId();
89
}
90
91
/**
92
 * Mettre à jour une ligne par ID
93
 * 
94
 * Exemple :
95
 * $success = update('utilisateurs', ['id' => 3, 'nom' => 'Durand', 'prenom' => 'Paul', 'role' => 'admin']);
96
 * echo $success ? "Mise à jour OK" : "Erreur";
97
 */
98
function update(string $table, array $datas): bool
99
{
100
    global $db;
101
102
    if (!isset($datas['id'])) {
103
        throw new \InvalidArgumentException('ID manquant pour la mise à jour');
104
    }
105
106
    $id = $datas['id'];
107
    unset($datas['id']);
108
109
    $set = implode(', ', array_map(fn($k) => "$k = :$k", array_keys($datas)));
110
111
    $sql = "UPDATE `$table` SET $set WHERE id = :id";
112
    $stmt = $db->prepare($sql);
113
114
    return $stmt->execute([...$datas, 'id' => $id]);
115
}
116
117
/**
118
 * Supprimer une ligne par ID
119
 * 
120
 * Exemple :
121
 * $success = delete('utilisateurs', 3);
122
 * echo $success ? "Suppression OK" : "Erreur";
123
 */
124
function delete(string $table, int $id): bool
125
{
126
    global $db;
127
128
    $sql = "DELETE FROM `$table` WHERE id = :id";
129
    $stmt = $db->prepare($sql);
130
    
131
    return $stmt->execute(['id' => $id]);
132
}
133