Charger un fichier texte dans une base de données mysql

Résolu/Fermé
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014 - 12 févr. 2014 à 14:34
 camile - 1 mai 2015 à 04:27
Bonjour à tous ! je suis débutant en PHP et j'ai un problème dans ce langage qui est le suivant: dans mon projet donc je suis en train de coder en PHP, j'ai un fichier texte que je dois lire chaque ligne contenant 6 mots chacune, et stocker ces 6 mots respectivement dans 6 colonnes d'une table de ma Base de Données (MySQL). Ceci pour toutes les lignes (plus de 100000 lignes). Voici un extrait de ce fichier.

( IM ME ES PU AK MD)

624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640 33830000
624030743830001 A100001D7DEE6E 80AE089F 91944192 F9052B04E3969977 33830001
624030743830002 A100001D7DEE6F 809A1A9F 29861661 4617481A74D864B5 33830002
624030743830003 A100001D7DEE70 80E68950 20303707 1C45F0418B552C45 33830003
624030743830004 A100001D7DEE71 80C275C6 70591541 EA26D0523114FFF2 33830004
624030743830005 A100001D7DEE72 80932253 44181182 1384BC94E9D33B9C 33830005
624030743830006 A100001D7DEE73 8035029C 38663053 1225153351556433 33830006
624030743830007 A100001D7DEE74 80CB3B71 64591576 3C96BB2772B43D85 33830007
624030743830008 A100001D7DEE75 800B3616 06726100 E33622230DA94ABF 33830008

voilà un extrait du contenu de mon fichier texte. Maitenant il faut que je le charge dans une

table (nommée: coord) de ma BD (nommée: gestnu), structure de la table:

colonne 1 -> IM, 2 -> ME, 3 -> ES, 4 -> PU, 5 -> AK, 6 -> MD


S'il vous plait aidez moi je compte beaucoup sur votre aide car mon projet est en arrêt

maintenant à cause de ce problème.

Merci d'avance
A voir également:

23 réponses

Profil bloqué
13 févr. 2014 à 13:50
ton fichier text ressemble à ça :

( IM ME ES PU AK MD)

624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640 33830000
624030743830001 A100001D7DEE6E 80AE089F 91944192 F9052B04E3969977 33830001
624030743830002 A100001D7DEE6F 809A1A9F 29861661 4617481A74D864B5 33830002
624030743830003 A100001D7DEE70 80E68950 20303707 1C45F0418B552C45 33830003
624030743830004 A100001D7DEE71 80C275C6 70591541 EA26D0523114FFF2 33830004
624030743830005 A100001D7DEE72 80932253 44181182 1384BC94E9D33B9C 33830005
624030743830006 A100001D7DEE73 8035029C 38663053 1225153351556433 33830006
624030743830007 A100001D7DEE74 80CB3B71 64591576 3C96BB2772B43D85 33830007
624030743830008 A100001D7DEE75 800B3616 06726100 E33622230DA94ABF 33830008


ou à ça :


624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640 33830000
624030743830001 A100001D7DEE6E 80AE089F 91944192 F9052B04E3969977 33830001
624030743830002 A100001D7DEE6F 809A1A9F 29861661 4617481A74D864B5 33830002
624030743830003 A100001D7DEE70 80E68950 20303707 1C45F0418B552C45 33830003
624030743830004 A100001D7DEE71 80C275C6 70591541 EA26D0523114FFF2 33830004
624030743830005 A100001D7DEE72 80932253 44181182 1384BC94E9D33B9C 33830005
624030743830006 A100001D7DEE73 8035029C 38663053 1225153351556433 33830006
624030743830007 A100001D7DEE74 80CB3B71 64591576 3C96BB2772B43D85 33830007
624030743830008 A100001D7DEE75 800B3616 06726100 E33622230DA94ABF 33830008

en gros là, il n'arrive pas à lire ta première ligne (surement parce que soit elle est vide, soit ne correspond pas à ce qu'il attend.

As-tu changer le nom du fichier par le tiens ? moi dans le code que je t'ai fournis il s'intitule text.txt mais le tiens a surement un autre nom...

je pourrai difficilement faire mieux à présent, j'ai repris tout ton code source de départ, ta base de données etc...je ne vois pas où sa pourrai planté là si ce n'est pas ces deux chose !

verifie bien que ton fichier commence directement par
624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640

et absolument rien d'autre (pas même un espace, un saut de ligne ou autre...)
et verifie surtout que tu as bien mis le nom de ton fichier (et éventuellement son arborescence...
1
Profil bloqué
13 févr. 2014 à 13:59
au pire envoi moi en message privée tes fichiers (php, txt et ton arborescence) afin que je vois ça car il n' y a pas de raison de mon coté tout fonctionne vraiment parfaitement...
0
Profil bloqué
12 févr. 2014 à 15:32
bonjour,

a premiere vue on dirai du format CSV, pourquoi n'utilise tu pas la fonction fgetscsv de php ??

ou pourquoi pas un file_get_contents("ton_fichier");

tu récupère le tout sous forme de chaine de caractère, et tu troncque à chaque espace.

La sortie sera un tableau (correspondant au 6 de chaque ligne)

après tu bidouille avec un foreach de sorte a récupéré les 6 premiers, tu insert en base et tu recommence pour la ligne suivante...

Mais je pense que fgetscsv fera bcp plus l'affaire...je te laisse voir la fonction en ligne, tu vas adoré...

bon courage,
n'hesite pas à nous faire un retour...
0
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
12 févr. 2014 à 17:36
Voici mon code:



<?php

mysql_connect('[/contents/523-adresse-ip localhost]','[/contents/646-linux-gestion-des-utilisateurs root]','');
mysql_select_db('gestnum');

$file = 'fichab.txt';
$taille = 99999;
$delimiteur = "\r";
 
if($fp = fopen($file,"r")) {
mysql_query("DELETE FROM coordab");
 
 while ($ligne = fgets($fp, $taille)) {
  $table = explode($delimiteur, $ligne);
  foreach($table as $elem) {
  $delimiteur_champ = "\t";
  $champs = explode($delimiteur_champ, $elem);
    
         
 mysql_query("INSERT INTO coordab (ida, IMSI, MEID, ESN1, PUK1, AKY, MDN) VALUES ".implode(' ', $champs)) or die(mysql_error());
 
}

}

fclose ($fp);
}

?>




et cela m'affiche l'erreur suivante:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640 33830000' at line 1.


Je suis bloqué

Aidez-moi SVP !
0
Profil bloqué
12 févr. 2014 à 17:53
pourquoi utilise tu implode ?

je pense que c'est celà qui fait foiré ton code...
tu stipule vouloir renseigné les champ A,B,C,D etc...mais tu ne lui passe réélement en paramètre que le champs A, lui il attend le reste..

essai de faire un var_dump($champ); pour voir déjà comment il se comporte (voir ce que contient réélement ton tableau...

après tu travaille dessus, mais je suis casi persuadé que c'est ton implode qui fou le bordel...^^

tu y est presque, persévere...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
13 févr. 2014 à 07:54
Merci pour tout ! S'il vous plait ne vous lasser pas de m'aider, voici ce que vous m'avez demander de faire.




mysql_connect('localhost','root','');
mysql_select_db('gestnum');

$file = 'fichab.txt';
$taille = 99999;
$delimiteur = "\r";
 
if($fp = fopen($file,"r")) {

mysql_query("TRUNCATE TABLE coordab");
 
 while ($ligne = fgets($fp, $taille)) {
  $table = explode($delimiteur, $ligne);
  $delimiteur_champ = "\x20";
  foreach($table as $elem) {
  
  $champs = explode($delimiteur_champ, $elem);
    
         
 mysql_query("INSERT INTO coordab (ida,IMSI, MEID, ESN1, PUK1, AKY, MDN) 
 	           VALUES ".var_dump($champs)) or die(mysql_error());
 
}

}

fclose ($fp);
}

?>




Voilà le resultat:



array (size=6)
0 => string '624030743830000' (length=15)
1 => string 'A100001D7DEE6D' (length=14)
2 => string '80E5FA73' (length=8)
3 => string '37312379' (length=8)
4 => string '0E47EA7A6F444640' (length=16)
5 => string '33830000;' (length=9)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2


Maintenant je ne sais plus quoi faire, souvenez vous de ce que je vous ai dit dès le départ. je suis débutant en php et ceci est mon tout premier projet en php. Aidez moi.
0
Profil bloqué
13 févr. 2014 à 09:44
oulala,

l'erreur est très facile à comprendre, tu fais un var_dump dans une requete SQL. brrrr à bannir ^^

ton var_dump il faut le mettre en dehors, genre :

var_dump($champs);

mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN)
VALUES ($champ[0],$champ[1],$champ[2],$champ[3],$champ[4],$champ[5]") or die(mysql_error());


par ailleurs, tu as 6 données dans ton tableau (6colonnes) et tu cherche à en insérer 7...forcément sa coince,
à mon avis il s'agit de ta premiere colonne (ida) qui j'imagine est en AUTO_INCREMENT, donc t'embéte pas à la précisé...sauf si sa s'avere necessaire, mais alors dans ce cas il faut indiqué par quoi tu veux la remplir..

En espérant t'avoir aider d'avantage...
0
Profil bloqué
13 févr. 2014 à 09:48
d'ailleurs, la syntaxe exact devrais étre :

mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN)
VALUES (".$champ[0].",".$champ[1].",".$champ[2].",".$champ[3].",".$champ[4].",".$champ[5].");") or die(mysql_error());

(désolé la première a été tapé rapidos sans verif avant ^^)
0
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
13 févr. 2014 à 10:08
Voici ce qu'il m'affiche maintenant:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FA73,37312379,0E47EA7A6F444640,33830000)' at line 2

SVP encore un coup de main, je suis dépassé.
0
Profil bloqué
13 févr. 2014 à 10:42
Après avoir testé de mon coté, sa devrais fonctionner du tiens, essai ça :
<?php
mysql_connect('localhost','root','');
mysql_select_db('gestnum');

//on vide la table coordab avant
mysql_query("TRUNCATE TABLE coordab");

//On ouvre le fichier en question (en lecture seule)
$handle = fopen("text.txt", "r");

//on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
while ($data = fgetcsv($handle, 1000, ",")) {

//$data correspond à une ligne complete, nous n'avons plus qu'à l'exploser pour tout récupérer
	$explode = explode(' ',$data[0]);
	
//Maintenant qu'on à tous, on l'insert en base
mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
 	           VALUES (".$explode[0].",".$explode[1].",".$explode[2].",".$explode[3].",".$explode[4].",".$explode[5].");") or die(mysql_error());
    }
//On ferme le fichier
fclose($handle);
?>


Si sa ne marche toujours pas sa doit venir de la structure de ta table en base, faudra que tu nous envoi un peu sa structure pour qu'on voit à quoi elle ressemble (champs varchar(255), ida en auto_increment etc...)

tiens nous au courant...
0
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
13 févr. 2014 à 11:10
Merci pour votre disponibilité, voici la structure de ma table coordab:


# Nom Type Interclassement Attributs Null Défaut Extra Action
1 ida int(60) Non Aucune AUTO_INCREMENT Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
plus
2 IMSI varchar(255) latin1_swedish_ci Non Aucune Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
plus
3 MEID varchar(255) latin1_swedish_ci Non Aucune Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
plus
4 ESN1 varchar(255) latin1_swedish_ci Non Aucune Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
plus
5 PUK1 varchar(255) latin1_swedish_ci Non Aucune Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
plus
6 AKY varchar(255) latin1_swedish_ci Non Aucune Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
plus
7 MDN varchar(255) latin1_swedish_ci Non Aucune Modifier Modifier Supprimer Supprimer
Primaire Primaire
Unique Unique
Index Index
Spatial Spatial
Texte entier Texte entier
plus

Je viens de tester le code que vous m'avez envoyé mais il m'affiche toujours ceci:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FA73,37312379,0E47EA7A6F444640,33830000)' at line 2

SVP ne vous lasser point, je ne connais pas.
0
tu es fait avec PHP, mois je fait le java comment posséder?
0
Profil bloqué
13 févr. 2014 à 11:22
ouaaah un peu bourrin la structure,

j'aurai eu besoin de la structure extraite directement de phpMyAdmin.

Pour ce faire, rendez-vous sur votre phpMyAdmin,
- selectionnez votre base,
- puis dans l'onglet "exporter",
- selectionner l'option "Personnalisée - afficher toutes les options possibles"
- une fois là, selectionnez toutes les tables,
- dans la partie "sortie", selectionner "afficher les resultats",

et en bas de page, cliquer enfin sur "executer".

Là, le code va s'afficher, copier coller le ici...

A mon avis le problème vient de la structure vraiment...de mon coté j'ai testé le code que je t'ai envoyé, aucun problème..

ne te décourage pas

on y est presque...
0
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
13 févr. 2014 à 11:31
phpMyAdmin SQL Dump
-- version 4.0.4
-- https://www.phpmyadmin.net/
0
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
13 févr. 2014 à 11:41
J'ai enlevé la virgule ', ' et remplacer par un espace au niveau de :

while ($data = fgetcsv($handle, 1000, ","))

pour avoir while ($data = fgetcsv($handle, 1000, " ")) et il m'affiche l'erreur

suivante:

Notice: Undefined offset: 1 in C:\wamp\www\etudephp\chargerbd.php on line 20
0
Profil bloqué
13 févr. 2014 à 12:03
normal, puisqu'a l'origine se n'est pas un csv, je suis cependant d'accord avec toi sur le fait que dans la logique celà devrais étre un espace et non une virgule...mais si tu ne mets pas de virgule, tout fou le camp.

en gros, laisse avec une virgule pour le moment, je me charge de regardé la BDD et reviens vers toi ^^

patience...
0
Profil bloqué
13 févr. 2014 à 12:28
Re bonjour,

l'effort été totalement idiote et venait de moi, juste une histoire de guillemet autours des données dans la requete...

remplace la requete par celle là (juste un retravaille au niveau des guillemet, et hop de mon coté impeccable...):
//Maintenant qu'on à tous, on l'insert en base
mysql_query('INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
 	           VALUES ("'.$explode[0].'","'.$explode[1].'","'.$explode[2].'","'.$explode[3].'","'.$explode[4].'","'.$explode[5].'");') or die(mysql_error());
</php> 
 


En revanche fait attention car si ton fichier est super lourd sa risquerai de mettre un petit moment ^^

tiens moi au courant (en théorie ton prochain post devrais étre "yesss sa marche" lol)
0
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014
13 févr. 2014 à 12:40
Voilà le code que vous m'avez envoyé et que j'ai mis :

<?php

mysql_connect('localhost','root','');
mysql_select_db('gestnum');

//on vide la table coordab avant
mysql_query("TRUNCATE TABLE coordab");

//On ouvre le fichier en question (en lecture seule)
$handle = fopen("fichab.txt", "r");

//on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
while ($data = fgetcsv($handle, 1000, ",")) {

//$data correspond à une ligne complete, nous n'avons plus qu'à l'exploser pour tout récupérer
$explode = explode(' ',$data[0]);

//Maintenant qu'on à tous, on l'insert en base
mysql_query('INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN)
VALUES ("'.$explode[0].'","'.$explode[1].'","'.$explode[2].'","'.$explode[3].'","'.$explode[4].'","'.$explode[5].'");') or die(mysql_error());

}
//On ferme le fichier
fclose($handle);
?>

Et voilà ce que cela m'affiche


Notice: Undefined offset: 2 in C:\wamp\www\etudephp\chargerbd.php on line 20
Call Stack
# Time Memory Function Location
1 0.0007 251280 {main}( ) ..\chargerbd.php:0

( ! ) Notice: Undefined offset: 3 in C:\wamp\www\etudephp\chargerbd.php on line 20
Call Stack
# Time Memory Function Location
1 0.0007 251280 {main}( ) ..\chargerbd.php:0

( ! ) Notice: Undefined offset: 4 in C:\wamp\www\etudephp\chargerbd.php on line 20
Call Stack
# Time Memory Function Location
1 0.0007 251280 {main}( ) ..\chargerbd.php:0

( ! ) Notice: Undefined offset: 5 in C:\wamp\www\etudephp\chargerbd.php on line 20
Call Stack
# Time Memory Function Location
1 0.0007 251280 {main}( ) ..\chargerbd.php:0

SVP aidez moi toujours, je sais que vous ai déjà beaucoup occupé.
0
Profil bloqué
13 févr. 2014 à 14:55
C'est un truc tout con qui fait planté ton code...

En fait dans ton fichier fichtab.txt, il y a un espace et un saut de ligne tout à la fin...c'est ça qui fait planté et c'est logique.
On demande au code de lire chaque ligne et d'explosé le résultat de chaque ligne...

arrivé à la dernière, comme tu as un saut de ligne, lui il cherche pas à comprendre, il la lit...il capte deux espace dans cette ligne et après plus rien...de ce fait il pense que tu as une ligne incompléte et donc n'insert plus en base et te remonte une erreur.

En gros retire juste les saut de ligne et les espaces etc qu'il y a juste après la dernière ligne de ton fichier...et...enjoy ^^

Bon courage !
0
Merci à toute l'equipe, car mon problème est presque resolu. Mais un aspect reste

encore: en effet mon fichier texte a 99 999 lignes, mais ce n'est que 547 lignes qui

sont stockés dans la base lorsque j'exécute le script. Puis il m'affiche l'erreur

suivante:

( ! ) Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\pagecon\toutespages\locations\chargerbd.php on line 19
Call Stack

#	Time	Memory	Function	Location
1	0.0020	253936	{main}( )	..\chargerbd.php:0





J'utilise WampServer 2.4 . Que faire ? SVP aidez moi.
0
Merci à toute l'equipe, car mon problème est presque resolu. Mais un aspect reste

encore: en effet mon fichier texte a 99 999 lignes, mais ce n'est que 547 lignes qui

sont stockés dans la base lorsque j'exécute le script. Puis il m'affiche l'erreur

suivante:


 ! ) Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\pagecon\toutespages\locations\chargerbd.php on line 19
Call Stack

#	Time	Memory	Function	Location
1	0.0020	253936	{main}( )	..\chargerbd.php:0


J'utilise WampServer 2.4 . Que faire ? SVP aidez moi.
0
Profil bloqué
14 févr. 2014 à 09:13
Dans ce cas tout en haut de ton fichier tu ajoute ceci (première ligne de ton script juste après ton <?php):

ini_set('max_execution_time', 0);

(en fait à l'origine ton script ne peux s'executé que pendant un temps donnée...(chez toi, pendant 30 seconde) ...avec cette ligne tu lui donne l'ordre de ne pas avoir de limite dans le temps pour s'executé...

c'est particulièrement utile quand on a de très gros script...^^

Bon courage à toi,

informe nous si c'est résolu !
0
Merci beaucoup pour mon problème que vous avez résolu . J'ai mis set_time_limit(0); à l'entête
et dans php.ni, j'ai mis max_execution_time à 100000; et ça fonctionne à merveille. Merci encore.

Mais j'ai encore un petit souci, comment insérer une barre de progression qui montre la progression du chargement des données dans la BDD, car ça prend assez de temps pour charger (des dizaines de minuite). Merci d'avance !
0
Profil bloqué
14 févr. 2014 à 10:51
De rien, sa m'a fait plaisir de t'aider...et peut-étre qu'un jour se sera ton tour hihi ^^

Sinon ouaaah pour faire une barre de progression on a pris une très mauvaise route là...
Il aurai fallu le faire en ajax par exemple et encore c'est très compliqué à faire..

Au pire affiche juste un petit engrenage qui tourne, et en dessous un message indiquant "merci de patienter...le processus peut prendre plusieurs minutes, ne recharger pas la page même si celle-ci semble figé"

m'enfin dans ton cas actuel je pense que c'est la meilleure solution...le faire en ajax deviendrai à mon sens trop complexe pour toi étant débutant...^^

Ravie d'avoir pu solutionner ton problème.
Le post étant résolu, peut tu le tracer en résolu ?

merci..

http://sarl-adams.fr
0
Anju44 Messages postés 6 Date d'inscription mardi 28 août 2012 Statut Membre Dernière intervention 31 mai 2014
Modifié par Anju44 le 22/05/2014 à 09:52
Bonjour,

Je suis désolée, je me permets de remonter ce sujet, car j'ai le même problème que Nguim. La seule chose qui change est que je dois entrer les chaînes de caractère de 45 fichiers !

Pour poser un peu l'environnement : je travaille sur un projet qui analyse la consommation des imprimantes. Un script python a été écrit récupérant les compteurs d'imprimantes tous les jours. Dans chaque fichier csv (correspondant à une imprimante) se trouve des dizaines de chaînes de caractères, ressemblant à ceci :

30/01/14;28433
31/01/14;28631
01/02/14;28641
02/02/14;28641
03/02/14;28657
04/02/14;28674
05/02/14;28700
07/02/14;28743

J'ai réussi à créer un script qui ouvre, lit tous les fichiers, et coupe les chaînes de caractères, de ce côté là pas de soucis. Mais après, je n'arrive pas à les entrer dans ma base de données.

Celle-ci se compose de six tables, mais c'est la table "compteurs" qui m'intéresse. Elle se compose ainsi :
id_imprimante (clé étrangère de la table imprimante), date_releve, compteur.
Sachant que id_imprimante, date_releve est la clé primaire de la table compteurs.

Mon script est le suivant :

<?php

function parcourir_repertoire($repertoire)
{
 $le_repertoire = opendir($repertoire) or die("Erreur le repertoire $repertoire n'existe pas");
 while($fichier = @readdir($le_repertoire))
 {
  if ($fichier == "." || $fichier == "..") continue;
  if (is_dir($repertoire. '/'.$fichier))
  {
   print '<ul>'.$repertoire.'/'.$fichier;
   parcourir_repertoire($repertoire.'/'.$fichier);
   print '</ul>';
  }
  else
  {
   print "$fichier \n";
   $myfile = file_get_contents($repertoire. '/' .$fichier, "r");
   
   // Découpe les chaines de caractères de tous les fichiers  
   $chaine = $myfile;
   print_r(explode(';', $chaine));
  }
 }
}

parcourir_repertoire('/script_python/historique');

?>


Et le résultat est celui-ci (ce n'est qu'une partie d'un fichier):

Array
(
[0] => 30/01/14
[1] => 50651
30/01/14
[2] => 50651
31/01/14
[3] => 50658
01/02/14
[4] => 50685
02/02/14
[5] => 50685
)

Est-ce normal que les dates n'aient pas de valeur devant ? Sachant que la première date en a une ?

A partir de là, je ne sais pas comment faire pour tout entrer dans la base de données, j'ai lu ce qui a été fait dans ce sujet et j'ai essayé sur un seul fichier, mais ça me renvoie ceci :

PHP Notice: Undefined offset: 1 in /var/www/script_chaines_test.php on line 19
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 2

Je pense que ce doit être une erreur bête, mais je n'arrive pas à comprendre...
Et une fois que j'aurai réussi à le faire sur un fichier, comment le faire pour tous les fichiers ? Sachant qu'en plus, une fois dans la base de données, il doit y avoir l'imprimante à laquelle les compteurs correspondent...

J'espère que j'ai été assez claire dans mes explications, et je vous remercie par avance de me venir en aide, car je bloque dessus et je ne peux pas continuer mon projet tant que ce n'est pas fait... :(

Ju'

P.S : Je vais, de mon côté, essayer de continuer d'analyser le script donné ici ^^

P.S.2 : J'ai essayé donc de le faire pour un seul fichier avec le code ci-dessous qui a été donné dans le sujet :

<?php

mysql_connect('localhost', 'root', 'a');
mysql_select_db('imprimantes_test');

mysql_query("TRUNCATE TABLE compteur");

// On parcourt le fichier (en lecture seule)
$handle = fopen("172.17.68.94.csv", "r");

// On parcourt tout le fichier
while ($data = fgetcsv($handle, 1000, ";"))
{
	//$data correspond à une ligne complète, nous n'avons plus qu'à l'exploser pour tout récupérer
	$explode = explode(' ', $data[0]);
	
	// On l'insert dans la base
	mysql_query("INSERT INTO compteur (id_imprimante, date_releve, compteur) 
			VALUES ('', '.$explode[0].', '.$explode[1].');") or die(mysql_error());
}

// On ferme le fichier
fclose($handle);

?>


Et ça me renvoie ceci comme erreur :

PHP Notice: Undefined offset: 1 in /var/www/script_chaines_test.php on line 19
Cannot add or update a child row: a foreign key constraint fails ('imprimantes_test'.'compteur', CONSTRAINT 'FK_imprimante' FOREIGN KEY ('id_imprimante') REFERENCES 'imprimantes' ('id_imprimante'))

Donc comme je le pensais, il va vraiment y avoir un problème avec la clé étrangère de la table imprimante... :(
0
Profil bloqué
22 mai 2014 à 23:59
Bonjour,

en lisant très (mais alors très très) rapidement le sujet, déjà l'erreur parle d'elle même.

En effet tu as une erreur au niveau de ton insertion dans mySQL, ce qui est logique car là tu lui dit en gros "insert moi RIEN dans id_imprimante", hors c'est un champs obligatoire.

Essai plutot comme ceci dans un premier temps:

mysql_query('INSERT INTO compteur SET date_releve="'.$explode[0].'", compteur="'.$explode[1].'"') or die(mysql_error());


Cette syntaxe te permet d'une part de ne préciser que les champs que tu souhaite remplir, mySQL s'occupera seul de créé l'id en question...

Si tu n'a d'autre choix que de renseigné l'ID, alors il faudra allé le chercher dans la table concernée, le stocker dans ta boucle afin de le réinjecter dans ton insertion (oui dit comme ça sa semble du chinois désolé.)


j'espère avoir répondu à tes questions...

n'hesite pas à revenir vers nous, et/ou a marqué ce message en résolu si tel est le cas...^^

ne te décourage pas, pour une débutante le début est très bien réfléchi ^^
0