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 :

Actualiser une table à l'aide d'un fichier CSV [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Actualiser une table à l'aide d'un fichier CSV
    Bonjour à toutes et à tous

    je suis en train de concevoir un forum pour lequel je souhaite actualiser les comptes utilisateurs à l'aide d'une liste en CSV.

    Pour l'instant, j'ai réussi à faire un script qui ouvre mon fichier csv, en extrait les données et les envoie dans ma table des utilisateurs (voir le code ci-dessous)

    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
    $fichier = "liste.csv";
    if (file_exists($fichier))
         $fp = fopen("$fichier", "r"); 
    while (!feof($fp)) // on importe 
        { 
           $ligne = fgets($fp,4096); //On lit une ligne 
           $liste = explode( ";",$ligne);  
           $titre_text = $liste[0];
           $prenom_text = $liste[1];
           $nom_text = $liste[2];
           $email_text = $liste[3]; 
           //(...)
           $query = "INSERT INTO phpbb_users //(...)
           $result= MYSQL_QUERY($query);
         }
    Mais ce traitement est trop basique car ma table peut déjà contenir un compte pour une adresse email issue du CSV . Je voudrais donc créer un nouveau compte (nouvelle ligne dans ma base) seulement si l'email n'est pas déjà présent dans la base.Voyez-vous comment je pourrais m'y prendre ?

    Merci par avance !

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    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
    $fichier = "liste.csv";
    if (file_exists($fichier))
         $fp = fopen("$fichier", "r"); 
    while (!feof($fp)) // on importe 
        { 
           $ligne = fgets($fp,4096); //On lit une ligne 
           $liste = explode( ";",$ligne);  
           $titre_text = $liste[0];
           $prenom_text = $liste[1];
           $nom_text = $liste[2];
           $email_text = $liste[3]; 
           //(...)
           $requete="select * from phpbb_users where email='".$email_text."'";
           $exe=mysql_query($requete);
           if(mysql_num_rows($exe)==0){
           $query = "INSERT INTO phpbb_users //(...)
           $result= MYSQL_QUERY($query);
           }
         }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Bonjour et merci Raideman,

    j'ai essayé d'insérer ta portion de code dans mon script mais j'ai du faire erreur quelque part :

    j'ai testé d'insérer 3 comptes avec des adresses qui étaient déjà présentes dans la base et 2 nouveaux comptes ont été créés à tort.

    Si tu as le temps d'y jeter un coup, voici ma page :

    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
    <?php  
     
     // Connexion bdd 
       @mysql_connect($dbhost,$dbuser,$dbpasswd) or die("Impossible de se connecter à la base de données"); 
       @mysql_select_db($dbname); 
     
     
     
      // On ouvre le fichier à importer 
     $fichier = "liste.csv";
     if (file_exists($fichier))
         $fp = fopen("$fichier", "r"); 
     else
         { 
    	   echo "Fichier introuvable !<br>Importation stoppée.";
           exit();
         }
     
    	while (!feof($fp)) // Et Hop on importe 
        {  
         $ligne = fgets($fp,4096); 
         $liste = explode( ";",$ligne);  
         $titre_text = $liste[0];
         $prenom_text = $liste[1];
         $nom_text = $liste[2];
         $email_text = $liste[3]; 
     
    	 $requete="select * from phpbb_users where user_email='".$email_text."'";
         $exe=mysql_query($requete);
         if(mysql_num_rows($exe)==0)
     
    		   {	   
     
    		    //On crée l'identifiant de l'utilisateur
    			$sql = "SELECT MAX(user_id) as total
    					FROM phpbb_users";
     
    			$reponse = mysql_query($sql);
    			$donnees = mysql_fetch_array($reponse);
    			$user_id = $donnees['total']+1;
    			$email_text = trim($email_text);
    			$email_text = strtolower($email_text);
     
    		   // Ajouter un nouvel enregistrement dans la table  
    		   $date_inscription = time();
    		   $query = "INSERT INTO phpbb_users (user_id, user_active, user_level, user_regdate, user_date_bdd, user_timezone, user_style, user_lang, user_dateformat, user_login_tries, user_last_login_try, user_email, user_charte, user_titre, user_nom, user_prenom, user_compteur_lecteur) VALUES(" . $user_id . ", 0, 2, '', " . time() . ", '" . $board_config['board_timezone'] . "', 1, 'french', '" . $board_config['default_dateformat'] . "', 0, 0, '$email_text', 0, '$titre_text', '$nom_text', '$prenom_text', 0)";
     
     
    		   $result= MYSQL_QUERY($query); 
    		   }
     
    	  }
     
    ?>

  4. #4
    Membre actif Avatar de Momodedf
    Inscrit en
    Juillet 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 246
    Points : 221
    Points
    221
    Par défaut
    Ca marche rarement de recopier un code qu'on a pas pondu.

    Essaye plutot de comprendre ce qu'il t'a mis et de l'appliquer à ton appli.
    Ici les lignes importantes sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $requete="select * from phpbb_users where email='".$email_text."'";
           $exe=mysql_query($requete);
           if(mysql_num_rows($exe)==0){
    En clair aprés avoir récupéré l'email du nouvel user il selectionne toutes les lignes qui ont cet email dans ta table puis compte combien il y en a.
    Donc si le résultat du comptage est 0 tu peux insérer, sinon tu peux renvoyer une erreur à l'utilisateur.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    En clair aprés avoir récupéré l'email du nouvel user il selectionne toutes les lignes qui ont cet email dans ta table puis compte combien il y en a.
    Donc si le résultat du comptage est 0 tu peux insérer, sinon tu peux renvoyer une erreur à l'utilisateur.
    J'ai bien compris le rôle de cette portion de code, mais je ne vois ce qui cloche dans l'appli...

  6. #6
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    A mon avis, la solution qui est de loin la plus fiable est de vérifier cette contrainte au niveau de la base de données, par exemple en mettant le champ email en 'UNIQUE'
    Ainsi, lorsque tu exécutera l'import, les doublons éventuels déclencheront une erreur SQL.
    Le top étant évidemment d'intercepter cette erreur dans le code php pour la traiter si besoin (exemple : l'inscrire dans un fichier de log, ou encore faire un update à la place du insert, ... bref ce que tu veux). en plus ça t'évitera d'avoir des gros messages d'erreur php moches sur ton interface utilisateur

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Hervé Saladin Voir le message
    A mon avis, la solution qui est de loin la plus fiable est de vérifier cette contrainte au niveau de la base de données, par exemple en mettant le champ email en 'UNIQUE'
    Effectivement, c'est une bonne idée !
    Merci

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Grâce à l'aide de plusieurs forumeurs, j'ai pu avancer sur mon script.

    1 - je récupère toutes les adresses emails qui se trouvent dans la BDD et les stocke dans un tableau
    2 - je parcours mon fichier CSV ligne à ligne
    3 - il me reste à insérer la condition pour gérer la création ou non d'un nouveau compte dans la base :

    Si une adresse email n'est pas présente dans ma base
    je crée un compte dans la base
    Sinon
    je mets à jour le compte de l'utilisateur dans la base

    Voilà ci-dessous la portion de code concernée. Mais j'ai du me planter quelque part car ma page ne fonctionne pas...

    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
    <?php 
    while (!feof($fp)) // on importe  
        {   
         $ligne = fgets($fp,4096);  
         $liste = explode( ";",$ligne);   
         (...) 
         $email_text = $liste[3];  
     
        // on regarde si l'email existe déjà 
        if (in_array ($email_text, $emailsArray)  
     
             //On met à jour la fiche de l'utilisateur 
             { 
             $query = "UPDATE phpbb_users (user_titre, user_nom, user_prenom) VALUES('$titre_text', '$nom_text', '$prenom_text')";  
             $result= MYSQL_QUERY($query);  
             }          
        else 
            {         
             // Ajouter un nouvel enregistrement dans la table   
             $query = "INSERT INTO (...)
    Merci pour votre aide

  9. #9
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    La syntaxe de ta requête UPDATE est archi-fausse !
    Ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE table(champ1,champ2,champ3 ...)
    VALUES(valeur1,valeur2,valeur3,...)
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE table
    SET champ1 = valeur1,
    champ2 = valeur2,
    champ3 = valeur3,
    ...
    WHERE clePrimaire = identifiant
    ... c'est les bases du SQL !

    De plus, si tu m'avais bien lu, tu ne te compliquerais pas la vie pour rien à faire une requête de sélection et mettre son résultat dans un tableau pour comparer à chaque fois, ce qui, en plus, n'est pas très "propre".
    Si tu as bien mis ton champ email en UNIQUE, il suffit de faire :
    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
    while (!feof($fp)) {   
         $ligne = fgets($fp,4096);  
         $liste = explode( ";",$ligne);   
         (...) 
         $email_text = $liste[3];
     
         $requeteInsertion = "INSERT INTO ....";
     
         if(!@mysql_query($requeteInsertion))
               // voir la doc MySQL pour le code d'erreur retourné lors de la violation d'une contrainte UNIQUE,  ou la provoquer volontairement pour voir le code
              if(mysql_errno() == codeDerreur) {
                   $requeteMAJ = "UPDATE ...";
                   mysql_query($requeteMAJ );
              }
              else
                   print('Une erreur est survenue : '.mysql_errno().' : '.mysql_error());
    }

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Hervé Saladin Voir le message
    La syntaxe de ta requête UPDATE est archi-fausse !
    Mea culpa ! C'est vrai que sur ce coup là j'ai pas réfléchi du tout ().

    En tout cas merci bien pour ton aide. Grâce à toi et à ceux qui m'ont répondu avant, j'ai (enfin) réussi à pondre un script qui fonctionne

    Pour info l'erreur Duplicate entry porte le numéro 1062.

    Encore merci à tous

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

Discussions similaires

  1. [Google Maps] Créer une carte à l'aide d'un fichier .csv
    Par Prodiguy dans le forum APIs Google
    Réponses: 4
    Dernier message: 02/05/2013, 14h50
  2. [WD10] Actualiser une table fichier sur requête
    Par Mick16 dans le forum WinDev
    Réponses: 3
    Dernier message: 29/11/2011, 09h47
  3. [HTML] Parcours d'une table HTML pour creer un fichier CSV : comment faire ?
    Par Thomus38 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 28/06/2007, 12h19
  4. extraction d'une table au format d'un fichier csv
    Par smutmutant2003 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 06/06/2007, 16h55
  5. Réponses: 2
    Dernier message: 21/03/2006, 15h22

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