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

  FORUM HardWare.fr
  Programmation
  PHP

  injection donnée xls à partir d'une colone précise ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

injection donnée xls à partir d'une colone précise ?

n°2311298
cyberpilou​1410
Posté le 20-02-2018 à 10:37:08  profilanswer
 

Bonjour,  
j'utilise ce genre de script (qui fonctionne bien)  pour importer des fichier xls dans un bd mysql mais j'aimerais pourvoir lui spécifier à partir de quelle ligne il doit commencer l'injection et à partir de quelle ligne celle-ci ce termine, pouvez vous m'aider ? merci d'avance :  
 
voici le script :  
 
//Le chemin d'acces a ton fichier sur le serveur  
$fichier = fopen("nom_du_fichier.text_ou_.csv", "r" );  
 
//tant qu'on est pas a la fin du fichier :  
while (!feof($fichier))  
{  
// On recupere toute la ligne  
$uneLigne = fgets($fichier, 1024);  
//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')  
$tableauValeurs = explode(';', $uneLigne);  
// On crée la requete pour inserer les donner (ici il y a 12 champs donc de [0] a [11])  
$sql="INSERT INTO Balance VALUES ('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."', '".$tableauValeurs[4]."', '".$tableauValeurs[5]."', '".$tableauValeurs[6]."', '".$tableauValeurs[7]."', '".$tableauValeurs[8]."', '".$tableauValeurs[9]."', '".$tableauValeurs[10]."', '".$tableauValeurs[11]."')";  
 
$req=mysql_query($sql)or die (mysql_error());  
// la ligne est finie donc on passe a la ligne suivante (boucle)  
}  
//vérification et envoi d'une réponse à l'utilisateur  
if ($req)  
{  
echo"Ajout dans la base de données effectué avec succès";  
}  
else  
{  
echo"Echec dans l'ajout dans la base de données";  
}


Message édité par cyberpilou1410 le 05-03-2018 à 10:31:19
mood
Publicité
Posté le 20-02-2018 à 10:37:08  profilanswer
 

n°2311373
nabbo
Posté le 21-02-2018 à 11:02:03  profilanswer
 

un truc dans le genre.

 

attention : si une de tes lignes fait plus de 1024 caractères, ou si tes données contiennent des apostrophes, ton script va merder gentillement.

 

:jap:

 
Code :
  1. //Le chemin d'acces a ton fichier sur le serveur 
  2. $fichier = fopen("nom_du_fichier.text_ou_.csv", "r" ); 
  3. $i=0;
  4. $start=10;
  5. $end=123;
  6. //tant qu'on est pas a la fin du fichier : 
  7. while (!feof($fichier)) 
  8. if($i<$start) continue;
  9. if($i>$end) continue;
  10. // On recupere toute la ligne 
  11. $uneLigne = fgets($fichier, 1024); 
  12. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';') 
  13. $tableauValeurs = explode(';', $uneLigne); 
  14. // On crée la requete pour inserer les donner (ici il y a 12 champs donc de [0] a [11]) 
  15. $sql="INSERT INTO Balance VALUES ('".$tableauValeurs[0]."', '".$tableauValeurs[1]."', '".$tableauValeurs[2]."', '".$tableauValeurs[3]."', '".$tableauValeurs[4]."', '".$tableauValeurs[5]."', '".$tableauValeurs[6]."', '".$tableauValeurs[7]."', '".$tableauValeurs[8]."', '".$tableauValeurs[9]."', '".$tableauValeurs[10]."', '".$tableauValeurs[11]."')"; 
  16. $req=mysql_query($sql)or die (mysql_error()); 
  17. // la ligne est finie donc on passe a la ligne suivante (boucle) 
  18. $i++;
  19. //vérification et envoi d'une réponse à l'utilisateur 
  20. if ($req) 
  21. echo"Ajout dans la base de données effectué avec succès"; 
  22. else 
  23. echo"Echec dans l'ajout dans la base de données"; 
  24. }
 


Message édité par nabbo le 21-02-2018 à 11:02:40
n°2311391
MaybeEijOr​Not
but someone at least
Posté le 21-02-2018 à 14:26:10  profilanswer
 

Cela fait bien longtemps que je n'ai pas fait de PHP mais ça me semble complètement faux comme code.

 

Déjà pour débuter :

Code :
  1. while (!feof($fichier))


Il faudrait déjà commencer par lire une ligne pour voir si on est à la fin. Ce test est donc fait dans le mauvais ordre. Actuellement le test est fait a posteriori et donc on effectue un tour de boucle en trop.

 

Puis :

Code :
  1. $i=0;
  2. $start=10;
  3. $end=123;
  4. while (!feof($fichier))
  5. {
  6.    if($i<$start) continue;
  7.    if($i>$end) continue;
  8.    $uneLigne = fgets($fichier, 1024);
  9.    // ...
  10.    $i++;
  11. }


Donc si on simule on commence à $i=0, on entre dans la boucle en passant l'évaluation de fin de fichier, ok, on teste $i, on est inférieur à la valeur $start donc on retourne à l'évaluation de la boucle sans avoir bougé le pointeur et sans avoir incrémenté $i. Du coup on part dans une boucle infinie ou j'ai raté un truc ?

 

Ceci me semblerait plus correct :

Code :
  1. $i=0;
  2. $start=10;
  3. $end=123;
  4. while (($uneLigne = fgets($fichier, 1024)) !== false || $i <= $end) {
  5.    if ($i <= $start) {
  6.       // ...
  7.    }
  8.    $i++;
  9. }

Message cité 1 fois
Message édité par MaybeEijOrNot le 21-02-2018 à 14:27:07

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2311393
cyberpilou​1410
Posté le 21-02-2018 à 14:28:57  profilanswer
 

Merci pour vos réponse je teste et vous tiens au courants :)

n°2311442
Tibar
Posté le 21-02-2018 à 21:56:17  profilanswer
 

Sinon tu intègres tout dans une table temporaire de ta bdd et tu extraits les données qui t’intéressent de cette table temporaire.

n°2311753
cyberpilou​1410
Posté le 28-02-2018 à 14:58:06  profilanswer
 

Grace à votre aide j'avance mais une idée de si on peux partir directement à partir d'un fichier xlsm , pour le txt je mets comme séparateur (\t) pour csv ; mais pour le xlsm ???? c'est possible ?


Message édité par cyberpilou1410 le 28-02-2018 à 15:14:42
n°2311760
MaybeEijOr​Not
but someone at least
Posté le 28-02-2018 à 15:28:28  profilanswer
 

Pour lire un .xlsm avec PHP il faut utiliser une library, je pense qu'il en existe une mais je doute qu'elle prend en charge les macros.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2311956
cyberpilou​1410
Posté le 02-03-2018 à 19:22:05  profilanswer
 

Bonsoir, j'avance petit à petit en fait ce qui résoudrais un grande partie mon probleme c'est de pouvoir effacer les lignes du fichier qui ne contienne pas de donnée car les fichiers que je doit importer comportes à  des milliers de ligne vide !!!! mais le script lui les vérifies et les injectes (pour le csv les lignes n'ont que le séparateur ;)

n°2311963
cyberpilou​1410
Posté le 03-03-2018 à 15:10:36  profilanswer
 

MaybeEijOrNot a écrit :

Cela fait bien longtemps que je n'ai pas fait de PHP mais ça me semble complètement faux comme code.
 
Déjà pour débuter :

Code :
  1. while (!feof($fichier))


Il faudrait déjà commencer par lire une ligne pour voir si on est à la fin. Ce test est donc fait dans le mauvais ordre. Actuellement le test est fait a posteriori et donc on effectue un tour de boucle en trop.
 
Puis :

Code :
  1. $i=0;
  2. $start=10;
  3. $end=123;
  4. while (!feof($fichier))
  5. {
  6.    if($i<$start) continue;
  7.    if($i>$end) continue;
  8.    $uneLigne = fgets($fichier, 1024);
  9.    // ...
  10.    $i++;
  11. }


Donc si on simule on commence à $i=0, on entre dans la boucle en passant l'évaluation de fin de fichier, ok, on teste $i, on est inférieur à la valeur $start donc on retourne à l'évaluation de la boucle sans avoir bougé le pointeur et sans avoir incrémenté $i. Du coup on part dans une boucle infinie ou j'ai raté un truc ?
 
Ceci me semblerait plus correct :

Code :
  1. $i=0;
  2. $start=10;
  3. $end=123;
  4. while (($uneLigne = fgets($fichier, 1024)) !== false || $i <= $end) {
  5.    if ($i <= $start) {
  6.       // ...
  7.    }
  8.    $i++;
  9. }



 
Bonjour, j'ai testé ta solution mais si par exemple je met 2 en start &  5 en end il insere les ligne 2,4,6 ... :(

n°2311964
MaybeEijOr​Not
but someone at least
Posté le 03-03-2018 à 16:43:12  profilanswer
 

Oups petite erreur, remplacer par :

 
Code :
  1. $i=1;
  2. $start=10;
  3. $end=123;
  4. while (($uneLigne = fgets($fichier, 1024)) !== false || $i <= $end) {
  5.    if ($i >= $start) {
  6.       // ...
  7.    }
  8.    $i++;
  9. }
 

Néanmoins ça n'explique pas pourquoi ça n'insère qu'une ligne sur deux. Quel est le code exactement ?

Message cité 1 fois
Message édité par MaybeEijOrNot le 03-03-2018 à 16:54:43

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
mood
Publicité
Posté le 03-03-2018 à 16:43:12  profilanswer
 

n°2311965
cyberpilou​1410
Posté le 03-03-2018 à 17:03:31  profilanswer
 

MaybeEijOrNot a écrit :

Oups petite erreur, remplacer par :
 

Code :
  1. $i=1;
  2. $start=10;
  3. $end=123;
  4. while (($uneLigne = fgets($fichier, 1024)) !== false || $i <= $end) {
  5.    if ($i >= $start) {
  6.       // ...
  7.    }
  8.    $i++;
  9. }


 
Néanmoins ça n'explique pas pourquoi ça n'insère qu'une ligne sur deux. Quel est le code exactement ?


 
voici le code j'ai peut être mal placé ton code ?  
 

Code :
  1. <?php
  2. $token= mysql_real_escape_string($_GET['token']);
  3. $session_token= mysql_real_escape_string($_GET['session_token']);
  4. echo'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
  5. if(isset($_FILES['txt']))
  6. {
  7.   $dossier = '**********************';
  8.   $fichier = basename($_FILES['txt']['name']);
  9.   if(move_uploaded_file($_FILES['txt']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
  10.   {
  11.     echo "Upload du fichier effectué avec succès !";
  12.   }
  13.   else //Sinon (la fonction renvoie FALSE).
  14.   {
  15.     echo "Echec de l\'upload !";
  16.   }
  17. }
  18. echo "<br>Chemin du fichier : **************/".$_FILES['txt']['name']."<br><br>Resultat Import SQL : <br>";
  19. mysql_connect('localhost', '******', '*******');
  20. mysql_select_db('*********');
  21. mysql_query("SET NAMES ISO 8859-15" );
  22. //Le chemin d'acces a ton fichier sur le serveur
  23. $fichier = fopen("*************/".$_FILES['txt']['name'], "r" );
  24. //tant qu'on est pas a la fin du fichier :
  25. //tant qu'on est pas a la fin du fichier :
  26. $i=1;
  27. $start=2;
  28. $end=5;
  29. while (($uneLigne = fgets($fichier, 1024)) !== false || $i <= $end) {
  30.    if ($i >= $start) {
  31. // On recupere toute la ligne
  32. $uneLigne = addslashes(fgets($fichier));
  33. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un '\t')
  34. $tableauValeurs = explode("\t", $uneLigne);
  35. //$tableauValeurs[10]=substr($tableauValeurs[72], 0, 7);
  36. // On crée la requete pour inserer les donner (ici il y a 12 champs donc de [0] a [11])
  37. $sql="INSERT IGNORE INTO test VALUES ('".$tableauValeurs[0]."','".$tableauValeurs[1]."')";
  38. $req=mysql_query($sql)or die (mysql_error());
  39. // la ligne est finie donc on passe a la ligne suivante (boucle)
  40.    }
  41.    $i++;
  42. }
  43. //vérification et envoi d'une réponse à l'utilisateur
  44. if ($req)
  45. {
  46. echo "<h2>Ajout dans la base de données effectué avec succès</h2>";
  47. ";
  48. }
  49. else
  50. {
  51. echo "Echec dans l'ajout dans la base de données";
  52. }
  53. ?>


 
la par exemple j'ai  mis start 2 & end 5 il m'a ajouter les ligne   3-5-7-9


Message édité par cyberpilou1410 le 03-03-2018 à 17:05:54
n°2311967
MaybeEijOr​Not
but someone at least
Posté le 03-03-2018 à 17:12:04  profilanswer
 

Ah ben oui c'est normal :

 
Code :
  1. // On recupere toute la ligne
  2. $uneLigne = addslashes(fgets($fichier));
  3. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un '\t')
  4. $tableauValeurs = explode("\t", $uneLigne);
 

La ligne est déjà récupérée par mon code, à remplacer par :

 
Code :
  1. // On echappe toute la ligne
  2. $uneLigne = addslashes($uneLigne);
  3. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un '\t')
  4. $tableauValeurs = explode("\t", $uneLigne);

Message cité 1 fois
Message édité par MaybeEijOrNot le 03-03-2018 à 17:13:32

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2311970
cyberpilou​1410
Posté le 03-03-2018 à 17:37:19  profilanswer
 

MaybeEijOrNot a écrit :

Ah ben oui c'est normal :
 

Code :
  1. // On recupere toute la ligne
  2. $uneLigne = addslashes(fgets($fichier));
  3. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un '\t')
  4. $tableauValeurs = explode("\t", $uneLigne);


 
La ligne est déjà récupérée par mon code, à remplacer par :
 

Code :
  1. // On echappe toute la ligne
  2. $uneLigne = addslashes($uneLigne);
  3. //On met dans un tableau les differentes valeurs trouvés (ici séparées par un '\t')
  4. $tableauValeurs = explode("\t", $uneLigne);



 
 
Alors çà avance là il commence bien l'insertion à la bonne ligne mais ne tiens pas compte de la fin ..il insere jusqu'au bout .. je vais devenir fous :)

n°2311971
cyberpilou​1410
Posté le 03-03-2018 à 17:40:46  profilanswer
 

n'aurais je pas pas mis le bout du code    
}
   $i++;
}
 
à la mauvaise place ? voir plus haut

n°2311972
MaybeEijOr​Not
but someone at least
Posté le 03-03-2018 à 18:37:12  profilanswer
 

Non, je prends de la drogue je crois :
 

Code :
  1. while (($uneLigne = fgets($fichier, 1024)) !== false || $i <= $end) {


 
par :

Code :
  1. while (($uneLigne = fgets($fichier, 1024)) !== false && $i <= $end) {


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2311974
cyberpilou​1410
Posté le 03-03-2018 à 18:53:16  profilanswer
 

OUIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII çà fonctionne :) je le mets sur la bonne version et je te dit quoi.... un grand grand merci :)

n°2311975
cyberpilou​1410
Posté le 03-03-2018 à 18:55:18  profilanswer
 

Tu es en France ? si tu est de passage en Belgique contacte moi et je t'offre une bonne bière belge évidement

n°2311996
cyberpilou​1410
Posté le 05-03-2018 à 10:32:10  profilanswer
 

Allez j'ose ????  
et en spécifiant une colonne de départ c'est possible ?  
:)

n°2312121
MaybeEijOr​Not
but someone at least
Posté le 07-03-2018 à 19:49:29  profilanswer
 

Pas compris la question...
 
Les colonnes sont déjà gérées ici :

Code :
  1. //$tableauValeurs[10]=substr($tableauValeurs[72], 0, 7);
  2. // On crée la requete pour inserer les donner (ici il y a 12 champs donc de [0] a [11])
  3. $sql="INSERT IGNORE INTO test VALUES ('".$tableauValeurs[0]."','".$tableauValeurs[1]."')";


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.

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

  injection donnée xls à partir d'une colone précise ?

 

Sujets relatifs
Lecture de pair<double,double> d'un fichiersupprimer certaines balises d'un fichier xml
Suivi de bug en ligne sans serveurMise en ligne projet Silex
Accès fichier local dans une web extensionRécupération d'une ligne dans la bdd
Cherche personne pour décrypter fichierAfficher le contenu d'une ligne de la bdd
Créer fiche magasin à partir d'un fichier csvÉcrire dans un fichier qui est en cours de lecture
Plus de sujets relatifs à : injection donnée xls à partir d'une colone précise ?


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