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 :

Affichage de résultat plusieurs fois [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut Affichage de résultat plusieurs fois
    Bonjour à tous,

    je développe une petite application de stockage de photo.
    Le problème vient de ma requète :

    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
    foreach($mots as $mot)
            {
    $sql.="SELECT * FROM afficher,doc,personnel WHERE  afficher.idqrqc = doc.idqrqc and doc.idqrqc=personnel.idqrqc and afficher.idqrqc=personnel.idqrqc and titre LIKE '%$mot%'
     
    UNION ";
     }
    //quand la boucle est terminée, il faut enlever le dernier union
    $sql=substr($sql,0,-6);
     
     
    $req = mysql_query($sql, $cnx) 
     		   or 
     		  die("Pb dans la requête : " . mysql_error($cnx));
    		 }
     
    $listeqrqc = mysql_fetch_object($req);
    Quand je fais une boucle while sur listeqrqc pour affiché les résultats sous forme de tableau, tous les résultats sont affichés plusieres fois.

    Au niveau de conception de la BD
    j'ai 3 tables, je récupere l'id de la premiere table (afficher) et je l'injecte dans la 2eme et 3eme table.

    Merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pourquoi faire une union plutôt que des OR ?

    De plus je vois mal la structure de ta table car tu lies personnel avec doc et afficher et doc et afficher encore entre eux.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Citation Envoyé par sabotage Voir le message

    Pourquoi faire une union plutôt que des OR ?
    je ne pense pas avoir les compétences pour te répondre

    De plus je vois mal la structure de ta table car tu lies personnel avec doc et afficher et doc et afficher encore entre eux.
    J'ai un formulaire qui alimente les 3 tables. Pour afficher tous le résultats, j'ai récupéré le idqrqc de la table afficher (AI) et je l'ai injecter dans les 2 autres tables (pour avoir un lien).
    je sais que peut etre c'est pas la bonne façon, mais ça a marché qu'on j'avais seulment 2 tables.
    exmple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql.="SELECT * FROM afficher,doc WHERE  afficher.idqrqc = doc.idqrqc  and titre LIKE '%$mot%'
     
    UNION "
    ;

    je ne comprend pas pour quoi ça marche pas pour 3.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Si la clef primaire est dans "afficher" alors "afficher" est joint à "personnel" et à "doc" mais pas "personnel" avec "doc" en plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $sql.="SELECT * FROM afficher
    JOIN doc ON afficher.idqrqc = doc.idqrqc
    JOIN personnel ON afficher.idqrqc=personnel.idqrqc";
     
    foreach($mots as $mot)  {
         $where_mots[] = 'titre LIKE %' . mysql_real_escape_string($mot) . '%';
    }
     
    if (isset($where_mots)) {
         $sql .= ' WHERE ' . implode (' OR ', $where_mots);
    }
     
    $req = mysql_query($sql, $cnx)
    Au passage l'extension mysql_ est obsolète, utilise mysqli ou PDO.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Merci pour l'idée de remplacer union par or et pour mysql_

    Par contre je n'ai toujours par réussi à régler le problème d'affichage.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu ne nous a pas montré le code d'affichage.

    Tu as testé la requête directement dans PHPmyadmin pour voir si le problème venait des résultat ou de l'affichage d'ailleurs ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    J'ai oublié de dire que je l'ai biensur testé la requète en sql et ça marche (la 1ere requète marche aussi).

    le problème vient comme j'ai dit au debut de l'affichage.

    je l'affiche avec une boucle while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $listeqrqc = mysql_fetch_object($req);
     
    while $listeqrqc

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($listeqrqc = mysql_fetch_object($req))
    {
        // ...
    }

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Oui dans ce genre

    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
    while ($listeqrqc) {
    	if ($numLigne % 2 == 0) 
    		echo "<tr class='pair P'>";
    	else
    		echo "<tr class='impair P'>";
     
     
     
    	echo "
     
    		<td style='width:5%; height:30px;'>$listeqrqc->date</td>
    		<td style='width:5%; height:30px;'>$listeqrqc->auteur</td>
    		<td style='width:5%; height:30px;'>$listeqrqc->code</td>
    		<td style='width:5%; height:30px;'>$listeqrqc->zone</td>
    		<td style='width:5%; height:30px;'>$listeqrqc->defaut</td>
    		<td style='width:35%; height:30px;' class='desc'>$listeqrqc->titre</td>
    		<td style='width:10%; height:30px;'>'<a  href='$listeqrqc->lien1'>Fichier n°1</a>'
    		 ";
    		 	$Lien2 = $listeqrqc->lien2 ;
    			$Lien3 = $listeqrqc->lien3 ;
    			$Lien4 = $listeqrqc->lien4 ;
    		 if($Lien2 !="" )
    				echo "<td style='width:10%; height:30px;'>'<a href='$Lien2'>Fichier n°2</a>'";
     
     
    		 if($Lien3 !="" )
    				echo "<td style='width:10%; height:30px;'>'<a href='$Lien3'>Fichier n°3</a>'";
     
     
    		 if($Lien4 !="" )
    				echo "<td style='width:10%; height:30px;'>'<a href='$Lien4'>Fichier n°4</a>'	
     
     
     
     
    	</tr>";
    	$listeqrqc = mysql_fetch_object($req);
    	$numLigne++;
    }

  10. #10
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Le truc est que ça a très bien marché pour 2 tables.

    Donc je pense que le problème vient de requète (sachant que je l'ai testée sur sql et elle donne les bons résultats).

  11. #11
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    ou plutôt 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    while ($listeqrqc = mysql_fetch_object($req))
    {
        $class = ($numLigne % 2) ? 'impair P' : 'pair P';
     
        // tu dois échapper tes données à l'affichage
        // je considère que tu es en utf-8
        $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
     
        $link_builder =
            function ($link_num) use ($listeqrqc)
            {
                $prop = "lien{$link_num}";
                return ($listeqrqc->$prop === '')
                           ? ''
                           : '<td style="width:10%; height:30px;"><a href="'.$listeqrqc->$prop.'">Fichier n°'.$link_num.'</a></td>';
            };
     
        echo
    <<<HTML
    <tr class="{$class}">
        <td style="width:5%; height:30px;">{$hsc($listeqrqc->date)}</td>
        <td style="width:5%; height:30px;">{$hsc($listeqrqc->auteur)}</td>
        <td style="width:5%; height:30px;">{$hsc($listeqrqc->code)}</td>
        <td style="width:5%; height:30px;">{$hsc($listeqrqc->zone)}</td>
        <td style="width:5%; height:30px;">{$hsc($listeqrqc->defaut)}</td>
        <td style="width:35%; height:30px;" class="desc">{$hsc($listeqrqc->titre)}</td>
        {$link_builder(1)}
        {$link_builder(2)}
        {$link_builder(3)}
        {$link_builder(4)}
    </tr>
    HTML;
     
        ++$numLigne;
    }
    Même si tu es sûr et certains des liens, ça ne mange pas de pain mais tu devrais quand même jouer la sécurité et construire tes url avec rawurlencode()

  12. #12
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Merci pour l'exemple.

    Malheursement le problème est toujours la, en+ avec ce que tu m'a donné, j'ai un résultat en moins (le 1er enregistrement).

    Donc en gros voila ce que j'ai :

    1er enregistrement ----> aucun affichage avec le code de rawsrc et un affichage avec l'ancien code

    2eme enregistremnt ----> le 1er et 2eme enregistrement sont affichés mais en double.

    3eme enregistrement ----> le 1 et 2 et 3eme enregistrement sont affichés mais en triple

    etc

  13. #13
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    poste le code avant le while.
    Et si tu as des doublons, c'est que ta requête SQL renvoie des doublons.

    Exécute ton SQL dans phpmyadmin par exemple et vois ce qu'elle retourne.

  14. #14
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    je l'ai déja fait au début, ça sert à rien que je poste tout le code parce que il est long.

    donc voila la requète dans le cas ou je coche rien dans le formulaire de recherche


    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
    blablabla
     $mots = explode(' ',$rec);                      
     
     $sql='';
    else {
     
    $sql.="SELECT * FROM afficher
    JOIN doc ON afficher.idqrqc = doc.idqrqc
    JOIN personnel ON afficher.idqrqc=personnel.idqrqc";
     
    foreach($mots as $mot)  {
         $where_mots[] = 'titre LIKE %' . mysql_real_escape_string($mot) . '%';
    }
     
    if (isset($where_mots)) {
         $sql .= ' WHERE ' . implode (' OR ', $where_mots);
    }
     
    $req = mysql_query($sql, $cnx)
     
    or 
     		  die("Pb dans la requête : " . mysql_error($cnx));
     
    }
     
     
     
     
     
     
     
    $listeqrqc = mysql_fetch_object($req);
     
    $ligne=mysql_num_rows($req);  // nous retourne le nombre de ligne ! 
     
     
    echo "<center>"."Nombre de QRQC = $ligne </p>" ;
     
     if( $ligne !=0)
     {
    //  fonctionAfficaheEnTableau($result,$champs) ;
    }else echo "il n'ya pas de QRQC pour cette recherche ééé !!" ;
     
     
    // affichage du résultat sous forme de tableau
    $numLigne = 1;
    echo "<table border='0'>";
    echo " <tr class='entete'>
          <td>Date</td>
          <td>Auteur</td>
          <td>Code</td>
          <td>Zone</td>
    	  <td>Défaut</td>
          <td style='height:40px;'>Description du problème</td>
          <td>Lien</td>
    	  <td>Lien 2</td>
    	  <td>Lien 3</td>
    	  <td>Lien 4</td>
        </tr> ";
     
    }

  15. #15
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    ben c'est ta requête qui renvoie les doublons : tu fais un WHERE LIKE %...% OR LIKE %...% OR ..., avec ce genre de SQL tu ne peux avoir que des doublons et plus dans 99% des cas.

    Essaie avec un SELECT DISTINCT ...

  16. #16
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    ben c'est ta requête qui renvoie les doublons : tu fais un WHERE LIKE %...% OR LIKE %...% OR ..., avec ce genre de SQL tu ne peux avoir que des doublons et plus dans 99% des cas.
    C'est un modérateur qui m'a donné l'idée des OR ...

    Malheursement je ne peux pas faire autrement parce que c'est un formulaire de recherche et donc j'ai des recherches + ou - avancées.

    j'ai essayer le DISTINCT au départ et ça a donné rien c'est pour ça que j'ai posté ce problème.

    la question qui me rend fou, pourquoi ça marche avec 2 tables et pas avec 3 ?!!!

  17. #17
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Mais ça marche avec 3 tables sinon t'aurais une erreur.
    Le truc c'est que ton SQL ne te renvoie pas ce que tu souhaiterais avoir.
    Tu dois retravailler ton SQL.

  18. #18
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    OK merci, je vais voir...

    Je pense que je vais fusionner 2 tables et c tt

    Merci pour tes conseils.

  19. #19
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    Salut,

    Si tu veux récupérer les résultats ayant au moins un des mots clés, le WHERE n'a rien a voir avec les doublons de résultat et la requête me paraît bien comme elle est.

    Peut-être tes conditions de jointure ?

    Cas concret :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM afficher
    JOIN doc ON afficher.idqrqc = doc.idqrqc
    JOIN personnel ON afficher.idqrqc=personnel.idqrqc

    S'il y a deux fiches personnel ayant le même code idqrqc que afficher.idqrqc OU deux fiches doc ayant le même code idqrqc que afficher.idqrqc, tu auras deux lignes.

    Imaginons que afficher.idqrqc = 1, si deux fiches personnel ont un idqrqc à 1, tu auras deux lignes avec ta jointure, dont toutes les infos de la table "afficher" seront doublées.

  20. #20
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 82
    Par défaut
    Non tout est bon !

    Le problème vient des conditions (il y en a telement que je n'arrive pas à les gérés)

    Bref merci à tous

    Je vais mettre résolu quand même.

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

Discussions similaires

  1. [MySQL] affichage des résultats de plusieurs requêtes
    Par Mathieu72 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/02/2007, 02h19
  2. [MySQL] Affichage des résultats d'une requête sur plusieurs pages
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2006, 13h24
  3. Réponses: 1
    Dernier message: 12/06/2006, 13h34
  4. [MySQL] Affichage impossible de plusieurs résultats
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 21/04/2006, 19h40
  5. [MySQL] Parcourir plusieurs fois le résultat de ma requête
    Par borgfabr dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/12/2005, 09h54

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