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 :

Lecture fichier CSV et enregistrement dans la base


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut Lecture fichier CSV et enregistrement dans la base
    bonjour.

    j'ai un fichier csv qui contient 3000 lignes que je lis et à chaque boucle je rentre les informations dans la base. à ma grande surprise j'ai vu qu'il s'arrete à la ligne 88. et il ne continue pas.
    j'ai decouvert ça en regardant les informations de la base de données.
    le pire c'est qu'il me dis pas qu'il s'arrete.
    voici 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
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    <?php
    //include("login.php");
     
    $monfichierCSV=getFichierCSV();
    OuvertureFichier($monfichierCSV);
    /* cette fonction sert à recuperer le nom du fichier envoyer par le formulaire et renvoie donc ce nom du fichier*/
    function getFichierCSV()
    {
    	/*on stocke le fichier dans un endroit sur le serveur*/
    	$stock="/var/www/apache2-default/script/";
    	if (move_uploaded_file($_FILES['fichierEnvoi']['tmp_name'], $stock.$_FILES['fichierEnvoi']['name']))
    	{
        		echo "Le fichier ".$_FILES['fichierEnvoi']['name']." a ete telecharge avec succes dans ".$stock."<br /><br /><hr>";
    	}
    	$monfichierCSVF=$_FILES['fichierEnvoi']['name'];
    	return $monfichierCSVF;
    }
     
    function connection()
    {
    	$link=mysql_pconnect("localhost","root","") or die("Connexion au serveur impossible");
    	$db=mysql_select_db("omnipub",$link) or die("Selection de la base impossible");
    }
     
    function OuvertureFichier($fichier)
    {
    	$memeRef=false; //teste si la reference du fichier csv=ref de la table objets
    	//echo "appel de la fonction getReferenceTableObjets <br /><br />";
    	$tabRefObj=getReferenceTableObjets();
    	//echo "Fin appel de la fonction getReferenceTableObjets <br /><br />";
    	$taille=1027;
    	$delimiteur=";";
    	/*ouverture du fichier*/
    	if($fp= fopen($fichier,"r"))
    	{	/* extraction d'une ligne */
    		while($ligne=fgetcsv($fp,$taille,$delimiteur))
    		{	//cette boucle affiche les noms des champs du fichier csv
    			/*for($b=0;$b<sizeof($ligne);$b++)
    			{
    				echo "Le champ du fichier csv numero  " .$b . " = <b>".$ligne[$b] . "</b><br />";
    			}*/
    			//$ligne[0] contient toutes les references contenues dans le fichier csv
    			for($j=0;$j<sizeof($tabRefObj);$j++)
    			{
    				//if($ligne[0]=='ref OM');break;
    				$comp=strcmp($ligne[0],$tabRefObj[$j]);
    				//echo "La reference  csv est <b> : " .$ligne[0];echo "</b> Et      "; echo "La ref dans la table objets via la requete  est : <b> " . $tabRefObj[$j]. "</b>";echo "<br />";
    				if($comp==0)
    				{
    					$memeRef=true;
    					echo "Le Champ reference csv <b> " .$ligne[0]. " </b>= a La reference objets <b>" . $tabRefObj[$j];echo "</b><br />";
    					connection();
    					$resultQuery=mysql_query("update prix set P1=$ligne[11]*2,P2=$ligne[12]*2,P4=$ligne[13]*2,P5=$ligne[14]*1.7,P10=$ligne[15]*1.7,
    					P15=$ligne[16]*1.5,P20=$ligne[17]*1.5, qte=$ligne[9] where ref='$ligne[0]'") 
    					or die("Execution impossible de la requete des mise a jour de la reference " .$ligne[0]. " des produits existants , l'erreur est ". mysql_error());
    				}
    				//else echo "le champ csv <b> ".$ligne[0]."</b> est different de la reference de la table objet <b> ".$tabRefObj[$j] ." </b><br />";
    			}
    			if($memeRef==false)
    			{ 
    				echo " Insertion de la reference :<b> " .$ligne[0]. " </b>dans la base<br /> <br /><br />";
    				connection();
     
    				$reqInsertInt_Obj_Cat="insert into int_obj_cat(cid,ref)values('$ligne[7]','$ligne[0]')";
    				mysql_query($reqInsertInt_Obj_Cat) or die("Erreur insertion de la requete " .$reqInsertInt_Obj_Cat . " l'erreur est ". mysql_error() );
    				$reqInsertInt_Obj_Coul="insert into int_obj_coul values('$ligne[7]','$ligne[0]')";
    				mysql_query($reqInsertInt_Obj_Coul) or die("Erreur insertion de la requete " .$reqInsertInt_Obj_Coul . " l'erreur est ". mysql_error() );
     
     
    				$reqInsertPrix="insert into prix(ref,P1,P2,P4,P5,P10,P15,P20,qte) values('$ligne[0]','$ligne[11]'*2,'$ligne[12]'*2,'$ligne[13]'*2,'$ligne[14]'*1.7,'$ligne[15]'*1.7,'$ligne[16]'*1.5,'$ligne[17]'*1.5,'$ligne[9]')";
    				mysql_query($reqInsertPrix) or die("Erreur insertion de la requete " .$reqInsertPrix . " l'erreur est ". mysql_error() );
     
     
    				$ReqPrixChamp = "select id  from prix where ref ='$ligne[0]'" ;
    				$resultat = mysql_query ($ReqPrixChamp) or die ("Requete <b> ".$ReqPrixChamp."</b> impossible") ;
    				while ($reponse = mysql_fetch_array ($resultat))  
    				//echo "$reponse[0]" ;echo" <br />";
    				$res="$reponse[0]";
    				echo "res vaut " .$res ." <br />";
     
     
    				//$RequeteIdPrix="select id from prix where ref LIKE '$ligne[0]'";echo " la requete est :<b> " . $RequeteIdPrix;echo "</b><br />";
    				//$IdPrix=mysql_query($RequeteIdPrix) or die("Selection  impossible de ID prix <br /> l'erreur est ". mysql_error());
    				//echo "le id correspondant a la reference <b>".$ligne[0]."</b> est :<b> ". $IdPrix . "</b><br /><br />";
     
    				$reqInsertObjet="insert into `objets`(`ref`, `nom`, `descriptif`, `type`,`prix`,`fournisseur`) values ('".mysql_escape_string($ligne[0])."','".mysql_escape_string($ligne[2])."','".mysql_escape_string($ligne[4])."','".mysql_escape_string($ligne[6])."','$res','".mysql_escape_string($ligne[1])."')";
    				mysql_query($reqInsertObjet) or die("Erreur insertion de la requete " .$reqInsertObjet . " l'erreur est ". mysql_error());
    				echo "res apres 1er vaut " .$res ." <br />";
    			}
     
    		}
     
    	}
    	else
    	{
    		echo "Ouverture du fichier ". $fichier ." impossible";
    	}
    	fclose($fp);	
    }
     
    /* cette fonction fonctionne*/
    function getReferenceTableObjets()
    {
    	$tteReferences=array();
    	connection();
    	$i=0;
    	$requete="select distinct ref from objets";
    	$refObjet=mysql_query($requete) or die("Execution de la requete".$requete." dans la fonction getReferenceTableObjets impossible");
    	while($mesRef=mysql_fetch_assoc($refObjet))
    	{
    		$tteReferences[$i]=$mesRef['ref'];
    		//echo "la reference dans la base num ".$i. " est ". $tteReferences[$i];echo "<br />";
    		$i++;
    	}	
    	return $tteReferences;
    }
     
    function getIdPrix($refidp)
    {
    	$tot = "select id  from prix where ref ='$refidp'" ;
     
     
    /* Statistique */
    $resultat = mysql_query ($tot) or die ("Requête impossible") ;
    while ($reponse = mysql_fetch_array ($resultat))  
    echo "$reponse[0]" ;echo" <br />";
     
    //mysql_close ($connexion) ;
     
    //echo "$reponse" ;
    return "$reponse[0]";//tres important les cotes sinon ça marche pas
    }
     
    ?>
    je comprends rien.
    la ligne ou il s'arete est :
    OM192433;19; MATRIX XL METALLIC;;Stylo à bille rétractable avec design du corps innovateur en coloris métallisé. Zone de préhension souple. Pointe en métal solide et clip en métal chromé mat. Recharge plastique super grande capacité, type G2, écriture bleue. Matériel: plastique, métal;;Objet;147;11-87-27;500;1.76;1.76;0.00;1.76;0.00;1.76;0.00;1.76

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ton programme ne capte aucune erreur mysql quand il s'arrête ?

    Tu as une variable $taille = 1027 qui est utilisée par la fonction fgetcsv. Peut-être que la ligne 88 fait plus de 1027 caractères ?

    Peut-être aussi que la ligne en erreur ne contient pas le même nombre de colonnes que les autres ?
    Inspire toi du programme ci-dessous pour vérifier le nombre de colonnes du fichier csv.
    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
    <?php
    /* testbovins.php
    Teste l'intégrité des lignes de la table BOVINS_x ou VEAUX_x
    */
    $nomfich = "c:\\Documents and Settings\\esruser\\Mes documents\\TRANSHUMANCE_SORT_2005_2006.txt";
     
    //Ouverture fichier
    if(!($fp = fopen($nomfich, "r")))
    {
        printf("Impossible d'ouvrir le fichier texte %s", $nomfich);
        exit();
    }
     
    while( !feof($fp))
    {
        $lu = fgets($fp, 50000);
        $lu = trim($lu);
     
        if($lu == '') continue;
     
        //Traitement de $lu
        $t = explode(';', $lu);
        $nt = count($t);
     
        if($nt <> 7) echo $lu . "\r\n";
    }
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Bonjour CinePhil.
    Merci pour votre réponse.
    j'ai testé votre programme et il m'affiche tous mon fichier et je comprends pas.
    pour tes questions:
    Mysql ne me renvoie aucune erreur.
    dans tous les fichiers il ya le meme nombre de colonnes.
    et pour le nombre de caractère que contient la ligne concernée je ne sais pas.
    si vs avez une idée je suis là.
    Merci

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Euh... il faut adapter le programme quand même !
    La ligne suivante teste le nombre de colonnes requises pour une ligne du fichier et renvoie la ligne si ce nombre est différent.
    Dans ton cas tu n'as pas 7 colonnes mais beaucoup plus d'après l'exemple de ligne que tu as donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($nt <> 7) echo $lu . "\r\n";
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut
    Je l'ai adapté mais je comprends pas ce qu'il m'affiche.
    j'ai rajouté un <br /> pour un retour ligne pour voir chaque ligne.
    et là ca correspond à ce que j'ai dans mon fichier csv.
    de quoi ça peut venir?enfin si qqn voit mieux !
    Merci

  6. #6
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut fichier csv
    j'ai trouvé le problème: le programme ne lit pas les champs csv a partir de la ligne 88. j'ai fait un echo des champs et au lieu qu'il continue jusq'a l'affichage de 24eme champ il s'arrette au 17eme.

    voici l'affichage pour cette ligne du fichier csv(valide car les insertions se realisent)

    OM190031;19; DELGADO CHROME/DORE STYLO PLUME;;Instruments d'écriture avec corps en métal et attributs en métal dorés. Plume en acier inoxydable doré à pointe iridium (M).;;Objet;396;38;500;5.203;5.203;0.00;5.203;0.00;5.203;0.00;5.203;;;;;;;

    son affichage donne ceci:

    Le champ du fichier csv numero 0 = OM190031
    Le champ du fichier csv numero 1 = 19
    Le champ du fichier csv numero 2 = DELGADO CHROME/DORE STYLO PLUME
    Le champ du fichier csv numero 3 =
    Le champ du fichier csv numero 4 = Instruments d'écriture avec corps en métal et attributs en métal dorés. Plume en acier inoxydable doré à pointe iridium (M).
    Le champ du fichier csv numero 5 =
    Le champ du fichier csv numero 6 = Objet
    Le champ du fichier csv numero 7 = 396
    Le champ du fichier csv numero 8 = 38
    Le champ du fichier csv numero 9 = 500
    Le champ du fichier csv numero 10 = 5.203
    Le champ du fichier csv numero 11 = 5.203
    Le champ du fichier csv numero 12 = 0.00
    Le champ du fichier csv numero 13 = 5.203
    Le champ du fichier csv numero 14 = 0.00
    Le champ du fichier csv numero 15 = 5.203
    Le champ du fichier csv numero 16 = 0.00
    Le champ du fichier csv numero 17 = 5.203
    Le champ du fichier csv numero 18 =
    Le champ du fichier csv numero 19 =
    Le champ du fichier csv numero 20 =
    Le champ du fichier csv numero 21 =
    Le champ du fichier csv numero 22 =
    Le champ du fichier csv numero 23 =
    Le champ du fichier csv numero 24 =


    voici l'affichage d'une ligne peut etre invalide!!!
    la ligne correspondant est:


    OM190142;19; VENECIA CHROME STYLO PLUME;;Instruments d'écriture avec corps en métal et laque ultra brillant à plusieurs couches. Attributs en métal chromé. Plume ciselée en acier inoxydable à pointe iridium (M).;;Objet;396;;500;12.13;12.13;0.00;12.13;0.00;12.13;0.00;12.13

    Le champ du fichier csv numero 0 = OM190142
    Le champ du fichier csv numero 1 = 19
    Le champ du fichier csv numero 2 = VENECIA CHROME STYLO PLUME
    Le champ du fichier csv numero 3 =
    Le champ du fichier csv numero 4 = Instruments d'écriture avec corps en métal et laque ultra brillant à plusieurs couches. Attributs en métal chromé. Plume ciselée en acier inoxydable à pointe iridium (M).
    Le champ du fichier csv numero 5 =
    Le champ du fichier csv numero 6 = Objet
    Le champ du fichier csv numero 7 = 396
    Le champ du fichier csv numero 8 =
    Le champ du fichier csv numero 9 = 500
    Le champ du fichier csv numero 10 = 12.13
    Le champ du fichier csv numero 11 = 12.13
    Le champ du fichier csv numero 12 = 0.00
    Le champ du fichier csv numero 13 = 12.13
    Le champ du fichier csv numero 14 = 0.00
    Le champ du fichier csv numero 15 = 12.13
    Le champ du fichier csv numero 16 = 0.00
    Le champ du fichier csv numero 17 = 12.13


    j'ai regardé à la fin de ma deuxieme ligne et il yavait pas de point virgule. a savoir que les champs partant de 18 a 24 je ne les utilise pas.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par tifsa Voir le message
    j'ai regardé à la fin de ma deuxieme ligne et il yavait pas de point virgule. a savoir que les champs partant de 18 a 24 je ne les utilise pas.
    C'est bien de là que vient le problème.
    Donc si tu as normalement 24 champs par ligne, tu adaptes mon programme en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($nt <> 24) echo $lu . "\r\n";
    Si tu veux un affichage à l'écran plutôt qu'une sortie redirigée vers un fichier texte, tu remplaces
    "\r\n" par <br />.
    Tu obtiendras toutes les lignes ayant un nombre de champs différent de 24.

    Ton programme étant sans doute basé sur des lignes de 24 colonnes, il doit planter sur la première ligne qui ne respecte pas ce standard.

    L'affichage des lignes en erreur avec mon programme te permettra de déterminer quelle est l'erreur sur chaque ligne. Ce n'est pas forcément un manque de ';' à la fin mais il peut aussi en manquer au milieu. À voir avec les types de données retournées par rapport à une ligne complète.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. lire un fichier CSV et enregistrer dans la bdd
    Par kariel dans le forum Développement Web en Java
    Réponses: 9
    Dernier message: 15/05/2014, 12h54
  2. Réponses: 3
    Dernier message: 24/10/2012, 13h01
  3. [Débutant] Lire fichier csv et remplir dans une base de données
    Par YTRABELSI dans le forum C#
    Réponses: 29
    Dernier message: 09/06/2012, 22h28
  4. Réponses: 9
    Dernier message: 02/06/2009, 15h37

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