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.
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...
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...
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 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...^^
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.
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..
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
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...)
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
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..
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 ^^
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)
//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é.
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 ^^
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.
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.
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...^^
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 !
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 ?
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 :
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):
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... :(
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 ^^