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 :

Lier un commentaire à un message [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Mes 3 tables :
    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
    21
    22
    23
    24
    25
    26
    27
    CREATE TABLE IF NOT EXISTS `linker` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(32) NOT NULL,
      `descb` varchar(255) NOT NULL,
      `links` varchar(120) NOT NULL,
      `image` varchar(120) NOT NULL,
      `media` varchar(120) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
     
    CREATE TABLE IF NOT EXISTS `coment` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nname` varchar(32) NOT NULL,
      `title` varchar(32) NOT NULL,
      `messg` varchar(32) NOT NULL,
      `linker_id` varchar(32) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    CREATE TABLE IF NOT EXISTS `linker_coment` (
      `linker_id` int(4) NOT NULL AUTO_INCREMENT,
      `coment_id` int(4) NOT NULL,
      PRIMARY KEY (`linker_id`),
      KEY `coment_id` (`coment_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    Ma requête de base pour faire l'affichage simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    	id,
    	title,
    	descb,
    	links,
    	image,
    	media
    FROM
    	linker
    ORDER BY
    	linker.id DESC
    Avec 3 table j'arrive à ceci : image

    J'ai essayé d'autres scénarios mais j'arrive pas à afficher complèt.

    J'ai 5 lignes de données et parmis les 5, y a 2 commentaires.
    Donc 4 lignes sans commentaires.

    Avec affichage simple avec 2 table, ça va afficher une des lignes deux fois.

    J'en suis rendu là.
    Images attachées Images attachées  

  2. #22
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Au niveau de la table "coment" (ici et dans le graphique) il y a une erreur, il ne faut pas mettre le champ "linker_id", faut le supprimer (juste mettre/conserver le champ "id", la clé primaire, c'est tout).

    Par conséquent, et au niveau de la table linker_coment et coment, mettre la relation comme ceci :
    "linker_id" (table linker_coment) -> "id" (table comment)


    Aussi, concernant cette table "linker_coment", tu ne peux pas mettre juste 1 seul champ (comme "linker_id") comme clé primaire, et surtout pas mettre d'auto_increment aussi, sinon cette table ne servirait à rien.
    Je l'avais expliqué et donné des exemple, il faut créer une clé primaire double zone, c'est à dire une primaire constituée de 2 champs (ces 2 champs d'ailleurs).
    Table "linker_coment" : PRIMARY KEY (linker_id, coment_id)

    De même qu'il faut utiliser la même longueur de champ sur ces 3 tables, c'est à dire que la longeur des "id" sont int(11).
    Et bien dans la table linker_coment :
    linker_id int(11)
    coment_id(11)
    (et non 4)
    Ce sont les même données : clé primaire d'un coté, clé étrangère de l'autre.

    Si tu utilise InnoDB, tu peux rajouter des contraintes de clés étrangères dans cette table "linker_coment" :
    - linker_id est la clé étrangère du champ id de la table linker
    - coment_id est la clé étrangère de id de la table coment.
    Ca se faire avec des FOREIGN KEY.
    Mais si tu n'est pas encore familiarisé avec tout ça, le plus simple serait de ne rien faire à ce niveau là (clé étrangères), et utiliser un moteur comme MyISAM.
    C'est moins contraignant.


    Je remarque aussi que tantôt tu utilises le moteur MyISAM, tantôt InnoDB.
    J'ai tendance à dire qu'il faudrait utiliser soit l'un, soit l'autre.

    Grosso modo :
    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
    CREATE TABLE IF NOT EXISTS `coment` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
    ... etc ...
      PRIMARY KEY (`id`)
    );
     
    CREATE TABLE IF NOT EXISTS `linker` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
    ... etc ...
      PRIMARY KEY (`id`)
    );
     
    CREATE TABLE IF NOT EXISTS `linker_coment` (
      `linker_id` int(11) NOT NULL,
      `coment_id` int(11) NOT NULL,
      PRIMARY KEY (`linker_id`, `coment_id`)
    );

  3. #23
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Bonjour, merci pour l'aide accordée.

    Je pense que c'est au niveau de ou des requêtes :

    Les table corrigées :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    CREATE TABLE IF NOT EXISTS `linker` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(32) NOT NULL,
      `descb` varchar(255) NOT NULL,
      `links` varchar(120) NOT NULL,
      `image` varchar(120) NOT NULL,
      `media` varchar(120) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    INSERT INTO `linker` (`id`, `title`, `descb`, `links`, `image`, `media`, `modified`) VALUES
    (1, 'message1', '', '', '', '', '2012-01-13 14:36:06'),
    (2, 'message2', '', '', '', '', '2012-01-13 14:36:25');
     
     
     
    CREATE TABLE IF NOT EXISTS `coment` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nname` varchar(32) NOT NULL,
      `title` varchar(32) NOT NULL,
      `messg` varchar(32) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
     
    INSERT INTO `coment` (`id`, `nname`, `title`, `messg`, `modified`) VALUES
    (1, '', 'Commentaire1 pour message1', '', '2012-01-13 14:35:18'),
    (2, '', 'Commentaire2 pour message1', '', '2012-01-13 14:35:33');
     
     
     
    CREATE TABLE IF NOT EXISTS `linker_coment` (
      `linker_id` int(11) NOT NULL,
      `coment_id` int(11) NOT NULL,
      PRIMARY KEY (`linker_id`,`coment_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    INSERT INTO `linker_coment` (`linker_id`, `coment_id`) VALUES
    (1, 1),
    (2, 1);

    Requête :

    Pour la requête, c'est ce que j'obtiens de mieux à ma connaissance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    	l.id AS lid,
    	l.title AS ltitle,
    	c.id AS cid,
    	c.title AS ctitle
    FROM
    	linker_coment
    LEFT OUTER JOIN coment AS c ON c.id = linker_coment.linker_id
    RIGHT OUTER JOIN linker AS l ON linker_coment.coment_id = l.id
    Résultat :

    Il faudrait que les commentaires soient dans le même message.
    Et de préférence en utilisant une requête.
    J'utilise des balises de <table> pour la mise en forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IDmsg(1) - message1
    IDcom(1) - Commentaire1 pour message1
     
    IDmsg(1) - message1
    IDcom(2) - Commentaire2 pour message1
     
    IDmsg(2) - message2
    IDcom() -
    Mon code en PHP :

    J'ai simplifié pour mieux illustrer :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    include 'config_open_db.php';
     
    $sql="
    
    		SELECT
    			l.id AS lid,
    			l.title AS ltitle,
    			c.id AS cid,
    			c.title AS ctitle
    		FROM
    			linker_coment
    		LEFT OUTER JOIN coment AS c ON c.id = linker_coment.linker_id
    		RIGHT OUTER JOIN linker AS l ON linker_coment.coment_id = l.id
    
    ";
     
    $rs=mysqli_query($conn,$sql);
    if(!$rs) die("Probleme : ". mysqli_error($conn));
     
     
        echo "<table align=\"center\">";
     
            while($row=mysqli_fetch_array($rs)){
                extract($row);
     
                echo "<tr>";
                    echo "<td>IDmsg($lid) - $ltitle</td>";
                echo "</tr>";
     
                echo "<tr>";
                    echo "<td>IDcom($cid) - $ctitle</td>";
                echo "</tr>";
     
     
                echo "<tr><td class=\"h\"><br></td></tr>";
     
            }
        echo "</table>";
     
    mysqli_close($conn);
    ?>

  4. #24
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Tu effectues ce qu'on appelle des jointures extérieurs (LEFT OUTER JOIN et RIGHT OUTER JOIN) alors que très certainement ce sont des jointures internes (INNER JOIN) qu'il faudrait.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT
    l.id AS lid, l.title AS ltitle, c.id AS cid, c.title AS ctitle
    FROM linker_coment
    INNER JOIN coment AS c ON c.id = linker_coment.linker_id
    INNER JOIN linker AS l ON linker_coment.coment_id = l.id
    Ton problème à mon sens, c'est que tu te repose beaucoup (peut être trop) sur ton logiciel, alors qu'à la source, le plus important, c'est d'exprimer clairement son besoin.
    Certes, les logiciels c'est utiles, mais ça sert surtout à gagner du temps, encore faut il savoir ce qu'on va faire, sinon on perd du temps.


    De mon coté, j'utilise aucun logiciel, au mieux, un papier et un crayon.
    Faut dire que j'e ne crée pas des Bdd tous les jours aussi.
    Certes, je ne dis pas que ce n'est pas utile, je dis juste qu'un logiciel par moment ça a ses limites, ça ne fait pas tout.


    En tout cas, relis bien ce topic, tu remarqueras qu'à aucun moment tu as exprimer clairement ton besoin.
    Jamais tu as dis clairement que 1 message sera lié à 1 ou plusieurs liens. Pourtant c'est cela qui détermine qu'il faudra au minimum 2 tables pour le représenter.

    De même que, tu n'as jamais confirmer que : 1 lien pourra être lié à 1 ou plusieurs messages. Pourtant, c'est cela qui détermine qu'il faudra une 3ème table pour représenter au final une relation de plusieurs à plusieurs entre les messages et liens.
    Sur ce dernier point, à cet instant je n'est toujours pas la confirmation que ce modèle en 3 tables soit vraiment adapté à ce que tu veux.
    C'est pourtant essentiel, non ?


    Ceci dit, bien souvent un petit graphique vaut mieux qu'un long discourt.
    Ou alors, on y met ce qu'on appel un jeux d'essai.

    Un jeu d'essai c'est très pratique d'ailleurs.
    C'est ceci :
    table coment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id | titre
    1  | titre1
    2  | titre2
    3  | titre3
    table linker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id | nom
    1  | nom1
    2  | nom2
    3  | nom3
    4  | nom4
    5  | nom5
    table linker_coment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    linker_id | coment_id
    1         | 1
    2         | 1
    3         | 1
    1         | 2
    4         | 2
    Ici, le commentaire 1 contient 3 liens : 1, 2, 3
    Puis le commentaire 2 contient 2 liens : 1 et 4
    On remarque au passage que le lien 1 appartient à 2 commentaires : le 1 et le 2.
    Puis le commentaire 3 contient aucun lien.
    Et enfin, on a un lien lié à aucun commentaire (lien isolé) : le 5

    C'est cela un jeu d'essai, c'est à dire qu'on y met d'abord tout ce qu'on veut obtenir, mais aussi (voir surtout) ce qu'on ne voudra pas obtenir.

    Ici pour exemple on voit qu'il y a un lien isolé (le 5). Est-ce possible ?
    Théoriquement la Bdd ne pourra pas empêcher ça (sauf faire des trigger, ce qui ici on va dire que c'est hors sujet).
    Si on dit que cela ne doit pas être possible, le programme devra le gérer (Php).
    Etc, etc ...


    Maintenant, et selon ce jeu d'essai, qu'est ce que la requête doit récupérer selon tel ou tel critères, et entre autre ne pas récupérer ?
    (Si ce jeu d'essai te semble insuffisant, un cas que j'aurais oublier ou autre, alors faut le dire ou le rajouter).


    Et pour ce qui est du code HTML, je vais te dire, on s'en fiche pas mal. Ca c'est du décor.
    Un petit print_r() par ci, quelques <br /> par là suffisent largement pour vérifier les données.
    Tant qu'on obtient pas ce qu'on veut, faire du HTML ne sert à rien.


    Vois tu mieux ?

  5. #25
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Y'a beaucoup de choses, je vais prendre le temps de raisonner tout ça.

    L'idée est que je voulais associer les commentaires à linker.

    Linker est l'information avec les détails :
    Le titre du sujet, le url de l'image, le liens pour la source, etc.
    j'ai indiqué message mais c'est plutot titre dans l'image incluse.

    La table coment :
    Les visiteurs eux aurais émis des commentaires sur le sujet.

    Je cherchais aussi à planifier pour que chaque catégorie, y a des articles.
    C'est le même principe.

    Ou un forum, chaque sujet y a des interventions comme des répliques.

    C'est ça mon besoin.

    Je vais essayer des choses avec que je viens de recevoir.

    Votre proposition de requête:
    Et ca donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IDmsg(1) - message1
    IDcom(1) - Commentaire1 pour message1
     
    IDmsg(1) - message1
    IDcom(2) - Commentaire2 pour message1
    Cette requête exclu le message2 et fait apparaitre deux fois le message pour afficher les deux commentaires.

    Je ne sais pas si on pourrait associer les commentaires au sujet en passant par une autre requête...

    Bien merci de m'aider.
    Images attachées Images attachées  

  6. #26
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je pense avoir trouver la solution:

    Utiliser les trois tables tel que vous me l'avez montrer.
    Faire une requête simple pour les messages (linker) et
    faire une autre requête avec jointure pour lier le ID de
    la table comentaires avec la table des clé étrangères.

    Puis avec PHP placer un while juste pour la partie commentaires.

    Voici ce que ça donne :

    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
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <?php
    include 'config_open_db.php';
     
    $sql="
    		SELECT
    		id,
    		title,
    		descb,
    		links,
    		image,
    		media
    	FROM
    		linker
    	ORDER BY
    		linker.id DESC
    ";
    $rs=mysqli_query($conn,$sql);
    if(!$rs) die("Probleme : ". mysqli_error($conn));
     
     
    $csql="
    		SELECT
    		coment.id AS cid,
    		coment.nname AS nname,
    		coment.title AS ctitle,
    		coment.messg AS messg
    	FROM
    		coment
    	INNER JOIN linker_coment AS lc ON coment.id = lc.linker_id
    ";
    $crs=mysqli_query($conn,$csql);
    if(!$crs) die("Probleme : ". mysqli_error($conn));
     
     
        echo "<table align=\"center\">";
     
        while($row=mysqli_fetch_array($rs)){
            extract($row);
     
                echo "<tr>";
                    echo "<td>IDmsg($id) - $title</td>";
                echo "</tr>";
     
    								while($crow=mysqli_fetch_array($crs)){
    										extract($crow);
     
    										echo "<tr>";
    												echo "<td>IDcom($cid) - $ctitle</td>";
    										echo "</tr>";
     
    								}
     
                echo "<tr><td class=\"h\"><br></td></tr>";
     
        }
        echo "</table>";
     
    mysqli_close($conn);
    ?>
    Le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IDmsg(1) - message1
      IDcom(1) - Commentaire1 pour message1
      IDcom(2) - Commentaire2 pour message1
     
    IDmsg(2) - message2
    Avant de passer à résoudre, je veux m'assurer que c'est plausible comme solution.

    J'aurais jamais réussi sans votre aide.
    Merci beaucoup.

  7. #27
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Le while dans le whwil, ça ne marche pas.

    Le fait d'ajouter un commentaire pour l'autre
    message2, ça fourre tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IDmsg(1) - message1
    Commentaire1 pour message1
    Commentaire2 pour message1
    Commentaire1 pour message2
     
    IDmsg(2) - message2

  8. #28
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par dancom5
    Et ca donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IDmsg(1) - message1
    IDcom(1) - Commentaire1 pour message1
     
    IDmsg(1) - message1
    IDcom(2) - Commentaire2 pour message1
    Cette requête exclu le message2 et fait apparaitre deux fois le message pour afficher les deux commentaires.
    Ce n'est pas exacte, car une requête ne renvoit pas 1 ligne pour le message et une (ou plusieurs) autre ligne pour les liens.
    Ca ne peut être que ton code Php qui effectue cette séparation du message et des liens.

    Au départ, il est préférable de ne pas faire de mise en forme, mais juste vérifier les ligne que ça renvoie.
    PhpMyAdmin (ou autre client SQL) suffit pour ça.



    Si on prend le jeu d'essai que j'ai mis précédemment, avec INNER JOIN ça va renvoyer 5 lignes, et uniquement 5 lignes.
    Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id | titre | id | nom
    1  | titre1| 1 |nom1
    1  | titre1| 2 |nom2
    1  | titre1| 3 |nom3
    2  | titre2| 1 |nom1
    2  | titre2| 4 |nom4
    On voit alors qu'un INNER JOIN (sans autre critères) renvoie uniquement les messages ayant des liens, et uniquement.
    Ca exclu donc les messages non liés à des liens, et aussi les liens isolés.


    Après, faut voir ce que tu veux obtenir, s'il faut quand même les messages n'ayant pas de liens, liens isolés, etc ...
    Ici, il faudra alors faire des jointures extérieurs comme LEFT JOIN, RIGHT JOIN, etc ...
    Mais ici il y a tellement de cas qu'il m'est impossible de tous les évoquer.
    Il y a un excellent tuto sur ce forum qui explique tout ça :
    -> LE SQL de A à Z : 3e partie - les jointures
    Puis rien de tel que de faire des essai pour le vérifier.


    Par ailleurs, de mon coté je ne m'impose pas toujours de récupérer des données en 1 seule et unique requête.
    S'il est possible de le faire en 2, voire même en 3 requêtes, si l'impact sur les performances est négligeable, alors il n'est pas rare que je le fasse en plusieurs requêtes.
    Le but étant de me faciliter la tâche afin d'obtenir un tableau à plusieurs dimensions. La mise en forme HTML sera d'autant plus simple à faire au final.

    Exemple :
    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
     
    $sql = "SELECT c.id AS cid, c.title, lc.linker_id
    FROM coment c
    INNER JOIN linker_coment lc ON c.id = lc.coment_id";
    // On exécute la requête
     
    $coment_linker = array();
    while ($coment = mysqli_fetch_array($rs)) {
        $coment_linker[$coment['cid']] = array('title' => $coment['title']);
        //
        $sql = "SELECT l.id AS lid, l.name
        FROM linker_coment lc
        INNER JOIN linker l ON lc.linker_id = l.id
        WHERE lc.coment_id = ".(int)$coment['cid'];
        //
        while ($linkers = mysqli_fetch_array($rs)) {
            $coment_linker[$coment['cid']]['linkers'][$linkers['lid']] = array('name' => $linkers['name']);
        }
    }
    Ici, on obtient les données structurées dans un tableau à plusieurs dimensions.
    Ca offre plus de souplesses/facilités pour faire des présentations (HTML entre autre).
    La 1ère dimension contient les messages, la 2ème les liens (linkers) associés à chaque messages.

  9. #29
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je suis reparti sur de nouvelles bases en créant deux tables :

    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
    21
    22
    23
    24
    25
    26
    CREATE TABLE IF NOT EXISTS `categorie` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `categorie` varchar(222) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
    INSERT INTO `categorie` (`id`, `categorie`) VALUES
    (1, 'voitures'),
    (2, 'ordinateurs'),
    (3, 'nouriture');
     
     
    CREATE TABLE IF NOT EXISTS `article` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `categorie_id` int(11) NOT NULL,
      `article` varchar(222) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `categorie_id` (`categorie_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
     
    INSERT INTO `article` (`id`, `categorie_id`, `article`) VALUES
    (1, 2, 'DELL'),
    (2, 2, 'HP'),
    (3, 1, 'Minoune'),
    (4, 1, 'carcasse'),
    (5, 3, 'pommes');
    Le code PHP :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    include 'config_open_db.php';
     
    $sql="
      SELECT * FROM categorie
    ";
    $rs=mysqli_query($conn,$sql);
    if(!$rs) die("Probleme : ". mysqli_error($conn));
    while($row=mysqli_fetch_array($rs)){
     
    	echo '<b> ID'.$row['id'].' - '.$row['categorie'].'</b><br>';
     
    				$asql="
    					SELECT
                article.id,
    						article.article,
    						article.categorie_id
    					FROM
    						article
    					WHERE
    						article.categorie_id = ".$row['id']."
    				";
    				$ars=mysqli_query($conn,$asql);
    				if(!$ars) die("Probleme : ". mysqli_error($conn));
    				while($arow=mysqli_fetch_array($ars)){
    						echo 'ID'.$arow['id'].' - '.$arow['article'].' cat:'.$arow['categorie_id'].'<br>';
    				}
     
    }
     
    mysqli_close($conn);
    ?>
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ID1 - voitures (categorie)
    ID3 - Minoune cat:1 (article)
    ID4 - carcasse cat:1 (article)
    ID2 - ordinateurs (categorie)
    ID1 - DELL cat:2 (article1)
    ID2 - HP cat:2 (article1)
    ID3 - nouriture (categorie)
    ID5 - pommes cat:3 (article1)
    J'obtiens ici le résultat que je voulais. J'avoue que j'avais beaucoup de termes utilisés qui n'étaient pas très évocateurs. Tellement que j'en était mêlé à la fin. J'ai tout bonnement décidé de tout refaire pour faire des essais et ça donné ça au bout.

    RunCodePhp, Votre aide m'a été très utile puisque ça m'a éclairer sur plusieurs points qui m'a fait comprendre des choses que je ne savais pas.

    Merci pour votre patience.

    Je tente d'appliquer l'exemple sur mon code.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [PHP 5.0] Lier l'article aux commentaires
    Par lythande dans le forum Langage
    Réponses: 9
    Dernier message: 13/04/2015, 17h15
  2. [Modèle Relationnel] Plusieurs commentaires pour un seul message
    Par -Fly- dans le forum Schéma
    Réponses: 2
    Dernier message: 16/03/2012, 16h43
  3. [XL-2003] Lier des évennements aux différents choix d'un Message Box
    Par Mas_Carpone dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/10/2009, 15h38
  4. A lire impérativement avant de poster un message
    Par ok.Idriss dans le forum Demandes
    Réponses: 0
    Dernier message: 01/05/2002, 19h57

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