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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Rendu PHP différent sous Linux et Windows


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 14
    Points
    14
    Par défaut Rendu PHP différent sous Linux et Windows
    Hello all

    Je me suis codé un script PHP dont le but est de créer une requête SQL à partir d'un fichier CSV. Car on m'a filé des fichiers excel pour remplir mes bases de données.

    J'aimerais que ce script profite a pas mal de monde et j'obtiens une requète correcte lorsque j'exécute mon script via un navigateur sous Linux (Debian).

    J'ai essayé avec Firefox et IE8 sous Windows et là, j'obtiens un retour à la ligne dans ma requète que je n'ai pas sous Linux.

    Exemple :

    Citation Envoyé par Windows
    INSERT INTO TABLE
    VALUES ('B001', '8700', '15', '0', '150', '50', '145', '100', '140
    ');

    INSERT INTO TABLE
    VALUES ('B002', '8700', '15', '0', '210', '50', '200', '100', '185
    ');
    Citation Envoyé par Linux
    INSERT INTO TABLE
    VALUES ('B001', '8700', '15', '0', '150', '50', '145', '100', '140');

    INSERT INTO TABLE
    VALUES ('B002', '8700', '15', '0', '210', '50', '200', '100', '185');
    Je ne vois pas trop d'où peu venir le souci.

    Vous pouvez tester le script à cette adresse :

    http://www.open-web.fr/csv2sql/

    Et enfin le code principal csv2sql.php:

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    <?php
    session_start();
     
    include('envoi.php'); //fonction d'envoi de fichier
     
    $caractereDeSeparation = $_POST['caractereDeSeparation'];
    $nomDeTable = $_POST['nomDeTable'];
     
    $_SESSION['SQLRequeteComplete'] = '';
    $SQLRequeteINTO = 'INSERT INTO ' . $nomDeTable;
    $compteur = 1;
    $premiereBoucle = true;
    $CSVcontientNomsChamps = $_POST['CSVcontientNomsChamps'];
     
    // On ouvre le fichier CSV aléatoire créé
    $fichierCSV = fopen($nomAleatoire, "r+");
     
    while(!feof($fichierCSV)) // Boucle de lecture de fichierCSV...
    {
    	/* ... on lit fichierCSV ligne par ligne avec fgets()
    	et on place dans un tableau $valeurs le contenu de la ligne en cours */
     
    	$ligneEnCours = fgets($fichierCSV);
     
    	// traitements....
    	$ligneEnCours = preg_replace('/\n/', '', $ligneEnCours); // on vire les retours à la ligne si il y en a
    	$ligneEnCours = preg_replace('/\'/', '', $ligneEnCours); // on vire les ' si il y en a
    	$ligneEnCours = preg_replace('/"/', '', $ligneEnCours); // on vire les " si il y en a
    	// fin traitements....	
     
    	$valeurs = explode($caractereDeSeparation, $ligneEnCours); // on place chaque élément dans un tableau $valeurs[]
     
    	$nombreChamps = sizeof($valeurs); // on compte le nombre d'éléments du tableau
     
    	if($premiereBoucle) // Première lecture pour récupérer les champs 
    	{
    		if($CSVcontientNomsChamps == 'true') // si le nom des champs se trouve dans le fichier CSV...
    		{
    			$SQLRequeteINTO .= ' (';
    			foreach($valeurs as $champ) // On lit chaque champ séparément pour les placer dans la requète
    			{
    				if($compteur < $nombreChamps) // tant que l'on n'est pas au dernier champ...
    				{
    					$SQLRequeteINTO = $SQLRequeteINTO . $champ . ', '; // ...on place des virgules pour compléter la requète
    					$compteur++;
    				}
    				else // une fois arrivé au dernier champ...
    				{
    					$SQLRequeteINTO = $SQLRequeteINTO . $champ . ')
    '; // ...on termine par une parenthèse
    				}
    			}
    			$compteur = 1; // on réinitialise le compteur
    		}
    		else // si il n'y a pas le nom des champs, on est direct sur SQLRequeteVALUES
    		{
    			$SQLRequeteINTO .= '
    ';
    			$SQLRequeteVALUES = 'VALUES (';
                    	foreach($valeurs as $valeur) // On lit chaque champ séparément pour les placer dans la requète
                    	{
                    	        if($compteur < $nombreChamps) // tant que l'on n'est pas au dernier champ...
                    	        {
                    	                $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ', '; // ...on place des virgules pour compléter la requète
                    	                $compteur++;
                    	        }
                    	        else // une fois arrivé au dernier champ...
                    	        {
                    	                $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ');
    
    '; // ...on termine par une parenthèse
                    	        }
                    	}
                    	$compteur = 1; // on réinitialise le compteur	
    		}
    	}
    	else // lecture des valeurs
    	{
    		$SQLRequeteVALUES = 'VALUES (';
    		foreach($valeurs as $valeur) // On lit chaque champ séparément pour les placer dans la requète
                    {
                            if($compteur < $nombreChamps) // tant que l'on n'est pas au dernier champ...
                            {
                                    $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ', '; // ...on place des virgules pour compléter la requète
                                    $compteur++;
                            }
                            else // une fois arrivé au dernier champ...
                            {
                                    $SQLRequeteVALUES .= '\'' . $valeur . '\'' . ');
    
    '; // ...on termine par une parenthèse
                            }
                    }
    		$compteur = 1; // on réinitialise le compteur
    	}
     
    	/* Le premier tour de boucle ne sert qu'à générer les colonnes du INSERT INTO
    	Le dernier tour de boucle génère un VALUES vide
    	Donc on ne les inclus pas dans la génération de la requète SQL finale.
    	*/
     
    	if($CSVcontientNomsChamps == 'true')
    	{
    		if(!$premiereBoucle AND !feof($fichierCSV)) 
    		{
    			$_SESSION['SQLRequeteComplete'] .=  $SQLRequeteINTO . $SQLRequeteVALUES; 
    			$_SESSION['SQLRequeteComplete'] = str_replace('\'NULL\'', 'NULL', $_SESSION['SQLRequeteComplete']);
    		}
    	}
    	else
    	{
    		if(!feof($fichierCSV))
                    {
                            $_SESSION['SQLRequeteComplete'] .=  $SQLRequeteINTO . $SQLRequeteVALUES;
                            $_SESSION['SQLRequeteComplete'] = str_replace('\'NULL\'', 'NULL', $_SESSION['SQLRequeteComplete']);
                    }
     
    	}
     
    	$premiereBoucle = false;
    }
     
    echo '<a href="telechargement.php?fichier=' . $_SESSION['nomFichier'] .'">T&eacute;l&eacute;charger le fichier SQL</a><br /><br />';
    echo nl2br($_SESSION['SQLRequeteComplete']);
     
    fclose($fichierCSV);
     
    unlink($nomAleatoire); // on efface le fichier aléatoire créé
     
    ?>
    Le script d'envoi (envoi.php) :

    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
    <?php
     
    $tailleMax = 1048576; 
    $extensionsValides = array('csv');
    $erreur = '';
     
    if($_FILES['fichierCSV']['error'] > 0)  // on vérifie si le fichier a été envoyé
    {
    	$erreur = "Erreur lors du transfert";
    }
    else
    {
    	if($_FILES['fichierCSV']['size'] > $tailleMax) // Puis on vérifie si le fichier n'est pas trop gras
    	{
    		$erreur = "Le fichier est trop gros";
    	}
    	else
    	{
    		$extensionFichier = strtolower(substr(strrchr($_FILES['fichierCSV']['name'], '.') ,1)); // on met en petit l'extension du fichier
     
    		if(in_array($extensionFichier, $extensionsValides)) // 
    		{
    			$nomAleatoire = md5(uniqid(rand(), true)); // on crée un nom aléatoire pour le fichier envoyé
    			$transfert = move_uploaded_file($_FILES['fichierCSV']['tmp_name'], $nomAleatoire); // on place le fichier dans le répertoire web 
     
    			$_SESSION['nomFichier'] = $_FILES['fichierCSV']['name']; //on récupère le nom du fichier envoyé...
    			$_SESSION['nomFichier'] = substr($_SESSION['nomFichier'], 0, -4); // on vire l'extension
    			$_SESSION['nomFichier'] .= '.sql';
    		}
    		else
    		{
    			$erreur = "Ce fichier n'est pas un fichier CSV";
    		}
    	}
    	echo $erreur;
    }
    ?>
    Script de téléchargement :

    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
    <?php
     
    session_start();
     
    $fichierSQL = fopen($_SESSION['nomFichier'], 'w+');
    fputs($fichierSQL, $_SESSION['SQLRequeteComplete']);
    fclose($fichierSQL);
     
    $fichier = $_GET['fichier'];
    $chemin = '' . $fichier;
    if (file_exists($chemin))
    {
    	header('Content-disposition: attachment; filename="' . $fichier . '"');
    	header('Content-Type: application/force-download');
    	header('Content-Transfer-Encoding: binary');
    	header('Content-Length: '. filesize($chemin));
    	header('Pragma: no-cache');
    	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    	header('Expires: 0');
    	readfile($chemin);
    }
    else
    {
    	$erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez nous excusez pour le désagrément.';
    }
     
    unlink($_SESSION['nomFichier']); // on efface le fichier SQL généré sur le serveur
     
    ?>
    La page d'index.php :

    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
    <?php
    session_start();
    ?>
     
    <form method="post" action="csv2sql.php" enctype="multipart/form-data">
    <p>S&eacute;lectionnez le fichier CSV &agrave; envoyer :<br />
    <input type="file" name="fichierCSV" />
    <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
    <br /><br />
    Indiquez le nom de la table :<br />
    <input type="text" name="nomDeTable" />
    <br /><br />
    La premi&egrave;re ligne du fichier CSV contient le nom des champs<br />
    <input type="radio" name="CSVcontientNomsChamps" value="true" checked="checked" /> Oui
    <input type="radio" name="CSVcontientNomsChamps" value="false" /> Non
    <br /><br />
    S&eacute;lectionnez le caract&egrave;re de s&eacute;paration :<br />
    <select name="caractereDeSeparation">
    <option value=",">,</option>
    <option value=";">;</option>
    </select>
    <br /><br />
    <input type="submit" value="Envoyer" />
     </p>
    </form>
    Si des fois vous avez une idée d'où ça peut venir....

    Merci !!

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Bon, je n'ai pas tout regardé, mais essai de rajouter le caractère carriage return dans ton preg_replace: \r\n plutôt que \n tout cours.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 14
    Points
    14
    Par défaut


    C'est exactement ça ! Nickel !

    Un grand merci à toi

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 14
    Points
    14
    Par défaut
    Et pour compléter, une explication du phénomène que j'ai trouvée.

    le '\n' c'est le LF (Line Feed) et '\r' le CR (carriage return). Les premiers
    télétypes et imprimantes nécessitaitent les deux caractères pour faire un saut
    de ligne.
    Puis ensuite, le LF suffisait pour faire CR + LF.
    Sous Windows et en particulier le Notepad, un saut de ligne ce code CR puis LF,
    Wordpad se comporte aussi bien avec uniquement LF.
    Sous Linux, la plus part du temps seul le LF est utilisé.

    Perso, j'utilise que le LF, mais je bosse quasiment que sous Unix / Linux.

    Si tu veux plus d'info, les acronymes CR et LF te permettront de trouver des
    informations complémentaires sur le NET.

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

Discussions similaires

  1. Connection php 5 sous linux vers oracle 7.3.4 sous windows 2003 server
    Par dorian-ya67 dans le forum Connexions aux bases de données
    Réponses: 2
    Dernier message: 16/05/2013, 14h06
  2. [Free Pascal] GLScene : est-ce possible (sous Linux ET Windows) ?
    Par I_am_root dans le forum Free Pascal
    Réponses: 3
    Dernier message: 10/12/2007, 14h33
  3. Réponses: 9
    Dernier message: 01/08/2007, 12h20
  4. Ethernet sous Linux et Windows
    Par Invité4 dans le forum Réseau
    Réponses: 9
    Dernier message: 17/04/2005, 11h19
  5. Etat de la pile sous Linux et Windows
    Par Bibouda dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 16/02/2003, 01h28

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