php: Gestion de fichier txt a la base mysql

php: Gestion de fichier txt a la base mysql - PHP - Programmation

Marsh Posté le 20-02-2012 à 16:31:44    

Bonjour,
j'ai un fichier txt que je doit insérer son contenu dans la base mysql, ce fichier contient:
1) l'identificateur de l'élevé (id_eleve)
2) le nom de l'élevé
mon script doit ouvrir le fichier lire le contenu et insérer dans la table élevé avec des condition:
- si l' id_eleve existe dans la table
on va supprimer l'ancien et ajouter le nouveau id_eleve
si non on va ajouter tous simplement
voila mon script
 

Code :
  1. <?php
  2.    
  3. $connexion=db_connexion();
  4. // Connexion db  
  5. $fichier_ouvrir = @fopen("permis.txt", "r" );
  6. if ($fichier_ouvrir) {
  7.     while (!feof($fichier_ouvrir)) {
  8.         $var_id= rtrim(fgets($fichier_ouvrir, 11));
  9.  $var_nom_eleve= rtrim(fgets($fichier_ouvrir, 200));
  10.     $sql= mysql_query("select * from eleve where id_eleve=$var_id" );
  11.    
  12.     if (isset($_POST["$var_id"]))
  13.    {
  14.    $var_id=prepareChaine($_POST["$var_id"]);
  15.  }
  16.      else
  17.      {
  18.       $var_id=prepareChaine("" );
  19.          $req=("DELETE from eleve where id_eleve=$var_id" );
  20.             $req=("INSERT INTO eleve VALUES ('$var_id'),('$var_nom_eleve')" );
  21.    
  22. // Execution de la requete si pas d'erreur
  23. if ($req <> "" ) {
  24. $req=mysql_query ("$req" )or die(mysql_error());
  25. }
  26. fclose($fichier_ouvrir);
  27.   }
  28. }
  29. // Fermeture DB
  30. ?>


 
mon problème que se script ne fonctionne pas !!!
Aidez moi a le corriger
merci a vous tous

Reply

Marsh Posté le 20-02-2012 à 16:31:44   

Reply

Marsh Posté le 21-02-2012 à 00:33:10    

Hello,
 
1. Pourquoi un $_POST?  
2. Il ne manquerait pas une fonction dans ton code là? parce que prepareChaine() n'est défini nul part...
3. Ta condition else  l.20 s'ouvre mais ne se ferme pas.
4. Tu mets dans $req une chaine à la l.25, puis à la ligne suivante tu y mets directement une nouvelle chaine, il y a un problème net ici.
 
Sinon pour vérifier ici simplement que ton $var_id n'est pas déjà présent dans ta base, après ta requete l.14, tu peux appliquer la fonction mysql_num_rows() à ta ressource $sql, si le résultat est superieur à 0 alors l'id_eleve est déjà existant.

Reply

Marsh Posté le 21-02-2012 à 10:52:44    

Si c'est possible, tu ferais mieux de travailler avec un fichier au format csv avec un séparateur style ;. Ca évitera de supposer que ton ID fait forcément 11 caractères. Quid de ton script si l'ID fait plus ou moins.
 
En plus, php a déjà une fonction native permettant de lire un fichier csv. Ton script sera donc plus sûr.
 
Ensuite, ben une simple boucle sur chaque ligne lue, avec explode(";", $Ligne), t'auras dans un tableau ton ID et ton prénom et ensuite, tu fais le traitement approprié ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-02-2012 à 11:32:35    

xaeon a écrit :

Hello,
 
1. Pourquoi un $_POST?  
2. Il ne manquerait pas une fonction dans ton code là? parce que prepareChaine() n'est défini nul part...
3. Ta condition else  l.20 s'ouvre mais ne se ferme pas.
4. Tu mets dans $req une chaine à la l.25, puis à la ligne suivante tu y mets directement une nouvelle chaine, il y a un problème net ici.
 
Sinon pour vérifier ici simplement que ton $var_id n'est pas déjà présent dans ta base, après ta requete l.14, tu peux appliquer la fonction mysql_num_rows() à ta ressource $sql, si le résultat est superieur à 0 alors l'id_eleve est déjà existant.


 
bonjour;  
pour  $_POST j'ai deja une fonction dans un fichier qui contient que les fonction juste en copiant j'ai pas mis le require (....)  
j'ai changer mon code comme ceci mais je trouve aussi le problème :  
en executant le scirpt il n' y pas une insertion dans la table et en plus un msg apparait :Column count doesn't match value count at row 1
voila mon script:

Code :
  1. <?php
  2.     require_once("lib/db_connect.inc.php" );
  3. require_once('lib/inc_Site2010.php');
  4. $connexion=db_connexion();
  5.  mysql_query("set names utf8" );
  6. // Connexion db  
  7. $fichier_ouvrir = @fopen("permis.txt", "r" );
  8. if ($fichier_ouvrir) {
  9.     while (!feof($fichier_ouvrir)) {
  10.         $var_id= rtrim(fgets($fichier_ouvrir, 11));
  11.  $var_titre_archt= rtrim(fgets($fichier_ouvrir, 200));
  12.         $sql= mysql_query("select * from architecte1" );
  13.  if (mysql_num_rows($sql) >=1)
  14.         {      
  15.    $req=("DELETE from architecte1 where id_archi=$var_id" );
  16.    $req=("INSERT INTO architecte1 VALUES ('$var_id'),('$var_titre_archt')" );
  17.      //$req=("INSERT INTO architecte1 (id_archi,titre_archi) VALUES ('$var_id'),('$var_titre_archt')" );
  18.    
  19.          $req=mysql_query ("$req" )or die(mysql_error());   
  20.   } 
  21. }
  22. fclose($fichier_ouvrir);
  23. }
  24. // Fermeture DB
  25. ?>


???

Reply

Marsh Posté le 21-02-2012 à 11:35:01    

ben forcément, après VALUES, tu mets entre les ( ) que l'ID au lie des 2 valeurs :/...
 
Tu lis un peu la doc de temps en temps?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-02-2012 à 11:35:20    

rufo a écrit :

Si c'est possible, tu ferais mieux de travailler avec un fichier au format csv avec un séparateur style ;. Ca évitera de supposer que ton ID fait forcément 11 caractères. Quid de ton script si l'ID fait plus ou moins.
 
En plus, php a déjà une fonction native permettant de lire un fichier csv. Ton script sera donc plus sûr.
 
Ensuite, ben une simple boucle sur chaque ligne lue, avec explode(";", $Ligne), t'auras dans un tableau ton ID et ton prénom et ensuite, tu fais le traitement approprié ;)


 
 
bonjour,
En faite je n'est aucune idée sur un fichier au format csv
Pouriez-vous m'aidez à changer mon code ???

Reply

Marsh Posté le 21-02-2012 à 11:36:40    

Ca serait aussi mieux de mettre des binds dans les requêtes (+ de perfs) et de quoter ce qui sort du fichier (sécurité).
 
Bref c'est plus propre et dans les règles de l'art.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 21-02-2012 à 11:37:50    

MEI a écrit :

Ca serait aussi mieux de mettre des binds dans les requêtes (+ de perfs) et de quoter ce qui sort du fichier (sécurité).
 
Bref c'est plus propre et dans les règles de l'art.


 
merci de me répondre et commet ca??

Reply

Marsh Posté le 21-02-2012 à 11:43:45    

rufo a écrit :

ben forcément, après VALUES, tu mets entre les ( ) que l'ID au lie des 2 valeurs :/...
 
Tu lis un peu la doc de temps en temps?


 
les deux valeur se trouvent dans le fichier donc je doit mettre le $var_id et le $var_titre_archt
j'ai bien changer ma requête  

Code :
  1. $req=("INSERT INTO architecte1 (id_archi,titre_archi) VALUES ('$var_id' ,'$var_titre_archt')" );

 
mais l'insertion n'est pas faite??


Message édité par manoula le 21-02-2012 à 12:12:27
Reply

Marsh Posté le 21-02-2012 à 12:56:41    

Déjà, les ( ) en début et fin de la requête sql sont inutiles. Ensuite, faut penser à échapper les ' si y'en a dans le titre.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-02-2012 à 12:56:41   

Reply

Marsh Posté le 21-02-2012 à 12:57:42    

manoula a écrit :


 
 
bonjour,
En faite je n'est aucune idée sur un fichier au format csv
Pouriez-vous m'aidez à changer mon code ???


 
ben tu cherches dans google ce qu'est un fichier csv (même si dans mon post, j'ai donné déjà une petite indication sur ce que c'était)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-02-2012 à 09:24:14    

rufo a écrit :

Déjà, les ( ) en début et fin de la requête sql sont inutiles. Ensuite, faut penser à échapper les ' si y'en a dans le titre.


 
bonjour voila mon code complet après modification :

Code :
  1. <?php
  2.     require_once("xxx/db_connect.inc.php" );
  3. require_once('xxx/yyyy.php');
  4. $connexion=db_connexion();
  5.  mysql_query("set names utf8" );
  6. // Connexion db  
  7. $fichier_ouvrir = @fopen("permis.txt", "r" );
  8. if ($fichier_ouvrir) {
  9.     while (!feof($fichier_ouvrir)) {
  10.         $var_id= rtrim(fgets($fichier_ouvrir, 11));
  11.  $var_titre_archt= rtrim(fgets($fichier_ouvrir, 200));
  12.      
  13.     $sql= mysql_query("select * from architecte1 where id_archi='$var_id'" ) or die('Erreue: ' . mysql_error() . "<br />\n$sql" );
  14.  if (mysql_num_rows($sql) >=0)
  15.         {      
  16.   
  17.   $req="DELETE from architecte1 where id_archi='$var_id'";
  18.      $req="INSERT INTO architecte1 (id_archi,titre_archi) VALUES ('$var_id','$var_titre_archt')";
  19.    
  20.          $req=mysql_query ("$req" )or die(mysql_error());   
  21.   } 
  22.   else
  23. {
  24.         $req="INSERT INTO architecte1 (id_archi,titre_archi) VALUES ('$var_id','$var_titre_archt')";
  25.    
  26.          $req=mysql_query ("$req" )or die(mysql_error()); 
  27. }
  28.   
  29. }
  30. fclose($fichier_ouvrir);
  31. }
  32. // Fermeture DB
  33. ?>


alors maintenant quand j’exécute l'erreur est : Duplicata du champ '0' pour la clef 1 !!
mon fichier contient les id et les nom en arabe :
0 ???? ????
2 ???
4 ????
5 ???? ?? ????
...
en faite il fait l'insertion que du premier enregistrement mais si seulement si je change le 1er(enregistrement) et le 2eme par des nom en français il insère les 2 avec le 3eme en arabe !!!
Et si les 3 premier enregistrement en français il insère les 3 avec le 4eme en arabe !!!


Message édité par manoula le 22-02-2012 à 09:24:39
Reply

Marsh Posté le 22-02-2012 à 10:10:47    

T'as sans doute aussi un pb de charset. Et je ne vois toujours pas dans ton code où tu échappes les caractères pouvant poser des pbs lors de l'insertion concernant le nom de la personne :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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