31 $sql =
"SELECT * FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
32 $stmt = $this->pdo->prepare($sql);
33 $stmt->execute([
':emailUtilisateur' => $emailUtilisateur]);
34 $row = $stmt->fetch(PDO::FETCH_ASSOC);
48 $sql =
"SELECT * FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
49 $stmt = $this->pdo->prepare($sql);
50 $stmt->execute([
':pseudoUtilisateur' => $pseudoUtilisateur]);
51 $row = $stmt->fetch(PDO::FETCH_ASSOC);
65 $sql =
"SELECT COUNT(*) FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
66 $stmt = $this->pdo->prepare($sql);
67 $stmt->execute([
':emailUtilisateur' => $emailUtilisateur]);
68 return (
bool)$stmt->fetchColumn();
77 public function findTrending(
int $limit = 8,
int $daysAgo = 7): array
93 -- Nombre d'abonnés récents (sur les X derniers jours)
94 COUNT(DISTINCT aa.emailAbonne) AS nouveaux_abonnes,
95 -- Nombre d'utilisateurs ayant liké une chanson de cet artiste (sur X jours)
96 COUNT(DISTINCT lc.emailUtilisateur) AS nouveaux_likes_chansons,
97 -- Nombre de votes reçus lors des battles (sur X jours)
98 COUNT(DISTINCT v.emailVotant) AS nouveaux_votes_battle,
99 -- Score de tendance global calculé avec pondération
100 (COUNT(DISTINCT aa.emailAbonne) * 5) +
101 (COUNT(DISTINCT lc.emailUtilisateur) * 1) +
102 (COUNT(DISTINCT v.emailVotant) * 3) AS score_tendence
106 /* Jointure avec les abonnements artistes : uniquement ceux très récents */
107 LEFT JOIN abonnementArtiste aa
108 ON u.emailUtilisateur = aa.emailArtiste
109 AND aa.dateAbonnement >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
111 /* Jointure avec les chansons publiées par l'artiste */
113 ON u.emailUtilisateur = c.emailPublicateur
114 /* Jointure pour récupérer les likes sur les chansons (sur les X derniers jours) */
115 LEFT JOIN likeChanson lc
116 ON c.idChanson = lc.idChanson
117 AND lc.dateLike >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
119 /* Jointure pour les votes de battle reçus par l'artiste (sur X jours) */
121 ON u.emailUtilisateur = v.emailVotee
122 AND v.dateVote >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
124 WHERE u.statutUtilisateur = 'actif' -- Seulement les utilisateurs actifs
125 AND u.roleUtilisateur = 2 -- Seulement les artistes
127 GROUP BY u.emailUtilisateur, u.pseudoUtilisateur, u.urlPhotoUtilisateur
128 HAVING score_tendence > 0 -- Seulement les artistes ayant un score positif
129 ORDER BY score_tendence DESC -- Tri par score décroissant
130 LIMIT :limit; -- Limite à N résultats
137 $stmt = $this->pdo->prepare($sql);
138 $stmt->bindValue(
':daysAgo', $daysAgo, PDO::PARAM_INT);
139 $stmt->bindValue(
':limit', $limit, PDO::PARAM_INT);
141 $artistes = $stmt->fetchAll(PDO::FETCH_ASSOC);
142 $stmt->closeCursor();
156 $sql =
"SELECT COUNT(*) FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
157 $stmt = $this->pdo->prepare($sql);
158 $stmt->execute([
':pseudoUtilisateur' => $pseudoUtilisateur]);
159 return (
bool)$stmt->fetchColumn();
169 $dateDeNaissance = $row[
'dateDeNaissanceUtilisateur'] ?
new DateTime($row[
'dateDeNaissanceUtilisateur']) :
null;
170 $dateInscription = $row[
'dateInscriptionUtilisateur'] ?
new DateTime($row[
'dateInscriptionUtilisateur']) :
null;
171 $dateDebutAbonnement = $row[
'dateDebutAbonnement'] ?
new DateTime($row[
'dateDebutAbonnement']) :
null;
172 $dateFinAbonnement = $row[
'dateFinAbonnement'] ?
new DateTime($row[
'dateFinAbonnement']) :
null;
174 $statutUtilisateur = $row[
'statutUtilisateur'] ? StatutUtilisateur::from($row[
'statutUtilisateur']) :
null;
175 $statutAbonnement = $row[
'statutAbonnement'] ? StatutAbonnement::from($row[
'statutAbonnement']) :
null;
178 if ($row[
'roleUtilisateur']) {
179 $roleDAO =
new RoleDAO($this->pdo);
180 $role = $roleDAO->find((
int)$row[
'roleUtilisateur']);
184 if ($row[
'genreUtilisateur']) {
186 $genre =
$genreDAO->find((
int)$row[
'genreUtilisateur']);
190 $row[
'emailUtilisateur'],
191 $row[
'nomUtilisateur'],
192 $row[
'pseudoUtilisateur'],
193 $row[
'motDePasseUtilisateur'],
198 (
bool)$row[
'estAbonnee'],
199 $row[
'descriptionUtilisateur'],
200 $row[
'siteWebUtilisateur'],
202 $dateDebutAbonnement,
204 (
int)$row[
'pointsDeRenommeeArtiste'],
205 (
int)$row[
'nbAbonnesArtiste'],
206 $row[
'urlPhotoUtilisateur'],
217 $sql =
"SELECT * FROM utilisateur";
218 $stmt = $this->pdo->prepare($sql);
220 return $this->
hydrateAll($stmt->fetchAll(PDO::FETCH_ASSOC));
231 foreach ($rows as $row) {
232 $utilisateurs[] = $this->
hydrate($row);
234 return $utilisateurs;
244 $sql =
"INSERT INTO utilisateur (emailUtilisateur, pseudoUtilisateur, motDePasseUtilisateur, dateDeNaissanceUtilisateur, dateInscriptionUtilisateur, statutUtilisateur, estAbonnee, statutAbonnement, dateDebutAbonnement, dateFinAbonnement, pointsDeRenommeeArtiste, nbAbonnesArtiste, urlPhotoUtilisateur, roleUtilisateur, descriptionUtilisateur, siteWebUtilisateur, genreUtilisateur, nomUtilisateur) VALUES (:emailUtilisateur, :pseudoUtilisateur, :motDePasseUtilisateur, :dateDeNaissanceUtilisateur, :dateInscriptionUtilisateur, :statutUtilisateur, :estAbonnee, :statutAbonnement, :dateDebutAbonnement, :dateFinAbonnement, :pointsDeRenommeeArtiste, :nbAbonnesArtiste, :urlPhotoUtilisateur, :roleUtilisateur, :descriptionUtilisateur, :siteWebUtilisateur, :genreUtilisateur, :nomUtilisateur)";
245 $stmt = $this->pdo->prepare($sql);
256 return $stmt->execute([
260 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
261 ':dateInscriptionUtilisateur' => $dateInscription,
262 ':statutUtilisateur' => $statutUtilisateur,
264 ':statutAbonnement' => $statutAbonnement,
265 ':dateDebutAbonnement' => $dateDebutAbonnement,
266 ':dateFinAbonnement' => $dateFinAbonnement,
270 ':roleUtilisateur' => $roleId,
273 ':genreUtilisateur' => $genreId,
285 $sql =
"UPDATE utilisateur SET pseudoUtilisateur = :pseudoUtilisateur, motDePasseUtilisateur = :motDePasseUtilisateur, dateDeNaissanceUtilisateur = :dateDeNaissanceUtilisateur, dateInscriptionUtilisateur = :dateInscriptionUtilisateur, statutUtilisateur = :statutUtilisateur, estAbonnee = :estAbonnee, statutAbonnement = :statutAbonnement, dateDebutAbonnement = :dateDebutAbonnement, dateFinAbonnement = :dateFinAbonnement, pointsDeRenommeeArtiste = :pointsDeRenommeeArtiste, nbAbonnesArtiste = :nbAbonnesArtiste, urlPhotoUtilisateur = :urlPhotoUtilisateur, roleUtilisateur = :roleUtilisateur, descriptionUtilisateur = :descriptionUtilisateur, siteWebUtilisateur = :siteWebUtilisateur, genreUtilisateur = :genreUtilisateur, nomUtilisateur = :nomUtilisateur WHERE emailUtilisateur = :emailUtilisateur";
286 $stmt = $this->pdo->prepare($sql);
297 return $stmt->execute([
301 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
302 ':dateInscriptionUtilisateur' => $dateInscription,
303 ':statutUtilisateur' => $statutUtilisateur,
305 ':statutAbonnement' => $statutAbonnement,
306 ':dateDebutAbonnement' => $dateDebutAbonnement,
307 ':dateFinAbonnement' => $dateFinAbonnement,
311 ':roleUtilisateur' => $roleId,
314 ':genreUtilisateur' => $genreId,
324 public function delete(?
string $emailUtilisateur): bool
326 $sql =
"DELETE FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
327 $stmt = $this->pdo->prepare($sql);
328 return $stmt->execute([
':emailUtilisateur' => $emailUtilisateur]);
359 $currentUser = $this->
find($excludeEmail);
360 $genreId = $currentUser?->getGenreUtilisateur()?->getIdGenre();
362 $params = [
':excludeEmail' => $excludeEmail];
368 JOIN role r ON u.roleUtilisateur = r.idRole
369 WHERE r.typeRole = 'artiste'
370 AND u.emailUtilisateur != :excludeEmail
371 AND u.genreUtilisateur = :genreId
372 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
374 $params[
':genreId'] = $genreId;
377 $requete = $this->pdo->prepare($sql);
378 $requete->execute($params);
379 $artistes = $this->
hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
380 if (!empty($artistes)) {
383 }
catch (PDOException $e) {
384 error_log(
'Erreur DAO lors de la récupération des artistes : ' . $e->getMessage());
391 JOIN role r ON u.roleUtilisateur = r.idRole
392 WHERE r.typeRole = 'artiste'
393 AND u.emailUtilisateur != :excludeEmail
394 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
398 $requete = $this->pdo->prepare($sql);
399 $requete->execute([
':excludeEmail' => $excludeEmail]);
400 return $this->
hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
401 }
catch (PDOException $e) {
402 error_log(
'Erreur DAO lors de la récupération des artistes populaires : ' . $e->getMessage());
414 $sql =
"SELECT COUNT(*) FROM abonnementArtiste WHERE emailArtiste = :email";
415 $stmt = $this->pdo->prepare($sql);
416 $stmt->execute([
':email' => $emailArtiste]);
417 return (
int)$stmt->fetchColumn();
427 $sql =
"SELECT COUNT(*) FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
428 $stmt = $this->pdo->prepare($sql);
429 $stmt->execute([
':abonne' => $emailAbonne,
':artiste' => $emailArtiste]);
430 return (
bool)$stmt->fetchColumn();
442 $sql =
"DELETE FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
443 $this->pdo->prepare($sql)->execute([
':abonne' => $emailAbonne,
':artiste' => $emailArtiste]);
446 $sql =
"INSERT INTO abonnementArtiste (emailAbonne, emailArtiste) VALUES (:abonne, :artiste)";
447 $this->pdo->prepare($sql)->execute([
':abonne' => $emailAbonne,
':artiste' => $emailArtiste]);
460 $sql =
"UPDATE utilisateur
461 SET nbAbonnesArtiste = nbAbonnesArtiste + :increment
462 WHERE emailUtilisateur = :emailArtiste";
464 $stmt = $this->pdo->prepare($sql);
465 return $stmt->execute([
466 ':increment' => $increment,
467 ':emailArtiste' => $emailArtiste
existsByEmail(string $emailUtilisateur)
Vérifie si un utilisateur existe par son adresse email.
hydrate(array $row)
Hydrate un tableau de données en une instance de Utilisateur.
find(?string $emailUtilisateur)
Récupère un utilisateur par son adresse email.
existsByPseudo(string $pseudoUtilisateur)
Vérifie si un utilisateur existe par son pseudo.
estAbonneAArtiste(string $emailAbonne, string $emailArtiste)
Vérifie si un utilisateur est abonné à un artiste.
findTrending(int $limit=8, int $daysAgo=7)
Récupère les artistes en tendance sur la plateforme.
updateNbAbonnes(string $emailArtiste, int $increment)
Met à jour le compteur d'abonnés d'un artiste.
countFollowers(string $emailArtiste)
Compte le nombre d'abonnés d'un artiste.
update(Utilisateur $utilisateur)
Met à jour un utilisateur dans la base de données.
setPdo($pdo)
Setter pour la pdo.
findByPseudo(?string $pseudoUtilisateur)
Récupère un utilisateur par son pseudo.
create(Utilisateur $utilisateur)
Crée un nouvel utilisateur dans la base de données.
findAllArtistes(string $excludeEmail)
Récupère une liste d'artistes populaires, en priorisant ceux du même genre que l'utilisateur donné.
findAll()
Récupère tous les utilisateurs de la base de données.
getPdo()
Getter pour la pdo.
hydrateAll(array $rows)
Hydrate plusieurs utilisateurs à partir d'un tableau de données.
__construct(?PDO $pdo)
Constructeur de la classe UtilisateurDAO.
basculerAbonnement(string $emailAbonne, string $emailArtiste)
Bascule l'état d'abonnement d'un utilisateur à un artiste.
getNbAbonnesArtiste()
Getter pour nbAbonnesArtiste.
getStatutAbonnement()
Getter pour statutAbonnement.
getNomUtilisateur()
Getter pour le nom de l'utilisateur.
getDateInscriptionUtilisateur()
Getter pour la date d'inscription de l'utilisateur.
getPointsDeRenommeeArtiste()
Getter pour pointsDeRenommeeArtiste.
getDateDeNaissanceUtilisateur()
Getter pour la date de naissance de l'utilisateur.
getPseudoUtilisateur()
Getter pour le pseudo de l'utilisateur.
getDescriptionUtilisateur()
Getter pour descriptionUtilisateur.
geturlPhotoUtilisateur()
Getter pour urlPhotoUtilisateur.
getDateFinAbonnement()
Getter pour dateFinAbonnement.
getSiteWebUtilisateur()
Getter pour siteWebUtilisateur.
getMotDePasseUtilisateur()
Getter pour le mot de passe de l'utilisateur.
getEmailUtilisateur()
Getter pour l'email de l'utilisateur.
getRoleUtilisateur()
Getter pour roleUtilisateur.
getDateDebutAbonnement()
Getter pour dateDebutAbonnement.
getEstAbonnee()
Getter pour estAbonnee.
getGenreUtilisateur()
Getter pour le genre musical préféré
getStatutUtilisateur()
Getter pour le statut de l'utilisateur.