Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1529 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  prb de double boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

prb de double boucle

n°1209435
gilles974
Posté le 28-09-2005 à 09:18:15  profilanswer
 

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
 
 
 

mood
Publicité
Posté le 28-09-2005 à 09:18:15  profilanswer
 

n°1209503
omega2
Posté le 28-09-2005 à 10:01:37  profilanswer
 

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.

n°1209547
Berceker U​nited
PSN : berceker_united
Posté le 28-09-2005 à 10:28:38  profilanswer
 

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

n°1209557
DEns91
Posté le 28-09-2005 à 10:36:43  profilanswer
 

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

n°1209568
omega2
Posté le 28-09-2005 à 10:42:20  profilanswer
 

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

n°1209570
gilles974
Posté le 28-09-2005 à 10:42:37  profilanswer
 

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

n°1209599
DEns91
Posté le 28-09-2005 à 11:09:16  profilanswer
 

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.

n°1209626
omega2
Posté le 28-09-2005 à 11:31:43  profilanswer
 

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.

n°1209729
gilles974
Posté le 28-09-2005 à 12:46:32  profilanswer
 

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

n°1209850
shakpana
des fois, j'me demande ...
Posté le 28-09-2005 à 14:32:51  profilanswer
 

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
mood
Publicité
Posté le 28-09-2005 à 14:32:51  profilanswer
 

n°1209858
omega2
Posté le 28-09-2005 à 14:40:18  profilanswer
 

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. ;)

n°1209861
shakpana
des fois, j'me demande ...
Posté le 28-09-2005 à 14:41:52  profilanswer
 

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
n°1209871
omega2
Posté le 28-09-2005 à 14:46:23  profilanswer
 

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.

n°1209873
shakpana
des fois, j'me demande ...
Posté le 28-09-2005 à 14:46:46  profilanswer
 

ok, tu m'as eu :)

n°1210047
gilles974
Posté le 28-09-2005 à 16:51:43  profilanswer
 

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

n°1210223
shakpana
des fois, j'me demande ...
Posté le 28-09-2005 à 20:33:40  profilanswer
 

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
n°1210399
gilles974
Posté le 29-09-2005 à 06:44:00  profilanswer
 

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

n°1210411
gilles974
Posté le 29-09-2005 à 08:08:52  profilanswer
 

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
n°1210414
omega2
Posté le 29-09-2005 à 08:27:29  profilanswer
 

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.

n°1210417
shakpana
des fois, j'me demande ...
Posté le 29-09-2005 à 08:33:34  profilanswer
 

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
n°1210419
omega2
Posté le 29-09-2005 à 08:39:35  profilanswer
 

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. ;)

n°1210421
shakpana
des fois, j'me demande ...
Posté le 29-09-2005 à 08:40:38  profilanswer
 

:jap:

n°1210452
gilles974
Posté le 29-09-2005 à 09:18:34  profilanswer
 

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

n°1210503
omega2
Posté le 29-09-2005 à 09:54:40  profilanswer
 

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. :)

n°1210545
DEns91
Posté le 29-09-2005 à 10:19:27  profilanswer
 

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>";  
 

n°1210555
omega2
Posté le 29-09-2005 à 10:23:56  profilanswer
 

Citation :

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


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

n°1210581
DEns91
Posté le 29-09-2005 à 10:33:57  profilanswer
 

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é ...  :)  
 
 
 

n°1210650
gilles974
Posté le 29-09-2005 à 11:31:59  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  prb de double boucle

 

Sujets relatifs
[C#] Boucle for sur DataSet ??peut simplifier cette boucle
comment faire ma boucle ?![RESOLU]Boucle dans remplacement regex
comment faire une boucle "toutes les 3 secondes"?[SGBD] Oracle, double left outer join et syntaxe ANSI
[ms-dos]Comment, avec boucle FOR, trouver le lecteur assigné au CDdouble click dans un listbox multiselect
probleme de Boucle avec une macro!!!!Construction d'un tableau dans une boucle while
Plus de sujets relatifs à : prb de double boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR