30 $sql =
"SELECT * FROM chanson";
31 $pdoStatement = $this->pdo->prepare($sql);
32 $pdoStatement->execute();
33 $pdoStatement->setFetchMode(PDO::FETCH_ASSOC);
34 $tableau = $pdoStatement->fetchAll();
41 $sql =
"SELECT * FROM chanson WHERE idChanson = :id";
42 $pdoStatement = $this->pdo->prepare($sql);
43 $pdoStatement->execute(array(
47 $pdoStatement->setFetchMode(PDO::FETCH_ASSOC);
48 $tableau = $pdoStatement->fetch();
49 $chanson = $this->
hydrate($tableau);
53 public function findTrending(
int $limit = 8,
int $daysAgo = 7): array
57 u.pseudoUtilisateur AS artistePseudoUtilisateur,
58 -- Métriques récentes (période paramétrable)
59 COUNT(DISTINCT lc.emailUtilisateur) AS nouveaux_likes,
60 COUNT(DISTINCT cp.idPlaylist) AS nouvelles_playlists,
61 -- SCORE DE TENDANCE : 1 Like = 2 pts, 1 Playlist = 3 pts
62 (COUNT(DISTINCT lc.emailUtilisateur) * 2) +
63 (COUNT(DISTINCT cp.idPlaylist) * 3) AS score_tendance
65 JOIN utilisateur u ON c.emailPublicateur = u.emailUtilisateur
66 LEFT JOIN likeChanson lc
67 ON c.idChanson = lc.idChanson
68 AND lc.dateLike >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
69 LEFT JOIN chansonPlaylist cp
70 ON c.idChanson = cp.idChanson
71 AND cp.dateAjoutChanson >= DATE_SUB(NOW(), INTERVAL :daysAgo DAY)
72 GROUP BY c.idChanson, u.pseudoUtilisateur
73 HAVING score_tendance > 0
74 ORDER BY score_tendance DESC
82 $stmt = $this->pdo->prepare($sql);
83 $stmt->bindValue(
':daysAgo', $daysAgo, PDO::PARAM_INT);
84 $stmt->bindValue(
':limit', $limit, PDO::PARAM_INT);
86 $chansons = $stmt->fetchAll(PDO::FETCH_ASSOC);
97 $sql =
"SELECT * FROM chanson WHERE emailPublicateur = :email";
98 $stmt = $this->pdo->prepare($sql);
99 $stmt->execute([
':email' => $email]);
100 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
107 public function hydrate(array $tableaAssoc): chanson
109 $chanson =
new chanson();
110 $chanson->setIdchanson(isset($tableaAssoc[
'idChanson']) ? (
int)$tableaAssoc[
'idChanson'] :
null);
111 $chanson->setTitrechanson($tableaAssoc[
'titreChanson'] ??
null);
112 $chanson->setDureechanson(isset($tableaAssoc[
'dureeChanson']) ? (int)$tableaAssoc[
'dureeChanson'] :
null);
115 $chanson->setDateTeleversementChanson(
116 !empty($tableaAssoc[
'dateTeleversementChanson']) ?
new DateTime($tableaAssoc[
'dateTeleversementChanson']) : null
118 $chanson->setNbecoutechanson(isset($tableaAssoc[
'nbEcouteChanson']) ? (int)$tableaAssoc[
'nbEcouteChanson'] :
null);
119 $chanson->seturlAudioChanson($tableaAssoc[
'urlAudioChanson'] ??
null);
122 if (!empty($tableaAssoc[
'albumChanson'])) {
123 $albumDAO =
new AlbumDAO($this->pdo);
124 $album = $albumDAO->find((
int)$tableaAssoc[
'albumChanson']);
127 $chanson->setAlbumChanson($album);
129 $chanson->setAlbumChanson(
null);
134 if (!empty($tableaAssoc[
'genreChanson'])) {
136 $genre = $genre->find((
int)$tableaAssoc[
'genreChanson']);
137 $chanson->setGenreChanson($genre);
139 $chanson->setGenreChanson(
null);
142 $chanson->setEmailPublicateur($tableaAssoc[
'emailPublicateur'] ??
null);
150 foreach ($tableauxAssoc as $tableauAssoc) {
151 $chansons[] = $this->
hydrate($tableauAssoc);
158 $sql =
"SELECT * FROM chanson
159 WHERE titreChanson LIKE :titre
160 ORDER BY nbEcouteChanson DESC
163 $pdoStatement = $this->pdo->prepare($sql);
164 $likeTitre =
'%' . $titre .
'%';
165 $pdoStatement->bindParam(
':titre', $likeTitre, PDO::PARAM_STR);
166 $pdoStatement->execute();
167 $pdoStatement->setFetchMode(PDO::FETCH_ASSOC);
168 $tableau = $pdoStatement->fetchAll();
174 $sql =
"SELECT * FROM chanson WHERE albumChanson = :idAlbum";
175 $pdoStatement = $this->pdo->prepare($sql);
176 $pdoStatement->bindParam(
':idAlbum', $idAlbum, PDO::PARAM_INT);
177 $pdoStatement->execute();
178 $pdoStatement->setFetchMode(PDO::FETCH_ASSOC);
179 $tableau = $pdoStatement->fetchAll();
184 public function filtrerChanson(?
int $idGenre =
null, ?
int $idAlbum =
null,
string $colonne =
'titreChanson',
string $ordre =
'ASC'): array
187 $colonnesValides = [
'titreChanson',
'dateTeleversementChanson',
'nbEcouteChanson',
'idChanson',
'dureeChanson'];
188 $ordresValides = [
'ASC',
'DESC'];
190 $colonne = in_array($colonne, $colonnesValides,
true) ? $colonne :
'titreChanson';
191 $ordre = in_array(strtoupper($ordre), $ordresValides,
true) ? strtoupper($ordre) :
'ASC';
193 $sql =
"SELECT * FROM chanson WHERE 1=1";
195 if ($idGenre !==
null) {
196 $sql .=
" AND genreChanson = :idGenre";
198 if ($idAlbum !==
null) {
199 $sql .=
" AND albumChanson = :idAlbum";
202 $sql .=
" ORDER BY $colonne $ordre";
204 $stmt = $this->pdo->prepare($sql);
206 if ($idGenre !==
null) {
207 $stmt->bindValue(
':idGenre', $idGenre, PDO::PARAM_INT);
209 if ($idAlbum !==
null) {
210 $stmt->bindValue(
':idAlbum', $idAlbum, PDO::PARAM_INT);
214 $tableau = $stmt->fetchAll(PDO::FETCH_ASSOC);
221 $sql =
"INSERT INTO chanson (titreChanson, dureeChanson, dateTeleversementChanson, nbEcouteChanson, albumChanson, genreChanson, emailPublicateur, urlAudioChanson)
222 VALUES (:titre, :duree, :dateTeleversement, :nbEcoute, :album, :genre, :emailPublicateur, :urlAudio)";
224 $pdoStatement = $this->pdo->prepare($sql);
230 return $pdoStatement->execute([
233 ':dateTeleversement' => $dateTeleversement,
235 ':urlAudio' => $chanson->geturlAudioChanson(),
236 ':album' => $idAlbum,
237 ':genre' => $idGenre,
250 $sql =
"UPDATE chanson SET
251 titreChanson = :titre,
252 genreChanson = :idGenre
253 WHERE idChanson = :idChanson";
255 $pdoStatement = $this->pdo->prepare($sql);
259 return $pdoStatement->execute([
261 ':idGenre' => $idGenre,
273 $sql =
"DELETE FROM chanson WHERE idChanson = :idChanson";
274 $stmt = $this->pdo->prepare($sql);
275 return $stmt->execute([
':idChanson' => $idChanson]);
285 $sql =
"UPDATE chanson SET nbEcouteChanson = COALESCE(nbEcouteChanson, 0) + 1 WHERE idChanson = :idChanson";
286 $stmt = $this->pdo->prepare($sql);
287 $ok = $stmt->execute([
':idChanson' => $idChanson]);
292 $sql2 =
"SELECT nbEcouteChanson FROM chanson WHERE idChanson = :idChanson";
293 $stmt2 = $this->pdo->prepare($sql2);
294 $stmt2->execute([
':idChanson' => $idChanson]);
295 $val = $stmt2->fetchColumn();
296 return $val !==
false ? (int)$val :
null;
305 SELECT c.*, l.dateLike, l.emailUtilisateur
307 JOIN chanson c ON c.idChanson = l.idChanson
308 WHERE l.emailUtilisateur = :email
309 ORDER BY l.dateLike DESC
312 $stmt = $this->pdo->prepare($sql);
313 $stmt->execute([
':email' => $email]);
314 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
317 foreach ($results as $row) {
318 $chansons[] = $this->
hydrate($row);
329 $sql =
"INSERT INTO likeChanson (emailUtilisateur, idChanson, dateLike)
330 VALUES (:emailUtilisateur, :idChanson, :dateLike)";
332 $stmt = $this->pdo->prepare($sql);
333 return $stmt->execute([
334 ':emailUtilisateur' => $emailUtilisateur,
335 ':idChanson' => $idChanson,
336 ':dateLike' => (
new DateTime())->format(
'Y-m-d H:i:s')
345 $sql =
"UPDATE likeChanson SET dateLike = :dateLike
346 WHERE emailUtilisateur = :emailUtilisateur AND idChanson = :idChanson";
348 $stmt = $this->pdo->prepare($sql);
349 return $stmt->execute([
350 ':emailUtilisateur' => $emailUtilisateur,
351 ':idChanson' => $idChanson,
352 ':dateLike' => (
new DateTime())->format(
'Y-m-d H:i:s')
359 public function toggleLike(
string $emailUtilisateur,
int $idChanson): bool
362 $sql =
"SELECT COUNT(*) FROM likeChanson WHERE emailUtilisateur = :emailUtilisateur AND idChanson = :idChanson";
363 $stmt = $this->pdo->prepare($sql);
365 ':emailUtilisateur' => $emailUtilisateur,
366 ':idChanson' => $idChanson
368 $isLiked = $stmt->fetchColumn() > 0;
372 $sql =
"DELETE FROM likeChanson WHERE emailUtilisateur = :emailUtilisateur AND idChanson = :idChanson";
373 $stmt = $this->pdo->prepare($sql);
374 return $stmt->execute([
375 ':emailUtilisateur' => $emailUtilisateur,
376 ':idChanson' => $idChanson
408 $sql =
"SELECT COALESCE(SUM(nbEcouteChanson), 0) as total
410 WHERE emailPublicateur = :email";
411 $stmt = $this->pdo->prepare($sql);
412 $stmt->execute([
':email' => $emailArtiste]);
413 return (
int)$stmt->fetchColumn();
rechercherParTitre(string $titre)
updateChanson(Chanson $chanson)
findAllFromUser(?string $email=null)
hydrateMany(array $tableauxAssoc)
createChanson(Chanson $chanson)
getPdo()
Get the value of pdo.
rechercherParAlbum(int $idAlbum)
findChansonsLikees(string $email)
Récupère les chansons likées par un utilisateur.
getTotalEcoutesByArtiste(string $emailArtiste)
Calcule le nombre total d'écoutes pour toutes les chansons d'un artiste.
deleteChanson(int $idChanson)
Supprime une chanson en base de données par son ID.
updateChansonLikee(string $emailUtilisateur, int $idChanson)
Met à jour un like (change la date)
findTrending(int $limit=8, int $daysAgo=7)
incrementNbEcoute(int $idChanson)
Incrémente le compteur d'écoutes d'une chanson de 1 et retourne la nouvelle valeur.
addChansonLikee(string $emailUtilisateur, int $idChanson)
Ajoute un like pour une chanson (user + chanson)
hydrate(array $tableaAssoc)
setPdo($pdo)
Set the value of pdo.
toggleLike(string $emailUtilisateur, int $idChanson)
Bascule le like d'une chanson (ajoute ou supprime)
findAll()
Récupère toutes les chansons de la base de données.
__construct(?PDO $pdo=null)
Constructeur de la classe ChansonDAO.
filtrerChanson(?int $idGenre=null, ?int $idAlbum=null, string $colonne='titreChanson', string $ordre='ASC')
getIdChanson()
Get the value of idChanson.
getGenreChanson()
Get the value of genreChanson.
getAlbumChanson()
Get the value of albumChanson.
getNbEcouteChanson()
Get the value of nbEcouteChanson.
getDateTeleversementChanson()
Get the value of dateTeleversementChanson.
getDureeChanson()
Get the value of dureeChanson.
getTitreChanson()
Get the value of titreChanson.
getEmailPublicateur()
Get the value of emailPublicateur.