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 :

Solution pour réaliser un index


Sujet :

PHP & Base de données

  1. #21
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Techniquement, le ON n'est pas obligatoire avec INNER JOIN. Mais ça revient à ne pas mettre de condition de jointure, ce qui va donc te remonter un produit cartésien des deux tables.
    Autrement dit, tu vas avoir tous les contacts de la base sans restriction.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 65
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Elle ne va pas se créer toute seule !

    A un moment donné, il faut arrêter de jouer aux apprenti-sorciers !
    Il n'y a rien de magique ici !

    Si je reprends l'exemple montré :
    • table contact_activites : ID_CONTACT / ID_ACTIVITE_ASSOCIE
    • Tu dois avoir au moins une ligne avec : 5 / 1
    La table a bien été crée au préalable :
    j'ai mis 3 lignes dedans qui correspondent à ce script là :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT activite.ID as activite_id, contact.ID as contact_id 
    FROM activite, contact 
    WHERE contact.ID = activite.CONTACT1 OR contact.ID = activite.CONTACT2 OR contact.ID = activite.CONTACT3
    Une ligne 5/1, 5/2, 5/4 qui corresponde à des valeurs que j'ai rentré dans la base pour faire mes tests.

    Je pense que tu m'as mal compris, je voulais plus dire que l'instruction n'a pas été appelé dans le code :
    Elle est appelée l.7 avec le LEFT JOIN mais moi j'aurai besoin de l'appeler pour mettre une condition sur la table contact dans le INNER JOIN à la l.6.
    Je sais pas si tu m'as compris

    Citation Envoyé par jreaux62 Voir le message
    "INNER JOIN contact...." sans "ON..." ça ne risque pas de fonctionner !
    Citation Envoyé par Celira Voir le message
    Techniquement, le ON n'est pas obligatoire avec INNER JOIN. Mais ça revient à ne pas mettre de condition de jointure, ce qui va donc te remonter un produit cartésien des deux tables.
    Autrement dit, tu vas avoir tous les contacts de la base sans restriction.
    Je comprends mieux pourquoi j'ai cette affichage quand je souhaite afficher tous les contacts en même temps, il me manque une condition

    EDIT : Je poste la requête avec la condition
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT activite.LIBELLE, association.LIBELLE, activite.SITEWEB, activite.EMAIL, activite.DESCRIPTION, activite.TARIF_ACTIVITE, contact.NOM
    FROM activite
    INNER JOIN association ON (activite.ASSOCIATION = association.ID)
    INNER JOIN rubrique ON (activite.RUBRIQUE = rubrique.ID)
    INNER JOIN contact ON (contact.ID = contact_activites.ID_CONTACT)
    LEFT JOIN contact_activites ON (contact.ID = contact_activites.ID_CONTACT AND activite.ID = contact_activites.ID_ACTIVITE_ASSOCIE) 
    WHERE activite.RUBRIQUE = 2

    Error : #1054 - Unknown column 'contact_activites.ID_CONTACT' in 'on clause'

  3. #23
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Attention, l'ordre des tables est important : tu ne peux pas utiliser une table qui n'est pas encore apparue dans la requête. Le plus simple est donc de toujours écrire dans l'ordre
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    from table_A join table_A_B join table_B
    Ton ancienne requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT activite.ID as activite_id, contact.ID as contact_id 
    FROM activite, contact 
    WHERE contact.ID = activite.CONTACT1 OR contact.ID = activite.CONTACT2 OR contact.ID = activite.CONTACT3
    devient
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT activite.ID as activite_id, contact.ID as contact_id 
    FROM activite
    LEFT JOIN contact_activites ON (activite.ID = contact_activites.ID_ACTIVITE_ASSOCIE) -- liaison entre activite et contact_activite
    INNER JOIN contact ON (contact_activites.ID_CONTACT = contact.ID) -- liaison entre contact_activite et contact
    A noter que ta requête va renvoyer pour une activité donnée autant de lignes qu'il y a de contacts associés à l'activité.
    Exemple, si tu as activite1 liée à contactA et contactB et activite2 liée à contactA, contactC et contactD, ta requête devrait renvoyer
    activite1 - contactA
    activite1 - contactB
    activite2 - contactA
    activite2 - contactC
    activite2 - contactD
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 65
    Points : 31
    Points
    31
    Par défaut
    Ah oui !
    Il faut le faire en deux fois en passant par la table contact_activites ...
    Merci beaucoup !

    Donc du coup j'ai pu refaire mon autre requête en s'aidant de celle là :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT activite.LIBELLE, association.LIBELLE, activite.SITEWEB, activite.EMAIL, activite.DESCRIPTION, activite.TARIF_ACTIVITE, contact.NOM
    FROM activite
    INNER JOIN association ON (activite.ASSOCIATION = association.ID)
    INNER JOIN rubrique ON (activite.RUBRIQUE = rubrique.ID)
    LEFT JOIN contact_activites ON (activite.ID = contact_activites.ID_ACTIVITE_ASSOCIE)
    LEFT JOIN contact ON (contact.ID = contact_activites.ID_CONTACT)
    WHERE activite.RUBRIQUE = 2

    Et j'obtiens bien comme résultat toutes les informations dont j'ai besoin ainsi que les contacts même si il y'en a pas.

    Bon maintenant que ça sa fonctionne j'ai un dernier petit soucis à régler :
    En voulant ajouter un contact dans une association qui en possède déjà un j'ai remarqué qu'il ne s'affichait pas dans la table...
    Comment afficher si il y a un deuxième (voir un nème) contact ?

  5. #25
    Invité
    Invité(e)
    Par défaut
    En faisant la requête qui va bien...


    Mais si tu ne montres pas ton code, comment veux-tu qu'on le corrige ?

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 65
    Points : 31
    Points
    31
    Par défaut
    Je me suis trompé, ce n'est pas que je n'obtiens pas le résultat, c'est que j'obtiens deux fois la même ligne avec uniquement le contact qui est modifié.

    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
    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
     
    $req2 = $bdd->prepare('SELECT DISTINCT activite.LIBELLE as activite, association.LIBELLE as association, activite.SITEWEB as siteweb, activite.EMAIL as email, activite.DESCRIPTION as description, activite.TARIF_ACTIVITE as tarif, contact.NOM as contact
    FROM activite
    INNER JOIN association ON (activite.ASSOCIATION = association.ID)
    INNER JOIN rubrique ON (activite.RUBRIQUE = rubrique.ID)
    LEFT JOIN contact_activites ON (activite.ID = contact_activites.ID_ACTIVITE_ASSOCIE)
    LEFT JOIN contact ON (contact.ID = contact_activites.ID_CONTACT)
    WHERE activite.RUBRIQUE = :rubrique_id');
     
    	while($libelle = $req2->fetch())
    	{
    		// Affichage NOM activité (NOM association)
    		$activite_association = $libelle['activite'] . ' (' . $libelle['association'] . ')' . '</br>';
    		echo $activite_association;
     
    		// Test SITEWEB
    		if($libelle['siteweb']!=NULL)
    		{
    			echo $libelle['siteweb'] . '</br>';
    		}
     
    		// Test EMAIL
    		if($libelle['email']!=NULL)
    		{
    			echo $libelle['email'] . '</br>';
    		}
     
    		// Test DESCRIPTION
    		if($libelle['description']!=NULL && $libelle['description']!=" ")
    		{
    			echo $libelle['description'] . '</br>';
    		}
     
    		// Test TARIF_ACTIVITE
    		if($libelle['tarif']!=0 && $libelle['tarif']!=NULL)
    		{
    			echo 'Tarif activité : ' . $libelle['tarif'] . '€ </br>';
    		}
     
    		// Test CONTACT
    		if($libelle['contact']!=NULL)
    		{
     
    			echo 'Contact 1 : ' . $libelle['contact'] . '</br>';
    		}
     
    		echo '</br>';
    		?>
    		</div>
    		<?php
    	}

    Peut-être faut-il que je rajoute sur chaque if une condition pour éviter les doublons ?
    Puis sinon j'ai la même association d'affiché plusieurs fois avec juste le nom du contact qui change.

  7. #27
    Invité
    Invité(e)
    Par défaut
    Oui, c'est ce que Celira a expliqué plus haut.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	$nom_activite_courante = ''; // initialisation
    	while($libelle = $req2->fetch())
    	{
     
    	   if( $libelle['activite'] != $nom_activite_courante )
    	   {
    	      $nom_activite_courante = $libelle['activite']; // "nouvelle activité" : on affecte le nouveau nom
     
    	      // ICI, on affiche les INFOS qui concernent la "nouvelle activité" (SAUF les CONTACTS)
     
    	   }
    	      // ICI, on affiche le(s) CONTACT
    }

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 65
    Points : 31
    Points
    31
    Par défaut
    Merci bien ça fonctionne parfaitement !!

    Par contre imaginons que je souhaite faire un div pour styliser un peu la page. Le div prendrai du nom de l'activité jusqu'au dernier contact de l'activité (en gros tout le while sauf que le while fait plusieurs boucles si il y a plusieurs contacts) est-ce que tu aurais une idée pour faire ça aussi (si tu vois ce que je veux dire) ?

    En tout cas merci pour toute l'aide apportée !
    J'y vois un peu plus clair au niveau des requêtes et des boucles.

  9. #29
    Invité
    Invité(e)
    Par défaut
    Bon.

    Perso, je n'aime pas les requêtes trop compliquées... ni les prises de tête...
    Du coup, je ferais simplement 2 requêtes :
    • UNE pour les activités (sans les contact) -> on boucle
    • UNE (dans la boucle) pour les contacts de chaque activité (sachant que la préparation de la requête se fait une seule fois, en dehors de la boucle)

    Et là, plus de problème à se demander comment faire ses boucles... et tant pis pour les puristes

Discussions similaires

  1. [HOOK] Problème(s) pour réaliser le tutoriel sur les HOOKS
    Par Rodrigue dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/07/2016, 18h22
  2. Réponses: 3
    Dernier message: 12/11/2012, 11h33
  3. Réponses: 12
    Dernier message: 12/10/2009, 14h21
  4. Réponses: 21
    Dernier message: 30/08/2004, 17h07
  5. [Kylix] solution pour kylix3 OE BCB sous mdk 9.2
    Par raggadoll dans le forum EDI
    Réponses: 3
    Dernier message: 28/01/2004, 16h26

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