2
0

db.class.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. /**
  3. * Classe `db`
  4. *
  5. * Cette classe gère la connexion à la base de données et fournit des méthodes pour exécuter des requêtes SQL.
  6. *
  7. * Fonctionnalités principales :
  8. * - Gestion de la connexion à la base de données avec PDO.
  9. * - Préparation et exécution de requêtes SQL.
  10. * - Gestion des transactions.
  11. * - Récupération des résultats des requêtes.
  12. * - Gestion des erreurs SQL.
  13. *
  14. * @package Core\Class
  15. */
  16. class db
  17. {
  18. private static PDO $dbh;
  19. private static string $error = '';
  20. private static PDOStatement $stmt;
  21. /**
  22. * Établit une connexion à la base de données si elle n'existe pas déjà.
  23. *
  24. * @return void
  25. * @throws Exception En cas d'erreur de connexion.
  26. */
  27. private static function connect(): void
  28. {
  29. if (isset(self::$dbh)) {
  30. return;
  31. }
  32. $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
  33. $options = [
  34. PDO::ATTR_PERSISTENT => true,
  35. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  36. ];
  37. try {
  38. self::$dbh = new PDO($dsn, DB_USER, DB_PASS, $options);
  39. } catch (PDOException $e) {
  40. self::$error = $e->getMessage();
  41. throw new Exception("Database connection error: " . self::$error);
  42. }
  43. }
  44. /**
  45. * Récupère la version du serveur de base de données.
  46. *
  47. * @return string La version du serveur.
  48. */
  49. public static function version(): string
  50. {
  51. self::connect();
  52. return self::$dbh->getAttribute(PDO::ATTR_SERVER_VERSION);
  53. }
  54. /**
  55. * Prépare une requête SQL.
  56. *
  57. * @param string $query La requête SQL à préparer.
  58. * @return void
  59. */
  60. public static function query(string $query): void
  61. {
  62. self::connect();
  63. self::$stmt = self::$dbh->prepare($query);
  64. }
  65. /**
  66. * Lie une valeur à un paramètre dans la requête préparée.
  67. *
  68. * @param string $param Le nom du paramètre.
  69. * @param mixed $value La valeur à lier.
  70. * @param int|null $type Le type de la valeur (optionnel).
  71. * @return void
  72. */
  73. public static function bind(string $param, mixed $value = null, ?int $type = null): void
  74. {
  75. if (is_null($type)) {
  76. $type = match (true) {
  77. is_int($value) => PDO::PARAM_INT,
  78. is_bool($value) => PDO::PARAM_BOOL,
  79. is_null($value) => PDO::PARAM_NULL,
  80. default => PDO::PARAM_STR,
  81. };
  82. }
  83. self::$stmt->bindValue($param, $value, $type);
  84. }
  85. /**
  86. * Exécute la requête préparée.
  87. *
  88. * @return bool TRUE si l'exécution a réussi, FALSE sinon.
  89. */
  90. public static function execute(): bool
  91. {
  92. self::connect();
  93. if (class_exists('debug') && method_exists('debug', 'isFile') && debug::isFile("sql")) {
  94. ob_start();
  95. $result = self::$stmt->execute();
  96. self::$stmt->debugDumpParams();
  97. $debugOutput = ob_get_clean();
  98. debug::logSession($debugOutput);
  99. return $result;
  100. }
  101. return self::$stmt->execute();
  102. }
  103. /**
  104. * Récupère tous les résultats de la requête sous forme de tableau associatif.
  105. *
  106. * @return array Les résultats de la requête.
  107. */
  108. public static function resultset(): array
  109. {
  110. self::execute();
  111. return self::$stmt->fetchAll(PDO::FETCH_ASSOC);
  112. }
  113. /**
  114. * Récupère un seul résultat de la requête sous forme de tableau associatif.
  115. *
  116. * @return array|false Le résultat de la requête ou FALSE si aucun résultat.
  117. */
  118. public static function single(): array|false
  119. {
  120. self::execute();
  121. return self::$stmt->fetch(PDO::FETCH_ASSOC);
  122. }
  123. /**
  124. * Récupère le nombre de lignes affectées par la dernière requête.
  125. *
  126. * @return int Le nombre de lignes affectées.
  127. */
  128. public static function rowCount(): int
  129. {
  130. return self::$stmt->rowCount();
  131. }
  132. /**
  133. * Récupère l'ID de la dernière ligne insérée.
  134. *
  135. * @return string L'ID de la dernière ligne insérée.
  136. */
  137. public static function lastInsertId(): string
  138. {
  139. self::connect();
  140. return self::$dbh->lastInsertId();
  141. }
  142. /**
  143. * Démarre une transaction.
  144. *
  145. * @return bool TRUE si la transaction a démarré avec succès, FALSE sinon.
  146. */
  147. public static function beginTransaction(): bool
  148. {
  149. self::connect();
  150. return self::$dbh->beginTransaction();
  151. }
  152. /**
  153. * Valide une transaction.
  154. *
  155. * @return bool TRUE si la transaction a été validée avec succès, FALSE sinon.
  156. */
  157. public static function endTransaction(): bool
  158. {
  159. self::connect();
  160. return self::$dbh->commit();
  161. }
  162. /**
  163. * Annule une transaction.
  164. *
  165. * @return bool TRUE si la transaction a été annulée avec succès, FALSE sinon.
  166. */
  167. public static function cancelTransaction(): bool
  168. {
  169. self::connect();
  170. return self::$dbh->rollBack();
  171. }
  172. /**
  173. * Affiche les paramètres de la requête pour le débogage.
  174. *
  175. * @return void
  176. */
  177. public static function debugDumpParams(): void
  178. {
  179. self::connect();
  180. self::$stmt->debugDumpParams();
  181. }
  182. /**
  183. * Affiche les erreurs de la dernière requête SQL.
  184. *
  185. * @return void
  186. */
  187. public static function queryError(): void
  188. {
  189. self::connect();
  190. $qError = self::$dbh->errorInfo();
  191. if (!empty($qError[2])) {
  192. echo "Query Error: " . $qError[2];
  193. }
  194. }
  195. /**
  196. * Récupère le dernier message d'erreur de connexion.
  197. *
  198. * @return string Le message d'erreur.
  199. */
  200. public static function getError(): string
  201. {
  202. return self::$error;
  203. }
  204. }