IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Besoin d'aide pour une liste de tableau [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut Besoin d'aide pour une liste de tableau
    Bonjour,

    J'ai une table relation n n qui associe une playlist à une ou plusieurs vidéos :

    Nom : Capture.PNG
Affichages : 489
Taille : 2,8 Ko

    La première colonne fait référence à la table playlist et la deuxième à la table vidéos.

    Pour récupérer mes informations, j'écris cette requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT p.name as playlist_name, p.created, v.name as video_name, v.thumbnail, v.description, v.posted, v.pseudo
    FROM relations as r
    LEFT JOIN playlists as p ON r.id_playlist = p.id
    LEFT JOIN videos as v ON r.id_video = v.id

    Pour lire ses informations, j'écris ce bout de code :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
        $relations_arr = array();
        $relations_arr["playlists"] = array();
     
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
     
            extract($row);
     
            $playlists_item = array(
                "name_of_playlist" => $row['playlist_name'],
                "created" => $row['created'],
                "videos" => array(
                    "name_of_video" => $row['video_name'],
                    "thumbnail" => $row["thumbnail"],
                    "description" => $row["description"],
                    "posted" => $row["posted"],
                    "pseudo" => $row["pseudo"]
            ));
     
            array_push($relations_arr["playlists"], $playlists_item);
        }
     
        http_response_code(200);
        print_r(json_encode($relations_arr));

    Et comme résultat, j'obtiens ceci :

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    {
        "playlists": [
            {
                "name_of_playlist": "Playlist 01",
                "created": "2018-10-15",
                "videos": {
                    "name_of_video": "Vidéo 01",
                    "thumbnail": "Lien 01",
                    "description": "Description 01",
                    "posted": "2018-10-31",
                    "pseudo": "Pseudo 01"
                }
            },
            {
                "name_of_playlist": "Playlist 01",
                "created": "2018-10-15",
                "videos": {
                    "name_of_video": "Vidéo 02",
                    "thumbnail": "Lien 02",
                    "description": "Description 02",
                    "posted": "2018-10-24",
                    "pseudo": "Pseudo 02"
                }
            },
            {
                "name_of_playlist": "Playlist 02",
                "created": "2018-10-03",
                "videos": {
                    "name_of_video": "Red Dead Redemption 2 - Bande-annonce de lancement",
                    "thumbnail": "https://www.dailymotion.com/video/x6voudz",
                    "description": "Un bon jeu auquel je ne peux pas encore jouer car j'effectue ce test.",
                    "posted": "2018-10-15",
                    "pseudo": "Gamekult"
                }
            },
            {
                "name_of_playlist": "Playlist 02",
                "created": "2018-10-03",
                "videos": {
                    "name_of_video": "Les chansons pour enfants décryptées ! (feat. SWANN PERISSE) - Parlons peu Mais parlons",
                    "thumbnail": "https://www.dailymotion.com/video/x6v7fv1",
                    "description": "Pour fêter les 3 ans de la chaîne on voulait faire une super fête ! A la place on a chanté des chansons dégueulasses.",
                    "posted": "2018-10-10",
                    "pseudo": "Parlons Peu Mais Parlons"
                }
            }
        ]
    }

    Or, le résultat escompté n'est pas bon, en effet j'aimerai avoir ceci :

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    {
        "playlists": [
            "name_of_playlist": "Playlist 01",
            "created": "2018-10-15": [
                    "videos_01": {
                        "name_of_video": "Vidéo 01",
                        "thumbnail": "Lien 01",
                        "description": "Description 01",
                        "posted": "2018-10-31",
                        "pseudo": "Pseudo 01"
                    }
                    "videos_02": {
                        "name_of_video": "Vidéo 02",
                        "thumbnail": "Lien 02",
                        "description": "Description 02",
                        "posted": "2018-10-24",
                        "pseudo": "Pseudo 02"
                    }
            ]
     
            "name_of_playlist": "Playlist 02",
            "created": "2018-10-03", [
                "videos_01": {
                    "name_of_video": "Red Dead Redemption 2 - Bande-annonce de lancement",
                    "thumbnail": "https://www.dailymotion.com/video/x6voudz",
                    "description": "Un bon jeu auquel je ne peux pas encore jouer car j'effectue ce test.",
                    "posted": "2018-10-15",
                    "pseudo": "Gamekult"
                }
                "videos_02": {
                    "name_of_video": "Les chansons pour enfants décryptées ! (feat. SWANN PERISSE) - Parlons peu Mais parlons",
                    "thumbnail": "https://www.dailymotion.com/video/x6v7fv1",
                    "description": "Pour fêter les 3 ans de la chaîne on voulait faire une super fête ! A la place on a chanté des chansons dégueulasses.",
                    "posted": "2018-10-10",
                    "pseudo": "Parlons Peu Mais Parlons"
                }
            ]
        ]
    }

    Un seul tableau de playlist qui contient ses propres vidéos donc.

    Ou qu'elle serait le résultat le plus judicieux ? Sachant que je dois pouvoir par la suite supprimer une vidéo d'une playlist ou en ajouter.

    Merci pour vos conseils !

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    J'ai modifié mon code :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT p.name as playlist_name, p.created as playlist_created, v.id as video_id, v.name as video_name, v.thumbnail, v.description, v.posted, v.pseudo
                        FROM relations as r
                        INNER JOIN playlists as p ON r.id_playlist = p.id
                        INNER JOIN videos as v ON r.id_video = v.id
                        GROUP BY v.id

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        $relations_arr = array();
        $i = 1;
     
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            $relations_arr[$row['playlist_name']] = array
            (
                "video ". $i++ => array
                (
                    "name_of_video" => $row['video_name'],
                    "thumbnail" => $row["thumbnail"],
                    "description" => $row["description"],
                    "posted" => $row["posted"],
                    "pseudo" => $row["pseudo"]
                )
            );
        }
     
        http_response_code(200);
        print_r(json_encode($relations_arr));

    Et voici le résultat :

    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    {
        "Playlist 01": {
            "video 2": {
                "name_of_video": "Vidéo 02",
                "thumbnail": "Lien 02",
                "description": "Description 02",
                "posted": "2018-10-24",
                "pseudo": "Pseudo 02"
            }
        },
        "Playlist 02": {
            "video 4": {
                "name_of_video": "Les chansons pour enfants décryptées ! (feat. SWANN PERISSE) - Parlons peu Mais parlons",
                "thumbnail": "https://www.dailymotion.com/video/x6v7fv1",
                "description": "Pour fêter les 3 ans de la chaîne on voulait faire une super fête ! A la place on a chanté des chansons dégueulasses.",
                "posted": "2018-10-10",
                "pseudo": "Parlons Peu Mais Parlons"
            }
        }
    }

    Il ne prend que la dernière vidéo de la playlist, pas toutes les vidéos

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Salut.
    Essaie ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        $relations_arr = array();
        $i = 1;
     
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            $relations_arr[$row['playlist_name']][] = array
            (
                "video ". $i++ => array
                (
                    "name_of_video" => $row['video_name'],
                    "thumbnail" => $row["thumbnail"],
                    "description" => $row["description"],
                    "posted" => $row["posted"],
                    "pseudo" => $row["pseudo"]
                )
            );
        }
     
        http_response_code(200);
        print_r(json_encode($relations_arr));
    Heu, pour le SQL, tu es sûr pour le group by ?
    Tu as essayé sans ? Parce que un group by sans fonction d'agrégation ? je vois pas l'intérêt.
    Tu confonds avec order by ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.name as playlist_name, p.created as playlist_created, v.id as video_id, v.name as video_name, v.thumbnail, v.description, v.posted, v.pseudo
    FROM relations as r
    INNER JOIN playlists as p ON r.id_playlist = p.id
    INNER JOIN videos as v ON r.id_video = v.id
    ORDER BY v.id
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
        $relations_arr = array();
        $relations_arr["playlists"] = array();
     
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
     
            extract($row);
     
            $relations_arr["playlists"][$row['id_playlist']]["name_of_playlist"] = $row['playlist_name'];
            $relations_arr["playlists"][$row['id_playlist']]["created"] = $row['created'];
            $relations_arr["playlists"][$row['id_playlist']]["videos"][] = array(
                    "name_of_video" => $row['video_name'],
                    "thumbnail" => $row["thumbnail"],
                    "description" => $row["description"],
                    "posted" => $row["posted"],
                    "pseudo" => $row["pseudo"]
    				);
        }
     
        http_response_code(200);
        print_r(json_encode($relations_arr));
    N.B. Il faut ajouter "id_playlist" à la liste des colonnes à récupérer dans la requête.

    Il faut aussi certainement appliquer un htmlspecialchars aux $row (à cause des apostrophes).

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    ...Heu, pour le SQL, tu es sûr pour le group by ?...
    Que suis-je bête ! Oui j'ai confondu avec order by

    Merci énormément ta méthode fonctionne, entre temps, j'ai écris cette requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT p.name as playlist_name, p.created,
                    JSON_ARRAYAGG(
                        json_object
                        (
                            'video_name', v.name,
                            'thumbnail', v.thumbnail,
                            'description', v.description,
                            'posted', v.posted,
                            'pseudo', v.pseudo
                        )
                    ) as videos
                    FROM relations as r
                    INNER JOIN playlists as p ON r.id_playlist = p.id
                    LEFT JOIN videos as v ON r.id_video = v.id
                    GROUP BY p.id

    Je ne savais pas qu'on pouvait manipuler des objets au format json. Cette méthode fonctionnait mais l'affichage n'était pas très clair, il a fallu que je fasse un traitement derrière pour synthétiser correctement mes données.

    Merci encore !

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    ...Il faut ajouter "id_playlist"...
    Par curiosité j'ai aussi effectuer ton bout de code et cela fonctionne aussi avec la requête de mon premier post en ajoutant comme tu l'as dis "id_playlist" dans la requête.

    Merci à vous deux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour une liste conditionnelle
    Par pascalywood dans le forum Modélisation
    Réponses: 2
    Dernier message: 18/08/2015, 22h37
  2. Besoin d'aide pour une requete
    Par jnc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/07/2005, 11h54
  3. Création requete besoin d'aide pour une date
    Par royrremi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2004, 22h03
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo