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 :

Erreur : Invalid argument supplied for foreach() lors d'ajouts en BD


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club Avatar de XAVIERV
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 29
    Points
    29
    Par défaut Erreur : Invalid argument supplied for foreach() lors d'ajouts en BD
    Bonsoir à tous !
    Voilà mon soucis est que je n'arrive pas à ajouter correctement dans ma base de donnée des informations d'un fichier csv
    j'ai le message "invalid argument supplied for foreach()" pour ajouter les informations dans ma base de donnée

    Voilà mon 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public function putMeteoDataBase()
    	{
    		require('./config.php');
     
                    //connexion base de donnée
    		$mysqli = new mysqli('localhost', 'root', '','previsions_meteo');
    		$mysqli->set_charset("utf8"); //encodage utf8
     
                    // Vérification de la connexion
    		if($mysqli->connect_errno)
    		{
     
    			printf("Echec de la connexion %s\n", $mysqli->connect_error);
    			exit();
    		}
     
    		$file = fopen($file, "r");
    		while (!feof($file))
    		{
    			// On recupere toute la ligne
    			$line = addslashes(fgets($file));
    			//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
    			$array_values = explode(';', $line);
     
     
    			foreach($array_values as $key => $array)
    			{
     
    				foreach($array as $values)
    				{
     
    			              // On crée la requete pour inserer les donner (ici il y a 8 champs donc de [0] a [7])
    			             $result=$mysqli->query('INSERT INTO 
                                         meteo("date","ville","periode","resume","identifiant_de_resume","temperature_minimale","temperature_maximale","commentaire") VALUES 
                                         ("'.$values[0].'","'.$values[1].'", "'.$values[2].'", "'.$values[3].'", "'.$values[4].'", "'.$values[5].'", "'.$values[6].'", "'.$values[7].'"');
     
    		 	       }
    		      }
     
    		}
    		//vérification et envoi d'une réponse à l'utilisateur
    		if ($result)
    		{
    			echo "<h2>Ajout dans la base de donnée effectué avec succès</h2>";
    		}
    		else
    		{
    			echo "Echec de l'ajout dans la base de donnée";
    		}
     
    	}

    Merci de me donner un coup de main !

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Pour trouver l'erreur, relis ton code en te demandant à chaque nouvelle variable ce qu'elle contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //On met dans un tableau les différentes valeurs trouvées (ici séparées par un ; )
    $array_values = explode(';', $line);
    Jusque là, ça va à peu près.

    Ensuite quel est l'intérêt de faire des foreach ? Toutes les valeurs dont tu as besoin pour construire ta requête INSERT sont déjà présentes et directement accessibles via $array_values et tu n'as aucun besoin de les faire défiler avec une boucle (et encore moins deux).




    À part ça, pour lire un fichier csv, il y a fgetcsv() (bien plus pratique que d'utiliser fgets() puis explode()).

    Je ne pense pas que le addslashes() soit bien utile et que la construction de ta requête par concaténation des valeurs venues de ton csv bien raisonnable du point de vue pratique et du point de vue sécurité: tu dois utiliser une requête préparée. (Je te conseille aussi d'aller sur ce site qui est certes en anglais mais qui est limpide et right to the point.)




    Tu es parti pour lire le fichier csv puis pour construire la requête d'insertion et l'éxécuter avec PHP. C'est une manière de faire. Mais sache qu'il est aussi possible d'importer un fichier csv directement avec MySQL.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2020
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 34
    Points : 115
    Points
    115
    Par défaut
    Rien à ajouter.
    A part que la parenthèse fermante de ton INSERT est manquante (tu l'aurais sans doute aperçu bien vite).

  4. #4
    Nouveau membre du Club Avatar de XAVIERV
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 29
    Points
    29
    Par défaut
    Merci je vais changer tout ça et je reviens vers vous si je n'y arrive toujours pas encore merci de répondre

  5. #5
    Nouveau membre du Club Avatar de XAVIERV
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Points : 29
    Points
    29
    Par défaut remerciment
    Merci de m'avoir aider du coup j'ai résolue mon problème en utilisant du coup fgetcsv voilà mon 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
                    $mysqli = new mysqli('localhost', 'root', '','previsions_meteo');
    		$mysqli->set_charset("utf8"); //encodage utf8
     
    		if($mysqli->connect_errno)
    		{
     
    			printf("Echec de la connexion %s\n", $mysqli->connect_error);
    			exit();
    		}
     
    		if (($handle = fopen("./csv/meteo.csv", "r")) !== FALSE) 
    		{
    			$result=$mysqli->query('SELECT count(*) FROM meteo');
     
       			$row = $result->fetch_array();
     
        		while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
        		{
     
            		$num = count($data);
     
            		for ($c=0; $c < $num; $c++)
            		{
            			$values = explode(";", $data[$c]);
     
                        if($row[0] == 0)
               	 		{
               	 			$result=$mysqli->query('INSERT INTO meteo(date,ville,periode,resume,identifiant_de_resume,temperature_minimale,temperature_maximale,commentaire) VALUES ("'.$values[0].'","'.$values[1].'", "'.$values[2].'", "'.$values[3].'", "'.$values[4].'", "'.$values[5].'", "'.$values[6].'", "'.$values[7].'")');
     
     
    						if(!$result)
    						{
    							$message = 'Echec de l\'ajout dans la base de données';
    						}
    						else
    						{
    							$message = '<h2>Ajout dans la base de données effectué avec succès</h2>';
    						}
     
               	 		}
               	 		else
    					{
    						$message ='Les informations du fichier csv éxiste déjà dans la table';
               	 		}
     
     
     
               		}
               	}
            }
     
            fclose($handle);

    Bonne soirée

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 848
    Points : 6 535
    Points
    6 535
    Par défaut
    C'est pas encore ça, tu as encore collé un explode et une boucle inutiles. fgetcsv() se charge tout seul de découper la ligne du fichier csv en champs, encore faut-il lui donner le bon délimiteur de champs (qui visiblement est ;).
    Tu continues à construire ta requête en concaténant les valeurs issues de ton csv, ce qu'il ne faut pas faire pour des raisons de sécurité et d'éventuels problèmes d'échappements. Il faut à la place utiliser une requête préparée.

    À partir de ton code précédent, ça donnerait quelque chose dans ce goût là:
    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
    $mysqli = new mysqli('localhost', 'root', '', 'previsions_meteo');
    $mysqli->set_charset("utf8");
     
    if ( $mysqli->connect_errno ) {
        printf("Echec de la connexion %s\n", $mysqli->connect_error);
        exit();
    }
     
    if ( false !== $handle = fopen("./csv/meteo.csv", "r") ) {
        $result = $mysqli->query('SELECT count(*) FROM meteo'); 
     
        $row = $result->fetch_array();
     
        // on écrit la requête avec des placeholders ?
        $query = 'INSERT INTO meteo (date,
                                     ville,
                                     periode,
                                     resume,
                                     identifiant_de_resume,
                                     temperature_minimale,
                                     temperature_maximale,
                                     commentaire)
                  VALUES (?, ?, ?, ?, ?, ?, ?, ?)';
     
        // on prépare la requête
        $stmt = $mysqli->prepare($query);
     
        // on lie les variables à la requête préparée
        $stmt->bind_param('ssssssss', $date, $ville, $periode, $resume, $id_resume, $t_min, $t_max, $commentaire);
     
        while ( false !== $values = fgetcsv($handle, 1000, ";") ) {
            if ( $row[0] == 0 ) {                      //   ^-- on choisit le bon délimiteur de champs
                                                       //       pas besoin de faire un explode par la 
                                                       //       suite, ni de boucle
     
                // on met à jour les variables liées avec les valeurs des champs de la ligne du csv                                        
                list($date, $ville, $periode, $resume, $id_resume, $t_min, $t_max, $commentaire) = $values;
     
                // on exécute la requête préparée
                $result = $stmt->execute();
     
                if ( $result ) {
                    $message = '<h2>Ajout dans la base de données effectué avec succès</h2>';
                } else {
                    $message = 'Echec de l\'ajout dans la base de données';
                }
            } else {
                $message = 'Les informations du fichier csv éxistent déjà dans la table';
            }
     
        }
     
        // on ferme la requête
        $stmt->close();
    }
     
    fclose($handle);
    Je ne vois pas trop où tu veux en venir avec ta requête SELECT count(*)... ni pourquoi tu testes son résultat if ( $row[0] == 0 ) à cet endroit du code, c'est pourquoi je l'ai laissé tel quel.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. [MySQL] Problème de Foreach : Warning: Invalid argument supplied for foreach()
    Par bidoo1234 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 06/05/2010, 18h56
  2. Réponses: 4
    Dernier message: 21/09/2009, 23h56
  3. [C#] Base de données, Fichiers
    Par PIEPLU dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/07/2006, 01h16
  4. Cryptage de base de données fichier
    Par tidou dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 02/05/2006, 13h04
  5. Base de données fichiers !
    Par xavixxxxx dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 07/04/2005, 13h31

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