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

EDI, CMS, Outils, Scripts et API PHP Discussion :

comment proposer plusieurs options pour un même champ


Sujet :

EDI, CMS, Outils, Scripts et API PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Par défaut comment proposer plusieurs options pour un même champ
    Bonjour,
    Je récupère des informations (petites annonces) dans des fichiers xml pour les rentrer dans ma base de données "ads manager".
    Quelquefois, les noms de catégories imposées permettant de classifier les annonces ne sont pas bien respectés. Par exemple, si le nom de catégorie imposé est demi lune(sans trait d'union) mais qu'il est noté dans le fichier xml demi-lune (avec trait d'union), dans l'exemple de code de mon script php ci-dessous, l'objet va passer systématiquement dans la catégorie "Autres trucs" au lieu de rentrer dans la catégorie demi lune.
    Comment pourrais-je faire pour proposer plusieurs options écrites dans le fichier xml pour un seul champ de ma base de données.


    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
    {
    				$advert = $adverts->advert[$var];
     
    				$dataAnnonceur["ref"]                 = $ref  = utf8_decode($advert["ref"]);
    				$dataAnnonceur["category"]            = $cat    = utf8_decode(trim($advert->advert_features->truc_category));
     
    				$sql2 = "SELECT id
    						FROM  `drlpo_adsmanager_categories` 
    						WHERE name = '$cat'";
     
    				echo "<br><span style=\"color:green\">".$sql2."</span><br/>";
     
    				$results =mysql_query($sql2) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
     
    				while($rows = mysql_fetch_array($results))
    				{
    					$res[] = (int)$rows[0];
    				 }
    				 if(empty($res))
    				   {
     
    					   $sql2 = "SELECT id
    						FROM  `drlpo_adsmanager_categories` 
    						WHERE name = 'Autres trucs'";
     
    						echo "<br><span style=\"color:green\">".$sql2."</span><br/>";
     
    						$results =mysql_query($sql2) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
     
    						while($rows = mysql_fetch_array($results))
    						{
    							$res[] = (int)$rows[0];
    						}

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    C'est plutôt à l'insertion qu'à la sélection qu'il faudrait régler ton problème, tenter de l'insérer vraiment à la catégorie demi lune même s'il est écrit demi-lune dans le fichier xml.

    Par exemple, avant de comparer les catégories, enlever les traits d'union :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str_replace("-"," ","demi-lune");
    Bien sur s'il y en a dans les deux sens, ça risque d'être compliqué...




    PS : le mieux, on est bien d'accord c'est que les deux soient écrits exactement de la même manière, que ce soit d'une façon ou d'une

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Par défaut
    Bonsoir,
    Si j'avais la possibilité de résoudre le problème en amont, ce serait très simple. Si je cherche a solutionner cette situation c'est parce que je reçois plusieurs fichiers xml chaque jour, lesquels sont automatiquement traités par un script php qui se lance automatiquement (tache cron).
    Donc je dois créer un tableau de correspondance, mais je ne sais pas comment faire.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Par défaut
    Bonjour Spartacusply,
    Bonjour à tous,

    Ta suggestion m' a bien aidé. J'ai avancé sur le sujet, mais je me heurte a un problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $cat = str_replace('Velo','Velo bleu', $cat);$cat = str_replace('Demi-Lune','demi lune', $cat);$cat = str_replace('Vélo rouge','Velo rouge', $cat);$cat = str_replace('Vélo Vert','Vert', $cat);;$cat = str_replace('Vélo','Cycle  ', $cat);
    Velo bleu pour Velo ne fonctionne pas (certainement du à la similitude du mot Velo)
    demi lune pour Demi-Lune c'est OK
    Vélo rouge pour Velo rouge (accent sur velo) ne fonctionne pas (certainement comme cas n°1)
    Vert pour Velo Vert ne fonctionne pas (similitude du mot Vert)
    Cycle pour Vélo c'est OK

    La solution existe certainement, mais je ne la connais pas...

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Je pense que dans donc cas il vaut mieux partir d'un mécanisme générique, plutôt qu'un qui traiterait les cas particuliers un par un.

    Je m'explique : générer une "clef" qui identifierait de manière certaine une catégorie, comparer deux catégories pour savoir si c'est les mêmes reviendrait à comparer leurs clefs. Si celles-ci sont identiques, alors on dit que c'est la même catégorie. La clef doit être simple, pour pouvoir ainsi dire que deux clef sont identiques au même titre que "1= 1". Ellle ne doit ainsi que de caractères numériques en minuscules (et éventuellement numériques).

    Voici un code simple pour expliquer :

    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
    <?php
     
    // Fonction qui supprime les accents
    // Elle est un peu compliquée, maais c'est la seule fonction qui remplace tous les accents par leurs équivalents sans accents
    function stripAccents($str = null, $encoding = 'UTF-8') {
        if (!is_string($str)) {
            return false;
        }
        /* transformer les caractères accentués en entités HTML */
        $str = htmlentities($str, ENT_NOQUOTES, $encoding);
     
        /* remplacer les entités HTML pour avoir juste le premier caractères non accentués 
         * Exemple : "&ecute;" => "e", "&Ecute;" => "E", "Ã " => "a" ... */
        $str = preg_replace('#&([A-za-z])(?:acute|grave|cedil|circ|orn|ring|slash|th|tilde|uml);#', '\1', $str);
     
        /* remplacer les ligatures tel que : Œ, Æ ... 
          Exemple "Å“" => "oe" */
        $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
        /* Supprime les espaces */
        $str = preg_replace('/\s/', '_', $str);
        /* Supprimer tout le reste */
        $str = preg_replace('#&[^;]+;#', '', $str);
     
        return $str;
    }
     
    function getKey($cat) {
        $cat = trim($cat);
        $cat = strtolower($cat);
        $cat = stripAccents($cat);
     
        //On supprime tous les caractères non alphanumérique
        $cat = preg_replace("#[^!A-Za-z0-9 ]+#", '', $cat);
     
        return $cat;
    }
     
    $cat1 = "DemiLune";
    $cat2 = "Demi - lune";
     
    if (getKey($cat1) == getKey($cat2)) {
        echo "Même catégorie !!";
    }

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Par défaut
    Merci Spartacusply,
    Je vais tester dans les prochains jours et ne manquerai pas de revenir vers toi.
    Par contre, je vais avoir une dizaine de comparaison à faire. Comment les imbriquer ?

Discussions similaires

  1. Entrée de plusieurs dates pour un même champ
    Par Veg91 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 30/10/2013, 11h48
  2. Réponses: 2
    Dernier message: 21/08/2008, 12h46
  3. [MySQL] insérer plusieurs valeurs pour le même champ
    Par fAdoua123 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/03/2008, 13h41
  4. Comment fusionner plusieurs callback pour un même objet graphique
    Par biquet dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 19/04/2007, 10h39
  5. Plusieurs valeurs pour un même champ
    Par will89 dans le forum Requêtes
    Réponses: 32
    Dernier message: 14/06/2006, 10h06

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