prb de double boucle

prb de double boucle - PHP - Programmation

Marsh Posté le 28-09-2005 à 09:18:15    

bonjour
je vous expose mon probleme dans les grandes lignes
j'ai un fichiers csv sur lequel je lit ligne par ligne pour extraire les datas
while (($data = fgetcsv($handle, 1000, "," )) !== FALSE)
{
$row++;
for ($c=0; $c < $num; $c++)
    {
     //ici je lit les datas
    $donnee=explode(",",$data[$c]);
    }
}
fclose($handle);
 
j'ai un array : $champ=array("NUMERO","RE","STATUT","DATE","HEURE","IMMATR","CLIENT" );
 
mais j'arrive pas à incorporer la 2em boucle pour creer la chaine qui va me permettre d'injecter les donnees dans ma table mysql
$query = \"INSERT INTO TRANSAC ($champ[$numero]) VALUES ('\".$donnee[0].\"')
 
si quelqu'un à une idee.. merci gilles
 
 
 

Reply

Marsh Posté le 28-09-2005 à 09:18:15   

Reply

Marsh Posté le 28-09-2005 à 10:01:37    

Tu te rend compte de ce que tu fais???
Tu lis ton fichier csv ligne par ligne en la découpant au niveau des "," pour former un tableau.
Ensuite, ton tableau, tu le lis case par case en traitant la case comme un tableau que tu transformes en texte alors que chaque case contient du texte et pas un tableau. Et en plus pour chaque case, tu écrases le contenu de ta variable $donnee.
 
Qaund à ta requette SQL, franchement, il faut réviser le SQL par ce qu'on ne crait pas une ligne de donnée par valeur à mettre dans une colone de la table mais une ligne pour toutes les colones donc toutes les colones en une seule requette.
 
En plus des gas qui font la même erreur que toi au niveau SQL, on en a souvent alors fait une recherche sur le forum pour voir la solution. Et écrit toi sur un papier en francais ce que t'essaye de faire, comme ça tu véras bien comment améliorer ton code.

Reply

Marsh Posté le 28-09-2005 à 10:28:38    

Oui je crois qu'il y a du boulot à faire ! :/

Reply

Marsh Posté le 28-09-2005 à 10:36:43    

Tous a d'accord avec le post de OMEGA2. Quand tu auras revu le SQL tu pourras corrigé ton code de cette manière pour avoir un tableau  $donnee exploitable
 
$donnee = array();
while (($data = fgetcsv($handle, 1000, "," )) !== FALSE)
{
$row++;
for ($c=0; $c < $num; $c++)
    {
     //ici je lit les datas
    $donnee=explode(",",$data[$c]);
   array_push($donnee,explode(",",$data[$c]))
    }
}
fclose($handle);  
 
tu aurra donc tableau sous la forme ::  
array(0=>array("NUMERO","RE","STATUT","DATE","HEURE","IMMATR","CLIENT" ),1=>array("NUMERO2","RE2","STATUT2","DATE2","HEURE2","IMMATR2","CLIENT2" ));  
 
Bon j'espère que je n'ai pas ecrit trop de conneries

Reply

Marsh Posté le 28-09-2005 à 10:42:20    

Dens91 > C'est quoi l'intéret de passer par un tableau de tableaux à par compliquer encore plus le code final?

Reply

Marsh Posté le 28-09-2005 à 10:42:37    

merci pour la reponse
pour le SQL je savais que sa merdais mais je ne savais comment faire pour avoir une seul ligne de données  
merci je vois tout ca et vous tiens au coourant
a+ gilles

Reply

Marsh Posté le 28-09-2005 à 11:09:16    

omega2 a écrit :

Dens91 > C'est quoi l'intéret de passer par un tableau de tableaux à par compliquer encore plus le code final?


 
Ben c'étais juste pour ne pas changé la structure de son programe, bien sur on aurai pu l'insertion dans la boucle, ca c a lui de voir.  
 
Je pense pas que ca complique beaucoup plus le code puisqu'on ne sais pas vraiment ce qu'il vas faire avec ce code.  
Le bout de code, qui lit un fichier CSV pourrai servir a autre chose, exemple lire d'autre fichier CSV a inseré dans d'autre table.. que ca table "TRANSAC".
 
donc on pourrait imaginé qu'il pourrait faire un fonction  lectureCVS qui recoit le nom d'un fichier et qui revoit un tableau comptenant les données. Et un autre fonction qui s'occupe que de l'insertion... Resultat on a du code réutilisable.
 
Alors que si il met la requète dans la boucle ce bout de code ne pourra ètre utilisé que pour l'insertion de cette table.
 
BREF tous ca pour dire que je ne pense que ca soit beaucoup plus compliqué de faire un tableau.

Reply

Marsh Posté le 28-09-2005 à 11:31:43    

Ben là, j'ai l'impression qu'il met juste les données du fichier dans la table sans plus.
Mais c'est vrai qu'on a pas tout.
 
Par contre, vu qu'il part d'un csv avec la virgule comme délimiteur, il aurait trés bien pu utiliser directement la ligne de texte récupéré si le nombre de colones du csv est le même que celui de la table, mais c'est vrai que là aussi on ne sait pas d'où vient la valeur de son $num.

Reply

Marsh Posté le 28-09-2005 à 12:46:32    

rebonjour
je vais donner + amples explications  
le $num compte le nbr de champs, pour se qui est de la structure du prg c'est juste une aproche rien est arreté il est vrais que le faire avec des fonctions seraient plus avantageuses j'ai essayer avec array_push sans resultat la je merde vraiment la pannade .Je pensais a 2 solutions:
1- recuperer dans le fichier csv toutes les donnees superieure a la variable NUMERO et les injecter  
2- ou balancer tout le fichier et injecter que le differenciel quelle serait la meilleur solution et surtout comment proceder ??
c'est la premiere fois que je bosse sur des fichiers d'habitude j'utilisais un LOAD DATA INFILE pour injecter un fichier csv complet
merci a+ gilles
merci a+ gilles

Reply

Marsh Posté le 28-09-2005 à 14:32:51    

moi je vais devenir copieur/colleur de php.net si ça continue :p
pourquoi pas essayer d'utiliser un marteau* pour enfoncer une vis heu, un clou

Code :
  1. <?php
  2. $row = 1;
  3. $handle = fopen("test.csv", "r" );
  4. while (($data = fgetcsv($handle, 1000, "," )) !== FALSE) {
  5.     $num = count($data);
  6.     echo "<p> $num fields in line $row: <br /></p>\n";
  7.     $row++;
  8.     for ($c=0; $c < $num; $c++) {
  9.         echo $data[$c] . "<br />\n";
  10.     }
  11. }
  12. fclose($handle);
  13. ?>


évidement, implémente un contrôle d'erreur là dessus et t'es bon, non ?
 
* marteau : je laisse la pelle à clou à qui elle appartient :)


Message édité par shakpana le 28-09-2005 à 14:35:36
Reply

Marsh Posté le 28-09-2005 à 14:32:51   

Reply

Marsh Posté le 28-09-2005 à 14:40:18    

Je comprends mieux maintenant pourquoi il a pondus un tel code, la ressemblance est frapante malgrés l'adaptation  qu'il a essayer d'en faire ...
 
shakpana > Il cherche pas a afficher le contenu du fichier à l'écran mais il essaye d'envoyer le contenu du fichier dans mysql.
 
gilles974 > Ton fichier, il contient le même nombre de colones de donnée que ta table ou pas? Je te dirais plus tard le pourquoi de la question mais là on va faire petite étape par petite étape. ;)

Reply

Marsh Posté le 28-09-2005 à 14:41:52    

omega2 a écrit :

Il cherche pas a afficher le contenu du fichier à l'écran mais il essaye d'envoyer le contenu du fichier dans mysql.


j'avais prévenu copié/collé, mais avec un peu d'imagination remplacer un echo par une sql query ...
ça doit être possible ...
[edit] en esperant ne pas faire une sql query par ligne par champ  :whistle:


Message édité par shakpana le 28-09-2005 à 14:46:24
Reply

Marsh Posté le 28-09-2005 à 14:46:23    

Regarde donc ce qu'il a essayé de faire. ;) Il faut pas juste remplacer le echo bêtement sinon ca marche pas. Mais il y arrivera, faut juste qu'il arrive à réaliser d'où vient son erreur.

Reply

Marsh Posté le 28-09-2005 à 14:46:46    

ok, tu m'as eu :)

Reply

Marsh Posté le 28-09-2005 à 16:51:43    

re
merci a tous de vous pencher sur mon probleme  
oui omega2 le fichier est identique a la tbl mysql (autant de champs dans le fichier que dans la table) et oui shakpana je suis parti de l'exemple de code ci-dessus
les champs sont en dur dans un array ($champ=array("","" )) mais je n'arrive pa sa saisir le principe de reception des datas du fichiers csv, la pour moi c'est un bon exercice :o)
a+ gilles

Reply

Marsh Posté le 28-09-2005 à 20:33:40    

ok, étape suivante
-----------------------------------------------------------
fgetcsv
Renvoie la ligne courante et cherche les champs CSV
-----------------------------------------------------------
ce qui sous-entenderait que la ligne courante est parsée par php, et que $data (dans l'ex.) est un tableau, représentation "explosée" (selon le séparateur définit par toi dans l'appel) par fgetcsv de la ligne courante de ton fichier csv - whaou ...
vois-tu où cela nous mênes ?
à ta ligne 7, de ton code original, post #1
> $donnee=explode(",",$data[$c]);
qui te semblerais pas faire un peu doublon, du coup ?
--
mais tu l'avais déjà capter grâce au posts du début (omega2, Dens91)
donc tu peux attaquer la lecture de $data directement ...
par ex.
echo $data[0]." - ".$data[1]."\n";


Message édité par shakpana le 28-09-2005 à 20:37:18
Reply

Marsh Posté le 29-09-2005 à 06:44:00    

bonjour
$champ="NUMERO,RE";    
$row = 1;
$handle = fopen("TRANSAC.csv", "r" );  
while (($data = fgetcsv($handle, 1000, "," )) !== FALSE)  
      {
      $num = count($data);
      $row++;  
      for($c=0; $c < $num; $c++)
         {
         if ($row > "2" )
            {  
            echo $query = "INSERT INTO TRANSAC ($champ) VALUES ('$data[0]','$data[1]' )<br>";
             }
         }
}
fclose($handle);
 
voila shakpana le bout de code qui apparement marche :) je suis reste borné avec mon $data[$c] et mon explode je vais garder cette solution tellement simple je merite un bon coup de pied au cul merci du coup de pouce omega2 et shakpana  
 
a+ gilles

Reply

Marsh Posté le 29-09-2005 à 08:08:52    

aie aie desole de cette fausse joie
il me repete 31 x INSERT INTO TRANSAC (NUMERO,RE) VALUES ('S0555818','R' )
31 x INSERT INTO TRANSAC (NUMERO,RE) VALUES ('S0555819','R' )
et ainsi desuite  
j'avais déja tester ca dans mes nombreuses feuille d'ou monprobleme de boucle donc j'ai vire le for et la c'est bon
a+ gilles

Message cité 1 fois
Message édité par gilles974 le 29-09-2005 à 08:11:13
Reply

Marsh Posté le 29-09-2005 à 08:27:29    

petite optimisation : quand on compare une variable contenant un nombre à un nombre, on a pas besoin de mettre de " autour du nombre. La présence de " autour du nombre augmente le travail que dois fournir php.

Reply

Marsh Posté le 29-09-2005 à 08:33:34    

tu vas nous le faire disparaître ton  
> $num = count($data);
> $row++;  
> for($c=0; $c < $num; $c++) {
> ...
> }
m'enfin !?
---
edit : donc j'ai vire le for et la c'est bon
excuses-moi, je reviens je vais apprendre à lire  :D


Message édité par shakpana le 29-09-2005 à 08:39:56
Reply

Marsh Posté le 29-09-2005 à 08:39:35    

shakpana > D'aprés toi, il a fait quoi entre ses deux derniers messages d'aprés ce qu'il a dit dans son dernier. ;)

Reply

Marsh Posté le 29-09-2005 à 08:40:38    

:jap:

Reply

Marsh Posté le 29-09-2005 à 09:18:34    

oui j'ai poster trop vite moi aussi j'avais mal lu :) omega2 qu'entend tu par nombre 123 est un nombre pour php S123 est toujours un nombre ??? tout comme 10.25 ou 2005-10-21
 a+ gilles

Reply

Marsh Posté le 29-09-2005 à 09:54:40    

123 est un nombre "123" et '123' sont des chaines de caractéres pouvant être transformé totalement en nombre par php. "12s3" et '12s3' sont des chaines dont une partie ne peut pas être transformé en nombre. Au mieux, php sortir 12 comme nombre à partir de cette chaine.10.25 est un nombre 2005-10-21 est un ensemble d'opération matématique. par contre "2005-10-21" et '2005-10-21' sont des chaines pouvant être transformé en date.
 
exemple du travail que doit fournir php pour comparer une variable contenant un nombre à un nombre ou une chaine de caractére :
 
$num < "15"
et  
$num < 15
 
dans le premier cas :
- quand php transforme la ligne en uinstruction qu'il peut gérer plus rapidement, il tombe sur "15", donc il va créer une chaine de caractére contenant les caractéres 1 et 5.
- ensutie, quand il exécute la ligne, il prend sa nouvelle chaine (valuer (1 et 5 donc), il vérifie si dedans il y a pas des caractéres spéciaux (présence d'un \ ) ou des noms de variables (présence d'un $). S'il ya l'un des deux, il modifie la chaine. Dans le cas présent, il a rien trouvé donc il modifie rien. Si la chaine est délimité par des ' c'est un moindre mal vu qu'il ne fait pas cette vérification là.
- il tombe ensuite sur le < donc une opération matématique, il va donc lui faloir transformer la chaine en nombre pour pouvoir faire la comparaison. Pour ça il est obligé de :

  • vérifier jusqu'où les caractéres de la chaine correspondent à un nombre. Bon, là, c'est le cas de tous.  
  • Prendre ensuite le 1 qu'il multiplie par 10 auquel il rajoute 5.

- enfin il comparele contenu de la variable avec le nombre qu'il a calculé
 
Dans le second cas :
- il tombe sur du texte qui est un nombre, il vérifie que tous les caractéres forment un nombre sinon il envoie un message d'erreur ou d'alerte
- il transforme ensuite les caractéres 1 et 5 en un nombre 15 vu qu'ils ait qu'on lui a dit dessuite que c'est un nombre (pas de présence d'un ' ou d'un " ) Evidement, il fait alors le 1 * 10 + 5. ;)
- il tombe sur l'opérateur de comparaison et voit qu'il a un nombre des deux côtés. Donc il compare directement.
 
Comme tu vois, dans le second cas, php à deux étapes en moins à faire, et l'une des deux peut être vraiment gourmande en temp du processeur. (au minimum deux comparaisons par caractére et ca peut demander beaucoup plus au processeur pour traiter une chaine) En plus dans le second cas, on le voit (en fonction du réglage de l'affichage des erreurs et alertes) si on a saisie un caractére invalide au milieux du nombre. :)

Reply

Marsh Posté le 29-09-2005 à 10:19:27    

gilles974 a écrit :

aie aie desole de cette fausse joie
il me repete 31 x INSERT INTO TRANSAC (NUMERO,RE) VALUES ('S0555818','R' )
31 x INSERT INTO TRANSAC (NUMERO,RE) VALUES ('S0555819','R' )
et ainsi desuite  
j'avais déja tester ca dans mes nombreuses feuille d'ou monprobleme de boucle donc j'ai vire le for et la c'est bon
a+ gilles


 
Vire la boucle for t'en a pas besoin puisque $data est deja un tableau Et que tu fais l'insert de cette manière
 
echo $query = "INSERT INTO TRANSAC ($champ) VALUES ('$data[0]','$data[1]',......... )<br>";  
 

Reply

Marsh Posté le 29-09-2005 à 10:23:56    

Citation :

donc j'ai vire le for et la c'est bon


Dens91 > grilled et déjà fait en plus. ;)

Reply

Marsh Posté le 29-09-2005 à 10:33:57    

omega2 a écrit :

Citation :

donc j'ai vire le for et la c'est bon


Dens91 > grilled et déjà fait en plus. ;)


Bon ok je lirais tous avant de la ramené ...  :)  
 
 
 

Reply

Marsh Posté le 29-09-2005 à 11:31:59    

ok omega2 vu , sa commence à prendre forme :) comme à mon abitude j'ai merdé sur une bricole bref
a+ gilles

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed