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

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

Marsh Posté le 20-02-2018 à 10:37:08    

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
Reply

Marsh Posté le 20-02-2018 à 10:37:08   

Reply

Marsh Posté le 21-02-2018 à 11:02:03    

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
Reply

Marsh Posté le 21-02-2018 à 14:26:10    

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.
Reply

Marsh Posté le 21-02-2018 à 14:28:57    

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

Reply

Marsh Posté le 21-02-2018 à 21:56:17    

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.

Reply

Marsh Posté le 28-02-2018 à 14:58:06    

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
Reply

Marsh Posté le 28-02-2018 à 15:28:28    

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.
Reply

Marsh Posté le 02-03-2018 à 19:22:05    

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

Reply

Marsh Posté le 03-03-2018 à 15:10:36    

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

Reply

Marsh Posté le 03-03-2018 à 16:43:12    

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.
Reply

Marsh Posté le 03-03-2018 à 16:43:12   

Reply

Marsh Posté le 03-03-2018 à 17:03:31    

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
Reply

Marsh Posté le 03-03-2018 à 17:12:04    

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.
Reply

Marsh Posté le 03-03-2018 à 17:37:19    

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

Reply

Marsh Posté le 03-03-2018 à 17:40:46    

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

Reply

Marsh Posté le 03-03-2018 à 18:37:12    

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.
Reply

Marsh Posté le 03-03-2018 à 18:53:16    

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

Reply

Marsh Posté le 03-03-2018 à 18:55:18    

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

Reply

Marsh Posté le 05-03-2018 à 10:32:10    

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

Reply

Marsh Posté le 07-03-2018 à 19:49:29    

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.
Reply

Sujets relatifs:

Leave a Replay

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