DOM csv/excel

DOM csv/excel - PHP - Programmation

Marsh Posté le 07-02-2013 à 15:39:53    

Bonjour,
Je viens vers vous suite à un petit problème.
 
Pour être bref, j'importe un fichier CSV (édité sous Excel 2007) grâce à du PHP via AJAX.
Je récupère les données je les insères dans ma base MYSQL sans soucis.
 
Maintenant je voudrais mettre un peu de sécurité et empêcher que l'utilisateur ne puisse uploader des fichiers ne respectant pas un certain format interne (en-tête des colonnes).
 
Seul problème au moment de comparer les valeurs récupérées et ce qu'il devrait y avoir, j'obtiens toujours FAUX.
 
J'ai essayé
 

Code :
  1. if ($valeurCSV==$valeurVoulue)
  2. if ($valeurCSV===$valeurVoulue)
  3. if (trim($valeurCSV))==trim($valeurVoulue))
  4. if (ord($valeurCSV))==ord($valeurVoulue))
  5. if (ord(trim($valeurCSV))==ord(trim($valeurVoulue)))
  6. strcmp($valeurCSV,$valeurVoulue)


 
J'ai aussi essayé array_diff() après avoir réorganisé mon code.
 
Je n'ai pas réussi.
 
De là j'entends parler de DOM, j'ai ensuite essayé de changer l'encodage de mon script.
Je travaille sous eclipse, je suis donc allé dans workspace pour changer l'encodage par défaut,
puis propriétés du projet et faire de même. Réenregistrer les fichiers concernés, rien n'y fait !
 
J'ai aussi essayé des fonctions php de ce type :
 

Code :
  1. function fopen_utf8 ($filename, $mode) {
  2. $file = @fopen($filename, $mode);
  3. $bom = fread($file, 3);
  4. if ($bom != b"\xEF\xBB\xBF" )
  5. rewind($file);
  6. else
  7. echo "bom found!\n";
  8. return $file;
  9. }


 
Trouvées sur un forum. Je n'ai pas réussi. Donc si quelqu'un avait une solution pour comparer de manière fiable, le contenu d'une cellule CSV avec un chaîne de caractères...
Sachant que je ne sais pas en quoi est encodé mon fichier CSV et que mes scripts sont encodés en CP1252
Je suis plus que preneur.

Reply

Marsh Posté le 07-02-2013 à 15:39:53   

Reply

Marsh Posté le 07-02-2013 à 16:49:57    

J'ai jamais travaillé avec des fichiers tableurs en php, mais quelles sont les valeurs de $valeurCSV et $valeurVoulue ?
Ce serait quand même plus simple d'afficher ces valeurs pour voir les différences.
 
Sinon, c'est le bom (byte order mark) pas le dom (document object model)

Reply

Marsh Posté le 07-02-2013 à 17:57:01    

Merci pour cette correction et pour la réponse rapide.
$valeurCSV contient (suivant les versions) tout la ligne du fichier contenant les en-têtes csv séparée par des ";"
ou cellule par cellule.
et $valeurVoulue la même chose
 
(bien sur lors des test j'adapte l'une à l'autre)
 
dans l'idéal le fonctionnement serait basé sur des array puisque j'explode les lignes avec les ";" comme délimiteurs.
 
ensuite je parcours les 2 tableau (celui contenant les valeurs du fichier, et celui contenant les valeurs voulues), et dès lors qu'il y a une différence il met un bolléen à false.
ensuite suivant le bolléen je continue ou non le traitement du fichier et j'affiche un message d'erreur si besoin.
 
Lors d'un echo de chaque variable j'obtiens exactement la même chose, néanmoins mes conditions if ne constatent pas l'égalité.
 
J'ai fait plein de copier/coller depuis mon CSV vers mon script afin d'en être certain. Rien ne change.

Reply

Marsh Posté le 07-02-2013 à 19:53:23    

La casse est la même aussi ?
 
Bizarre, t'as regardé aussi dans le code source de ta page, quelquefois qu'il y aurait un caractère exotique qui ne serait pas retransmit à l'affichage dans ton navigateur.
 
Teste aussi strlen() sur tes 2 chaines, et éventuellement mb_detect_encoding() pour ta chaine issue de ton fichier csv.
 
Ce sont quelques pistes à explorer, je pense quand même que ça se situe plus sur la différence d'encodage des 2 chaines, à voir.

Reply

Marsh Posté le 08-02-2013 à 09:26:47    

Une fonction pour lire un fichier csv :

Code :
  1. function getContentCSVFile($Filename, $Length = 100000, $Delimiter = ';', $Enclosure = '"', $Escape = '\\', $Mode = 'r')
  2. {
  3.     if (!empty($Filename))
  4.     {
  5.         $ArrayContentFile = array();
  6.         $fp = fopen($Filename, $Mode);
  7.         if ($fp !== FALSE)
  8.         {
  9.             // Read each line, even there is a \n in the line
  10.             while (($Data = fgetcsv($fp, $Length, $Delimiter, $Enclosure)) !== FALSE)
  11.             {
  12.                 $ArrayContentFile[] = $Data;
  13.             }
  14.         }
  15.  
  16.         fclose($fp);
  17.  
  18.         return $ArrayContentFile;
  19.     }
  20.  
  21.     // ERROR
  22.     return array();
  23. }


A adapter sans doute pour gérer de l'utf-8...


---------------
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 08-02-2013 à 09:49:57    

Merci à vous deux pour vos réponses.
 
J'ai trouvée une solution, (pas forcément propre mais fonctionnelle ).
 
Grâce a strlen().
 
J'ai remarqué que la longueur de chaine était différente de 2 caractères.
Vu qu'avant je travaillais avec des array, j'avais remarqué que c'était toujours la dernière "ligne" du tableau qui posait problème.  
 
Du coup :  
 

Code :
  1. $valeurCSV=substr($valeurCSV, 0, strlen($valeurCSV)-2);
  2. if ($valeurVoulue===$valeurCSV)
  3. {
  4. }


 
Pour tout ceux qui ont un soucis il vous faut donc enlever les deux derniers caractères de la dernière cellule lue.
 
Merci encore pour votre aide.

Reply

Marsh Posté le 08-02-2013 à 11:35:26    

Question bête : tu gères les fichiers CSV dont le contenu d'une cellule est sur plusieurs lignes (ie, elle comporte des \n) ?
Ma fonction, oui...


---------------
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 08-02-2013 à 12:47:47    

Moi personnellement non, le fichier est formaté et il n'y à aucun raison d'y rentrer des données suffisamment longues pour occuper plusieurs lignes.
Et vu que c'est un admin qui s'occupera de l'import, je ne pense pas qu'il s'amuserait a ça.
Par contre est-ce que ça peut poser des erreurs de lecture si la cellule occupe plusieurs lignes ?

Reply

Marsh Posté le 08-02-2013 à 14:05:35    

ben oui. En général, on considère qu'une ligne csv = un enregistrement
Mais si le contenu de la ligne csv a des \n, suivant comment t'as construit ton parser, ça peut poser pb puisque certains enregistrements vont se trouver tronquer...


---------------
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 08-02-2013 à 14:48:57    

Ah oui en effet vu comme ça c'est gênant !  
J'en prendrais compte merci !

Reply

Sujets relatifs:

Leave a Replay

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