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 :

Importation d'un csv dans une base de données. [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 52
    Points
    52
    Par défaut Importation d'un csv dans une base de données.
    Bonjour à tous,

    N'ayant pas trouvé de solution a mon problème, je vous l'expose ici.

    Je suis en train de créer une requête automatique pour importer un fichier csv qui lui même sera uploadé en automatique sur un serveur et que j'importerai donc pour alimenter ma base de données.

    J'ai réussi à le faire sans problème jusqu'à mon problème que je n'arrive pas à résoudre car je pense qu'il faut que j'utilise des expressions régulières pour enlever certains caractères spéciaux mais je ne sais vraiment pas comment ni où incorporer cette partie du script.
    Voici le code :
    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
    // ouverture de la connexion à la base 
    	mysql_connect("localhost","root","");
    	mysql_select_db("nom_de_la_bdd");
     
    // On vide la table désignée pour ne pas avoir de doublons lors de l'importation du nouveau fichier	
    	mysql_query("TRUNCATE TABLE `nom_de_la_table_a_vider`");
     
    //Le chemin d'accès du fichier sur le serveur
    $fichier = fopen("nom_du_fichier_a_importer.csv", "r");
     
    //tant qu'on est pas à la fin du fichier :
    while (!feof($fichier))
    {
    // On récupère toute la ligne
    $uneLigne = fgets($fichier, 1024);
     
    //On met dans un tableau les différentes valeurs trouvées (ici séparées par un ';')
    $tableauValeurs = explode(';', $uneLigne);
     
    // On crée la requête pour insérer les données (ici il y a 8 champs donc de [0] a [7])
    $sql="INSERT INTO nom_de_la_table VALUES ('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."',  '".$tableauValeurs[4]."','".$tableauValeurs[5]."', '".$tableauValeurs[6]."', '".$tableauValeurs[7]."')";
     
    $req=mysql_query($sql)or die (mysql_error());
    // la ligne est finie donc on passe à la ligne suivante (boucle)
    }
     
    //vérification et envoi d'une réponse à l'utilisateur
    if ($req)
    {
    	echo"Ajout dans la base de données effectué avec succès";
    }
    else
    {
    	echo"Echec dans l'ajout dans la base de données";
    }
     
    ?>
    Le gros problème est donc le suivant :
    Dans certains "$tableauValeurs" il y a des apostrophes comme dans les noms propres ("d'aston" par exemple), des parenthèses, etc qui gênent dans la requête sql et donc me renvoient un code d'erreur a cause de ca.

    La question est donc, comment puis je faire pour ne pas prendre en compte ces caractères spéciaux dans la requête tout en les insérant dans la table et ou dois je poser cette partie de script?

    Merci d'avance.

  2. #2
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    comment puis je faire pour ne pas prendre en compte ces caractères spéciaux dans la requête
    Utilise la fonction mysql_real_escape_string()
    La doc : http://php.net/manual/fr/function.my...ape-string.php


    Un petit conseil en passant, renseigne le nom des champs dans ta requête SQL, car si un jours tu rajoute un champ en l'intercalant, cette requête risque de partir en vrille ...
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO table (champ1, champ2, ... etc ...) VALUES ('val1', 'val2', ... etc ...)
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Merci a toi pour la réponse rapide. Cependant, comment et où dois je incorporer cette fonction?

    j'ai souvent du mal a transposer les exemples des manuels en code concrets qui me serviront... (noob direz vous et je dirai oui malheureusement.)

    Après pour la dénomination des champs etc, ils ne changeront jamais ainsi que la table. mais merci de l'info.

    Merci.

    P.S : je réponds après avoir testé plusieurs solutions évidement.

    Deuxieme édition : J'ai réussi a remplir la table voulue, seul souci c'est que ca m'affiche une erreur "undefined offset".
    Je vous laisse le code final qui pourrait peut etre servir a d'autre :
    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
    // ouverture de la connection à la base 
    	mysql_connect("localhost","root","");
    	mysql_select_db("nom_de_la_bdd");
     
    // On vide la table pour ne pas avoir de doublons lors de l'importation du nouveau fichier
    	mysql_query("TRUNCATE TABLE `nom_de_la_table_a_vider`");
     
    //Le chemin d'acces du fichier sur le serveur
    $fichier = fopen("nom_du_fichier_a_uploader.csv", "r");
     
    //tant qu'on est pas à la fin du fichier :
    while (!feof($fichier))
    {
    // On recupere toute la ligne
    $uneLigne = fgets($fichier, 1024);
     
    //On met dans un tableau les differentes valeurs trouvées (ici séparées par un ';')
    $tableauValeurs = explode(';', $uneLigne);
     
    // On crée la requete pour insérer les donneées (ici il y a 8 champs donc de [0] a [7])
    $sql="INSERT INTO nom_de_la_table VALUES ('".mysql_real_escape_string($tableauValeurs[0])."', '".mysql_real_escape_string($tableauValeurs[1])."', '".mysql_real_escape_string($tableauValeurs[2])."', '".mysql_real_escape_string($tableauValeurs[3])."', '".mysql_real_escape_string($tableauValeurs[4])."', '".mysql_real_escape_string($tableauValeurs[5])."', '".mysql_real_escape_string($tableauValeurs[6])."', '".mysql_real_escape_string($tableauValeurs[7])."')";
     
    $req=mysql_query($sql)or die (mysql_error());
    // la ligne est finie donc on passe à la ligne suivante (boucle)
    }
     
    //vérification et envoi d'une réponse à l'utilisateur
    if ($req)
    {
    	echo"Ajout dans la base de données effectué avec succès";
    }
    else
    {
    	echo"Echec dans l'ajout dans la base de données";
    }
     
    ?>
    Voila. si vous ave une idée pour supprimer l'erreur du offset undefine, je suis preneur aussi.

    Bonne journée a tous.

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2009
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Ok, tout marche affaire résolue.
    les undefine offset étaient en fait des soucis du fichier qui avait la derniere ligne vide... donc obligatoirment une erreur la dedans.

    Bonne continuation tout le monde en espérant que ce code aide d'autres personnes.

    [Résolu]

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

Discussions similaires

  1. [AC-2010] Importer un fichier csv dans une base de données existante ACCESS
    Par rossy1990 dans le forum Access
    Réponses: 2
    Dernier message: 16/04/2014, 02h38
  2. [Shell] import CSV dans une base de données.
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 18/01/2012, 21h14
  3. [MySQL] Import de fichiers CSV dans une base de données
    Par damdam00 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/07/2010, 15h05
  4. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  5. Amelioration d'une importation d'un CSV dans une base
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/04/2008, 09h44

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