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);
123 if (!empty($tableaAssoc[
'albumChanson'])) {
124 $albumDAO =
new AlbumDAO($this->pdo);
125 $album = $albumDAO->find((
int)$tableaAssoc[
'albumChanson']);
126 $chanson->setAlbumChanson($album);
128 $chanson->setAlbumChanson(
null);
132 if (!empty($tableaAssoc[
'genreChanson'])) {
134 $genre = $genre->find((
int)$tableaAssoc[
'genreChanson']);
135 $chanson->setGenreChanson($genre);
137 $chanson->setGenreChanson(
null);
140 $chanson->setEmailPublicateur($tableaAssoc[
'emailPublicateur'] ??
null);
148 foreach ($tableauxAssoc as $tableauAssoc) {
149 $chansons[] = $this->
hydrate($tableauAssoc);
156 $sql =
"SELECT * FROM chanson WHERE titreChanson LIKE :titre";
157 $pdoStatement = $this->pdo->prepare($sql);
158 $likeTitre =
'%' . $titre .
'%';
159 $pdoStatement->bindParam(
':titre', $likeTitre, PDO::PARAM_STR);
160 $pdoStatement->execute();
161 $pdoStatement->setFetchMode(PDO::FETCH_ASSOC);
162 $tableau = $pdoStatement->fetchAll();
169 $sql =
"SELECT * FROM chanson WHERE albumChanson = :idAlbum";
170 $pdoStatement = $this->pdo->prepare($sql);
171 $pdoStatement->bindParam(
':idAlbum', $idAlbum, PDO::PARAM_INT);
172 $pdoStatement->execute();
173 $pdoStatement->setFetchMode(PDO::FETCH_ASSOC);
174 $tableau = $pdoStatement->fetchAll();
179 public function filtrerChanson(?
int $idGenre =
null, ?
int $idAlbum =
null,
string $colonne =
'titreChanson',
string $ordre =
'ASC'): array
182 $colonnesValides = [
'titreChanson',
'dateTeleversementChanson',
'nbEcouteChanson',
'idChanson',
'dureeChanson'];
183 $ordresValides = [
'ASC',
'DESC'];
185 $colonne = in_array($colonne, $colonnesValides,
true) ? $colonne :
'titreChanson';
186 $ordre = in_array(strtoupper($ordre), $ordresValides,
true) ? strtoupper($ordre) :
'ASC';
188 $sql =
"SELECT * FROM chanson WHERE 1=1";
190 if ($idGenre !==
null) {
191 $sql .=
" AND genreChanson = :idGenre";
193 if ($idAlbum !==
null) {
194 $sql .=
" AND albumChanson = :idAlbum";
197 $sql .=
" ORDER BY $colonne $ordre";
199 $stmt = $this->pdo->prepare($sql);
201 if ($idGenre !==
null) {
202 $stmt->bindValue(
':idGenre', $idGenre, PDO::PARAM_INT);
204 if ($idAlbum !==
null) {
205 $stmt->bindValue(
':idAlbum', $idAlbum, PDO::PARAM_INT);
209 $tableau = $stmt->fetchAll(PDO::FETCH_ASSOC);
216 $sql =
"INSERT INTO chanson (titreChanson, dureeChanson, dateTeleversementChanson, nbEcouteChanson, albumChanson, genreChanson, emailPublicateur, urlAudioChanson)
217 VALUES (:titre, :duree, :dateTeleversement, :nbEcoute, :album, :genre, :emailPublicateur, :urlAudio)";
219 $pdoStatement = $this->pdo->prepare($sql);
225 return $pdoStatement->execute([
228 ':dateTeleversement' => $dateTeleversement,
230 ':urlAudio' => $chanson->geturlAudioChanson(),
231 ':album' => $idAlbum,
232 ':genre' => $idGenre,
245 $sql =
"UPDATE chanson SET
246 titreChanson = :titre,
247 genreChanson = :idGenre
248 WHERE idChanson = :idChanson";
250 $pdoStatement = $this->pdo->prepare($sql);
254 return $pdoStatement->execute([
256 ':idGenre' => $idGenre,
268 $sql =
"DELETE FROM chanson WHERE idChanson = :idChanson";
269 $stmt = $this->pdo->prepare($sql);
270 return $stmt->execute([
':idChanson' => $idChanson]);
280 $sql =
"UPDATE chanson SET nbEcouteChanson = COALESCE(nbEcouteChanson, 0) + 1 WHERE idChanson = :idChanson";
281 $stmt = $this->pdo->prepare($sql);
282 $ok = $stmt->execute([
':idChanson' => $idChanson]);
287 $sql2 =
"SELECT nbEcouteChanson FROM chanson WHERE idChanson = :idChanson";
288 $stmt2 = $this->pdo->prepare($sql2);
289 $stmt2->execute([
':idChanson' => $idChanson]);
290 $val = $stmt2->fetchColumn();
291 return $val !==
false ? (int)$val :
null;
300 SELECT c.*, l.dateLike, l.emailUtilisateur
302 JOIN chanson c ON c.idChanson = l.idChanson
303 WHERE l.emailUtilisateur = :email
304 ORDER BY l.dateLike DESC
307 $stmt = $this->pdo->prepare($sql);
308 $stmt->execute([
':email' => $email]);
309 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
312 foreach ($results as $row) {
313 $chansons[] = $this->
hydrate($row);
324 $sql =
"INSERT INTO likeChanson (emailUtilisateur, idChanson, dateLike)
325 VALUES (:emailUtilisateur, :idChanson, :dateLike)";
327 $stmt = $this->pdo->prepare($sql);
328 return $stmt->execute([
329 ':emailUtilisateur' => $emailUtilisateur,
330 ':idChanson' => $idChanson,
331 ':dateLike' => (
new DateTime())->format(
'Y-m-d H:i:s')
340 $sql =
"UPDATE likeChanson SET dateLike = :dateLike
341 WHERE emailUtilisateur = :emailUtilisateur AND idChanson = :idChanson";
343 $stmt = $this->pdo->prepare($sql);
344 return $stmt->execute([
345 ':emailUtilisateur' => $emailUtilisateur,
346 ':idChanson' => $idChanson,
347 ':dateLike' => (
new DateTime())->format(
'Y-m-d H:i:s')
354 public function toggleLike(
string $emailUtilisateur,
int $idChanson): bool
357 $sql =
"SELECT COUNT(*) FROM likeChanson WHERE emailUtilisateur = :emailUtilisateur AND idChanson = :idChanson";
358 $stmt = $this->pdo->prepare($sql);
360 ':emailUtilisateur' => $emailUtilisateur,
361 ':idChanson' => $idChanson
363 $isLiked = $stmt->fetchColumn() > 0;
367 $sql =
"DELETE FROM likeChanson WHERE emailUtilisateur = :emailUtilisateur AND idChanson = :idChanson";
368 $stmt = $this->pdo->prepare($sql);
369 return $stmt->execute([
370 ':emailUtilisateur' => $emailUtilisateur,
371 ':idChanson' => $idChanson
403 $sql =
"SELECT COALESCE(SUM(nbEcouteChanson), 0) as total
405 WHERE emailPublicateur = :email";
406 $stmt = $this->pdo->prepare($sql);
407 $stmt->execute([
':email' => $emailArtiste]);
408 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.
findByTitreExact(string $titre, int $idAlbum)
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.