Recherche pdo dans tableau 2 dimenssion pour newbee

Fermé
Mosa - 19 févr. 2017 à 20:23
 Signaler flunsh - 21 févr. 2017 à 16:19
Bonjour,

Je suis un hyper débutant :-)
J'ai besoin d'aide pour effectuer la recherche de valeur dans un tableau a deux dimension, ça va même un peu plus loin, je vous explique.

J'ai un tableau à 2 dimensions qui est le résultat de cette requête :

$stmt2 = $db->prepare("Select
MEMBERS_GROUPE.MEMBERS_GROUPE_ID,
MEMBERS_GROUPE.MEMBERS_GROUPE_GROUPENAME,
MEMBERS_GROUPE.MEMBERS_GROUPE_LANG,
MEMBERS_GROUPE.MEMBERS_GROUPE_ACTIVE
From
MEMBERS_GROUPE
Where
MEMBERS_GROUPE.MEMBERS_GROUPE_LANG = 'fr'");
$stmt2->execute();
$rowg = $stmt2->fetch(PDO::FETCH_BOTH );


j'effectue une requête pour lister des utilisateurs

$stmt= $db->prepare("Select
MEMBERS.MEMBERS_ID,
MEMBERS.MEMBERS_USERNAME,
MEMBERS.MEMBERS_GROUPE
From
MEMBERS");
$stmt->execute();


J'affiche les données


<table >
<thead>
<tr>
<th data-field="id" data-sortable="true">ID</th>
<th data-field="name" data-sortable="true">Nom</th>
<th data-field="groupe" data-sortable="true">Groupes</th>
</tr>
<tbody>
<?php
while ($row = $stmt->fetch(PDO::FETCH_BOTH)) {
$groupe = explode(";",$row['MEMBERS_GROUPE']);
?>
<tr>
<td ><?php echo $row['MEMBERS_ID']; ?></td>
<td ><?php echo $row['MEMBERS_USERNAME']; ?></td>
<td ><?php
foreach ($groupe as $value) { echo affgroupe($value); }
?></td>
</tr>
<?php
}
?>
</tbody>
</thead>
</table>


Les données correspondant a MEMBERS_GROUPE dans la base MEMBERS sont enregistrées ainsi : 3;10;52

Je n'arrive pas a écrire la fonction affgroupe() qui doit parser un tableau a deux dimensions qui est le résultat de la 1ere requête !

je n'arrive pas a trouver de fonction qui permette de trouver le nom du groupe avec l'ID du groupe.

Pouvez vous me donner une coup de pouce ?

A voir également:

2 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
19 févr. 2017 à 20:48
bonsoir,
si je comprends bien, MEMBERS.MEMBERS_GROUPE permet de déterminer le groupe du membre, car il est identique à la valeur de MEMBERS_GROUPE.MEMBERS_GROUPE_ID pour le groupe corrspondant.
c'est exact?
ce serait bien que tu expliques ce que tu veux réaliser.
veux-tu obtenir la liste des membres ayant MEMBERS_GROUPE.MEMBERS_GROUPE_LANG = 'fr'?
si oui, je te suggère ceci:
Select
  MEMBERS.MEMBERS_ID,
  MEMBERS.MEMBERS_USERNAME,
  MEMBERS.MEMBERS_GROUPE
From
  MEMBERS, MEMBERS_GROUPE
on 
   MEMBERS.MEMBERS_GROUPE =
        MEMBERS_GROUPE.MEMBERS_GROUPE_ID
where 
     MEMBERS_GROUPE.MEMBERS_GROUPE_LANG = 'fr'
Cela te donnera les utilisateurs qui t’intéressent.
0
Bonsoir,

Non ce n'est pas le cas, la valeur MEMBERS_GROUPE peut avoir plusieurs groupes, les données sont stockées ainsi :
3;32;5
ou 3 = groupe1
32 = groupe 2
5 = groupe 3

c'est les id de groupes...
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > Mosa
Modifié par yg_be le 19/02/2017 à 20:57
donc c'est une partie de MEMBERS_GROUPE qui sera identique à la valeur de MEMBERS_GROUPE.MEMBERS_GROUPE_ID?
j'imagine que tu as fait ainsi parce qu'un membre peut faire partie de plusieurs groupes, c'est bien cela?
0
C'est ca, il peut faire partie de plusieurs groupes !!!

on ne peut pas faire de requête puisque dans la table MEMBRE il y a les id MEMBRE_GROUPE_ID sous la forme 3;32;5 (chaque ID de groupe séparé par ; )

La solution tel que c'est fait est de faire du traitement PHP
Je reprends un programme d'un collègue pour le compléter ...
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > Mosa
19 févr. 2017 à 21:18
la façon correcte d'enregistrer cela, c'est d'utiliser une table supplémentaire, qui contient deux champs, membre_id et groupe_id, et qui représente appartenance des membres dans les groupes.
ne peux-tu pas faire ainsi?
0
Mosa > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
Modifié par Mosa le 19/02/2017 à 21:35
Si je fais ainsi alors pour aficher les utilisateurs je devrai faire ma requête pour les utilisateurs et ensuite je devrais faire une requête par utilisateur pour connaitre tous les groupes qu'appartient un utilisateur ? si c'est ca, c'est bourrin je trouve, imagine si tu as 10 000 utilisateurs a afficher ...
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
21 févr. 2017 à 00:06
Partons du principe que tu as fais ta requête en PDO et que tu as utilisé un fetchAll (en fetch ASSOC ) pour stocker le résultat de la requête dans un array.
Il te suffit de retravailler un peut ton array pour obtenir ce que tu souhaites;

Par exemple :
//affichage des erreurs php
error_reporting(E_ALL);


/*
* Petite fonction de debug
*/
function debug($var){
 echo '<br><pre>';
 print_r($var);
 echo '</pre><br>';
}


// Je créé un array fictif pour simuler ce que ta requete retourne:
$resultatFetchAll = array();
$resultatFetchAll[] = array('id'=>2,'name'=> 'Jean','groupe'=>'groupe1','id_groupe'=>1);
$resultatFetchAll[] = array('id'=>2,'name'=> 'Jean','groupe'=>'groupe5','id_groupe'=>5);
$resultatFetchAll[] = array('id'=>2,'name'=> 'Jean','groupe'=>'groupe8','id_groupe'=>8);

echo " Array résultat du fetchAll suite à ta requete :<b>";
debug($resultatFetchAll);

//On va remettre en "forme" ton array pour le rendre exploitable
$arrFinal = array(); //array qui contiendra les données restructurées
foreach($resultatFetchAll as $K=>$row){
   $id_user = $row['id'];
   $name = $row['name'];
   $groupe = $row['groupe'];
   $id_groupe = $row['id_groupe'];
   $arrFinal[$id_user]['name'] = $name;
   $arrFinal[$id_user]['groupes'][] = array('id_groupe'=> $id_groupe, 'groupe'=>$groupe);
 
}

echo " Affichage de l'array restructuré :<b>";
debug($arrFinal);


// et donc pour l'utiliser ...
if(!empty($arrFinal)){
  foreach($arrFinal as $id=>$datas){
    echo " <br>id user :$id   - name : " . $datas['name'] ;
    $groupes = !empty($datas['groupes']) ? $datas['groupes'] : array();
    foreach($groupes as $grp){
      echo " <b>GROUPES :</b>id groupe : ".$grp['id_groupe'] . " -> " . $grp['groupe'];
    }
  }
}



0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
21 févr. 2017 à 00:15
Et sinon ... tu peux aussi (mais après tout dépend de tes besoins....) faire, dans ta requête, du GROUP_CONCAT histoire de tout récupérer sur une seule ligne...(mais la manipulation ensuite est plus compliquée car il faudra splitter les chaines de caractères...)
Exemple :
https://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
21 févr. 2017 à 11:42
je me demande si un GROUP_CONCAT(MEMBERS_GROUPE.MEMBERS_GROUPE_GROUPENAME) ne suffirait pas, sans manipulation supplémentaire.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
21 févr. 2017 à 13:13
Je dirais même plus... pourquoi pas faire un group_concat.. ?
Plus sérieusement. ... C'est juste la proposition que j'ai fait juste au dessus...
Après. .. tout dépend de ce qu'il veut fqire des données. ...
0
Signaler flunsh
21 févr. 2017 à 14:29
Bonjour,

Merci Jordane45 pour le script exemple, c'est bien plus concret pour moi (débutant de la 1ere heure) avec cet exemple !
L'idée est d'afficher tout sur une même ligne dans un tableau.

J'ai donc créer sur ma base de données Mysql une table intermédiaire pour effectuer ma jointure left.

Pour le moment j'essaye sans résultat d'écrire la requête.

Pour rappel l'objectif de cette démarche est d'afficher un tableau qui permettrait de récapituler les groupes d'appartenance d'un utilisateur. Ce tableau peut ressembler à cela :

USERNAME | Nom groupe 1 | Nom groupe 2 | Nom groupe 3 | ... (dynamique)
Jean - Oui - Non - Oui - ....
Paul - Non - Non - Oui -

et aussi du coup afficher les groupes ainsi :

USERNAME | Groupes |
Jean - Nom groupe1; Nom groupe 3; |
Paul - Nom groupe3;


Intellectuellement c'est pas simple tout de même cette histoire de left join quand on rajoute une table intermédiaire ... Je vais essayer de me concentrer la dessus ! j'ai trouvé des tuto avec deux tables mais pas 3 pour le moment.
Ensuite je regarderai de plus près votre suggestion avec GROUP_CONCAT !

Si vous avez des suggestions d'article ou de code je suis preneur, en attendant j'essaye de me débrouiller !
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Signaler flunsh
Modifié par jordane45 le 21/02/2017 à 15:39
C'est aussi simple que :
SELECT *
FROM tableintermediaire T1
LEFT JOIN tblGroup G ON G.id = T1.id_grp
LEFT JOIN tblUser U ON U.id = T1.id_user
0