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 :

Eviter les doublons ou mettre à jour suivant le cas


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Eviter les doublons ou mettre à jour suivant le cas
    Bonjour à tous,

    Je dispose d'une base de donnée MySQL dand laquelle j'ai une table personne dont la structure ressemble à ceci :



    Que je remplis à l'aide d'un tableau de tableaux qui ressemble à 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
    Array
    (
        [0] => Array
            (
                [0] => 147054261234567
                [1] => DURAND
                [2] => Pierre
                [3] => 1980-01-12
            )
     
        [1] => Array
            (
                [0] => 510893812345678
                [1] => DUPOND
                [2] => Anne
                [3] => 1958-10-12
            )
     
        [2] => Array
            (
                [0] => 519906987451895
                [1] => MARTIN
                [2] => Jacques
                [3] => 1991-01-14
    )

    Via ce script PHP :
    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
    connexionBdd();
     
     // Insertion des données dans la table
    foreach ($valeursExtraites as $valeurs) {
     
        $ligne = "'".implode("','",$valeurs)."'\n";
     
        $requete = mysql_query('
     
            INSERT INTO `maBase`.`maTable` (
                `pers_NNI` ,
                `pers_nom` ,
                `pers_prenom` ,
                `pers_dateGm` 
                                            )
            VALUES (
                '.$ligne.'
                   );'
                              );
     
            if(!$requete) die ('Erreur dans la requete : ' . mysql_error());
    }
    mysql_close();
    Cela fonctionne bien, mais :

    • si une entrée existe déjà dans la table, j'aimerai qu'elle ne soit pas insérée
      --> SAUF dans le cas où seule la date diffère dans ce cas il faudra mettre à jour la date.
    • 2 personnes différentes peuvent avoir : pers_NNI identique en ayant pers_nom, pers_prenom et/ou pers_dateGm différents.


    Je ne peux donc pas mettre pers_NNI en clef primaire. Je dois gérer les homonymes.
    En fait, le seul "couple" unique est : pers_NNI ET pers_nom ET pers_pernom

    Je n'y arrive pas, quelqu'un pourrait-il m'aider ?

  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
    Fais un SELECT avant pour voir si ta ligne existe déjà et en fonction du résultat fait un INSERT ou un UPDATE.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    dans ton insertion, ajoute la clause 'on duplicate key update' avec en paramètre "date='$date'", la clef étant par exemple le nom de la personne avec son prénom^^ (pas regardé le détail de ton code).

    Donc, avant insertion, ça vérifiera si la clef existe déjà, donc l'entrée, identifiée par nom+prenom (dans l'hypothèse actuelle). Si la clef n'existe pas, ça insère, si elle existe, ça ne fait qu'updater la date. Ajoute d'autres champs dans la dernière clause si tu ne veux pas qu'updater la date.

    en ce qui me concerne, je met ça dans toutes mes requêtes.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses.

    ON DUPLICATE KEY UPDATE semblait allechante mais la documentation MySQL indique que la clef spécifiée dans la clause doit être UNIQUE ou PRIMAIRE :

    Citation Envoyé par MySQL 5.5 Manual
    If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed
    Comme je l'ai dit, je ne peux mettre aucune de mes clef en unique ou en primaire.

    Je vais donc opter pour la solution de sabotage.

    Sujet résolu, merci pour vos réponses

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Je ne peux donc pas mettre pers_NNI en clef primaire. Je dois gérer les homonymes.
    Je ne vois pas en pourquoi une homonyme empêcherait d'avoir une clé primaire.

    Sauf erreur, une homonyme veut dire qu'il y a une similitude, comme avoir 2 fois le même nom, prénom voir même la même date de naissance, mais ça ne veut pas dire que c'est la même personne.


    Je dirais même que c'est tout l'inverse, c'est à cause du problème d'homonyme qu'il faut garantir l'unicité de chaque lignes en créant une clé primaire (une ID unique).

    Une personne est unique, il ne peu en avoir 2, non (homonyme ou pas) ?
    Ou alors il y a un truc que je ne pige pas.

  6. #6
    Invité
    Invité(e)
    Par défaut
    on dit un homonyme

    Non non rien à voir, je me suis mal exprimé. Les deux phrases ne sont pas liées entre elles. Je voulais dire
    Je ne peux donc pas mettre pers_NNI en clef primaire. D'autre part, je dois gérer les homonymes.
    Ce qu'il fallait comprendre, c'est que pers_NNI n'est pas unique : deux personnes peuvent avoir le même numéro de sécurité sociale (le cas des enfants assurés par leur parents) voire le même numéro de sécu ET la même date de naissance (cas des jumeaux ayant le numéro de sécu d'un des parents).

    Quand je disais que je devais gérer les homonymes, c'était pour dire que je ne pouvais mettre les champs nom ou prenom en UNIQUE ou PRIMAIRE
    Dernière modification par Invité ; 15/07/2010 à 10h44.

Discussions similaires

  1. Après importation, eviter les doublons
    Par uloaccess dans le forum Access
    Réponses: 6
    Dernier message: 16/11/2005, 16h36
  2. [Débutant][XSLT]Eviter les doublons
    Par leminipouce dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/10/2005, 11h34
  3. hash et Tie , eviter les doublons
    Par bluecurve dans le forum Langage
    Réponses: 5
    Dernier message: 12/10/2005, 16h39
  4. Eviter les doublons
    Par cyrill.gremaud dans le forum ASP
    Réponses: 5
    Dernier message: 14/09/2005, 12h37
  5. [langage] 2 fichier dans 1 en evitant les doublons
    Par remixxl dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 17h05

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