Rendu PHP différent sous Linux et Windows
Hello all :P
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:
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élé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:
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:
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:
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électionnez le fichier CSV à 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è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électionnez le caractère de sé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 !! :ccool: