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 :

doublons et array_unique [Débutant(e)] [MySQL]


Sujet :

PHP & Base de données

  1. #1
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut doublons et array_unique
    Bonjour,

    J'ai créé un table Cartes_postales qui contient pour chaques cartes_postales le numéro de la carte, le nom de commune, la date, le format...+ 3 thèmes (pour éviter d'avoir à construire une table Theme à part) :Theme1, Theme2, Theme3 qui peuvent être complétés ou non (selon qu'il y ai ou non plusieurs thèmes à identifier sur la même carte).
    Ca donne du genre
    Carte_postale1:Commune A : Theme1: pont
    Theme2: femme
    Theme3: null
    Carte postale2:CommuneA : Theme1:gare
    Theme2:pont
    theme3: femme

    Donc pour la commune A, le même mot 'pont' peut se retrouver en theme1 puis en theme2...ce qui me crée des problèmes de doublons
    Le formulaire de recherche se fait d'abord par nom de commune ( on sélectionne toutes cartes pour une commune), dans la réponse en php, je séléctionne les thèmes identifiés sur les cartes de la commune choisie.
    Ces thèmes apparaissent à l'intérieur du menu déroulant d'un nouveau formulaire dans la reponse.php (pour servir à une nouvelle recherche affinée)
    Le problème est qu'à l'affichage même en utilisant distinct Theme1, Theme2 ect...ou Group by j'ai des doublons parceque par exemple le mot 'pont' n'apparait qu'une fois en theme1 et qu'une fois en thème 2 sur les cartes du coup le menu déroulant récupère plusieur fois le même mot.
    J'ai entendu dire que la fonction array-unique pouvait éviter les doublons mais je débute et n'ai pas tout compris.
    Si quelqu'un peut me dire comment adapter mon script pour éviter ces répétitions,à moins qu'il n'y ai pas d'autres moyens que de créer une nouvelle table themes à part?
    Merci d'avance

    Voilà mon script:
    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
     
    <?php
          /* Excution de la requte */
     
    $choix = $_POST ['communes'];
    if ($choix !="")
    $finrequete = " Nom_commune LIKE '%$choix%'";
    $sql="SELECT DISTINCT Theme1, Theme2, Theme3, Theme4, Theme5 FROM Cartes_postales 
    WHERE $finrequete ORDER BY Theme1,Theme2, Theme3, Theme4, Theme5 ";
     
    $resultat=mysql_query($sql,$bd);
     
    if ($maligne=mysql_fetch_array($resultat)){
     
    echo "<H4><a href=formulaire_cartes_postales.html>Nouvelle recherche</a></H4>";    
     
        echo ' 
    <div id=divprecis1>
    
    <H3> Affiner le r&eacute;sultat par th&egrave;me:</H3> 
    <H3><form method="post" action="commune_theme.php"></H3> 
    <select name="communes" id="communes">
    <option value="'.$choix.'">'.$choix.'</option></select>
    <select name="themes" id="themes">';
    do{
    echo '<option value="'.$maligne['Theme1'].'">'.$maligne['Theme1'].'</option>
    <option value="'.$maligne['Theme2'].'">'.$maligne['Theme2'].'</option>
    <option value="'.$maligne['Theme3'].'">'.$maligne['Theme3'].'</option>';
     
     
    }while ($maligne=mysql_fetch_array($resultat));
    }
    echo '</select>';
    echo'
    <input name="valider" type="submit" id="submit" value="valider"> 
    </form>';
    echo '</div>';
    ?>

  2. #2
    Membre éclairé Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Par défaut
    Bonjour,

    Si j'ai bien compris, tu veux afficher un select avec tous les thèmes utilisés?
    alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do{
    echo '<option value="'.$maligne['Theme1'].'">'.$maligne['Theme1'].'</option>
    <option value="'.$maligne['Theme2'].'">'.$maligne['Theme2'].'</option>
    <option value="'.$maligne['Theme3'].'">'.$maligne['Theme3'].'</option>';
     
     
    }while ($maligne=mysql_fetch_array($resultat));
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    do{
    $themes[]=$maligne['Theme1'];
    $themes[]=$maligne['Theme2'];
    $themes[]=$maligne['Theme3'];
    }while ($maligne=mysql_fetch_array($resultat));
    $themes = array_unique ($themes);
    foreach($themes as $theme){
    echo '<option value="'.$theme.'">'.$theme.'</option>
    ';
    }
    J'espère que ça va marcher,

    @+

  3. #3
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut [débutant] doublons et array_unique
    Malheureusement y a toujours les doublons , merci quand même, à moins que tu ai une autre idée??

  4. #4
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut
    euh..., j'ai parlé un peu trop vite, ça marche en fait !, merci beaucoup

    Du coup, j'aurai une autre question toujours sur l'affichage dans le menu déroulant: c'est qu'entre les réponses lorsque pour une carte aucun thème particulier n'a été enregistré ça affiche la réponse vide en blanc ce qui n'est pas très esthétique en plus ça peut faire penser que la liste est vide.

    Saurais-tu comment éviter ce problème? Merci encore pour ta réponse rapide

  5. #5
    Membre éclairé Avatar de spilliaert
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     do{
    $themes[]=$maligne['Theme1'];
    $themes[]=$maligne['Theme2'];
    $themes[]=$maligne['Theme3'];
    }while ($maligne=mysql_fetch_array($resultat));
    $themes = array_unique ($themes);
    foreach($themes as $theme){
    if(trim($theme)!="")
    echo '<option value="'.$theme.'">'.$theme.'</option>
    ';
    }

  6. #6
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Bonsoir,

    array_unique() est sensible à la casse : Femme != femme.
    Donc
    Tu transformes tout ce que tes clients te donnent comme thème en majuscule/minuscule.
    Tu supprimes les espaces inutiles.
    Tu pries pour qu'ils soient tous des génies de l'ortograf (orthograf) (orthograph) ...

    Conclusion : tu leur offre une liste de choix et tu es obligé de la gérer. Même si c'est toi qui enregistre les cartes postales, tu n'es pas à l'abri d'une erreur dans l'écriture d'un thème.

    Quant à la ligne vide il "suffit" que tu testes la présence de la variable

  7. #7
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut [débutant] order by et array-unique
    Toujours avec le même script j'ai un problème d'affichage par ordre alphabétique qui est lié à la même raison:

    ça se range par ordre alphabétique mais par cartes_postales sans prendre en compte tous les thèmes de toutes les cartes de la commune sélectionnée.
    ça donne par exemple comme résultat: les deux premiers thèmes (Theme1 et Theme2 ) de la première carte par ordre alphabétique et les thèmes de la carte suivante dans leur propre ordre sans ordonner la totalité des thèmes ect...
    Ca donne à l'affichage
    Eglise
    Place

    Enfant
    Fontaine

    Peut-être pourrais tu m'expliquer comment résoudre ce problème?
    Voici la partie de mon script concernée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $sql="SELECT DISTINCT Theme1, Theme2, Theme3, Theme4, Theme5 FROM Cartes_postales WHERE (Theme1 IS NOT NULL OR Theme2) AND 
     
    $finrequete GROUP BY Theme1, Theme2 ORDER BY Theme1, Theme2, Theme3, Theme4, Theme5 ";
    Merci encore pour ta réponse précédente. Nal

  8. #8
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut
    Par rapport à ce que tu me disais sur la ligne vide et tester la variable, tu veux dire en faisant if isset ($themes) avant l'exécution de la requête ou en la déclarant vide : if(empty($themes)) j'avoue me mélanger un peu ...

  9. #9
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Si tu utilises la solution de Spilliaert, tu ne devrais plus avoir de problème de ligne vide puisqu'il vérifie que trim(variable) n'est pas la chaine vide.

    Empty() a un comportement que je n'aime pas trop, par exemple la valeur 0 (zero) est considérée comme vide.

    isset() pour vérifier qu'une variable existe, trim et !="" pour vérifier qu'une variable est "vide".

    Pour ordonner le tableau arsort() sort() asort() ...

  10. #10
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut
    Pour les lignes vides c'est réglé, merci

    par contre pour ordonner les cartes je ne comprends pas bien

    comment utiliser asort () ... pourrais tu me préciser un peu plus à quelle fonction ça correspond?

  11. #11
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Toujours en utilisant la solution de Spilliaert tu obtiens un tableau $themes.
    Si tu appliques la fonction sort() sur le tableau tu obtiendras un nouveau tableau trié par ordre croissant. Si tu préfere l'ordre décroissant, utilise rsort()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sort($themes);
    foreach($themes as $theme){
    if(trim($theme)!="")
    echo '<option value="'.$theme.'">'.$theme.'</option>';
    }

  12. #12
    nal
    nal est déconnecté
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 129
    Par défaut
    J' avais placé le sort($themes) après foreach donc ça risquait pas de marcher...mais là c'est bon tout fonctionne!

    Merci beaucoup à tous les deux vous m'enlevez une grosse épine du pied car je suis en stage...

    Bonsoir et merci encore

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

Discussions similaires

  1. Requete de comptage de doublons spéciale
    Par COliveOnTheNet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2003, 10h11
  2. PB: Insertion de doublon
    Par maxvador dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/09/2003, 12h07
  3. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  4. tri a bulle sans les doublons
    Par comme de bien entendu dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/03/2003, 16h29
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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