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 :

Retour BDD colonnes imbriquées [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    visiteur
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : visiteur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut Retour BDD colonnes imbriquées
    Bonjour les pros,

    J'ai un petit souci pour une demande de requête PDO...( pas doué sur les requêtes)

    Je vous explique en gros mon problème.
    J'ai actuellement une requête qui me donne que la moitié du résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $req = "SELECT DISTINCT genre,objet FROM ".$categorie." GROUP BY genre ASC ";
    $sql = $pdo->prepare($req);
    $sql->execute();
    while($retcat = $sql->fetch(PDO::FETCH_ASSOC)){
    	echo'<div class="div-categorie">'.$retcat['genre'].'<br>';
    	echo''.$retcat['objet'].''; // => Il m'affiche la première mais pas les autres. Déjà essayer d'incérer des autres requêtes, des whiles, des if, pour les objets, qui ne marchent pas non plus.)
    	echo'</div>';
    }
    voici le résultat
    Nom : retour-bdd.JPG
Affichages : 112
Taille : 14,7 Ko

    Le problème est que je voudrais que l'on puisse voir (avec un DISTINCT) tous les objets lister sous la catégorie genre.


    Exemple de ce que je souhaiterai afficher sur la page :

    Nom : exemple.JPG
Affichages : 109
Taille : 26,0 Ko
    Autre partie du site code (sans BDD).

    Je voudrais ce même rendu en passant par la base de donnée.

    $retcat['genre'] = ce qui correspond a tous les genres de la table BDD.
    $retcat['objet'] = ce qui correspond a tous objets du $retcat['genre'].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div>Chats</div></br> ($retcat['genre'])
    <div>Bulle</div><div>Savons</div> etc...( $retcat['objet'] du chat )
    </br>
    <div>Chiens</div></br>($retcat['genre'])
    <div>Collier</div><div>Yoyo</div> etc...($retcat['objet'] du chien)
    Si une bonne âme puisse bien m'aider ca serai cool !
    D'autres question suivrons par la suite.

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    La clause GROUP BY va "aplatir" les résultats pour ne retourner qu'un seul résultat pour chaque valeur possible de la colonne dans le GROUP BY.
    Donc votre requête ne fait que lister les genres.
    A l'intérieur de la boucle, vous devez faire une requête à chaque fois pour lister les éléments qui ont pour valeur de genre, la valeur en cours dans la boucle.

    Quelque chose comme ça : (il faudrait vérifier le nom des champs qu'on ne connait pas) :

    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
    <?php
     
    $req = "SELECT DISTINCT genre,objet FROM " . $categorie . " GROUP BY genre ASC ";
    $sql = $pdo->prepare($req);
    $sql->execute();
    while ($retcat = $sql->fetch(PDO::FETCH_ASSOC)) {
        // On affiche une fois le genre ci-dessous, en tant que catégorie
        echo'<div class="div-categorie">' . $retcat['genre'] . '<br>';
        $reqGalleries = "SELECT objet FROM $categorie WHERE genre = ? ORDER BY objet DESC"; // Je connais pas les champs de la DB
        $sqlGalleries = $pdo->prepare($reqGalleries);
        $sqlGalleries->execute($retcat['genre']);
        while ($row = $sqlGalleries->fetch(PDO::FETCH_ASSOC)) {
            // On affiche tous les 'objet' dans le genre en cours
            echo $row['objet'] . '<br />';
        }
        echo'</div>';
    }


    PS : Il est également possible de le faire en une seule requête mais alors il ne faut pas utiliser de GROUP BY mais plutôt de faire un ORDER BY genre et de faire une comparaison si le genre actuel dans la boucle est différent du précédent
    Cela oblige à faire plus de manipulations en PHP et est un peu moins souple

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Un moyen simple de faire des groupements est d'utiliser PDO::FETCH_GROUP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $req = "SELECT ALL genre, objet FROM {$categorie} GROUP BY genre ASC ";
    $genres = $pdo->query($req)->fetchAll(PDO::FETCH_GROUP); // Ça se joue ici
    foreach ($genres as $genre => $objets) {
        echo "<h3>{$genre}</h3>";
        echo '<ol>';
        foreach ($objets as $tuple) {
            echo "<li>{$tuple['objet']}</li>";
        }
        echo '</ol>';
    }
    PDO::FETCH_GROUP permet de grouper les enregistrements selon la 1re colonne sélectionnée, ici "genre".

    Tu peux faire un print_r($genres) pour bien comprendre ce qui est retourné par le ::fetchAll(PDO::FETCH_GROUP)

  4. #4
    Membre averti
    Homme Profil pro
    visiteur
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : visiteur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut Autre exemple
    Bonjour darkstar123456 et merci pour votre réponse.

    Je vous donne l'exemple de ma colonne de menu qui est fonctionnel (avec les retours BDD automatique selon le contenu inséré).
    Je voudrai reproduire ce même schéma pour les articles en visuel pour être plus précis au problème.

    Menus barre :
    Pièce jointe 608783

    le code :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    if(isset($_GET['categorie'])){
            $categorie = trim($_GET['categorie']);
    	if($categorie == $retcat){
    		$req = "SELECT COUNT(*) AS nbr_id FROM ".$categorie." WHERE id";
    		$sql = $pdo->prepare($req);
    		$sql->execute();
    		while($retnbr = $sql->fetch(PDO::FETCH_ASSOC)){
    			if($retnbr['nbr_id']>0){
    				echo'
    				<div style="padding:0.1vw;height:20px;position:relative;">
    					<a href="shop-online.php?categorie='.$categorie.'">
    						<div class="'.$sty2.'" style="float:left;">'.$categorie.'</div>
    						<div class="'.$sty_ok.'" style="float:right;margin:5px;"></div>
    					</a>
    				</div>';
    				$req = "SELECT DISTINCT genre FROM ".$categorie." ORDER BY genre ASC";
    				$sql = $pdo->prepare($req);
    				$sql->execute();
    				while($retgenre = $sql->fetch(PDO::FETCH_ASSOC)){
    					if(isset($_GET['genre'])){
    						$genre = trim($_GET['genre']);
    						if($retgenre['genre']==$genre){
    						        echo'
    							<a href="?categorie='.$categorie.'&genre='.$retgenre['genre'].'">
    								<div class="'.$ss_cat2.'" style="padding-left:1.5vw;background-color:white;">'.$retgenre['genre'].'</div>
    							</a>';
    						}
    						else{
    							echo'
    							<a href="?categorie='.$categorie.'&genre='.$retgenre['genre'].'">
    								<div class="'.$ss_cat1.'" style="padding-left:1.5vw;background-color:white;">'.$retgenre['genre'].'</div>
    							</a>';
    						}
    					}
    					else{
    						echo'
    						<a href="?categorie='.$categorie.'&genre='.$retgenre['genre'].'">
    							<div class="'.$ss_cat1.'" style="padding-left:1.5vw;background-color:white;">'.$retgenre['genre'].'</div>
    						</a>';
    					}
    				}
    				$req = ("SHOW TABLES");
    				$sql = $pdo->prepare($req);
    				$sql->execute();
    				while($retcat = $sql->fetch(PDO::FETCH_COLUMN)){
    					if($retcat !== $categorie AND $retcat !=='connecter' AND $retcat !=='events' AND $retcat !=='livredor' AND $retcat !=='membres'){
    						echo'
    						<div style="padding:0.1vw;height:20px;position:relative;">
    							<a href="shop-online.php?categorie='.$retcat.'">
    								<div class="'.$sty1.'" style="float:left;">'.$retcat.'</div>
    								<div class="'.$sty_no.'" style="float:right;margin:5px;"></div>
    							</a>
    						</div>';
    					}
    					else{}
    				}
    			}
    			else{
    				echo'
    			        <div style="padding:0.1vw;height:20px;position:relative;">
    					<a href="shop-online.php?categorie='.$categorie.'">
    						<div class="'.$sty2.'" style="float:left;">'.$categorie.'</div>
    						<div class="'.$sty_ok.'" style="float:right;margin:5px;"></div>
    					</a>
    				</div>';
    				echo'
    				<a href="?categorie='.$categorie.'">
    					<div class="'.$ss_cat_no.'" style="padding-left:1.5vw;background-color:white;"> Indisponible </div>
    				</a>';
    				$req = ("SHOW TABLES");
    				$sql = $pdo->prepare($req);
    				$sql->execute();
    				while($retcat = $sql->fetch(PDO::FETCH_COLUMN)){
    					if($retcat !== $categorie AND $retcat !=='connecter' AND $retcat !=='events' AND $retcat !=='livredor' AND $retcat !=='membres'){
    						echo'
    						<div style="padding:0.1vw;height:20px;position:relative;">
    							<a href="shop-online.php?categorie='.$retcat.'">
    								<div class="'.$sty1.'" style="float:left;">'.$retcat.'</div>
    								<div class="'.$sty_no.'" style="float:right;margin:5px;"></div>
    							</a>
    						</div>';
    					}
    					else{}
    				}
    			}
    		}
    	}
    	else{}
    	}
    else{
    	echo'
    	<div style="padding:0.1vw;height:20px;position:relative;">
    		<a href="shop-online.php?categorie='.$retcat.'">
    			<div class="'.$sty1.'" style="float:left;">'.$retcat.'</div>
    			<div class="'.$sty_no.'" style="float:right;margin:5px;"></div>
    		</a>
    	</div>';
    }
    Donc pour ma question j'ai suivi ce même procédé mais les while des objets ne se font pas...

    Je vous met la table BDD avec son contenu :
    Nom : tab-cat.JPG
Affichages : 89
Taille : 14,5 Ko

    Si l'on regarde la colonne objet, il y a 2 objets associés au genre " lapin " .

    J'ai testé votre code en le modifiant légèrement mais il me retour un message erreur de parametre sur la 2 ème boucle while.

    Voici le code :

    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
    $req = "SELECT DISTINCT genre FROM ".$categorie." ORDER BY genre ASC ";
    	$sql = $pdo->prepare($req);
    	$sql->execute();
    	while($retcat = $sql->fetch(PDO::FETCH_ASSOC)){
    		echo'<div class="div-categorie">'.$retcat['genre'].'<br>';
    			$req = "SELECT DISTINCT objet FROM ".$categorie." WHERE genre='".$retcat['genre']."' ORDER BY objet ASC "; 
    // Aussi essayer sans =''$retcat['genre']" J'obtient bien chat->collier mais pas les autres genres chiens,lapins
    			$sql = $pdo->prepare($req);
    			$sql->execute($retcat['genre']); // erreur de paramètre ici. J'ai testé aussi sans rien le retour ce fais 
    			while($retour = $sql->fetch(PDO::FETCH_ASSOC)){
    				echo''.$retour['objet'].'';
    			}
    		echo'</div>';
    	}
    Nom : Cap1.JPG
Affichages : 80
Taille : 41,4 Ko

    Voilà plus de détails pour mieux comprendre mon souci...

    P.S. et par curiosité quelle serai le tout en 1 avec plus de php ?!

  5. #5
    Membre averti
    Homme Profil pro
    visiteur
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : visiteur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut Testé le code .
    Merci Séb.,
    Voici le résultat avec votre script ET c'est ce que je désirai exactement...
    Nom : Cap3.JPG
Affichages : 98
Taille : 25,4 Ko

    P.S Comme j'apprend un peu sur le tas les langages web.
    J'avais lu plusieurs fois sur des forums qu'il fallait éviter la fonction query...
    plutôt utiliser préparer sa requête puis exécuter. (peut être un peu mon erreur ici pour le retour BDD... J'utilisais depuis longtemps le query...) Laquelle est le mieux ?

    J'ai juste encore une question qu'y n'est pas trop dans le thème mais le même style de problème en soit...
    J'ai sur ma page galeries une fonction qui m'affiche les dossiers par events et miniatures pics avec un lightbox.
    Mais justement le même problème, la lightbox s'ouvre normal mais m'affiche les dernières images du dernier dossier de ma page.

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    J'avais lu plusieurs fois sur des forums qu'il fallait éviter la fonction query...
    plutôt utiliser préparer sa requête puis exécuter. (peut être un peu mon erreur ici pour le retour BDD... J'utilisais depuis longtemps le query...) Laquelle est le mieux ?
    Il faut utiliser les requêtes préparées quand tu as une même requête dans une boucle.
    Ou si tu as beaucoup de paramètres : ça te permet de les échapper automatiquement, plutôt que de faire un $pdo->quote() à la main sur chaque argument.
    Sinon aucun intérêt. Dans ton cas par ex., aucun intérêt.

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    J'ai sur ma page galeries une fonction qui m'affiche les dossiers par events et miniatures pics avec un lightbox.
    Mais justement le même problème, la lightbox s'ouvre normal mais m'affiche les dernières images du dernier dossier de ma page.
    Pas compris. Ouvre une nouvelle discussion avec une illustration du problème et de ce que tu voudrais avoir.

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

Discussions similaires

  1. Retour BDD dans mail ecraser
    Par cretinus007 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/05/2014, 19h37
  2. Design d'une bdd / colonnes "extensibles"
    Par vincent.le dans le forum Administration
    Réponses: 3
    Dernier message: 23/04/2011, 15h27
  3. Masquer des colonnes imbriquées
    Par Patersson dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 09/02/2010, 19h59
  4. dataTable avec colonnes imbriquées
    Par khaoula_14_05 dans le forum JSF
    Réponses: 2
    Dernier message: 02/04/2008, 16h28
  5. Réponses: 13
    Dernier message: 30/11/2004, 06h16

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