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

Langage PHP Discussion :

lire un csv pour l'envoyé dans une DBD


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Par défaut lire un csv pour l'envoyé dans une DBD
    Bonjour
    J’explique mon problème:
    Je dois lire un fichier CSV (meteo.csv) :
    exemple :
    2013-12-05;Paris;matin;ensoleillé;1;5;8;Temps ensoleillé mais frais
    2013-12-05;Paris;"Après_midi";Pluvieux;1;9;11;Une pluie fine est attendue
    2013-12-05;Paris;nuit;Nuageux;4;9;11;Temps Couvert
    2013-12-06;Paris;matin;Brumeux;1;12;13;Temps Brumeux
    2013-12-06;Paris;"Après_midi";ensoleillé;1;14;15;Temps Ensoleillé
    2013-12-06;Paris;nuit;Nuageux;4;9;11;Temps Nuageux
    2013-12-07;Paris;matin;Brumeux;1;12;13;Temps Brumeux
    2013-12-07;Paris;"Après_midi";ensoleillé;2;14;15;Temps Ensoleillé
    2013-12-07;Paris;nuit;Nuageux;4;9;11;Temps Nuageux

    pour ensuite le rentre dans uns base de donné.

    sur la date du 2013-12-05 seul la troisième ligne est insérer dans la base.
    J'arrive à faire rentrer les lignes correspondant à matin et nuit mais celle avec la période après-midi impossible.
    SI l'un d'entre vous arrive à voir pourquoi je l'en remercie franchement d'avance.

    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
     PHP
     
    <?php
    $mysqli = new mysqli('localhost', 'root', '', 'projet_meteo');
    			$mysqli->set_charset("utf8");
    			if ($mysqli->connect_errno) 	{
    				echo 'Echec de la connection' . $mysqli->connect_error;
    				exit();
    			}	
     
    if (($handle = fopen("meteo.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
     
           $date = $data[0];
           $ville = $data[1];
           $periode = $data[2];
           $resume = $data[3];
           $id_resume = $data[4];
           $temp_min = $data[5];
           $temp_max = $data[6];
           $commentaire = $data[7];
     
            $mysqli->query('INSERT INTO meteo (day, ville, periode, resume, id_resume, temp_min, temp_max, commentaire) VALUES ("'. $date .'" , "'. $ville .'" ,"'. $periode .'" , "'. $resume .'" , "'. $id_resume .'" , "'. $temp_min .'" , "'. $temp_max .'" , "'. $commentaire .'")');
            var_dump($mysqli);
     
        }
     
    }    
     
    ?>

  2. #2
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    que donne un var_dump($data) placé à la ligne 13 ?

    Et quand tu dis "impossible", y a un message d'erreur à l'exécution de la requête d'insertion ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Août 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Août 2018
    Messages : 40
    Par défaut
    pour après midi ...
    c 'est normal que ca ne passe pas vu que la valeur est entre double quote dans ton CSV contrairement a matin et a nuit.
    ce qui donne dans ton insert :
    INSERT INTO meteo (day, ville, periode, ...) VALUES ( "2013-12-05" ,"Paris" ,""Après_midi"" ... )

    j'espere qu il n y as pas de station metéo a L'Isle-Adam ce qui va generer le meme type de problème ;-)


    si tes fichiers CSV restent de taille raisonnable ( < qq Mo)



    je conseil de proceder de la facon suivante pour s'éviter la majorité des problemes :

    a)lire le fichier ligne par ligne et mettre chaque ligne dans un array()
    b) faire un foreach()sur l'array pour chaque ligne faire une explode() de la variable avec ; comme séparateur
    c) compter le nombre de champs créé avec count() et verifier que le nombre de champs est bien celui attendu
    d) enfin avant d'inserer en base utiliser une fonction qui vire tout les caracteres spéciaux
    tu trouvera des exemples dans les commentaire de cette page du manuel php :
    https://www.php.net/manual/en/mysqli...ape-string.php

    ce qui evitera que la base sois peuplé avec tout et n'importe quoi :-)

  4. #4
    Membre confirmé
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Bonjour,
    que donne un var_dump($data) placé à la ligne 13 ?
    Tous d'abord Merci de t'a réponse.

    Et quand tu dis "impossible", y a un message d'erreur à l'exécution de la requête d'insertion ?
    Pour le var dump j'ai tous les éléments qui ce pressente. Et pas de message d'erreur. Seulement il me manque les aprés-midi et la première ligne du premier jours. C'est vraiment étrange.

    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'ensoleill�' (length=10)
    4 => string '1' (length=1)
    5 => string '5' (length=1)
    6 => string '8' (length=1)
    7 => string 'Temp ensoleill� mais frais' (length=26)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'Apr�s_midi' (length=10)
    3 => string 'Pluvieux' (length=8)
    4 => string '1' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Une pluie fine est attendue' (length=27)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'nuit' (length=4)
    3 => string 'Nuageux' (length=7)
    4 => string '4' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Temp Couvert' (length=12)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-06' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'Brumeux' (length=7)
    4 => string '1' (length=1)
    5 => string '12' (length=2)
    6 => string '13' (length=2)
    7 => string 'Temp Brumeux' (length=12)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-06' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'Apr�s_midi' (length=10)
    3 => string 'ensoleill�' (length=10)
    4 => string '1' (length=1)
    5 => string '14' (length=2)
    6 => string '15' (length=2)
    7 => string 'Temps Ensoleill�' (length=16)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-06' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'nuit' (length=4)
    3 => string 'Nuageux' (length=7)
    4 => string '4' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Temps Nuageux' (length=13)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-07' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'Brumeux' (length=7)
    4 => string '1' (length=1)
    5 => string '12' (length=2)
    6 => string '13' (length=2)
    7 => string 'Temps Brumeux' (length=13)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-07' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'Apr�s_midi' (length=10)
    3 => string 'ensoleill�' (length=10)
    4 => string '2' (length=1)
    5 => string '14' (length=2)
    6 => string '15' (length=2)
    7 => string 'Temps Ensoleill�' (length=16)

    C:\wamp\www\meteo\test.php:11:
    array (size=8)
    0 => string '2013-12-07' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'nuit' (length=4)
    3 => string 'Nuageux' (length=7)
    4 => string '4' (length=1)
    5 => string '9' (length=1)
    6 => string '11' (length=2)
    7 => string 'Temps Nuageux' (length=13)

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Je suppute un problème d'encodage (utf-8) de la bbd (les accents ne passeraient pas). Peux-tu donner le DDL de ta table SQL ?

  6. #6
    Membre confirmé
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Je suppute un problème d'encodage (utf-8) de la bbd (les accents ne passeraient pas). Peux-tu donner le DDL de ta table SQL ?
    Bonjour LaurentSc.

    Ne sachant pas ce qu'est le DDL j'ai fait un export SQL. (Je suis en formation ESECAD.

    j’espère que ça répondra à t'a question.

    projet_meteo.sql

  7. #7
    Membre confirmé
    Femme Profil pro
    en formation
    Inscrit en
    Septembre 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : en formation

    Informations forums :
    Inscription : Septembre 2019
    Messages : 90
    Par défaut
    Citation Envoyé par nagyp Voir le message
    Bonjour LaurentSc.

    Ne sachant pas ce qu'est le DDL j'ai fait un export SQL. (Je suis en formation ESECAD.

    J'ai supprimer les accents de mon fichier CSV et ça fonctionne.
    J'ai utf8_general_ci.
    Il me semblais que ca ne poser pas de souci avec les accents mais à priori si.
    Je ne sait pas quoi choisir.


    projet_meteo.sql

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    DDL=Data Language Definition. Dans ton cas, c'est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    DROP TABLE IF EXISTS `meteo`;
    CREATE TABLE IF NOT EXISTS `meteo` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `day` date DEFAULT NULL,
      `ville` text,
      `periode` text,
      `resume` text,
      `id_resume` int(11) DEFAULT NULL,
      `temp_min` int(11) DEFAULT NULL,
      `temp_max` int(11) DEFAULT NULL,
      `commentaire` text,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    COMMIT;
    chez moi, ton code fonctionne (je l'ai testé). Cela dit, je pense que ça vient des accents. Essaie ce code qui les enlève :
    Code php : 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
    <?php
    function debug($location, $var) // cette fonction aide au debug (tu peux l'enlever)
    {
        echo "<br/>".(is_string($location))?$location:''."<br/><pre>";
        var_dump($var);
        echo "</pre><br/>";
    }
     
    $mysqli = new mysqli('localhost', 'root', '', 'projet_meteo');
    $mysqli->set_charset("utf8");
    if ($mysqli->connect_errno) 	{
        echo 'Echec de la connection' . $mysqli->connect_error;
        exit();
    }
     
    if (($handle = fopen("meteo.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
            //debug("ligne csv 18",$data);
            $data_utf8=[];
            foreach($data as $item_data){
                $var=str_replace('é','e',$item_data);
                $data_utf8[]=str_replace('è','e',$var);
                }
     
            $date = $data_utf8[0];
            $ville = $data_utf8[1];
            $periode = $data_utf8[2];
            $resume = $data_utf8[3];
            $id_resume = $data_utf8[4];
            $temp_min = $data_utf8[5];
            $temp_max = $data_utf8[6];
            $commentaire = $data_utf8[7];
     
            $mysqli->query('INSERT INTO meteo (day, ville, periode, resume, id_resume, temp_min, temp_max, commentaire) VALUES ("'. $date .'" , "'. $ville .'" ,"'. $periode .'" , "'. $resume .'" , "'. $id_resume .'" , "'. $temp_min .'" , "'. $temp_max .'" , "'. $commentaire .'")');
            //var_dump($mysqli);
     
        }
     
    }
     
    ?>
    Le nom $data_utf8 vient de ma première idée, mais c'est pas ça.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,


    1-
    0 => string '2013-12-05' (length=10)
    1 => string 'Paris' (length=5)
    2 => string 'matin' (length=5)
    3 => string 'ensoleill�' (length=10)
    4 => string '1' (length=1)
    5 => string '5' (length=1)
    6 => string '8' (length=1)
    7 => string 'Temp ensoleill� mais frais' (length=26)
    Manifestement, le fichier meteo.csv n'est PAS encodé en UTF-8.

    Pour y remédier (SANS supprimer les accents) : on encode les données avec utf8_encode() .

    Solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (($handle = fopen("meteo.csv", "r")) !== false) {
        while (($data = fgetcsv($handle, 1000, ";")) !== false) {
     
    	$data = array_map('utf8_encode', $data); // encode en UTF-8 chaque données dans l' array $data (TOUTES en une fois)
     
           $date = $data[0];
           $ville = $data[1];
           $periode = $data[2];
    ...
    Solution 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    if (($handle = fopen("meteo.csv", "r")) !== false) {
        while (($data = fgetcsv($handle, 1000, ";")) !== false) {
     
           $date = utf8_encode($data[0]); // encode en UTF-8 la donnée (UNE par une)
           $ville = utf8_encode($data[1]);
           $periode = utf8_encode($data[2]);
    ...

    2- Suis le conseil de CosmoKnacki, et utilise des requêtes préparées !


    @saveus et resus
    Pour "Après_midi", NON, car ces guillemets sont automatiquement enlevés par la fonction fgetcsv().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\\" ]]]] ) : array
    Il s'agit de $enclosure = '"' (guillemet, par défaut).


    @laurentSc
    DDL = Data Definition Language = Langage de définition de données (LDD en Français)
    Dernière modification par Invité ; 30/04/2020 à 13h56.

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Jérôme,
    j'ai testé ton code (d'ailleurs, avant d'enlever les accents, je l'avais déjà fait), mais si on encode en utf8 le fichier CSV, on a des caractères moches en bdd (é et è )

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    ...on a des caractères moches en bdd (é et è )
    Ça, ça veut certainement dire que TON fichier meteo.csv EST DÉJÀ en UTF-8.
    Du coup, utf8_encode le traite une 2ème fois : ce qui n'est pas bon.

    Fais un var_dump( $data ); AVANT et APRÈS utf8_encode, pour voir.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/09/2013, 14h41
  2. Réponses: 2
    Dernier message: 20/02/2012, 09h29
  3. Réponses: 0
    Dernier message: 05/08/2011, 18h53
  4. Réponses: 1
    Dernier message: 08/09/2007, 17h12
  5. Réponses: 5
    Dernier message: 20/02/2007, 06h27

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