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 :

Importer fichier csv vers bdd mysql [POO]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    Par défaut Importer fichier csv vers bdd mysql
    class/Meteo.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
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    class Meteo {
     
    	public function __construct() {
     
    	}
     
    	public function insertMeteo($file) {
     
    		$mysqli = new mysqli('localhost', 'root', '', 'meteo');
    		$mysqli->set_charset("utf8");
     
    		if($mysqli->connect_errno) {
     
    			echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
    			exit;
    		}
     
    		$filename = $_FILES["upload"]["tmp_name"];
     
    		if($_FILES["upload"]["size"] > 0) {
     
    			$file = fopen($filename, "r");
     
    			while(($columm = fgetcsv($file, 10000, ",")) !== FALSE) {
     
    				$query = 'INSERT INTO meteo_city(ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    				minimum_temperature, maximum_temperature, commentaire)
    				VALUES ("' . $column[0] . '","' . $column[1] . '","' . $column[2] . '","' . $column[3] . '",
    				"' . $column[4] . '","' . $column[5] . '","' . $column[6] . '","' . $column[7] . '","' . $column[8] . '")';
     
    				$result = $mysqli->query($query);
     
    				if(!empty($result)) {
     
    					$message = '<p class="message">Les données ont bien été importées dans la bdd</p>';
     
    					return true;
    				}
    				else {
     
    					$message = '<p class="error">Les données n\'ont pas pu être importées dans la bdd</p>';
     
    					return false;
     
    					$mysqli->close();
    				}
    			}
    		}	
     
    		header('Location: index.php');
     
    		exit;
    	}
     
    	public function getMeteo() {
     
    		$mysqli = new mysqli('localhost', 'root', '', 'meteo');
    		$mysqli->set_charset("utf8");
     
    		if($mysqli->connect_errno) {
     
    			echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
    			exit;
    		}
     
    		$query = 'SELECT ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    		minimum_temperature, maximum_temperature, commentaire FROM meteo_city WHERE ville_id BETWEEN 3 AND 9';
     
    		$result = $mysqli->query($query);
     
    		if(!$result) {
     
    			echo 'Erreur au niveau de la requête. Message d\'erreur ' . $mysqli->error;
     
    			return false;
    		}
    		else {
     
    			while($row = $result->fetch_array()) {
     
    				$ville_id = $row['ville_id'];
    				$dates = $row['dates'];
    				$ville_name = $row['ville_name'];
    				$period = $row['period'];
    				$to_summarize = $row['to_summarize'];
    				$id_to_summarize = $row['id_to_summarize'];
    				$minimum_temperature = $row['minimum_temperature'];
    				$maximum_temperature = $row['maximum_temperature'];
    				$commentaire = $row['commentaire'];
     
    				$meteo_city[$ville_id]['dates'] = $dates;
    				$meteo_city[$ville_id]['Nom de la ville'] = $ville_name;
    				$meteo_city[$ville_id]['La période de la journée'] = $period;
    				$meteo_city[$ville_id]['Le résumer'] = $to_summarize;
    				$meteo_city[$ville_id]['L\'id du résumer'] = $id_to_summarize;
    				$meteo_city[$ville_id]['La température minimum'] = $minimum_temperature;
    				$meteo_city[$ville_id]['La température maximum'] = $maximum_temperature;
    				$meteo_city[$ville_id]['Le commentaire'] = $commentaire;
    			}
     
    			return $meteo_city;
     
    			$mysqli->close();
    		}
    	}	
    }
    display.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
    24
    25
    26
    27
    28
    29
    require('class/Meteo.php');
     
    if(isset($_POST['uploadFormSubmit'])) {
     
    	if(!empty($_FILES)) {
     
    		$files = new Meteo();
    		$file = $files->insertMeteo($_FILES);
     
    		if($file === TRUE) {
     
    			$message = '<p class="message">Le chargement a réussi</p>';
    		}
    		else {
     
    			$message = '<p class="error">Le chargement a echoué</p>';
    		}
    	}
    }
     
    <div id="main">
    	<?php if(isset($message)) echo $message ?>
     
    	<form action="" method="post" id="uploadForm" enctype="multipart/form-data">
    		<p>Ajoutez le fichier CSV</p>
    		<input type="file" name="upload" value="">
    		<input type="submit" name="uploadFormSubmit" id="uploadFormSubmit">
    	</form>
    </div>
    Bonjour, j'ai une erreur
    Notice: Undefined variable: column in ->
    que je n'arrive pas à résoudre et bien sur rien n'est importée vers la bdd. Besoin d'aide, merci & bon Weekend

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    merci d'être plus précis : pas de variable column dans ton code et merci de donner le numéro de ligne sur laquelle porte l'erreur.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    Par défaut
    Erreur ligne 31 & 32

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Erreur simple : ligne 27, tu as écrit $columm au lieu de $column.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    Par défaut
    bien vue merci bien, mais maintenant j'ai ce message ->
    Notice: Undefined offset: 1 etc...

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Pour investiguer, il me serait plus simple de pouvoir exécuter ton code. Pour cela, peux-tu poster la DDL de ta table MySQL meteo_city ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Désolé, j'ai vu ta réponse plusieurs heures après...J'ai bien fait de te demander la DDL car sinon, je n'aurais pas vu le problème. Pour que ça marche bien :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    while(($column = fgetcsv($file, 10000, ",")) !== FALSE) {
     
    $column=explode(';',$column[0]);   // j'ai rajouté cette ligne...
     
    $query = 'INSERT INTO meteo_city(ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    minimum_temperature, maximum_temperature, commentaire)
    VALUES ("' . $column[0] . '","' . $column[1] . '","' . $column[2] . '","' . $column[3] . '",
    "' . $column[4] . '","' . $column[5] . '","' . $column[6] . '","' . $column[7] . '","' . $column[8] . '")';
     
    $result = $mysqli->query($query);

    EDIT : j'ai supposé que le séparateur du CSV était le point-virgule, mais dans certains pays, c'est la virgule...S'il faut en tenir compte, il faut d'abord le détecter (je l'ai déjà fait).
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    Par défaut
    Toujours pareil
    meteocsv.zip

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Bizzarre car chez moi, avec ton fichier csv, ça marche bien. Merci de poster intégralement ton code.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    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
    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
    55
    56
    class Meteo {
     
    	public function __construct() {
     
    	}
     
    	public function insertMeteo($file) {
     
    		$mysqli = new mysqli('localhost', 'root', '', 'meteo');
    		$mysqli->set_charset("utf8");
     
    		if($mysqli->connect_errno) {
     
    			echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
    			exit;
    		}
     
    		$filename = $_FILES["upload"]["tmp_name"];
     
    		if($_FILES["upload"]["size"] > 0) {
     
    			$file = fopen($filename, "r");
     
    			while(($column = fgetcsv($file, 10000, ",")) !== FALSE) {
     
    				$column = explode(';', $column[0]);
     
    				$query = 'INSERT INTO meteo_city(ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    				minimum_temperature, maximum_temperature, commentaire)
    				VALUES("' . $column[0] . '","' . $column[1] . '","' . $column[2] . '","' . $column[3] . '",
    				"' . $column[4] . '","' . $column[5] . '","' . $column[6] . '","' . $column[7] . '","' . $column[8] . '")';
    			}
     
    			$result = $mysqli->query($query);
     
    			if(!empty($result)) {
     
    				$message = '<p class="message">Les données ont bien été importées dans la bdd</p>';
     
    				return true;
    			}
    			else {
     
    				$message = '<p class="error">Les données n\'ont pas pu être importées dans la bdd</p>';
     
    				return false;
     
    				$mysqli->close(); 
    			}
    		}
     
    		header('Location: index.php');
     
    		exit;
    	}
    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 
    require('class/Meteo.php');
     
    if(isset($_POST['uploadFormSubmit'])) {
     
    	if(!empty($_FILES)) {
     
    		$files = new Meteo();
    		$file = $files->insertMeteo($_FILES);
     
    		if($file === TRUE) {
     
    			$message = '<p class="message">Le chargement a réussi</p>';
    		}
    		else {
     
    			$message = '<p class="error">Le chargement a echoué</p>';
    		}
    	}
    }
     
    <ul>
    	<?php if(!empty($meteo)) : ?>
    		<?php foreach($meteo as $name) : ?>
    			<li><?php echo $name['dates']; ?></li>
    		<?php endforeach; ?>
    	<?php endif; ?>
    </ul>
     
    <div id="main">
    	<?php if(isset($message)) echo $message ?>
     
    	<form action="" method="post" id="uploadForm" enctype="multipart/form-data">
    		<p>Ajoutez le fichier CSV</p>
    		<input type="file" name="upload" value="">
    		<input type="submit" name="uploadFormSubmit" id="uploadFormSubmit">
    	</form>
    </div>

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Il manque des accolades dans les 2 fichiers...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    Par défaut
    J'ai revérifié mais je vois pas où.

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    J'avais la flemme hier soir de te dire où ; voici les codes corrigés avec des commentaires :

    display.php :
    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 // la balise pour dire qu'on a du code PHP n'y était pas
     
     
    require('class/Meteo.php');
     
    if(isset($_POST['uploadFormSubmit'])) {
     
    	if(!empty($_FILES)) {
     
    		$files = new Meteo();
    		$file = $files->insertMeteo($_FILES);
     
    		if($file === TRUE) {
     
    			$message = '<p class="message">Le chargement a réussi</p>';
    		}
    		else {
     
    			$message = '<p class="error">Le chargement a echoué</p>';
    		}
    	}
    }
    /* la balise de fin du code PHP n'y était pas */ ?>
    <ul>
    	<?php if(!empty($meteo)) : ?>
    		<?php foreach($meteo as $name) : ?>
    			<li><?php echo $name['dates']; ?></li>
    		<?php endforeach; ?>
    	<?php endif; ?>
    </ul>
     
    <div id="main">
    	<?php if(isset($message)) echo $message ?>
     
    	<form action="" method="post" id="uploadForm" enctype="multipart/form-data">
    		<p>Ajoutez le fichier CSV</p>
    		<input type="file" name="upload" value="">
    		<input type="submit" name="uploadFormSubmit" id="uploadFormSubmit">
    	</form>
    </div>

    meteo.php :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    <?php // la balise pour dire qu'on a du code PHP n'y était pas
     
    class Meteo
    {
     
        public function __construct ()
        {
     
        }
     
        public function insertMeteo ( $file )
        {
     
            $mysqli = new mysqli('localhost', 'root', '', 'meteo');
            $mysqli->set_charset("utf8");
     
            if ($mysqli->connect_errno)
            {
     
                echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
                exit;
            }
     
            $filename = $_FILES["upload"]["tmp_name"];
     
            if ($_FILES["upload"]["size"] > 0)
            {
     
                $file = fopen($filename, "r");
     
                while (($column = fgetcsv($file, 10000, ",")) !== FALSE)
                {
     
                    $column = explode(';', $column[0]);
     
                    $query = 'INSERT INTO meteo_city(ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    				minimum_temperature, maximum_temperature, commentaire)
    				VALUES("' . $column[0] . '","' . $column[1] . '","' . $column[2] . '","' . $column[3] . '",
    				"' . $column[4] . '","' . $column[5] . '","' . $column[6] . '","' . $column[7] . '","' . $column[8] . '")';
                }
     
                $result = $mysqli->query($query);
     
                if (!empty($result))
                {
     
                    $message = '<p class="message">Les données ont bien été importées dans la bdd</p>';
     
                    return true;
                }
                else
                {
     
                    $message = '<p class="error">Les données n\'ont pas pu être importées dans la bdd</p>';
     
                    return false;
     
                    $mysqli->close();
                }
            }
     
            header('Location: index.php');
     
            exit;
        }
    } //accolade de fin de la classe manquante
    ?>

    Ce code est fonctionnel, par contre, vu le résultat en bdd, il est clair qu'il n'y a pas correspondance entre le fichier csv et les colonnes de la table...

    Nom : Capture d’écran (3).png
Affichages : 316
Taille : 247,5 Ko

    par exemple, dans le fichier csv, y a pas de ville_id...

    Et je viens de voir (à l'instant) que dans ton fichier csv, il y a 9 enregistrements, et qu'on ne met en bdd que le dernier...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  15. #15
    Membre actif Avatar de Trehinos
    Homme Profil pro
    Analyste développeur PHP
    Inscrit en
    Novembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyste développeur PHP
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2012
    Messages : 99
    Points : 228
    Points
    228
    Par défaut
    Bonjour, il faut exécuter $result = $mysqli->query($query); dans la boucle while (pour insérer chaque enregistrement) et non après (sinon il n'y a que le dernier qui est enregistré).

    Pour ce qui est de la correspondance colonnes CSV <=> colonnes SQL, _il suffit de mettre les $column[$x] dans le bon ordre dans la requête, voire des '' ou des NULL (suivant la conception de la base) pour les valeurs qui ne sont pas dans le CSV =)


    Je ne comprends pas le $column = explode(';', $column[0]); non plus... Ici $column est déjà un tableau contenant les champs CSV, normalement (CF ligne juste au-dessus), alors pourquoi redécouper la première colonne ?

    EDIT : Ok j'ai compris. Et c'est bien inutile... Au-dessus, il y a $column = fgetcsv($file, 10000, ",") qui découpe un CSV séparé par des virgules... Hors le CSV à traiter est séparé par des points-virgules ! Remplacez par $column = fgetcsv($file, 10000, ";") et supprimez la ligne $column = explode(';', $column[0]);.

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour vos remarques Trehinos. Le $column = explode(';', $column[0]);, il était de moi, n'ayant pas vu que le séparateur était un des arguments de fgetcsv...
    J'avais aussi remarqué qu'on enregistrait en bdd que le dernier enregistrement du csv, mais pas trouvé la cause.

    Etant donné vos remarques, j'ai modifié le code et la DDL de la table meteo_city, et ça marche bien :

    meteo_city.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `meteo_city` (
      `dates` date NOT NULL,
      `ville_name` varchar(30) NOT NULL,
      `period` varchar(30) NOT NULL,
      `to_summarize` text NOT NULL,
      `id_to_summarize` int(11) NOT NULL,
      `minimum_temperature` int(11) NOT NULL,
      `maximum_temperature` int(11) NOT NULL,
      `vitesse_vent` varchar(30) NOT NULL,
      `commentaire` text NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    meteo.php :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?php // la balise pour dire qu'on a du code PHP n'y était pas
     
    class Meteo
    {
     
        public function __construct ()
        {
     
        }
     
        public function insertMeteo ( $file )
        {
     
            $mysqli = new mysqli('localhost', 'root', '', 'meteo');
            $mysqli->set_charset("utf8");
     
            if ($mysqli->connect_errno)
            {
     
                echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
                exit;
            }
     
            $filename = $_FILES["upload"]["tmp_name"];
     
            if ($_FILES["upload"]["size"] > 0)
            {
     
                $file = fopen($filename, "r");
     
                while (($column = fgetcsv($file, 10000, ";")) !== FALSE)
                {
     
                   // $column = explode(';', $column[0]);//var_dump( $column );echo "<br/><br/>";
     
                    $query = 'INSERT INTO meteo_city(dates, ville_name, period, to_summarize, id_to_summarize,
    				minimum_temperature, maximum_temperature, vitesse_vent,commentaire)
    				VALUES("' . $column[0] . '","' . $column[1] . '","' . $column[2] . '","' . $column[3] . '",
    				"' . $column[4] . '","' . $column[5] . '","' . $column[6] . '","' . $column[7] . '","' . $column[8] . '")';
                    $result = $mysqli->query($query);
                }
     
     
     
                if (!empty($result))
                {
     
                    $message = '<p class="message">Les données ont bien été importées dans la bdd</p>';
     
                    return true;
                }
                else
                {
     
                    $message = '<p class="error">Les données n\'ont pas pu être importées dans la bdd</p>';
     
                    return false;
     
                    $mysqli->close();
                }
            }
     
            header('Location: index.php');
     
            exit;
        }
    } //accolade de fin de la classe manquante
    ?>

    display.php :
    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
    <?php // la balise pour dire qu'on a du code PHP n'y était pas
     
     
    require('class/Meteo.php');
     
    if(isset($_POST['uploadFormSubmit'])) {
     
    	if(!empty($_FILES)) {
     
    		$files = new Meteo();
    		$file = $files->insertMeteo($_FILES);
     
    		if($file === TRUE) {
     
    			$message = '<p class="message">Le chargement a réussi</p>';
    		}
    		else {
     
    			$message = '<p class="error">Le chargement a echoué</p>';
    		}
    	}
    }
    /* la balise de fin du code PHP n'y était pas */ ?>
    <ul>
    	<?php if(!empty($meteo)) : ?>
    		<?php foreach($meteo as $name) : ?>
    			<li><?php echo $name['dates']; ?></li>
    		<?php endforeach; ?>
    	<?php endif; ?>
    </ul>
     
    <div id="main">
    	<?php if(isset($message)) echo $message ?>
     
    	<form action="" method="post" id="uploadForm" enctype="multipart/form-data">
    		<p>Ajoutez le fichier CSV</p>
    		<input type="file" name="upload" value="">
    		<input type="submit" name="uploadFormSubmit" id="uploadFormSubmit">
    	</form>
    </div>


    testé !
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  17. #17
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    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
    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
    55
    56
    57
     
     
    public function __construct() {
     
    	}
     
    	public function insertMeteo($filename) {
     
    		$mysqli = new mysqli('localhost', 'root', '', 'meteo');
    		$mysqli->set_charset("utf8");
     
    		if($mysqli->connect_errno) {
     
    			echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
    			exit;
    		}
     
    		$filename = $_FILES["upload"]["tmp_name"];
     
    		if($_FILES["upload"]["size"] > 0) {
     
    			$file = fopen($filename, "r");
     
    			while(($column = fgetcsv($file, 10000, ";")) !== FALSE) {
     
    				$query = 'INSERT INTO meteo_city(dates, ville_name, period, to_summarize, id_to_summarize,
    				minimum_temperature, maximum_temperature, commentaire) VALUES("' . $column[1] . '","' . $column[2] . '",
    				"' . $column[3] . '","' . $column[4] . '","' . $column[5] . '","' . $column[6] . '","' . $column[7] . '",
    				"' . $column[8] . '")';
     
    				$result = $mysqli->query($query);
     
    			}
     
    			fclose($file);
    		}
     
    		if(!empty($result)) {
     
    			$message = '<p class="message">Les données ont bien été importées dans la bdd</p>';
     
    			return true;
    		}
    		else {
     
    			$message = '<p class="error">Les données n\'ont pas pu être importées dans la bdd</p>';
     
    			return false;
     
    			$mysqli->close(); 
    		}
     
    		header('Location: index.php');
     
    		exit;
    	}
    meteo.csv


    2020-03-11;Paris;matin;très nuageux;1;12;14;Vitesse du vent : 10km/h;
    2020-03-11;Paris;après-midi;très nuageux;1;14;16;Vitesse du vent : 11km/h;
    2020-03-11;Paris;soirée;peu nuageux;1;11;13;Vitesse du vent : 10km/h;
    2020-03-12;Paris;matin;couvert;2;8;10;Vitesse du vent : 8km/h;
    2020-03-12;Paris;après-midi;très nuageux;2;10;12;Vitesse du vent : 10km/h;
    2020-03-12;Paris;soirée;ensoleillée;2;6;8;Vitesse du vent : 8km/h;
    2020-03-13;Paris;matin;peu nuageux;3;6;8;Vitesse du vent : 7km/h;
    2020-03-13;Paris;après-midi;très nuageux;3;10;12;Vitesse du vent : 7km/h;
    2020-03-13;Paris;soirée;très nuageux;3;7;9;Vitesse du vent : 5km/h;

    ça ne fonctionne toujours pas mon ami (Trehinos)

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Si ça marche ; par contre, tu as mal copié mon code de la classe meteo : il manque une colonne dans ta requête SQL...

    EDIT : attention, j'ai aussi modifié la DDL de la table meteo_city
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  19. #19
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Points : 45
    Points
    45
    Par défaut
    Super ça marche enfin, mais maintenant j'ai un problème avec l'appel de la méthode getMeteo()
    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
    public function getMeteo() {
     
    		$mysqli = new mysqli('localhost', 'root', '', 'meteo');
    		$mysqli->set_charset("utf8");
     
    		if($mysqli->connect_errno) {
     
    			echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
    			exit;
    		}
     
    		$query = 'SELECT ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    		minimum_temperature, maximum_temperature, commentaire FROM meteo_city';
     
    		$result = $mysqli->query($query);
     
    		if(!$result) {
     
    			echo 'Erreur au niveau de la requête. Message d\'erreur ' . $mysqli->error;
     
    			return false;
    		}
    		else {
     
    			while($row = $result->fetch_array()) {
     
    				$ville_id = $row['ville_id'];
    				$dates = $row['dates'];
    				$ville_name = $row['ville_name'];
    				$period = $row['period'];
    				$to_summarize = $row['to_summarize'];
    				$id_to_summarize = $row['id_to_summarize'];
    				$minimum_temperature = $row['minimum_temperature'];
    				$maximum_temperature = $row['maximum_temperature'];
    				$commentaire = $row['commentaire'];
     
    				$meteo_city[$ville_id]['dates'] = $dates;
    				$meteo_city[$ville_id]['Nom de la ville'] = $ville_name;
    				$meteo_city[$ville_id]['La période de la journée'] = $period;
    				$meteo_city[$ville_id]['Le résumer'] = $to_summarize;
    				$meteo_city[$ville_id]['L\'id du résumer'] = $id_to_summarize;
    				$meteo_city[$ville_id]['La température minimum'] = $minimum_temperature;
    				$meteo_city[$ville_id]['La température maximum'] = $maximum_temperature;
    				$meteo_city[$ville_id]['Le commentaire'] = $commentaire;
    			}
     
    			return $meteo_city;
    		}
     
    		$mysqli->close();
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ul>
    	<?php $meteo = $files->getMeteo(); ?>
    	<?php if(!empty($meteo)) : ?>
    		<?php foreach($meteo as $name) : ?>
    			<li><?php echo $name['dates']; ?></li>
    		<?php endforeach; ?>
    	<?php endif; ?>
    </ul>

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Tu ne précises quel problème ; néanmoins en exécutant le code, j'ai vu. J'ai du rajouter la colonne ville_id dans la table, puis modifier le code :

    meteo_city.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE `meteo_city` (
      `ville_id` smallint(11) AUTO_INCREMENT NOT NULL,
      `dates` date NOT NULL,
      `ville_name` varchar(30) NOT NULL,
      `period` varchar(30) NOT NULL,
      `to_summarize` text NOT NULL,
      `id_to_summarize` int(11) NOT NULL,
      `minimum_temperature` int(11) NOT NULL,
      `maximum_temperature` int(11) NOT NULL,
      `vitesse_vent` varchar(30) NOT NULL,
      `commentaire` text NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    méthode get_meteo :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
        public function getMeteo() {
     
            $mysqli = new mysqli('localhost', 'root', '', 'meteo');
            $mysqli->set_charset("utf8");
     
            if($mysqli->connect_errno) {
     
                echo 'Erreur de connexion. Message d\'erreur : ' . $mysqli->connect_error;
     
                exit;
            }
     
            $query = 'SELECT ville_id, dates, ville_name, period, to_summarize, id_to_summarize,
    		minimum_temperature, maximum_temperature, vitesse_vent,commentaire FROM meteo_city';
     
            $result = $mysqli->query($query);
     
            if(!$result) {
     
                echo 'Erreur au niveau de la requête. Message d\'erreur ' . $mysqli->error;
     
                return false;
            }
            else {
     
                while($row = $result->fetch_array()) {
                    $ville_id=$row['ville_id'];
                    $dates = $row['dates'];
                    $ville_name = $row['ville_name'];
                    $period = $row['period'];
                    $to_summarize = $row['to_summarize'];
                    $id_to_summarize = $row['id_to_summarize'];
                    $minimum_temperature = $row['minimum_temperature'];
                    $maximum_temperature = $row['maximum_temperature'];
                    $vitesse_vent = $row['vitesse_vent'];
                    $commentaire = $row['commentaire'];
     
                    $meteo_city[$ville_id]['dates'] = $dates;
                    $meteo_city[$ville_id]['Nom de la ville'] = $ville_name;
                    $meteo_city[$ville_id]['La période de la journée'] = $period;
                    $meteo_city[$ville_id]['Le résumer'] = $to_summarize;
                    $meteo_city[$ville_id]['L\'id du résumer'] = $id_to_summarize;
                    $meteo_city[$ville_id]['La température minimum'] = $minimum_temperature;
                    $meteo_city[$ville_id]['La température maximum'] = $maximum_temperature;
                    $meteo_city[$ville_id]['Le commentaire'] = $commentaire;
                }
     
                return $meteo_city;
            }
     
            $mysqli->close();
        }

    son appel :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    <ul>
        <?php $files = new Meteo();
        $meteo = $files->getMeteo();
         if(!empty($meteo)) :
             foreach($meteo as $name) :?>
                <li><?= $name['dates'];?> </li>
            <?php endforeach;
         endif; ?>
    </ul>

    Le code fonctionne mais heureusement qu'on utilise pas les variables affectées aux lignes 42 à 47 de la méthode car pas bon de mettre des espaces, des anti-slashes ou des apostrophes dans les noms d'index...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Importer fichier csv vers excel avec vba
    Par Freudsw dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/09/2015, 17h01
  2. [XL-2010] Importer fichier CSV vers MYSQL en VBA Excel
    Par 6116d dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 17/06/2014, 16h40
  3. importation fichier csv vers mysql par php
    Par frboyer dans le forum Langage
    Réponses: 4
    Dernier message: 26/05/2009, 09h21
  4. [CSV] exporter des données d'un fichier CSV vers BD Mysql
    Par samsso2006 dans le forum Langage
    Réponses: 2
    Dernier message: 04/05/2007, 22h25
  5. [XML][MYSQL] Importation données XML vers BDD MySql
    Par Ben-o dans le forum XQUERY/SGBD
    Réponses: 2
    Dernier message: 04/05/2006, 18h13

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