IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[CSV] problème en ligne, pas en local


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 216
    Points : 159
    Points
    159
    Par défaut [CSV] problème en ligne, pas en local
    Bonjour à tous,

    Voilà, j'ai un petit script pour importer des données venant d'un fichier CSV et allant vers une base de données. Aucun problème en local (php 5) ; mais une fois en ligne (sur php 4), il veut m'insérer une ligne vide une fois sur deux...

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    $file = $_FILES['csv']['name'];
    $taille = 1024; // taille ligne maximum
    $delimiteur = "\r";
     
    if($fp = fopen($file,"r")) {	// Si aucun problème pour ouvrir le fichier CSV
    	echo "<p class='good'>Fichier ouvert. En cours de lecture...</p>";
    	$i=2; // Première ligne d'hôtel du fichier Excel
    	while ($ligne = fgetcsv($fp, $taille, $delimiteur)) { // On lit chaque ligne
     
    		foreach($ligne as $elem) {
    			echo "<span class='ligne'>Ligne ".$i." : </span>"; // On indique le numéro de la ligne (pratique pour se repérer sur le fichier Excel)
    			$i++;
     
    			$elem = addslashes($elem);
     
    			$elem = substr($elem,0,-1); // On enlève le dernier " ; " à chaque ligne
    			$tabl = explode(";", $elem); // On met dans un tableau les elements
     
    			$tabl[1]=ereg_replace(" ","",$tabl[1]); // Enlève les espaces mis dans les codes postaux... (petit couac dans les CSV faits par Excel)
     
    			// On vérifie que l'hôtel n'y soit pas déjà
    			$req = "SELECT hotel FROM ho_liste WHERE hotel='".$tabl[2]."' AND adresse='".$tabl[4]."'";
    			$res = mysql_query($req); 
    			$nb = mysql_num_rows($res); // Nombre d'enregistrement trouves
     
    			// Si l'hôtel y est déjà
    			if($nb) {
     
    				echo "<span class='bad'> ERREUR : Hotel d&eacute;j&agrave; pr&eacute;sent ! </span> <br />"; 
     
    			// Sinon, insertion
     
    			} else {
     
    				// Requête SQL (je n'utilise pas ma fonction d'insertion ici pour la raison du point suivant (pas de "die")
    				$req = "INSERT INTO ho_liste(id_liste,localite,cp,hotel,etoiles,adresse,tel,mail,web,groupe,nb_ch)
    						VALUES ('','".$tabl[0]."','".$tabl[1]."','".$tabl[2]."','".$tabl[3]."','".$tabl[4]."','".$tabl[5]."',
    						'".$tabl[6]."','".$tabl[7]."','".$tabl[8]."','".$tabl[9]."')";
     
    				// Exécution de la requête... S'il y a un problème, c'est signalé mais l'éxécution des requêtes suivantes continue
    				if(!@mysql_query($req)) {
    					echo "<span class='bad'> ERREUR insertion SQL </span>".mysql_error(); 
    				} else {
    					echo "<span class='good'>Mise en ligne : OK ! </span>";
    				}
    				echo "<br />";
    			}
    		}
    	}
     
    	fclose ($fp); // On ferme le fichier CSV
     
    } else {
     
    	die("<p class='bad'>Erreur d'ouverture de fichier ! Merci de recommencer... </p>");
     
    }
    Comme je l'ai dit, en ligne je suis sur php 4 et non 5 comme en local, mais je ne vois pas pourquoi le problème viendrait de là (j'ai vérifié, la fonction fgetcsv est compatible php4 & 5)...
    En résultat, j'obtiens :

    Première ligne : ok
    Deuxième ligne : ok (c'est la ligne vide, tous les champs sont vides)
    Troisième ligne : ok
    Quatrième ligne : hôtel déjà présent (il retrouve la ligne 2)
    Cinquiète ligne : ok
    Sixième : hôtel déjà présent (idem)

    etc...

    Si quelqu'un trouve la solution, je suis preneur !
    J'ai essayé de changer le str_replace et le addslashes (en les enlevant), ça ne change rien...

    Merci d'avance !

  2. #2
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    ton delimiteur est un \r, bizzare

    le delimiteur de fgetcsv c'est pour separer les colonnes et pas les lignes

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 216
    Points : 159
    Points
    159
    Par défaut
    Merci pour ta réponse,

    Le fichier CSV est du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    champ1;champ2;champ3;champ4;champ5;
    champ1;champ2;champ3;champ4;champ5;
    champ1;champ2;champ3;champ4;champ5;
    ...
    il se termine donc par un ; (que je supprime) mais aussi par un saut de ligne.
    Impossible de configurer autrement les fichiers CSV à l'exportation dans Excel... donc comment faire autrement ?

    J'ai déjà essayé de mettre \r\n comme délimiteur, ça revient au même... Je sais pas trop comment résoudre ce soucis...

  4. #4
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    et si tu mettais ';' comme délimiteur ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 216
    Points : 159
    Points
    159
    Par défaut
    J'ai déjà essayé, au tout début...
    Je viens quand même de rééssayer : il met une première ligne dans la base (après il retrouve 1500 fois à peu près la même), mais elle est quasiment vide, les champs sont pas bien mis, etc...

    Mais j'ai du mal à comprendre la fonction maintenant, tu me mets le doute
    La doc dit : "fgetcsv() analyse la ligne qu'il lit et recherche les champs CSV, qu'il va retourner dans un tableau les contenant."

    Et $delimiteur pour moi c'est le délimiteur de FIN de ligne. Mais c'est vrai que c'est bizarre que je doive sortir le ";" à la fin de la ligne et un explode : la fonction devrait tout faire d'elle-même...
    Je pige plus trop là ^^

    Ce qui m'étonne c'est le fait que ça marche très bien en local. J'ai également testé sur un autre serveur, et ça marche...

  6. #6
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    fgetcsv renvoie une ligne, et fait un explode sur cette ligne avec le delimiteur

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Une exportation d'Excel au format CSV me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    champ1;champ2;champ3;champ4;champ5
    champ1;champ2;champ3;champ4;champ5
    champ1;champ2;champ3;champ4;champ5
    champ1;champ2;champ3;champ4;champ5
    champ1;champ2;champ3;champ4;champ5
    sans le point-virgule après le dernier champ.

    Citation Envoyé par Msieurduss Voir le message
    Et $delimiteur pour moi c'est le délimiteur de FIN de ligne.
    Un délimiteur est un séparateur de champ, et non pas un caractère de fin de ligne, qui, lui, est automatiquement détecté par 'fgetcsv()'.
    Donc le délimiteur est le point-virgule.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2006
    Messages : 216
    Points : 159
    Points
    159
    Par défaut
    Merci à vous deux pour ces infos !
    Je comprends un peu mieux... En fait, tel que j'ai fait, j'aurais très bien pu faire fgets, vu que je refais un explode derrière...
    Je vais donc essayer de voir l'exportation de fichiers CSV en plus appronfondi, c'est un peu bizarre là !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD9] Problème dernière ligne d'un fichier csv
    Par cactus666 dans le forum WinDev
    Réponses: 5
    Dernier message: 05/10/2007, 11h49
  2. Réponses: 6
    Dernier message: 04/09/2007, 00h11
  3. Réponses: 12
    Dernier message: 28/05/2007, 04h31
  4. [XSLT][>CSV] problème sur sauts de ligne (RC)
    Par jaq dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/12/2006, 15h29
  5. Réponses: 3
    Dernier message: 15/06/2006, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo