33 JOIN role r ON u.roleUtilisateur = r.idRole
34 WHERE r.typeRole = 'artiste'
35 AND u.pseudoUtilisateur LIKE :term
36 ORDER BY u.pointsDeRenommeeArtiste DESC, u.nbAbonnesArtiste DESC
39 $stmt = $this->pdo->prepare($sql);
40 $stmt->execute([
':term' =>
'%' . $term .
'%']);
42 return $this->
hydrateAll($stmt->fetchAll(PDO::FETCH_ASSOC));
48 $sql =
"SELECT * FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
49 $stmt = $this->pdo->prepare($sql);
50 $stmt->execute([
':emailUtilisateur' => $emailUtilisateur]);
51 $row = $stmt->fetch(PDO::FETCH_ASSOC);
53 return $this->hydrate($row);
65 $sql =
"SELECT * FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
66 $stmt = $this->pdo->prepare($sql);
67 $stmt->execute([
':pseudoUtilisateur' => $pseudoUtilisateur]);
68 $row = $stmt->fetch(PDO::FETCH_ASSOC);
70 return $this->hydrate($row);
82 $sql =
"SELECT COUNT(*) FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
83 $stmt = $this->pdo->prepare($sql);
84 $stmt->execute([
':emailUtilisateur' => $emailUtilisateur]);
85 return (
bool)$stmt->fetchColumn();
94 public function findTrending(
int $limit = 8,
int $daysAgo = 7): array
110 -- Nombre d'abonnés récents (sur les X derniers jours)
111 COUNT(DISTINCT aa.emailAbonne) AS nouveaux_abonnes,
112 -- Nombre d'utilisateurs ayant liké une chanson de cet artiste (sur X jours)
113 COUNT(DISTINCT lc.emailUtilisateur) AS nouveaux_likes_chansons,
114 -- Nombre de votes reçus lors des battles (sur X jours)
115 COUNT(DISTINCT v.emailVotant) AS nouveaux_votes_battle,
116 -- Score de tendance global calculé avec pondération
117 (COUNT(DISTINCT aa.emailAbonne) * 5) +
118 (COUNT(DISTINCT lc.emailUtilisateur) * 1) +
119 (COUNT(DISTINCT v.emailVotant) * 3) AS score_tendence
123 /* Jointure avec les abonnements artistes : uniquement ceux très récents */
124 LEFT JOIN abonnementArtiste aa
125 ON u.emailUtilisateur = aa.emailArtiste
126 AND aa.dateAbonnement >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
128 /* Jointure avec les chansons publiées par l'artiste */
130 ON u.emailUtilisateur = c.emailPublicateur
131 /* Jointure pour récupérer les likes sur les chansons (sur les X derniers jours) */
132 LEFT JOIN likeChanson lc
133 ON c.idChanson = lc.idChanson
134 AND lc.dateLike >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
136 /* Jointure pour les votes de battle reçus par l'artiste (sur X jours) */
138 ON u.emailUtilisateur = v.emailVotee
139 AND v.dateVote >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
141 WHERE u.statutUtilisateur = 'actif' -- Seulement les utilisateurs actifs
142 AND u.roleUtilisateur = 2 -- Seulement les artistes
144 GROUP BY u.emailUtilisateur, u.pseudoUtilisateur, u.urlPhotoUtilisateur
145 HAVING score_tendence > 0 -- Seulement les artistes ayant un score positif
146 ORDER BY score_tendence DESC -- Tri par score décroissant
147 LIMIT :limit; -- Limite à N résultats
154 $stmt = $this->pdo->prepare($sql);
155 $stmt->bindValue(
':daysAgo', $daysAgo, PDO::PARAM_INT);
156 $stmt->bindValue(
':limit', $limit, PDO::PARAM_INT);
158 $artistes = $stmt->fetchAll(PDO::FETCH_ASSOC);
159 $stmt->closeCursor();
161 return $this->hydrateAll($artistes);
173 $sql =
"SELECT COUNT(*) FROM utilisateur WHERE pseudoUtilisateur = :pseudoUtilisateur";
174 $stmt = $this->pdo->prepare($sql);
175 $stmt->execute([
':pseudoUtilisateur' => $pseudoUtilisateur]);
176 return (
bool)$stmt->fetchColumn();
186 $dateDeNaissance = $row[
'dateDeNaissanceUtilisateur'] ?
new DateTime($row[
'dateDeNaissanceUtilisateur']) :
null;
187 $dateInscription = $row[
'dateInscriptionUtilisateur'] ?
new DateTime($row[
'dateInscriptionUtilisateur']) :
null;
188 $dateDebutAbonnement = $row[
'dateDebutAbonnement'] ?
new DateTime($row[
'dateDebutAbonnement']) :
null;
189 $dateFinAbonnement = $row[
'dateFinAbonnement'] ?
new DateTime($row[
'dateFinAbonnement']) :
null;
191 $statutUtilisateur = $row[
'statutUtilisateur'] ? StatutUtilisateur::from($row[
'statutUtilisateur']) :
null;
192 $statutAbonnement = $row[
'statutAbonnement'] ? StatutAbonnement::from($row[
'statutAbonnement']) :
null;
195 if ($row[
'roleUtilisateur']) {
196 $roleDAO =
new RoleDAO($this->pdo);
197 $role = $roleDAO->find((
int)$row[
'roleUtilisateur']);
201 if ($row[
'genreUtilisateur']) {
203 $genre =
$genreDAO->find((
int)$row[
'genreUtilisateur']);
207 $row[
'emailUtilisateur'],
208 $row[
'nomUtilisateur'],
209 $row[
'pseudoUtilisateur'],
210 $row[
'motDePasseUtilisateur'],
215 (
bool)$row[
'estAbonnee'],
216 $row[
'descriptionUtilisateur'],
217 $row[
'siteWebUtilisateur'],
219 $dateDebutAbonnement,
221 (
int)$row[
'pointsDeRenommeeArtiste'],
222 (
int)$row[
'nbAbonnesArtiste'],
223 $row[
'urlPhotoUtilisateur'],
234 $sql =
"SELECT * FROM utilisateur";
235 $stmt = $this->pdo->prepare($sql);
237 return $this->hydrateAll($stmt->fetchAll(PDO::FETCH_ASSOC));
248 foreach ($rows as $row) {
249 $utilisateurs[] = $this->hydrate($row);
251 return $utilisateurs;
261 $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)";
262 $stmt = $this->pdo->prepare($sql);
273 return $stmt->execute([
277 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
278 ':dateInscriptionUtilisateur' => $dateInscription,
279 ':statutUtilisateur' => $statutUtilisateur,
281 ':statutAbonnement' => $statutAbonnement,
282 ':dateDebutAbonnement' => $dateDebutAbonnement,
283 ':dateFinAbonnement' => $dateFinAbonnement,
287 ':roleUtilisateur' => $roleId,
290 ':genreUtilisateur' => $genreId,
304 $sql =
"UPDATE utilisateur SET
305 emailUtilisateur = :emailUtilisateur,
306 pseudoUtilisateur = :pseudoUtilisateur,
307 motDePasseUtilisateur = :motDePasseUtilisateur,
308 dateDeNaissanceUtilisateur = :dateDeNaissanceUtilisateur,
309 dateInscriptionUtilisateur = :dateInscriptionUtilisateur,
310 statutUtilisateur = :statutUtilisateur,
311 estAbonnee = :estAbonnee,
312 statutAbonnement = :statutAbonnement,
313 dateDebutAbonnement = :dateDebutAbonnement,
314 dateFinAbonnement = :dateFinAbonnement,
315 pointsDeRenommeeArtiste = :pointsDeRenommeeArtiste,
316 nbAbonnesArtiste = :nbAbonnesArtiste,
317 urlPhotoUtilisateur = :urlPhotoUtilisateur,
318 roleUtilisateur = :roleUtilisateur,
319 descriptionUtilisateur = :descriptionUtilisateur,
320 siteWebUtilisateur = :siteWebUtilisateur,
321 genreUtilisateur = :genreUtilisateur,
322 nomUtilisateur = :nomUtilisateur
323 WHERE emailUtilisateur = :emailActuel";
325 $stmt = $this->pdo->prepare($sql);
336 return $stmt->execute([
340 ':dateDeNaissanceUtilisateur' => $dateDeNaissance,
341 ':dateInscriptionUtilisateur' => $dateInscription,
342 ':statutUtilisateur' => $statutUtilisateur,
344 ':statutAbonnement' => $statutAbonnement,
345 ':dateDebutAbonnement' => $dateDebutAbonnement,
346 ':dateFinAbonnement' => $dateFinAbonnement,
350 ':roleUtilisateur' => $roleId,
353 ':genreUtilisateur' => $genreId,
355 ':emailActuel' => $emailActuel,
363 public function delete(?
string $emailUtilisateur): bool
365 $sql =
"DELETE FROM utilisateur WHERE emailUtilisateur = :emailUtilisateur";
366 $stmt = $this->pdo->prepare($sql);
367 return $stmt->execute([
':emailUtilisateur' => $emailUtilisateur]);
398 $currentUser = $this->find($excludeEmail);
399 $genreId = $currentUser?->getGenreUtilisateur()?->getIdGenre();
401 $params = [
':excludeEmail' => $excludeEmail];
407 JOIN role r ON u.roleUtilisateur = r.idRole
408 WHERE r.typeRole = 'artiste'
409 AND u.emailUtilisateur != :excludeEmail
410 AND u.genreUtilisateur = :genreId
411 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
413 $params[
':genreId'] = $genreId;
416 $requete = $this->pdo->prepare($sql);
417 $requete->execute($params);
418 $artistes = $this->hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
419 if (!empty($artistes)) {
422 }
catch (PDOException $e) {
423 error_log(
'Erreur DAO lors de la récupération des artistes : ' . $e->getMessage());
430 JOIN role r ON u.roleUtilisateur = r.idRole
431 WHERE r.typeRole = 'artiste'
432 AND u.emailUtilisateur != :excludeEmail
433 ORDER BY u.pointsDeRenommeeArtiste DESC, u.dateInscriptionUtilisateur DESC
437 $requete = $this->pdo->prepare($sql);
438 $requete->execute([
':excludeEmail' => $excludeEmail]);
439 return $this->hydrateAll($requete->fetchAll(PDO::FETCH_ASSOC));
440 }
catch (PDOException $e) {
441 error_log(
'Erreur DAO lors de la récupération des artistes populaires : ' . $e->getMessage());
453 $sql =
"SELECT COUNT(*) FROM abonnementArtiste WHERE emailArtiste = :email";
454 $stmt = $this->pdo->prepare($sql);
455 $stmt->execute([
':email' => $emailArtiste]);
456 return (
int)$stmt->fetchColumn();
466 $sql =
"SELECT COUNT(*) FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
467 $stmt = $this->pdo->prepare($sql);
468 $stmt->execute([
':abonne' => $emailAbonne,
':artiste' => $emailArtiste]);
469 return (
bool)$stmt->fetchColumn();
480 if ($this->estAbonneAArtiste($emailAbonne, $emailArtiste)) {
481 $sql =
"DELETE FROM abonnementArtiste WHERE emailAbonne = :abonne AND emailArtiste = :artiste";
482 $this->pdo->prepare($sql)->execute([
':abonne' => $emailAbonne,
':artiste' => $emailArtiste]);
485 $sql =
"INSERT INTO abonnementArtiste (emailAbonne, emailArtiste) VALUES (:abonne, :artiste)";
486 $this->pdo->prepare($sql)->execute([
':abonne' => $emailAbonne,
':artiste' => $emailArtiste]);
499 $sql =
"UPDATE utilisateur
500 SET nbAbonnesArtiste = nbAbonnesArtiste + :increment
501 WHERE emailUtilisateur = :emailArtiste";
503 $stmt = $this->pdo->prepare($sql);
504 return $stmt->execute([
505 ':increment' => $increment,
506 ':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.
update(Utilisateur $utilisateur, string $emailActuel)
Met à jour un utilisateur dans la base de données.
find(?string $emailUtilisateur)
rechercher(string $term)
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.
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.
$pdo
Classe de gestion de la connexion MySQL.